Bonjour à la communauté Discourse,
Je souhaite partager mon expérience d’importation d’un forum IPB 3.1 vers Discourse 2.1, en espérant que cela sera utile à d’autres.
Un bref résumé sur la communauté :
- Sujet : Framework PHP Yii (discussions et support liés au code)
- Membres : ~26k
- Sujets : ~64k
- Messages : ~293k
L’importation a pris 27h 46min sur une machine avec 16 Go de RAM et 4 cœurs CPU.
Exigences de l’importation :
- Conserver les membres, mais nettoyer tous les comptes SPAM (~250k comptes dont ~26k restent après le nettoyage)
- Implémenter le SSO depuis le site web (les comptes utilisateurs ne sont pas gérés par Discourse)
- Conserver les sujets, les messages et les catégories avec leurs URLs d’origine afin que les résultats des moteurs de recherche fonctionnent toujours, ainsi que les autres liens provenant de plateformes comme Stackoverflow
Ceci est basé sur Migrating from Invision Power Board to Discourse - #23 by pfaffman, merci à @pfaffman pour le travail accompli sur l’importateur.
Préparation
Exportation des données depuis IPB
mysqldump <nom_de_la_base_de_données> > /tmp/ipb.sql
cd /var/www/yiiframework.com/forum/ && tar czvf uploads.tgz uploads/
Copiez le dump SQL et les fichiers uploadés vers le nouveau serveur et placez-les dans /var/discourse/shared/standalone/.
Je suppose ici une configuration Docker simple de Discourse.
Quel script utiliser ?
Il existe deux scripts d’importation, ipboard.rb et ipboard3.rb. Le script ipboard3.rb semble très brut et ne correspond pas non plus au schéma de table que nous avons, j’ai donc opté pour ipboard.rb.
La version actuelle du script d’importation ipboard.rb ne gère pas bien les pièces jointes et ne convertit pas non plus les balises de code, ce qui est très important pour nous car nous parlons beaucoup de code PHP. J’ai donc apporté les modifications suivantes au script :
Rendre les pièces jointes téléchargées disponibles
Le script d’importation remplace les pièces jointes des messages par des URLs vers le fichier téléchargé.
Si vous conservez votre instance IPB en ligne à l’URL où elle se trouvait auparavant, vous pouvez simplement spécifier l’URL (UPLOADS est une configuration du script d’importation, voir ci-dessous) vers le répertoire des uploads et c’est tout :
UPLOADS="https://www.yiiframework.com/forum/uploads"
Mais nous importons vers Discourse pour supprimer complètement l’ancien forum, nous devons donc placer les uploads ailleurs. Si vous utilisez un proxy nginx devant Discourse, vous pouvez le configurer pour servir les fichiers téléchargés depuis un répertoire sur le serveur. Ajoutez ce qui suit dans la partie server de la configuration nginx :
location /ipb_uploads/ {
alias /var/www/ipb_uploads/;
}
Et configurez l’URL des pièces jointes (voir ci-dessous) comme ceci :
UPLOADS="https://forum.yiiframework.com/ipb_uploads"
Configuration de MySQL dans le conteneur Discourse
Démarrer un shell bash dans le conteneur de l’application Discourse :
docker exec -it app bash
Dans le conteneur, installez MySQL et importez la base de données :
apt-get install mysql-server mysql-client libmysqlclient-dev
service mysql start
echo "create database ipb" | mysql -uroot -p
mysql -uroot -p ipb < /shared/ipb.sql
Lorsque j’ai tenté la première importation pour tester le script, cela a pris plusieurs jours pour importer 200k utilisateurs, dont nous savions qu’une grande partie étaient des comptes SPAM. Nous avons donc créé quelques requêtes SQL pour supprimer les comptes qui n’avaient jamais publié quoi que ce soit :
Notez que nous allons utiliser le SSO, donc les utilisateurs supprimés seront recréés lors de leur connexion.
Si vous n’allez pas utiliser le SSO, vos critères de suppression des utilisateurs pourraient être différents.
Vous pouvez importer vos données sans les nettoyer.
mysql -uroot -p
# puis appliquez les requêtes de nettoyage
Ensuite, nous devons installer les dépendances pour le script d’importation :
cd /var/www/discourse
echo "gem 'mysql2'" >>Gemfile
echo "gem 'reverse_markdown'" >>Gemfile
bundle install --no-deployment
Pour autoriser l’accès à la base de données Postgres de Discourse, remplacez peer par trust dans /etc/postgresql/10/main/pg_hba.conf. Notez que 10 représente la version de postgres ; si le fichier n’existe pas dans votre configuration, remplacez 10 par la version de postgres que vous exécutez actuellement.
Redémarrez Postgres pour charger les modifications : service postgresql restart
Importation
Préparez les avatars et les fichiers téléchargés :
mkdir /shared/imports
mv /shared/uploads.tgz /shared/imports
cd /shared/imports && tar xzvf uploads.tgz
Exécutez le script d’importation :
cd /var/www/discourse
DB_HOST="localhost" DB_NAME="yiisite" DB_USER="root" DB_PW="root" TABLE_PREFIX="ipb_" IMPORT_AFTER="1970-01-01" UPLOADS="https://www.forum.yiiframework.com/ipb_uploads" AVATARS_DIR="/shared/imports/uploads/" USERDIR="user" bundle exec ruby script/import_scripts/ipboard.rb | tee import.log
Assurez-vous d’ajuster l’URL UPLOADS comme discuté ci-dessus, car les uploads seront inclus dans les messages sous forme de liens vers le fichier d’origine téléchargé.
Nettoyage
Si tout s’est bien passé, nettoyez avec service mysql stop, apt-get purge mysql-server, rm -rf /var/lib/mysql
Configuration de la redirection d’URL
Pour conserver les URLs existantes vers le forum intactes, le script d’importation crée des permaliens pour chaque sujet qui reflètent l’URL des sujets et des catégories dans IPB.
Cependant, ces permaliens ne couvrent pas les liens vers des messages spécifiques dans un sujet ou des pages différentes.
Pour que ces URLs fonctionnent correctement, vous devez configurer certaines règles de réécriture d’URL ; il existe 3 options :
- Utiliser le paramètre
permalink normalizationsdans Discourse pour supprimer les parties inutiles des URLs - Règles de réécriture dans nginx, si vous avez un proxy nginx devant Discourse
- Si l’ancien forum se trouvait à une URL/hôte différent de Discourse, vous pouvez avoir un script personnalisé pour réécrire les URLs (c’est ce que j’ai fait)
Voici le code PHP que nous utilisons pour la redirection d’URL :
Ressources connexes
- Migrate a XenForo forum to Discourse
- Migrating from Invision Power Board to Discourse - #23 by pfaffman
- Feature: Invision Power Board Importer by pfaffman · Pull Request #5543 · discourse/discourse · GitHub
- Déploiement de Discourse utilisant SaltStack :
server-salt/states/discourse at master · yiisoft-contrib/server-salt · GitHub