Si vous avez deux sites Discourse que vous souhaiteriez fusionner en un seul, ce guide est pour vous.
Il existe un outil appelé discourse_merger qui peut prendre un site Discourse et le fusionner dans un autre.
Prérequis
Ce n’est pas une tâche facile et doit être traitée comme toute autre migration vers Discourse. Vous n’exécuterez pas discourse_merger sur un site de production en direct. Vous effectuerez la fusion dans un autre environnement où vous pourrez examiner le résultat avant de déplacer le résultat vers la production.
Copie vs Fusion
Presque tout sera copié d’un site à l’autre, mais les catégories et les utilisateurs peuvent être fusionnés, ce qui évitera la duplication.
- Les utilisateurs seront fusionnés si un utilisateur sur les deux sites a la même adresse e-mail.
- Les catégories seront fusionnées si elles ont le même nom.
Si vous souhaitez effectuer une réorganisation de vos données, faites-le avant de fusionner.
Choisissez le site de destination
Choisissez quel site sera la destination des données. C’est celui qui conservera tout son style et ses paramètres. L’autre site aura ses utilisateurs, catégories, sujets, publications, téléchargements, etc., copiés/fusionnés sur le site de destination.
Comment faire
Sauvegardez les deux sites y compris les fichiers et copiez-les dans l’environnement où vous effectuerez la fusion. Il est possible qu’ils proviennent de différentes versions de Discourse, nous devons donc les mettre à la même version. Je choisirais d’utiliser la version la plus récente de Discourse lors de l’exécution de la fusion.
Restaurez le site de destination dans l’environnement de fusion. Si vous le faites depuis la ligne de commande :
bundle exec ruby script/discourse restore destination-2018-08-02-134227-v2018xxx.tar.gz
Ensuite, nous allons extraire l’autre site.
cd /path/to/data
tar xvzf other-2018-08-02-134227-v2018xxx.tar.gz
Le résultat comprendra la sauvegarde de la base de données et les fichiers de téléchargement.
Créez une base de données avec les données :
psql
CREATE DATABASE "copyme" ENCODING = 'utf8';
\q
gunzip < /path/to/data/other-2018-08-02-134227-v2018xxx.tar.gz | psql -d copyme
Si vous effectuez l’importation dans un conteneur Docker officiel (recommandé), vous devrez réinitialiser le mot de passe postgres pour le fournir au script, sinon vous pourriez rencontrer une erreur indiquant que l’utilisateur postgres ne peut pas accéder à la base de données.
Pour changer le mot de passe :
sudo -u postgres psql
\password postgres
(entrez le nouveau mot de passe)
\q
Maintenant, il est temps d’exécuter le script. Quelques variables d’environnement que vous définirez :
DB_NAME : nom de la base de données en cours de fusion avec le site de destination.
DB_HOST : (optionnel) nom d’hôte de la base de données en cours de fusion. Laissez vide si elle est locale.
DB_PASS : mot de passe pour que l’utilisateur postgres accède à la base de données
UPLOADS_PATH : chemin absolu (du site en cours de fusion) du répertoire contenant les répertoires « original » et « optimized ». ex. /path/to/data/uploads/default
SOURCE_BASE_URL : URL de base du site en cours de fusion. ex. https://meta.discourse.org
SOURCE_CDN : (optionnel) URL de base du CDN du site en cours de fusion.
Vous devrez peut-être exécuter un bundle install avant d’exécuter le script d’importation pour éviter les erreurs. Pour ce faire :
su discourse -c 'bundle config set --local with generic_import && bundle install'
Lors de la première exécution, vous pourriez avoir besoin d’installer des dépendances supplémentaires pour les gems requises dans l’importation.
Une fois le bundle terminé, exécutez l’importation.
su discourse -c 'DB_NAME=copyme DB_PASS=password SOURCE_BASE_URL=http://copy.othersite.com UPLOADS_PATH=/shared/import/data/uploads/default bundle exec ruby script/bulk_import/discourse_merger.rb'
Une fois terminé, examinez le résultat dans un navigateur web.
Vous pouvez utiliser l’outil remap pour mettre à jour les liens de l’ancien forum.
bundle exec ruby script/discourse remap 'copy.othersite.com' 'hot.newsite.com'
Re-cuire également toutes les publications avec des téléchargements :
rake posts:rebake_match["upload:"]
Si tout semble correct, effectuez une sauvegarde du résultat et restaurez-la sur votre serveur de production.
bundle exec ruby script/discourse backup