Meine phpBB-Migrationsreise (PostgreSQL)

Ich teile meine Erkenntnisse, während ich eine Migration von phpBB3 zu Discourse durchführe.

Lösungen beinhalten:

  • PostgreSQL-Quelldatenbank
  • Emoji
  • Anpassungen am Importer (Behebung des Zitat-Bugs, verbesserte BBCode-Unterstützung (einschließlich YouTube), Anhangskommentare)
  • Weich gelöschte Beiträge werden als normale Beiträge importiert

Ich bin sehr wählerisch, daher sollten Sie, wenn Sie mir folgen, ein ziemlich gutes Ergebnis erzielen können.

Ich erwäge, von phpbb zu Discourse zu wechseln (installierte Versionshistorie: 3.2.1 - 3.2.8).
Das Problem ist, dass ich PostgreSQL für die Datenbank verwende. Vorschläge? Ich habe es noch nicht ausprobiert, gehe aber davon aus, dass es basierend auf dem OP noch nicht unterstützt wird.

Kam das neue Importskript jemals heraus? Ich sehe, das war etwas über ein Jahr her.

1 „Gefällt mir“

Das Skript für den Massenimport sollte für Sie funktionieren… discourse/script/bulk_import/phpbb_postgresql.rb at 52d4de7b45eb1b7c7997da2ba8bff83a3c22a3a5 · discourse/discourse · GitHub

4 „Gefällt mir“

Danke, @gerhard

Ist mein Verständnis korrekt?

  • script/import_scripts/phpbb3 und script/bulk_import sind komplett getrennte Importer.
  • Der Bulk-Importer ist weniger ausgefeilt (wenn auch schneller) und importiert beispielsweise keine Anhänge?

Wenn ja, dann scheint die Verwendung des Bulk-Importers Nachteile zu haben…

Gibt es dann keine andere Lösung? Wäre es ratsam, eine DB-Migration von PostgreSQL zu MySQL oder Ähnlichem in Betracht zu ziehen?

2 „Gefällt mir“

Ja, es gibt Nachteile. Wenn Sie sich mit Ruby auskennen, würde ich vorschlagen, die Dateien in discourse/script/import_scripts/phpbb3/database at main · discourse/discourse · GitHub so zu modifizieren, dass sie mit dem pg-Gem anstelle von mysql2 funktionieren.

Vielleicht? Ich habe keine Ahnung, wie einfach das wäre und ob es tatsächlich funktionieren würde. Sie können es ja mal versuchen…

1 „Gefällt mir“

Schade. Nun, ich werde es versuchen. Ich melde mich, wenn ich etwas herausgefunden habe.

2 „Gefällt mir“

Ist dieser Importer derjenige, der veraltet sein wird? Wie ist der Status des „neuen“? Ich versuche zu entscheiden, wie viel Aufwand ich hier investiere – wird es einen Upstream-Wert geben?

2 „Gefällt mir“

Ich habe mich selbst nicht mit dem Problem von PostgreSQL zu MySQL beschäftigt, aber rein aus der Perspektive der Migration von phpBB zu Discourse ist meine Meinung: Tun Sie alles, was nötig ist, um die Migration zu bewerkstelligen.

Ich habe zwei phpBB-Foren nach Discourse migriert, und obwohl es wie üblich das übliche Murren einer kleinen Anzahl von Benutzern gab, das man bei jeder Änderung bekommt, sind die Vorteile von Discourse es absolut wert! Nicht nur ist Discourse einfacher zu warten und zu verwalten, sondern das integrierte Benutzerengagement, die Bildverarbeitung, die Benutzeranpassung und die Lesbarkeit von Discourse sind nur einige der Funktionen, die phpBB so weit voraus sind, dass kein Vergleich möglich ist. Sie erhalten auch einen viel besseren Support mit Discourse.

Ich bin kein Experte, aber eine schnelle Suche zeigt, dass Sie von PostgreSQL zu MySQL migrieren könnten, indem Sie einen Schema-Dump durchführen, die Datentypen in den Schema-Anweisungen ändern, um sie an die von MySQL verwendeten anzupassen, das geänderte Schema verwenden, um die Tabellen in einer MySQL-Datenbank zu erstellen, und dann einen CSV-Export und -Import Tabelle für Tabelle durchführen.

Sobald Sie die MySQL-Datenbank haben, könnten Sie das normale phpBB-Migrationsskript verwenden und alle Ihre Anhänge haben.

Es wird sich die Mühe wert sein!

3 „Gefällt mir“

Das klingt nach einer Katastrophe, wenn man nicht vorsichtig mit den Zeichensätzen und Kollationen der Datenbank umgeht.

Vor ein paar Jahren habe ich angefangen, daran zu arbeiten, aber es ist unvollendet und veraltet. Aber vielleicht ist es hilfreich.

3 „Gefällt mir“

Ich wollte nicht andeuten, dass es einfach wäre, nur dass es die Mühe wert ist, sogar manuell möglich ist und es reichlich Ressourcen zu geben scheint, um es zu erreichen, sowohl mit automatisierten Werkzeugen als auch manuell. :grinning:

3 „Gefällt mir“

Da ich Ruby hasse und der bestehende Importer zugunsten eines Massenimporteurs (der noch nicht gut genug für meine Zwecke ist) veraltet sein wird, gehe ich die PostgreSQL → MySQL-Migrationsstrategie an.

Ich komme mit dem Migrationsassistenten von MySQL Workbench gut voran. Ich werde eine kleine Anleitung schreiben, wenn es erfolgreich ist, aber bisher sieht es vielversprechend aus.

2 „Gefällt mir“

Bisher hänge ich bei diesem Problem fest:

https://bugs.mysql.com/bug.php?id=89048

Im Grunde schlägt MySQL Workbench beim Importieren von Unicode fehl. Ich werde es morgen mit MariaDB versuchen und sehen, ob ich die Standard-Datenbankkodierung oder etwas anderes vor dem Import einstellen kann.

1 „Gefällt mir“

Es wäre großartig gewesen, wenn MySQL Workbench funktioniert hätte. Ich habe eine Reihe von Fehlerberichten dazu gesehen, als ich mir die Optionen angesehen habe, und deshalb habe ich es nicht empfohlen.

Ich habe die Methode mit dem Schema-Dump und dem CSV-Export/Import bereits einmal erwähnt und werde sie nur noch einmal mit einer leichten Modifikation erwähnen, um sie viel einfacher zu machen, und dann schweigen.

Wenn Sie einen GUI-Weg einschlagen möchten:

  1. Besorgen Sie sich einen Export aller Tabellen nur mit der Struktur aus einer funktionierenden Kopie derselben Version von phpBB3, die Sie verwenden und die MySQL/MariaDB ausführt. Es würde jemanden buchstäblich zwei Minuten dauern, einen aus phpMyAdmin zu erstellen, das auf den meisten Webhosts verfügbar ist, die MySQL/MariaDB ausführen. (Alternativ können Sie die CREATE TABLE-Anweisungen, die Sie benötigen, aus den phpBB3-Installationsskripten erhalten, wenn Sie niemanden dazu bringen können, den Export nur mit der Struktur für Sie durchzuführen, oder sogar ein günstiges Webhosting-Konto verwenden, um eine saubere Installation Ihrer Version von phpBB3 in einer MySQL/MariaDB-Umgebung durchzuführen und dann die Daten in den erstellten Tabellen zu löschen, um eine leere MySQL/MariaDB-Datenbank zu erstellen.)
  2. Greifen Sie auf einen Webhost mit MySQL/MariaDB und phpMyAdmin zu, erstellen Sie die Datenbank und importieren Sie die Struktur aus dem in Schritt 1 erstellten Export nur mit der Struktur mithilfe von phpMyAdmin.
  3. Erstellen Sie einen CSV-Export für jede Tabelle aus Ihrer PostgreSQL-Datenbank und führen Sie einen CSV-Import in die entsprechende Tabelle mithilfe von phpMyAdmin in Ihrer neuen MySQL/MariaDB-Datenbank durch.

Ich denke, das wird Probleme mit Zeichensätzen und Kodierungen verhindern, und Sie müssen nicht alle entsprechenden Datentypen und Feldgrößen herausfinden, die erforderlich wären, wenn Sie versuchen würden, den Schema-Dump manuell von PostgreSQL zu konvertieren.

Ich kann Ihnen eine SQL-Anweisung nur mit der Struktur geben, aber die einzige Datenbank, die ich noch habe, ist von phpBB3 3.3.8, daher kann dies zu weiteren Problemen führen, wenn Sie v. 3.2.x verwenden.

3 „Gefällt mir“

haha. ja, es brauchte einige nicht offensichtliche Tricks, um es überhaupt so weit zum Laufen zu bringen, wie ich es geschafft habe. Ich denke, es könnte immer noch funktionieren, aber danke, dass du mir eine weitere Möglichkeit zum Erkunden gibst.

1 „Gefällt mir“

ok, phew. hier ist meine Lösung für den PostgreSQL-Import.

dies bringt Sie von einem Postgres-Dump zu einem funktionierenden MariaDB-Server, in den Sie den Importer einstecken können. erfordert Docker Compose.

es funktioniert für phpbb 3.2. keine Ahnung von 3.3. wenn Sie dringend 3.3-Unterstützung benötigen, kann ich versuchen, es zu reparieren, wenn Sie mir einen phpbb 3.3 pg_dumpall-Dump geben.

3 „Gefällt mir“

phpbb_smilies.zip (87.2 KB)

(Vergleich mit Standard-Smileys)

fwiw, hier ist meine Emoji-Lösung

ich gebe dir zwei Optionen:

  1. nativ
    • Wenn du die ursprünglichen phpBB-Emojis nicht beibehalten möchtest, kannst du sie auf native Emojis abbilden, die bereits in Discourse vorhanden sind.

:grin: :smile: :wink: :slightly_frowning_face: :astonished: :exploding_head: :confounded: :sunglasses: :joy: :rage:
:stuck_out_tongue: :person_facepalming: :sob: :imp: :smiling_imp: :roll_eyes: :exclamation: :question: :bulb: :arrow_forward:
:neutral_face: :smiley_cat: :nerd_face: :nerd_face:

  1. importiert
    • Wenn du die ursprünglichen phpBB-Emojis beibehalten möchtest und sie als Kurzcodes verfügbar haben möchtest, um sie weiterhin zu verwenden:
      • Bevor du den Importer ausführst, gehe zum Emoji-Bereich des Discourse-Dashboards (admin/customize/emojis)
      • Wenn du möchtest, erstelle zuerst eine Emoji-Gruppe namens phpbb oder etwas Ähnliches
      • Ziehe die Emoji-Dateien (5 auf einmal) aus den new_files in den Browser, um sie als benutzerdefinierte Emojis zu importieren.

Ich habe einen Zip-Ordner mit der Konfiguration für beide Optionen, der als import.yml im Zip-Ordner enthalten ist.

Ebenfalls im Zip-Ordner befindet sich eine Tabellenkalkulation, die dir bei der Entscheidung oder Erstellung deiner eigenen Zuordnung hilft:

phpbb_smilies
├── phpbb_smilies.xlsx # Hauptreferenz zur Entscheidungsfindung
├── import.yml # Konfigurationsdatei mit beiden Optionen
├── orig_phpbb_smilies.csv # Originale phpBB-Daten
├── orig_files # Originale phpBB-Emoji-Dateien
│   ├── icon_arrow.gif
│   └── ...
└── new_files # Emoji-Dateien umbenannt, um der Spalte `new_shortcode` in der Tabelle zu entsprechen
    ├── phpbb_arrow.gif
    └── ...
1 „Gefällt mir“

Hat jemand die Zitatzuordnung korrekt zum Laufen gebracht?

Hier ist ein Beispiel eines Originalbeitrags von phpbb, der ein Zitat enthält (Benutzername und Inhalt geändert, IDs usw. sind gleich)

[quote=someuser post_id=46649 time=1677556325 user_id=48]
foo
[/quote]

bar

So sieht es in Discourse aus:

Hier ist der Rohbeitrag, der nach Discourse migriert wurde:

[quote=", post:37, topic:1893"]
foo
[/quote]

bar

Die migrierten postid und topicid sind korrekt, aber der Benutzername fehlt. Dies führt dazu, dass er nicht interaktiv ist. Wenn der Benutzername ein leerer String ist, wird das Zitat nicht erweitert und man kann nicht darauf klicken, um dem Verweis auf den Originalbeitrag zu folgen.

Kann ich auf eine bessere Erfahrung hoffen, ohne Verbesserungen am Importer vorzunehmen? D.h. mache ich etwas falsch?

1 „Gefällt mir“

Ich bin ziemlich sicher, dass diese bei einem phpbb3-Import, den ich im letzten Monat durchgeführt habe, ordnungsgemäß funktioniert haben.

1 „Gefällt mir“

Ich habe das letzte Problem noch nicht gelöst, aber hier ist eine weitere Frage.

Ich stelle fest, dass nach Abschluss des Imports und dem Starten des App-Containers mein noch vorhandener phpBB-Server stark beansprucht wird. Ich glaube, das passiert während der Sidekiq-Nachbearbeitungsphase.

phpBB existiert noch unter www.example.com, und Discourse ist unter dc.example.com

Ich versuche zu verstehen, was tatsächlich passiert, welche Einstellungen während dieser Testmigration sinnvoll sind und welche Einstellungen für die endgültige Migration sinnvoll sein werden. Und ob ich phpBB für diese Sidekiq-Nachbearbeitung laufen lassen muss. Ich frage, weil ich keine Ahnung habe, was bei der Nachbearbeitung passiert.

Einige möglicherweise relevante Einstellungen in meiner aktuellen settings.yml:

import:
  # Set this if you import multiple phpBB forums into a single Discourse forum.
  site_name:
  site_prefix:
    # this is needed for rewriting internal links in posts
    original: example.com    # without http(s)://
    new: https://dc.example.com       # with http:// or https://

Wenn es noch etwas gibt, das ich mir ansehen muss, lassen Sie es mich bitte wissen.

Eine weitere Sache, die mir nicht klar ist, ist der www-Subdomain. Ich leite derzeit mit nginx für phpBB auf www um. Spielt es also im obigen Beispiel eine Rolle, ob ich original: example.com oder original: www.example.com angebe? Ähnliche Frage für new, wenn ich die endgültige Migration durchführe. Meine Benutzer würden tatsächlich von www.example.com auf Discourse zugreifen, aber ich weiß nicht, was die beste Vorgehensweise ist.

1 „Gefällt mir“

Es gibt tatsächlich ein Problem mit der Zitat-Analyse.
Ich habe gerade eine frisch installierte phpBB 3.2.8 (installiert auf mariadb) importiert.

Die Zitat-Zuordnung ist kaputt – das Benutzername-Feld ist in den importierten Zitaten leer, aber alles andere ist korrekt.

Discourse-Screenshot des importierten Beitrags:

Discourse importierter Beitrag:

[quote=", post:4, topic:12"]
[quote=", post:3, topic:12"]
[quote=", post:2, topic:12"]
msg 1
[/quote]

second
[/quote]

third
[/quote]

fourth

Originaler phpBB-Beitrag:

MariaDB [phpbb]> select post_text from phpbb_posts where post_id=5;
...
| <r><QUOTE author="admin" post_id="4" time="1678400691" user_id="2"><s/>[quote=admin post_id=4 time=1678400691 user_id=2]</s/>
<QUOTE author="admin" post_id="3" time="1678400685" user_id="2"><s/>[quote=admin post_id=3 time=1678400685 user_id=2]</s/>
<QUOTE author="admin" post_id="2" time="1678400675" user_id="2"><s/>[quote=admin post_id=2 time=1678400675 user_id=2]</s/>msg 1</e></quote>
second
</e></quote>
third
</e></quote>
fourth</r> |

Vielleicht werde ich doch noch Verbesserungen am Importer vornehmen…

3 „Gefällt mir“

behoben


Ich bin ziemlich wählerisch, was die Migration meines Forums angeht, daher verbessere ich den Importer weiter. Ich bin mir nicht sicher, ob ich mir die Mühe machen werde, PRs zu erstellen, da der Importer veraltet ist und einige meiner Korrekturen eher spezifisch für mein Forum sind, aber dieser Branch wird all meine Korrekturen kombiniert enthalten, falls er für jemanden nützlich ist:

Ich habe das Zitateproblem behoben, Unterstützung für einige häufig hinzugefügte BBcodes hinzugefügt, das Parsen von YouTube-Links weniger fehlerhaft gemacht und die Erweiterung für Erwähnungen/simplementions unterstützt. Ich habe noch mehr zu verbessern, wie z. B. die Unterstützung für mehrere Website-Präfixe (Hauptanwendungsfall ist, wenn Sie Links auf Ihrem Forum zu example.com und www.example.com haben).

Obwohl ich einige nicht-Vanilla-Sachen unterstütze, sollte es kein Problem sein, ihn auf einem Standard-phpBB-Forum ohne Erweiterungen auszuführen. Ich empfehle sowieso, meine zu verwenden.

Der einfachste Weg, ihn zu verwenden, ist, meinen Branch irgendwoher zu ziehen und das Verzeichnis der Import-Skripte im Container mit einem Bind-Mount zu überschreiben.

d. h. meine Änderungen irgendwoher ziehen:

git clone --filter=blob:none --no-checkout https://github.com/ftc2/discourse.git discourse_dev
cd discourse_dev
git sparse-checkout set --cone
git switch phpbb_import
git sparse-checkout set script/import_scripts

Fügen Sie dann dies zu Ihrer import.yml-Containerkonfiguration hinzu:

docker_args:
  - '-v /path/to/discourse_dev/script/import_scripts:/var/www/discourse/script/import_scripts'

Bauen Sie dann den Import-Container neu. Nachdem Sie ihn neu erstellt haben, möchten Sie wahrscheinlich dort, wo Sie mein Repository gezogen haben, einen Reset durchführen, da der Build-Prozess meine Dateien überschreiben wird, lol.

cd /path/to/discourse_dev
git reset --hard HEAD
chown -R 1000:1000 .
5 „Gefällt mir“