Migrer un forum Phorum vers Discourse

Si vous avez un ancien forum Phorum et que vous envisagez de migrer vers Discourse, ce tutoriel est fait pour vous. Le processus est simple et nous utiliserons le script d’importation Phorum officiel. Commençons.

À un niveau élevé, nous allons procéder comme suit :

  • Préparer l’environnement de développement local.
  • Exporter la base de données depuis l’environnement de production.
  • Importer la base de données de production dans une instance Discourse locale.
  • Exécuter le script d’importation Phorum.

Ce qui peut être migré

  • Catégories
    • Chaque forum et dossier => Catégorie racine
  • Sujets et Messages
  • Utilisateurs (avec les attributs suivants)
    • statut banni
    • nom d’utilisateur
    • vrai nom => nom
    • adresse e-mail
    • statut administrateur
    • date d’ajout
    • dernière activité

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

Suivez l’un de ces guides pour installer Discourse lui-même et consultez ce guide si vous rencontrez des problèmes.

Installez le serveur de base de données MySQL ;

Ubuntu 18.04 :

$ sudo apt update
$ sudo apt install mysql-server -y

Une fois l’installation de MySQL terminée, vérifiez son statut :

$ systemctl status mysql.service

S’il n’est pas en cours d’exécution, exécutez la commande suivante :

$ sudo systemctl start mysql

MacOS :

$ brew install mysql@5.7
$ echo 'export PATH="/usr/local/opt/mysql@5.7/bin:$PATH"' >> ~/.bash_profile
$ source ~/.bash_profile

Vérifiez le statut des services :

$ brew services list

Vous devriez voir quelque chose comme ceci :

...
mysql@5.7         started
...

Sinon, exécutez la commande suivante et vérifiez à nouveau :

$ brew services start mysql@5.7

Pour Windows, vous pouvez suivre le guide d’installation officiel.

Cet environnement sera notre serveur Discourse.

Exportation de la base de données depuis l’environnement de production :

Exportez la base de données de production (depuis le serveur de production Phorum) :

$ mysqldump -u USER_NAME -p DATABASE_NAME > phorum_dump.sql

Copiez le dump de la base de données sur le serveur Discourse.

:bulb: Utilisez scp ou rsync pour copier la base de données. Bien sûr, vous pouvez la compresser en gzip au préalable.

Importation de la base de données de production vers le serveur Discourse

Sur le serveur Discourse, créez une base de données :

$ mysql -u root

:bulb: Si votre utilisateur de base de données a un mot de passe, vous devez utiliser : mysql -u root -p puis saisir votre mot de passe.

mysql> CREATE DATABASE phorum;

Assurez-vous que la base de données a été créée :

mysql> SHOW DATABASES;

Vous devriez voir quelque chose comme ceci :

+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| phorum             |
| sys                |
+--------------------+
5 rows in set (0.04 sec)

Il s’agit d’une base de données vide. Notre prochaine étape consiste à importer la base de données de production dedans.

$ mysql -u root phorum < phorum_dump.sql

Pendant que nous y sommes, récupérons le préfixe de table. Nous en aurons besoin plus tard :

$ mysql -u root
mysql> USE phorum;
mysql> SHOW TABLES;

Vous verrez quelque chose comme ceci :

+---------------------------+
| Tables_in_phorum          |
+---------------------------+
| pw_banlists           |
| pw_files              |
| pw_forum_group_xref   |
| pw_forums             |
| pw_groups             |
| pw_messages           |
| pw_messages_edittrack |
| pw_pm_buddies         |
| pw_pm_folders         |
| pw_pm_messages        |
| pw_pm_xref            |
| pw_search             |
| pw_settings           |
| pw_subscribers        |
| pw_user_custom_fields |
| pw_user_group_xref    |
| pw_user_newflags      |
| pw_user_permissions   |
| pw_users              |
+---------------------------+
19 rows in set (0.00 sec)

D’après la sortie ci-dessus, vous pouvez voir que le préfixe est pw_.

Exécution du script d’importation Phorum

Tout d’abord, installez les dépendances de l’importateur :

$ cd ~/discourse
$ echo "gem 'mysql2', require: false" >> Gemfile
$ bundle install

Configurons maintenant le script pour qu’il corresponde à nos besoins. Dans notre exemple, cela suffira :

PHORUM_DB = "phorum"
TABLE_PREFIX = "pw_"
BATCH_SIZE = 1000

# ...

host: "localhost",
username: "root",
password: "", # Changez ceci si vous avez un mot de passe pour la base de données MySQL
database: PHORUM_DB

Si vous souhaitez créer une redirection d’URL, vous devez décommenter ce qui suit :

# categories.each do |category|
#   Permalink.create(url: "list.php?#{category['id']}", category_id: category_id_from_imported_category_id(category['id'].to_i))
# end

#...

# results.each do |post|
#   if post['parent_id'] == 0
#     topic = topic_lookup_from_imported_post_id(post['id'].to_i)
#     Permalink.create(url: "read.php?#{post['category_id']},#{post['id']}", topic_id: topic[:topic_id].to_i)
#   end
# end

Cela ressemblera à ceci :

categories.each do |category|
  Permalink.create(url: "list.php?#{category['id']}", category_id: category_id_from_imported_category_id(category['id'].to_i))
end

#...

results.each do |post|
  if post['parent_id'] == 0
    topic = topic_lookup_from_imported_post_id(post['id'].to_i)
    Permalink.create(url: "read.php?#{post['category_id']},#{post['id']}", topic_id: topic[:topic_id].to_i)
  end
end

Exécutez l’importateur avec une instance Discourse propre :

bundle exec rake db:drop db:create db:migrate
bundle exec ruby script/import_scripts/phorum.rb

L’importateur se connectera au serveur MySQL et migrera notre base de données Phorum vers la base de données Discourse.

Démarrez le serveur Discourse une fois l’importation terminée :

$ bundle exec rails server

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

$ bundle exec sidekiq

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

Configurez votre serveur de production Discourse en suivant ce tutoriel.

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

C’est fait :tada:

7 « J'aime »

Je suis sur le point de commencer la migration d’un forum Phorum vers Discourse. Je souhaiterais conserver les fichiers joints aux messages (principalement des images). Il semble que cela ne soit pas pris en charge par le script de migration actuel. Quelqu’un a-t-il déjà réfléchi à cette question ?

1 « J'aime »

J’ai apporté quelques ajustements au script de migration pour « phorum », y compris la migration des pièces jointes, des fichiers et des téléchargements. La demande de fusion est disponible ici :

1 « J'aime »

Merci pour les scripts !

Cependant, j’ai l’impression que le manuel est assez brut et peu clair. J’ai dû me référer, par exemple, au guide de migration Xenforo pour bien comprendre ce que vous suggérez ici. Laissez-moi ajouter quelques étapes manquantes :

  • Avoir Discourse opérationnel
  • Créer un mysqldump du Phorum original - tout est clair, tout va bien.
  • Copier le dump de la base de données dans le dossier Discourse docker cp/path/to/backup/phorum_db.sql.gz app:/shared/phorum_db.sql.gz (en supposant app comme nom de conteneur standard)
    Et voici les parties manquantes :
  • Accéder au conteneur Docker de Discourse et y installer MySQL :
docker exec -it app bash
apt-get update && apt-get upgrade
# pv juste pour afficher la progression, lsb-release est requis par quelque chose
apt-get install -y lsb-release pv mariadb-server mariadb-client libmariadb-dev
service mariadb start

Notez que l’installation de MySQL est un peu plus compliquée, mais Mariadb devrait fonctionner aussi bien.

Ensuite, créez une base de données : mysqlCREATE database phorum.

Puis remplissez-la à partir de la sauvegarde : pv phorum_db.sql.gz | gunzip | mysql phorum (pas besoin de gunzip si votre dump est un sql brut)

Ajoutez le support MySql à Ruby :

cd /var/www/discourse/
echo "gem 'mysql2'" >>Gemfile
bundle config unset deployment
bundle install --no-deployment

Modifiez les données dans le script de migration (identifiants de base de données, préfixe, permaliens) :

nano /var/www/discourse/script/import_scripts/phorum.rb

Et ensuite, revenez au guide du post original, tout va bien là-bas :

Lancez l’importateur avec une instance Discourse propre :

git config --global --add safe.directory /var/www/discourse
bundle exec ruby script/import_scripts/phorum.rb

Si votre base de données Discourse n’est pas vraiment propre, il est préférable de la nettoyer avec bundle exec rake db:drop db:create db:migrate au préalable.

Si cela échoue avec “PG::ConnectionBad: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: FATAL: Peer authentication failed for user "discourse" (PG::ConnectionBad)” :

  1. Si vous obtenez l’erreur 'Peer authentication failed for user \"discourse\"' :
  2. Modifiez le fichier /etc/postgresql/13/main/pg_hba.conf
  3. changez tous les ‘peer’ en ‘trust’ et enregistrez le fichier
  4. rechargez le serveur postgres : /etc/init.d/postgresql reload (ou peut-être psql -U postgres -c \"SELECT pg_reload_conf();\", mais cela échouait parfois pour moi)

D’abord, il exécute les migrations d’utilisateurs qui peuvent être relativement lentes (~1.2k utilisateurs/minute selon la sortie du script. J’avais 100k utilisateurs, donc…). Ensuite, il crée les catégories et commence à migrer les messages et les sujets (même vitesse, ~1.2k/minute), mais à ce stade, vous pouvez déjà accéder au site web et voir à quoi cela ressemble.

Cela semble beaucoup plus fluide que ce à quoi je m’attendrais pour un moteur aussi ancien que Phorum. Il semble qu’il n’y ait pas de migration des messages privés (PM), mais cela ne devrait pas être un obstacle pour moi au moins.

Merci encore pour le script et les efforts !

Il est difficile d’écrire un guide pour quelque chose d’aussi compliqué qui couvre toutes les étapes. Déterminer exactement quelles pièces un utilisateur particulier pourrait avoir besoin de connaître est complexe. Bon travail pour trouver un autre guide avec les pièces manquantes.

Vous auriez peut-être pu inclure le modèle mysql pour installer mysql, ou peut-être accéder à un serveur mysql déjà installé d’une manière ou d’une autre (ce que je fais habituellement).

Si vous le souhaitiez, vous pourriez examiner d’autres scripts qui importent des MP pour vous en servir d’exemple.