Migration eines NodeBB-Forums mit Redis zu Discourse

Dieses Tutorial zeigt Ihnen, wie Sie den NodeBB Importer verwenden, um ein NodeBB-Forum auf die Discourse-Plattform zu migrieren. Wenn Ihr NodeBB-Forum MongoDB als Backend verwendet, folgen Sie diesem Tutorial. Keine Sorge, es ist ein einfacher Prozess. Legen wir los.

Der Plan

  • Vorbereitung der Entwicklungsumgebung.
  • Exportieren der Datenbank aus der Produktionsumgebung.
  • Importieren der Produktions-Datenbank in eine Discourse-Instanz.
  • Ausführen des Importerskripts.

Welche Daten können migriert werden?

  • Gruppen
  • Kategorien
    • Root-Kategorie => Root-Kategorie
    • Unterkategorie & Unter-Unterkategorie => Unterkategorie
  • Anhänge
  • Themen & Beiträge
    • angepinntes Thema => angepinntes Thema
    • Themenaufrufe
    • Alle Stile werden zusammen mit Erwähnungen, Emojis und Anhängen einwandfrei migriert.
  • Benutzer (mit folgenden Attributen)
    • Avatare (Profilbild)
    • Profilhintergrund
    • Sperrstatus
    • Name
    • Benutzername
    • E-Mail
    • Bio
    • Administrator
    • Website
    • Standort
    • Beitrittsdatum
    • Gruppe

Vorbereitung der lokalen Entwicklungsumgebung

Richten Sie Ihre Entwicklungsumgebung ein, indem Sie eine dieser Anleitungen befolgen:

Ab jetzt beziehe ich mich auf diese Umgebung als Discourse-Server.

:bulb: Bitte verwenden Sie diese Anleitung, wenn Sie Probleme bei der Einrichtung von Discourse haben.

Exportieren des Produktions-Datenbank-Dumps (vom NodeBB-Server):

Fahren Sie Ihr Forum herunter. Dies wird von NodeBB empfohlen.

$ cd /path_to_nodebb
$ ./nodebb stop

Sie sollten auch Redis herunterfahren:

$ sudo service redis-server stop
$ sudo service redis-server status
# redis-server is not running

Ihre Datenbank befindet sich in einer einzigen Datei. Diese Datei wird von Redis automatisch in regelmäßigen Abständen generiert. Normalerweise befindet sich diese Datei in /var/lib/redis/dump.rdb. Sie können den Pfad auch über die Redis-CLI abrufen:

$ redis-cli
127.0.0.1:6379> config get dir
# "/var/lib/redis"
127.0.0.1:6379> exit
$ ls -la /var/lib/redis
# -rw-rw-r-- 1 redis redis 2664346 Aug 4 16:24 dump.rdb

:bulb: Wenn Ihr Redis-Server ein Passwort erfordert, verwenden Sie AUTH IHR_PASSWORT.

:bulb: Wenn Sie aus irgendeinem Grund Ihre Datenbankdatei nicht am erwarteten Pfad finden, können Sie sie manuell generieren, indem Sie SAVE in der Redis-CLI ausführen.

Jetzt müssen Sie die Forum-Anhänge kopieren:

$ cd /path_to_nodebb_root_folder/
$ tar -czf ./uploads.tar.gz ./public/uploads

Da Sie nun Ihre Datenbank und die Forum-Assets haben, müssen Sie sie auf den Discourse-Server kopieren.

Importieren der Datenbank

Wenn Sie die Anweisungen zur Installation von Discourse befolgt haben, sollten Sie auf dem Discourse-Server einen Redis-Server installiert haben:

$ redis-server -v
# Redis server v=5.0.2...

Jetzt müssen Sie den Redis-Server stoppen (wichtig).

Linux-basiert:

$ sudo service redis-server stop
$ sudo service redis-server status
# redis-server is not running

Mac OS:

$ brew services stop redis
$ brew services list
# redis stopped

Was Sie jetzt tun müssen, ist die Datenbank des Forums in den lokalen Redis-Datenbankpfad zu kopieren. Der Importer muss eine Verbindung zum Redis-Server herstellen und die NodeBB-Datenbank in die Discourse-Datenbank migrieren. Dieser Schritt geht davon aus, dass Sie nichts Wichtiges in Ihrer Redis-Datenbank haben; andernfalls sollten Sie ein Backup erstellen.

$ redis-cli
127.0.0.1:6379> config get dir
# "/var/lib/redis"

Prüfen Sie, ob Dateien vorhanden sind, und notieren Sie sich den aktuellen Benutzer und die Berechtigungen von dump.rdb:

$ ls -la /var/lib/redis

Kopieren Sie die NodeBB-Datenbank (ersetzen, falls vorhanden):

$ cp dump.rdb /var/lib/redis

Später, wenn Sie versuchen, eine Verbindung zum Redis-Server herzustellen, können Sie den Fehler Fatal error loading the DB: Permission denied erhalten. Daher sollten Sie die Berechtigungen von dump.rdb ändern:

# Ersetzen Sie den Benutzer durch denselben, den Sie zuvor notiert haben.
$ sudo chown redis:redis /var/lib/redis/dump.rdb
$ sudo chmod 660 /var/lib/redis/dump.rdb

Jetzt müssen Sie uploads.tar.gz in einen beliebigen Pfad Ihrer Wahl entpacken:

$ tar xvzf uploads.tar.gz

Ausführen des Importerskripts

Da unsere Datenbank nun vorhanden ist, können wir unser Importerskript ausführen. Zuvor müssen wir einige Konfigurationen bearbeiten. Wahrscheinlich müssen Sie nur die folgenden zwei Zeilen ändern.

Dies ist der Pfad zu Ihrem NodeBB-Uploads-Ordner:

ATTACHMENT_DIR = '/absolute_path/uploads'

Dies ist der Name der Datenbank in Redis. Der Standardwert ist 0:

db: 0

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

$ cd ~/discourse
$ bundle exec rake db:drop db:create db:migrate
$ bundle exec ruby script/import_scripts/nodebb/nodebb.rb

Der Importer stellt eine Verbindung zum Redis-Server her und migriert alles in die Discourse-PostgreSQL-Datenbank.

Nachdem der Importer fertig ist, starten Sie die Discourse-Plattform:

$ bundle exec rails server

Starten Sie Sidekiq, um die migrierten Daten zu verarbeiten:

$ bundle exec sidekiq

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

Erstellen Sie ein Discourse-Backup und laden Sie es auf Ihren Discourse-Produktionsserver hoch, indem Sie dieses Tutorial befolgen.

Damit sollten Sie eine vollständige Migration von NodeBB zu Discourse erfolgreich durchgeführt haben :tada:
Falls Sie Fragen haben, helfe ich gerne :slight_smile:

9 „Gefällt mir“

Ich nörgle in verschiedenen Threads über meine Migration :smiley:

Ich habe ein Forum auf NodeBB mit Redis und konnte den Prozess in der Entwicklungsversion ohne Fehler abschließen, habe aber noch einige Fragen:

  • Im Migrationsskript habe ich den absoluten Pfad, wo ich die Bilder und Forendateien hatte, korrekt angegeben. Als ich mit der Migration fertig war, sehe ich, dass die Bilder in den Threads nicht sichtbar sind. In Discourse werden sie unter der URL verlinkt: assets/uploads, aber dort ist nichts.

    In der Entwicklungsversion habe ich dies gelöst, indem ich einen symbolischen Link erstellt habe:
    ln -s path/to/images public/assets

    Aber was muss ich in der Produktionsversion tun, um einen Link von assets/upload innerhalb des Docker zum Ordner zu erstellen, in dem ich die alten Bilder abgelegt habe?

  • Es scheint, dass alle Foren-Threads korrekt migriert wurden, aber ich sehe die Direktnachrichten zwischen den Benutzern nicht… sind sie nicht in der Migration enthalten?

  • Das Skript hat keine Benutzeravatare erkannt.

  • Und schließlich sehe ich in dem neuen Forum keine Einbettungen von YouTube-Videos oder Tweets. Muss ich dafür ein Plugin installieren?

Vielen Dank für Ihre Hilfe.

Das sollte nicht notwendig sein. Wenn Sie Ihre Originalbilder in einem Pfad haben, der in ATTACHMENT_DIR konfiguriert ist, erstellt Discourse einen Upload (im Wesentlichen eine Kopie der Datei) in Pfad-zu-Ihrer-Installation/discourse/public/uploads/default/. Wenn Sie die Uploads-Tabelle überprüfen, sollte sie wie folgt aussehen:

[1] pry(main)> Upload.last
  Upload Load (1.5ms)  SELECT "uploads".* FROM "uploads" ORDER BY "uploads"."id" DESC LIMIT 1
=> #<Upload:0x0000000109a460a0
 id: 196,
 user_id: 251468,
 original_filename: "Screenshot 2023-11-17 at 11.52.39.png",
 filesize: 25174,
 width: 398,
 height: 248,
 url: "/uploads/default/original/1X/2e5f7a09ba3bcd3a3597285771c53c16f20b18dd.png",
 created_at: Fri, 17 Nov 2023 19:12:47.455954000 UTC +00:00,
 updated_at: Fri, 17 Nov 2023 19:12:47.484137000 UTC +00:00,
 sha1: "2e5f7a09ba3bcd3a3597285771c53c16f20b18dd",

Korrekt, es sieht so aus, als ob das nodebb-Skript keine privaten Nachrichten migriert. Sie können andere Skripte überprüfen, um zu sehen, wie private Nachrichten importiert werden. Überprüfen Sie zum Beispiel das Vanilla-Skript.

Die Avatare werden wahrscheinlich nicht korrekt hochgeladen, wahrscheinlich aus demselben Grund, den Sie oben erwähnt haben.

Kein Plugin erforderlich. Sie müssen wahrscheinlich Ihre Beiträge erneut backen. Sie können warten, bis Sidekiq dies automatisch tut, oder Sie können einen vollständigen Re-Bake von der Konsole ausführen:

rake posts:rebake

Das nodebb-Skript wurde seit einigen Jahren nicht mehr aktualisiert, daher vermute ich, dass einige Teile davon veraltet sind und geändert werden müssen, damit es mit Ihren Daten funktioniert. Hoffe, das hilft!

1 „Gefällt mir“