If you have two Discourse sites that you wish were one, this guide is for you.
There’s a tool called discourse_merger that can take one Discourse site and merge it into another.
This is not an easy task, and should be treated like any other migration to Discourse. You will not be running discourse_merger on a live production site. You will perform the merge in another environment where you can review the output before moving the result to production.
Copy vs Merge
Almost everything will be copied from one site to the other, but Categories and Users can be merged, which will avoid duplication.
- Users will be merged if a user on both sites has the same email address.
- Categories will be merged if they have the same name.
If you want to do any reorganization of you data, do it before merging.
Choose the destination site
Choose which site will be the destination for the data. This is the one that will retain all its styling and settings. The other site will have it’s users, categories, topics, posts, uploads, etc. copied/merged into the destination site.
How to do it
Take backups of both sites including files and copy them to the environment where you’ll perform the merge. It’s possible that they’re from different versions of Discourse, so we need them to be at the same version. I would choose to use the most recent version of Discourse while performing the merge.
Restore the destination site.
bundle exec ruby script/discourse restore destination-2018-08-02-134227-v2018xxx.tar.gz
Next we’ll extract the other site.
cd /path/to/data tar xvzf other-2018-08-02-134227-v2018xxx.tar.gz
The output will include the database dump and the upload files.
Create a database with the data:
psql CREATE DATABASE "copyme" ENCODING = 'utf8'; \q gunzip < /path/to/data/other-2018-08-02-134227-v2018xxx.tar.gz | psql -d copyme
Now it’s time to run the script. Some env variables you’ll set:
DB_NAME: name of database being merged into the destination site.
DB_HOST: (optional) hostname of database being merged. leave blank if it’s local.
UPLOADS_PATH: absolute path of the directory containing “original” and “optimized” dirs. e.g. /path/to/data/uploads/default
SOURCE_BASE_URL: base url of the site being merged. e.g. https://meta.discourse.org
SOURCE_CDN: (optional) base url of the CDN of the site being merged.
IMPORT=1 DB_NAME=copyme SOURCE_BASE_URL=http://copy.othersite.com UPLOADS_PATH=/shared/import/data/uploads/default bundle exec ruby script/bulk_import/discourse_merger.rb
When it’s done, review the output in a web browser.
You can use the
remap tool to update links from the old forum.
bundle exec ruby script/discourse remap 'copy.othersite.com' 'hot.newsite.com'
Also rebake all posts with uploads:
If everything looks good, take a backup of the result and restore it to your production server.
bundle exec ruby script/discourse backup