Migrer un forum NodeBB avec Redis vers Discourse

Ce tutoriel vous montrera comment utiliser le NodeBB Importer pour migrer un forum NodeBB vers la plateforme Discourse. Si votre forum NodeBB utilise MongoDB comme backend, suivez ce tutoriel. Ne vous inquiétez pas, c’est un processus simple. Commençons.

Le plan

  • Préparation de l’environnement de développement.
  • Export de la base de données depuis l’environnement de production.
  • Import de la base de données de production dans une instance Discourse.
  • Exécution du script d’importation.

Quelles données peuvent être migrées ?

  • Groupes
  • Catégories
    • Catégorie racine => Catégorie racine
    • Sous-catégorie et sous-sous-catégorie => Sous-catégorie
  • Pièces jointes
  • Sujets et Messages
    • Sujet épinglé => Sujet épinglé
    • Vues des sujets
    • Tous les styles seront migrés correctement, y compris les mentions, les émojis et les pièces jointes.
  • Utilisateurs (avec les attributs suivants)
    • Avatars (photo de profil)
    • Arrière-plan du profil
    • Statut de bannissement
    • Nom
    • Nom d’utilisateur
    • Adresse e-mail
    • Biographie
    • Administrateur
    • Site web
    • Localisation
    • Statut d’adhésion
    • Groupe

Préparation de l’environnement de développement local

Configurez votre environnement de développement en suivant l’un de ces guides :

Désormais, je ferai référence à cet environnement comme le serveur Discourse.

:bulb: Veuillez utiliser ce guide si vous rencontrez des problèmes lors de la configuration de Discourse.

Exportation du dump de la base de données de production (depuis le serveur NodeBB) :

Arrêtez votre forum. Cela est recommandé par NodeBB.

$ cd /path_to_nodebb
$ ./nodebb stop

Vous devez également arrêter Redis :

$ sudo service redis-server stop
$ sudo service redis-server status
# redis-server n'est pas en cours d'exécution

Votre base de données de forum est contenue dans un seul fichier. Ce fichier est généré automatiquement périodiquement par Redis. Généralement, ce fichier se trouve dans /var/lib/redis/dump.rdb. Vous pouvez également obtenir le chemin via l’interface CLI de Redis :

$ redis-cli
127.0.0.1:6379> config get dir
# "/var/lib/redis"
127.0.0.1:6379> exit
$ ls -la /var/lib/redis
# -rw-rw-r-- 1 redis redis 2664346 Aug 4 16:24 dump.rdb

:bulb: Si votre serveur Redis nécessite un mot de passe, utilisez AUTH VOTRE_MOT_DE_PASSE.

:bulb: Si pour une raison quelconque vous ne trouvez pas votre fichier de base de données au chemin attendu, vous pouvez le générer manuellement en exécutant SAVE dans l’interface CLI de Redis.

Maintenant, vous devez copier les pièces jointes du forum :

$ cd /path_to_nodebb_root_folder/
$ tar -czf ./uploads.tar.gz ./public/uploads

Maintenant que vous avez votre base de données et les ressources du forum, vous devez les copier vers le serveur Discourse.

Importation de la base de données

Si vous avez suivi les instructions d’installation de Discourse, vous devriez avoir un serveur Redis installé sur le serveur Discourse :

$ redis-server -v
# Redis server v=5.0.2...

Vous devez maintenant arrêter le serveur Redis (important).

Basé sur Linux :

$ sudo service redis-server stop
$ sudo service redis-server status
# redis-server n'est pas en cours d'exécution

Mac OS :

$ brew services stop redis
$ brew services list
# redis arrêté

Ce que vous devez faire maintenant est de copier la base de données du forum vers le chemin local de la base de données Redis. L’importateur doit se connecter au serveur Redis et migrer la base de données NodeBB vers la base de données Discourse. Cette étape suppose que vous n’avez rien d’important dans votre base de données Redis, sinon vous devriez effectuer une sauvegarde.

$ redis-cli
127.0.0.1:6379> config get dir
# "/var/lib/redis"

Vérifiez s’il y a des fichiers et notez l’utilisateur actuel et les permissions de dump.rdb :

$ ls -la /var/lib/redis

Copiez la base de données NodeBB (remplacez s’il y en a une) :

$ cp dump.rdb /var/lib/redis

Plus tard, lors de la tentative de connexion au serveur Redis, vous pourriez obtenir Fatal error loading the DB: Permission denied, vous devez donc modifier les permissions de dump.rdb :

# Remplacez l'utilisateur par le même que celui noté précédemment.
$ sudo chown redis:redis /var/lib/redis/dump.rdb
$ sudo chmod 660 /var/lib/redis/dump.rdb

Vous devez maintenant décompresser uploads.tar.gz vers n’importe quel chemin de votre choix :

$ tar xvzf uploads.tar.gz

Exécution du script d’importation

Maintenant que notre base de données est en place, nous sommes prêts à exécuter notre script d’importation. Avant cela, nous devons modifier certaines configurations. Vous devez probablement changer uniquement les deux lignes suivantes.

Voici le chemin de votre dossier uploads NodeBB :

ATTACHMENT_DIR = '/absolute_path/uploads'

Voici le nom de la base de données dans Redis. La valeur par défaut est 0 :

db: 0

Exécutez l’importateur avec Discourse propre :

$ cd ~/discourse
$ bundle exec rake db:drop db:create db:migrate
$ bundle exec ruby script/import_scripts/nodebb/nodebb.rb

L’importateur se connectera au serveur Redis et migrera tout vers la base de données PostgreSQL de Discourse.

Une fois l’importation terminée, démarrez la plateforme Discourse :

$ bundle exec rails server

Démarrez Sidekiq pour traiter les données migrées :

$ bundle exec sidekiq

Vous pouvez surveiller la progression à l’adresse http://localhost:3000/sidekiq/queues.

Effectuez une sauvegarde de Discourse et téléversez-la sur votre serveur de production Discourse en suivant ce tutoriel.

Ainsi, vous devriez avoir réussi à effectuer une migration complète de NodeBB vers Discourse :tada:
Si vous avez des questions, je suis heureux de vous aider :slight_smile:

9 « J'aime »

Je n’arrête pas de harceler à propos de ma migration dans différents fils de discussion :smiley:

J’ai un forum sur NodeBB avec Redis et j’ai pu terminer le processus sans erreurs dans la version de développement, mais j’ai encore quelques questions :

  • Dans le script de migration, j’ai correctement indiqué le chemin absolu où se trouvaient mes images et les fichiers du forum. Une fois la migration terminée, je constate que les images ne sont pas visibles dans les fils de discussion. Dans Discourse, elles apparaissent liées dans l’URL : assets/uploads, mais il n’y a rien là-bas.

    Dans la version de développement, j’ai résolu ce problème en créant un lien symbolique :
    ln -s path/to/images public/assets

    Mais dans la version de production, que dois-je faire pour créer un lien depuis assets/upload à l’intérieur du docker vers le dossier où j’ai mis les anciennes images ?

  • Il semble que tous les fils de discussion du forum aient été migrés correctement, mais je ne vois pas les messages privés entre les utilisateurs… ne sont-ils pas inclus dans la migration ?

  • Le script n’a détecté aucun avatar d’utilisateur.

  • Et enfin, dans le nouveau forum, je ne vois aucun embedding de vidéos Youtube ou de Tweets. Dois-je installer un plugin pour cela ?

Merci beaucoup pour votre aide.

Cela ne devrait pas être nécessaire. Si vous avez vos images originales dans un chemin, configuré dans ATTACHMENT_DIR, Discourse créera un téléversement (essentiellement, une copie du fichier) dans path-to-your-install/discourse/public/uploads/default/. Si vous vérifiez la table Uploads, elle devrait ressembler à ceci :

[1] pry(main)> Upload.last
  Upload Load (1.5ms)  SELECT "uploads".* FROM "uploads" ORDER BY "uploads"."id" DESC LIMIT 1
=> #<Upload:0x0000000109a460a0
 id: 196,
 user_id: 251468,
 original_filename: "Screenshot 2023-11-17 at 11.52.39.png",
 filesize: 25174,
 width: 398,
 height: 248,
 url: "/uploads/default/original/1X/2e5f7a09ba3bcd3a3597285771c53c16f20b18dd.png",
 created_at: Fri, 17 Nov 2023 19:12:47.455954000 UTC +00:00,
 updated_at: Fri, 17 Nov 2023 19:12:47.484137000 UTC +00:00,
 sha1: "2e5f7a09ba3bcd3a3597285771c53c16f20b18dd",

Correct, il semble que le script nodebb ne migre pas les messages privés. Vous pouvez consulter d’autres scripts pour voir comment les messages privés sont importés, par exemple, consultez celui de Vanilla.

Les avatars ne sont probablement pas téléchargés correctement, probablement pour le même problème que vous avez mentionné ci-dessus.

Pas besoin de plugin. Vous devez probablement refaire la cuisson de vos messages. Vous pouvez attendre que sidekiq le fasse automatiquement, ou vous pouvez exécuter une refonte complète depuis la console :

rake posts:rebake

Le script nodebb n’a pas été mis à jour depuis quelques années, donc je suppose que certaines parties sont obsolètes et doivent être modifiées pour fonctionner avec vos données. J’espère que cela vous aidera !

1 « J'aime »