(Remplacé) Comment migrer/importer de SMF2 à Discourse

:mega: Ce document est désormais remplacé par ce guide SMF2 : Migrate an SMF2 forum to Discourse

Je tenais vraiment à migrer notre bon vieux forum SMF2 vers Discourse. Nous avons plus de 1000 membres et environ 20 000 messages répartis dans environ 2 000 sujets.
Sur SMF2, nous n’utilisions ni sondages ni pièces jointes — en fait, tout le monde n’avait même pas d’avatar. Cependant, certains messages reposaient fortement sur du BBCode « avancé ».

Voici comment nous avons procédé.

Prérequis

Installez simplement Discourse de la manière habituelle.
J’ai ajouté le plugin Discourse BBCode pour gérer les listes, les tailles, les couleurs, etc., directement.

Si vous ne pouvez pas établir une connexion distante vers votre base de données MySQL SMF2, vous devrez importer vos données depuis un dump vers un conteneur Docker temporaire.

Si votre base de données accepte les connexions distantes — ou s’exécute sur le même hôte, vous pouvez sauter cette étape.

Un conteneur MySQL Docker temporaire

Faites un dump de votre base de données :

cd /tmp/
mysqldump –u[nom_utilisateur] –p[mot_de_passe] [nom_base_de_données] > sqldump.sql

Créez le conteneur MySQL Docker temporaire :

cd /tmp/
docker run -d -e MYSQL_ROOT_PASSWORD=pass -e MYSQL_USER=user -e MYSQL_PASSWORD=pass -e MYSQL_DATABASE=db -v "$PWD":/backup --name=mysql mysql

Ensuite, connectez-vous à l’intérieur :

docker exec -it mysql bash

Importez le dump de votre base de données :

mysql -uuser -ppass db < /backup/sqldump.sql

Si vous obtenez l’erreur suivante :

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

Attendez simplement une minute que le conteneur soit complètement démarré.

Pour la compatibilité de la base de données, j’ai dû modifier le plugin d’authentification de notre base de données temporaire, mais votre expérience peut varier :

mysql -uuser -ppass db

Utilisez cette requête :

ALTER USER user
IDENTIFIED WITH mysql_native_password
BY 'pass';

Puis déconnectez-vous et vérifiez l’adresse IP de votre instance MySQL :

exit
docker inspect mysql | grep IPAddress

Vous disposez maintenant d’une copie fonctionnelle de votre base de données SMF2.

Un conteneur d’importation Discourse temporaire

Créons un nouveau conteneur appelé « import », basé sur le conteneur app.yml par défaut :

cd /var/discourse
cp containers/app.yml containers/import.yml

nano containers/import.yml

Ajoutez le modèle mysql-dep à votre nouveau conteneur d’importation :

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
## Décommentez ces deux lignes si vous souhaitez ajouter Lets Encrypt (https)
  #- "templates/web.ssl.template.yml"
  #- "templates/web.letsencrypt.ssl.template.yml"
  - "templates/import/mysql-dep.template.yml"

Ensuite, lancez simplement :

/var/discourse/launcher stop app
/var/discourse/launcher rebuild import

Importation dans Discourse

Une fois le conteneur d’importation reconstruit, nous devons y entrer pour notre dernier ajustement :

/var/discourse/launcher enter import
cd /var/www/discourse/ # le script doit être lancé depuis ce répertoire précis, mais vous devriez y être arrivé de toute façon
su discourse -c "bundle exec ruby script/import_scripts/smf2.rb -h 172.17.0.3 -u user -p pass -d db -f smf_ -t Europe/Paris"
  • -h : l’hôte de la base de données MySQL SMF2 (ici, l’IP d’un conteneur Docker) ;
  • -u : utilisateur MySQL SMF2 ;
  • -p : mot de passe MySQL SMF2 ;
  • -d : base de données MySQL SMF2 ;
  • -f : préfixe des tables SMF2 ;
  • -t : fuseau horaire SMF2.

Nettoyage

Si vous l’avez créé, arrêtez et supprimez le conteneur MySQL Docker temporaire :

docker stop mysql
docker rmi mysql

Arrêtez le conteneur Discourse « import » et utilisez le lanceur pour nettoyer :

/var/discourse/launcher destroy import
/var/discourse/launcher cleanup

J’ai en fait réussi à détruire mon conteneur principal :slight_smile: Pas de panique :

/var/discourse/launcher rebuild app

Paramètres Discourse après l’importation

Certains paramètres par défaut peuvent causer des problèmes avec les messages importés et les permissions. Modifiez-les selon vos besoins depuis le panneau des paramètres Discourse :

  • longueur minimale du titre du sujet : Je l’ai changée à 3 — les sujets dont le titre était trop court s’avéraient très difficiles à gérer (impossibles à déplacer, etc.) ;
  • esthétisation du titre : J’ai dû la désactiver — les sujets dont le titre ne commençait pas par une majuscule s’avéraient très difficiles à gérer (impossibles à déplacer, etc.).

Bibliographie

10 « J'aime »

Thanks for providing this. Maybe @marcozambi can use this for the guide he was planning to write after his successful import (including attachments)?

See here:

Also can anybody from the Discourse team let us know what happened to the old topic that was a guide for SMF2 imports? I can no longer find it via search.

1 « J'aime »

Still determined to contribute, as soon as all the details will be in place. I’m taking notes of everything and I’ll write someting asap

1 « J'aime »

poke @codinghorror @sam @HAWK

I think we can combine what @_vincent has compiled here, what was in the “missing” topic, and a few notes from @marcozambi’s migration to make a pretty comprehensive guide for migrating SMF2 to Discourse.

I have undeleted it here: https://meta.discourse.org/t/importer-for-simple-machines-2-forums/17656

I am assuming it was deleted because it contained info that is no longer up to date so grab what you need from it and we’ll remove it again to avoid future confusion.

1 « J'aime »

Thanks! For the most part it was up-to-date. I did a migration with it a couple months ago and I would have been lost as f*$# without it.

I think the guide isn’t the problem, so much as the importer itself could use a little attention in a few areas. Also, if possible, we should change some of the MySQL settings in the Discourse docker container when it gets created to prevent connection timeouts. That would probably take care of everything IMO.

1 « J'aime »

Ok, it’s out. SMF2 to Discourse - The Ultimate Guide
I hope the Guide is readable enough, as I am not a native english speaker. It goes without saying that any constructive feedback is more than welcome.

3 « J'aime »

Hello guys,

Let me start that you did a wonderful job with [SMF2 to Discourse - The Ultimate Guide] and this migration tool.

I could migrate a huge SMF instante (61k members, 400k posts, 350k, topics).
I did a dry run and everything worked as it should.

My question is: will this script override Discourse specific settings like the ones in /admin/site_settings/ ? - I’m asking this as I want to make a final migration of the content that came up in the meantime on the SMF site, but I would not want to overwrite the settings already configured in /admin/site_settings/.

Thank you

1 « J'aime »

No it should not override any of the site settings.

1 « J'aime »

Thank you so much.

I don’t have the expertise to “read” the script and what exactly it is copying over. I was hoping the same

Merci pour ce guide.

Je suis bloqué juste après votre remarque :

Pour assurer la compatibilité de la base de données, j’ai dû modifier notre plugin d’authentification temporaire, mais votre expérience peut varier :

J’obtiens l’erreur suivante :

Le plugin caching_sha2_password n'a pas pu être chargé : /usr/lib/x86_64-linux-gnu/mariadb19/plugin/caching_sha2_password.so : impossible d'ouvrir le fichier partagé : Aucun fichier ou dossier de ce type (Mysql2::Error::ConnectionError)

Pourriez-vous, s’il vous plaît, m’indiquer une piste pour résoudre ce problème ? Je suppose que cela est lié au changement du « plugin d’authentification de la base de données ». Si c’est le cas, comment procéder ?

Merci !

Ensuite, j’ai essayé d’importer la base de données dans une base MySQL distincte en dehors de Docker, etc. Elle s’exécute sur localhost.

Maintenant, lorsque j’exécute le script, je reçois cette erreur au même moment qu’auparavant :

from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/mysql2-0.5.3/lib/mysql2/client.rb:90:in initialize' /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/mysql2-0.5.3/lib/mysql2/client.rb:90:in connect’: Impossible de se connecter au serveur MySQL local via le socket ‘/var/run/mysqld/mysqld.sock’ (2) (Mysql2::Error::ConnectionError)

J’ai essayé d’attendre un certain temps et de relancer comme indiqué dans le guide, mais malheureusement, le même résultat se produit systématiquement. Quelqu’un pourrait-il m’aider, s’il vous plaît ?

Merci

Voici une capture d’écran https://drive.google.com/file/d/1z8TLY4zBr0KzrL9aJDQTG4NKG5Dhbg11/view?usp=drivesdk