Move topics from one Discourse instance to another

Need to move some stuff from one instance of Discourse to another?

There is a command line tool to export a topic, a set of topics, or an entire category, and another to import them in at the other end.

Topic Export/Import

  • one or more topics and their replies
  • the users who posted in the topic

Category Export/Import

  • the category and all its subcategories
  • its security settings
  • custom groups mentioned in the security settings
    • :warning: if any of the groups have ‘membership requests’ enabled, it will crash. Turn this off before the export
  • all topics and posts in the category and subcategories
  • all users who posted, and assigns them to the groups

Begin: Identify the IDs

First, identify the ID(s) of the =Export= that you wish to export. You’ll find this at the end of the URL used to access it.

  • https://meta.discourse.org/t/how-to-contribute-to-discourse/53797

  • https://meta.discourse.org/t/how-to-contribute-to-discourse/53797/12
    (in this case you are in the middle of a topic - grab the first number)

  • https://meta.discourse.org/c/howto/faq/4

Category or Topic ID(s)

Multiple topics

You can select more than one topic by adding IDs separated by a space; this works in the field above (I don’t think that this works for categories though):

  • 53797 200943 124096

Run the Export Script

The tool can be run as a root user inside the container:

cd /var/discourse
./launcher enter app

Run this command:

discourse export_=Export= =ID=

The output should look something like this:

Starting export of =Export=…

Where are the new users all coming from?
Export saved to =Export=-export-2021-08-27-015437.json

Done

Move the Exported File

The exported .json file needs to be moved from the inside of the application container where you did the export to the inside of the container of the receiving instance. This takes a few steps.

Copy it to the ‘outside’

Exit the container if you haven’t already

exit

You should now have a prompt like this:

root@yourserver:/var/discourse

Use docker to copy the file out of the container (you can’t move it I don’t think)

docker cp app:/var/www/discourse/=FileName= .

Move it to the other instance

This is beyond the scope of this guide, but this might help you get there:

Copy it into the container in the receiving instance

SSH into your receiving instance as root and get to the Discourse directory:

cd /var/discourse

Use docker once again to copy the file into the other container

docker cp =FileName= app:/var/www/discourse

Import the Content

Enter the container in the receiving instance:

./launcher enter app

Run the import script

discourse import_=Export= =FileName=

:cake: Done!

You might need to tidy up some loose ends, but hopefully, it should all be done.

Advanced Tips

Missing Ruby Gem

When doing a complex category import, my instance was missing the ‘Listen’ Ruby.
This was solved by doing this: (using the Discourse user inside the container)

./launcher enter app
su discourse
bundle config --delete without
bundle config --delete with
bundle install
exit
exit

This broke the rails console, necessitating a rebuild afterwards

./launcher rebuild app

Multisite

In a multisite environment, use the RAILS_DB env variable.

RAILS_DB=xxxmoves discourse export_=Export= =ID=
RAILS_DB=dancerehab discourse discourse import_=Export= =FileName=

Please report bugs in the bug category, and request enhancements in the feature category.


Related Topics


Last Reviewed by @SaraDev on 2022-07-13T00:00:00Z

Last edited by @hugh 2024-05-29T06:25:11Z

Check documentPerform check on document:
43 « J'aime »

Je vais réessayer.\n\nY a-t-il un moyen simple de migrer les téléchargements pertinents avec les sujets ?

Pas vraiment. Une chose qui fonctionne la plupart du temps est si vous récupérez tous ces téléchargements et collez l’URL de l’original dans n’importe quel message sur le site vers lequel vous vous déplacez, alors ce qui devrait se produire, c’est que ces téléchargements seront créés avec le même SHA et que cela fonctionnera tout simplement.

Vous feriez donc la chose qui convertit le contenu du message en URL pour obtenir ces URL. (Je ne me souviens jamais comment faire cela, je dois donc le découvrir à chaque fois).

Hmmm - je ne suis toujours pas très clair à ce sujet. Dites-vous que cela fonctionnera ?

  1. Récupérer tous les fichiers téléchargés du premier site
    • Comment ?
  2. Les déposer dans un seul sujet
  3. Ils généreront le même lien relatif qu’ils avaient sur l’ancien site et magie !

Ou vouliez-vous dire ceci ?

  1. Récupérer toutes les URL absolues dans vos catégories d’intérêt de l’ancien site
  2. Les coller dans un sujet
  3. Ils seront tous téléchargés sur le nouveau site avec le même SHA et les liens existants fonctionneront comme par magie

Ou quelque chose de complètement différent ?

Je pense que l’une ou l’autre de ces solutions devrait fonctionner. Cependant, vous pouvez transférer ces images vers le nouveau site, elles devraient générer le même sha, ce qui fera fonctionner comme par magie les liens existants dans les sujets.

Peut-être pourriez-vous faire quelque chose comme ça :

cat_id=123
Topic.where(category_id: cat_id).each do| t|
  Post.where(topic_id: t.id) do |p|
      p.cooked.match(image url)....
         puts(the match)

Et je pense que si vous faites cela et collez ces liens dans un message n’importe où sur votre site, cela téléchargera toutes ces images localement et créera le même sha, puis ces liens. Vous pouvez en essayer quelques-unes à la main pour voir.

Il est tard dans la nuit. Votre expérience peut varier.

1 « J'aime »

Bonjour, je ne suis pas sûr que ce tutoriel soit ce que je veux faire, mais je pose la question ici.

Si j’installe Discourse sur un serveur, mais qu’en raison de sa croissance, j’ai besoin de migrer vers un serveur plus puissant, est-ce que ce sont les étapes ?

Que se passe-t-il, par exemple, avec l’option de sauvegarde ? Ne puis-je pas le faire, installer Discourse sur un autre serveur, puis restaurer la copie de sauvegarde de l’autre instance à partir de cette option ?

J’attends vos éclaircissements, car je veux savoir comment migrer lorsque j’en aurai besoin et ne pas perdre le travail que j’ai accompli récemment.

Non. Pour passer à un serveur plus grand, une simple sauvegarde et restauration suffisent. Vous pouvez également déplacer un site Discourse vers un autre VPS avec rsync.