(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

Thank you for the guide.

I’m stuck right after you say:

For database compatibility, I had to change our temporary database authentification plugin, but I suppose your mileage may vary:

I get the error:

Plugin caching_sha2_password could not be loaded: /usr/lib/x86_64-linux-gnu/mariadb19/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory (Mysql2::Error::ConnectionError)

I wonder if you could give me a clue as to how fix this please? Presumably it’s related to changing the ‘database authentication plugin’? If so, how do I do that please?

Thank you!

Next I tried importing the DB into a separate MySQL DB outside of Docker, etc. It’s running on localhost.

Now when I run the script I get this error at the same point as before:

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’: Can’t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock’ (2) (Mysql2::Error::ConnectionError)

I have tried waiting for a period and re-running as per the guidance in the guide - but the same result always occurs unfortunately. Can anyone help me please?

Thank you

Here is a screenshot 2020-12-02_00-00-16.png - Google Drive