(Ersatzweise) Wie man von SMF2 nach Discourse migriert / importiert

:mega: Dieses Dokument wurde durch diesen anderen SMF2-Leitfaden ersetzt: Migrate an SMF2 forum to Discourse

Ich wollte unseren guten alten SMF2-Forum wirklich zu Discourse migrieren. Wir haben über 1000 Mitglieder und rund 20.000 Beiträge in etwa 2.000 Themen.
Auf SMF2 haben wir keine Umfragen oder Anhänge verwendet – tatsächlich hatte nicht einmal jeder ein Avatar. Einige Beiträge verließen sich jedoch stark auf „erweiterten" BBCode.

So haben wir das umgesetzt.

Voraussetzungen

Installieren Sie Discourse einfach auf die übliche Weise.
Ich habe das Discourse BBCode-Plugin hinzugefügt, um Listen, Größen, Farben usw. von Haus aus zu verarbeiten.

Wenn Sie keine Remote-Verbindung zu Ihrer SMF2-MySQL-Datenbank herstellen können, müssen Sie Ihre Daten aus einem Dump in einen temporären Docker-Container importieren.

Wenn Ihre Datenbank Remote-Verbindungen akzeptiert – oder auf demselben Host läuft, können Sie diesen Schritt überspringen.

Ein temporärer Docker MySQL-Container

Sichern Sie Ihre Datenbank:

cd /tmp/
mysqldump –u[Benutzername] –p[Passwort] [Datenbankname] > sqldump.sql

Erstellen Sie den temporären Docker MySQL-Container:

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

Dann betreten Sie ihn:

docker exec -it mysql bash

Importieren Sie Ihren Datenbank-Dump:

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

Wenn Sie den folgenden Fehler erhalten:

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

Warten Sie einfach eine Minute, bis der Container vollständig hochgefahren ist.

Für die Datenbankkompatibilität musste ich den Authentifizierungsplugin meiner temporären Datenbank ändern, aber bei Ihnen kann das abweichen:

mysql -uuser -ppass db

Verwenden Sie diese Abfrage:

ALTER USER user
IDENTIFIED WITH mysql_native_password
BY 'pass';

Melden Sie sich dann ab und überprüfen Sie die IP-Adresse Ihrer MySQL-Instanz:

exit
docker inspect mysql | grep IPAddress

Sie haben jetzt eine funktionierende Kopie Ihrer SMF2-Datenbank.

Ein temporärer Discourse-Import-Container

Erstellen wir einen neuen Container namens „import", basierend auf dem Standard-App.yml-Container:

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

nano containers/import.yml

Fügen Sie die mysql-dep-Vorlage zu Ihrem neuen Import-Container hinzu:

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
## Kommentieren Sie diese beiden Zeilen aus, wenn Sie Lets Encrypt (https) hinzufügen möchten
  #- "templates/web.ssl.template.yml"
  #- "templates/web.letsencrypt.ssl.template.yml"
  - "templates/import/mysql-dep.template.yml"

Dann einfach:

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

Importieren in Discourse

Sobald der Import-Container neu erstellt wurde, müssen wir ihn für unseren neuesten Trick betreten:

/var/discourse/launcher enter import
cd /var/www/discourse/ # Das Skript muss von diesem genauen Verzeichnis aus gestartet werden, aber Sie sollten ohnehin dort gelandet sein
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: Der Hostname Ihrer SMF2-MySQL-Datenbank (hier die IP eines Docker-Containers);
  • -u: SMF2-MySQL-Benutzer;
  • -p: SMF2-MySQL-Passwort;
  • -d: SMF2-MySQL-Datenbank;
  • -f: SMF2-Tabellenpräfix;
  • -t: SMF2-Zeitzone.

Bereinigung

Wenn Sie den temporären MySQL-Docker-Container erstellt haben, stoppen und entfernen Sie ihn:

docker stop mysql
docker rmi mysql

Stoppen Sie den Discourse-„import"-Container und verwenden Sie den Launcher zur Bereinigung:

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

Ich habe es tatsächlich geschafft, meinen Hauptcontainer zu zerstören :slight_smile: Kein Problem:

/var/discourse/launcher rebuild app

Discourse-Einstellungen nach dem Import

Einige Standardeinstellungen können Probleme mit importierten Beiträgen und Berechtigungen verursachen. Ändern Sie diese je nach Bedarf im Discourse-Einstellungsbereich:

  • min topic title length: Ich habe sie auf 3 geändert – Themen mit zu kurzen Titeln erwiesen sich als sehr schwer zu bearbeiten (konnten nicht verschoben werden usw.);
  • title prettify: Ich musste es ausschalten – Themen, deren Titel nicht mit einem Großbuchstaben begannen, erwiesen sich als sehr schwer zu bearbeiten (konnten nicht verschoben werden usw.).

Bibliografie

10 „Gefällt mir“

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 „Gefällt mir“

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 „Gefällt mir“

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 „Gefällt mir“

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 „Gefällt mir“

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 „Gefällt mir“

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 „Gefällt mir“

No it should not override any of the site settings.

1 „Gefällt mir“

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

Vielen Dank für den Leitfaden.

Ich stecke direkt nach folgendem Satz fest:

Für die Datenbankkompatibilität musste ich unser temporäres Datenbankauthentifizierungs-Plugin ändern, aber bei Ihnen kann es anders aussehen:

Ich erhalte den Fehler:

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)

Könnten Sie mir bitte einen Hinweis geben, wie ich das beheben kann? Vermutlich hängt es mit der Änderung des „Datenbankauthentifizierungs-Plugins

Als Nächstes habe ich versucht, die Datenbank in eine separate MySQL-Datenbank außerhalb von Docker zu importieren usw. Sie läuft auf localhost.

Wenn ich das Skript jetzt ausführe, erhalte ich an derselben Stelle wie zuvor diesen Fehler:

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)

Ich habe versucht, eine Weile zu warten und es erneut auszuführen, wie in der Anleitung empfohlen – leider tritt immer dasselbe Ergebnis auf. Kann mir jemand bitte helfen?

Vielen Dank

Hier ist ein Screenshot https://drive.google.com/file/d/1z8TLY4zBr0KzrL9aJDQTG4NKG5Dhbg11/view?usp=drivesdk