Migrieren Sie ein Phorum-Forum zu Discourse

Wenn Sie ein altes Phorum-Forum haben und über eine Migration zu Discourse nachdenken, ist dieses Tutorial genau das Richtige für Sie. Der Prozess ist unkompliziert, und wir verwenden das offizielle Phorum-Import-Skript. Legen wir los.

Auf hoher Ebene werden wir Folgendes tun:

  • Vorbereitung der lokalen Entwicklungsumgebung.
  • Exportieren der Datenbank aus der Produktionsumgebung.
  • Importieren der Produktionsdatenbank in eine lokale Discourse-Instanz.
  • Ausführen des Phorum-Import-Skripts.

Was migriert werden kann

  • Kategorien
    • Alle Foren und Ordner => Stammkategorie
  • Themen & Beiträge
  • Benutzer (mit folgenden Attributen)
    • Sperrstatus
    • Benutzername
    • Vor- und Nachname => Name
    • E-Mail
    • Admin-Status
    • Hinzugefügt am
    • Zuletzt aktiv

Vorbereitung der lokalen Entwicklungsumgebung

Folgen Sie einer dieser Anleitungen, um Discourse selbst zu installieren, und konsultieren Sie diese Anleitung, falls Sie Probleme haben.

Installieren Sie einen MySQL-Datenbankserver;

Ubuntu 18.04:

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

Nach Abschluss der MySQL-Installation überprüfen Sie den Status:

$ systemctl status mysql.service

Falls er nicht läuft, führen Sie Folgendes aus:

$ 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

Überprüfen Sie den Status der Dienste:

$ brew services list

Sie sollten etwas Ähnliches wie Folgendes sehen:

...
mysql@5.7         started
...

Andernfalls führen Sie Folgendes aus und überprüfen erneut:

$ brew services start mysql@5.7

Für Windows können Sie sich an den offiziellen Installationsleitfaden halten.

Diese Umgebung wird unser Discourse-Server sein.

Exportieren der Datenbank aus der Produktionsumgebung:

Exportieren Sie die Produktionsdatenbank (vom Phorum-Produktionsserver):

$ mysqldump -u BENUTZERNAME -p DATENBANKNAME > phorum_dump.sql

Kopieren Sie den Datenbank-Dump auf den Discourse-Server.

:bulb: Verwenden Sie scp oder rsync, um die Datenbank zu kopieren. Sie können sie natürlich auch vorher gzipen.

Importieren der Produktionsdatenbank in den Discourse-Server

Auf dem Discourse-Server erstellen Sie eine Datenbank:

$ mysql -u root

:bulb: Wenn Ihr Datenbankbenutzer ein Passwort hat, sollten Sie Folgendes verwenden: mysql -u root -p und dann Ihr Passwort eingeben.

mysql> CREATE DATABASE phorum;

Stellen Sie sicher, dass die Datenbank erstellt wurde:

mysql> SHOW DATABASES;

Sie sollten etwas Ähnliches wie Folgendes sehen:

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

Dies ist eine leere Datenbank. Unser nächster Schritt ist der Import der Produktionsdatenbank darin.

$ mysql -u root phorum < phorum_dump.sql

Da wir schon dabei sind, holen wir uns die Tabellenvorlage. Wir werden sie später benötigen:

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

Sie werden etwas Ähnliches wie Folgendes sehen:

+---------------------------+
| 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)

Aus der obigen Ausgabe können Sie erkennen, dass die Vorlage pw_ ist.

Ausführen des Phorum-Import-Skripts

Installieren Sie zuerst die Abhängigkeiten des Importers:

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

Konfigurieren wir nun das Skript entsprechend unseren Anforderungen. In unserem Beispiel reicht Folgendes:

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

# ...

host: "localhost",
username: "root",
password: "", # Ändern Sie dies, wenn Sie ein Passwort für die MySQL-Datenbank haben
database: PHORUM_DB

Wenn Sie eine URL-Weiterleitung erstellen möchten, sollten Sie Folgendes auskommentieren:

# 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

Es wird dann so aussehen:

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

Führen Sie den Importer mit einer sauberen Discourse-Instanz aus:

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

Der Importer verbindet sich mit dem MySQL-Server und migriert unsere Phorum-Datenbank in die Discourse-Datenbank.

Starten Sie den Discourse-Server, nachdem der Importer mit dem Import fertig ist:

$ bundle exec rails server

Starten Sie Sidekiq, um die migrierten Daten zu verarbeiten:

$ bundle exec sidekiq

:bulb: Sie können den Fortschritt von Sidekiq unter http://localhost:3000/sidekiq/queues überwachen.

Richten Sie Ihren Discourse-Produktionsserver ein, indem Sie diesem Tutorial folgen.

Erstellen Sie ein Backup der Discourse-Datenbank und laden Sie es gemäß diesem Tutorial auf Ihren Discourse-Produktionsserver hoch.

Es ist erledigt :tada:

7 „Gefällt mir“

Ich stehe kurz vor der Migration eines Phorum-Forums zu Discourse. Ich möchte die an Beiträge angehängten Dateien (meist Bilder) erhalten. Es sieht so aus, als ob dies im aktuellen Migrations-Skript nicht unterstützt wird. Hat sich das schon jemand genauer angesehen?

1 „Gefällt mir“

Ich habe einige Anpassungen am Migrations-Skript für „phorum" vorgenommen, einschließlich der Migration von Anhängen, Dateien und Uploads. Der Pull Request befindet sich hier:

1 „Gefällt mir“

Vielen Dank für die Skripte!

Ich finde jedoch, dass das Handbuch ziemlich roh und unklar ist. Ich musste mich z. B. am Xenforo Migrationsleitfaden orientieren, um tatsächlich zu verstehen, was Sie hier vorschlagen. Lassen Sie mich einige fehlende Schritte hinzufügen:

  • Discourse am Laufen haben
  • Erstellen Sie einen mysqldump vom ursprünglichen Phorum - alles klar, alles gut.
  • Kopieren Sie den Datenbank-Dump in den Discourse-Ordner docker cp/path/to/backup/phorum_db.sql.gz app:/shared/phorum_db.sql.gz (unter der Annahme, dass app der Standardcontainername ist)
    Und hier die fehlenden Teile:
  • Springen Sie tatsächlich in den Discourse Docker Container und installieren Sie MySQL dort:
docker exec -it app bash
apt-get update && apt-get upgrade
# pv nur zur Bequemlichkeit, um den Fortschritt anzuzeigen, lsb-release wird von etwas benötigt
apt-get install -y lsb-release pv mariadb-server mariadb-client libmariadb-dev
service mariadb start

Beachten Sie, dass die MySQL-Installation etwas kniffliger ist, aber Mariadb sollte genauso gut funktionieren.

Erstellen Sie dann eine Datenbank: mysqlCREATE database phorum.

Füllen Sie sie dann aus dem Backup: pv phorum_db.sql.gz | gunzip | mysql phorum (kein gunzip erforderlich, wenn Ihr Dump reines SQL ist)

Fügen Sie MySql-Unterstützung zu Ruby hinzu:

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

Ändern Sie die Daten im Migrationsskript (Datenbankanmeldeinformationen, Präfix, Permalinks):

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

Und dann zurück zum ursprünglichen Leitfaden, alles gut dort:

Führen Sie den Importer mit einer sauberen Discourse-Instanz aus:

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

Wenn Ihre Discourse-Datenbank nicht wirklich sauber ist, bereinigen Sie sie besser vorher mit bundle exec rake db:drop db:create db:migrate.

Wenn es mit “PG::ConnectionBad: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: FATAL: Peer authentication failed for user "discourse" (PG::ConnectionBad)” fehlschlägt:

  1. Wenn Sie den Fehler 'Peer authentication failed for user "discourse"' erhalten:
  2. Bearbeiten Sie die Datei /etc/postgresql/13/main/pg_hba.conf
  3. Ändern Sie alle ‘peer’ in ‘trust’ und speichern Sie die Datei
  4. Laden Sie den Postgres-Server neu: /etc/init.d/postgresql reload (oder vielleicht psql -U postgres -c "SELECT pg_reload_conf();", aber das schlug bei mir manchmal fehl)

Zuerst werden die Benutzermigrationen ausgeführt, die relativ langsam sein können (~1,2k Benutzer/Minute laut Skriptausgabe. Ich hatte 100k Benutzer, also…). Dann werden Kategorien erstellt und mit der Migration von Nachrichten und Themen begonnen (gleiche Geschwindigkeit, ~1,2k/Minute), aber zu diesem Zeitpunkt können Sie bereits auf die Website zugreifen und sehen, wie sie aussieht.

Scheint viel reibungsloser zu laufen, als ich es von einer so alten Engine wie Phorum erwartet hätte. Es scheint keine Migration von privaten Nachrichten (PM) zu geben, aber das sollte für mich zumindest kein Hindernis sein.

Nochmals vielen Dank für das Skript und die Bemühungen!

Es ist schwierig, eine Anleitung für etwas so Kompliziertes zu schreiben, die alle Schritte abdeckt. Herauszufinden, welche Teile einem bestimmten Benutzer mitgeteilt werden müssen, ist komplex. Gute Arbeit, eine weitere Anleitung mit den fehlenden Teilen gefunden zu haben.

Vielleicht hättest du die MySQL-Vorlage einbeziehen können, um MySQL zu installieren, oder vielleicht hättest du auf einen bereits installierten MySQL-Server zugegriffen (was ich normalerweise tue).

Wenn du wolltest, könntest du dir andere Skripte ansehen, die PMs importieren, um sie als Beispiel zu verwenden.