Ein XenForo-Forum zu Discourse migrieren

In dem Forum, das ich übertragen habe, wurde einmal das xengallery installiert, daher musste ich Folgendes ändern, da die Tabelle xfgallery nicht mehr existierte.

  def get_xf_sql(type, id)
    case type
    when :gallery
      return "SELECT NULL WHERE 1=0;"
    when :attachment
      <<-SQL
        SELECT a.attachment_id, a.data_id, d.filename, d.file_hash, d.user_id
        FROM #{TABLE_PREFIX}attachment AS a
        INNER JOIN #{TABLE_PREFIX}attachment_data d ON a.data_id = d.data_id
        WHERE attachment_id = #{id}
        AND content_type = 'post'
      SQL
    end
  end
1 „Gefällt mir“

Sie können versuchen, das Skript erneut auszuführen und zu sehen, ob es abgeschlossen wird.

Ihr System befindet sich auf einer einzigen Partition?

Der mysql-server-Installationsschritt ist nun veraltet. Es muss mariadb-server installiert werden.

sudo apt-get install mariadb-server mariadb-client libmariadb-dev-compat libmariadb-dev

Ich konnte die restlichen Schritte befolgen und die XF DB importieren, daher sollte jemand die Anleitung aktualisieren.

Jetzt bleibe ich beim folgenden Schritt stecken und brauche Hilfe.

echo "gem 'mysql2'" >>Gemfile
bundle install --no-deployment

Wenn ich das oben ausführe, erhalte ich den folgenden Fehler. Ich habe die Gemfile überprüft und sie enthält nur diese eine Zeile - gem ‘mysql2’

Diese Gemfile enthält keine explizite globale Quelle.
Wenn Sie keine explizite globale Quelle verwenden, kann dies dazu führen, dass eine andere lockfile generiert wird, abhängig von den Gems, die Sie lokal installiert haben, bevor Bundler ausgeführt wird.
Definieren Sie stattdessen eine globale Quelle in Ihrer Gemfile wie folgt: source "https://rubygems.org".
Konnte das Gem 'mysql2' nicht in lokal installierten Gems finden.
root@ip-172-566-459-13-app:/#

Ok, ich bin zum nächsten Schritt übergegangen. Jemand hat oben gepostet, dass wir uns im Ordner /var/www/discourse auf dem Container befinden und dann das Gem hinzufügen müssen.

Jetzt im letzten Schritt

RAILS_ENV=production bundle exec ruby script/import_scripts/xenforo.rb

bekomme ich diesen Fehler. Was könnte ich falsch machen?

`/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/postgresql_adapter.rb:63:in “rescue in new_client”: Wir konnten Ihre Datenbank nicht finden: discourse.
Verfügbare Datenbankkonfigurationen finden Sie in config/database.yml. (ActiveRecord::NoDatabaseError)Um diesen Fehler zu beheben:

  • Haben Sie die Datenbank nicht erstellt oder sie gelöscht? Um die Datenbank zu erstellen, führen Sie aus:
    bin/rails db:create
  • Hat sich der Datenbankname geändert? Überprüfen Sie, ob config/database.yml den korrekten Datenbanknamen enthält.`

Gelöst: Ich habe mich als Root-Benutzer angemeldet, musste zum ‘discourse’-Benutzer wechseln. Der Import hat begonnen.

4 „Gefällt mir“

Ich habe einen einigermaßen guten Server mit 4 CPUs und 16 GB RAM bekommen. Bei der aktuellen Migrationsrate der Beiträge wird es 9 Tage dauern, nur die Beiträge zu migrieren. Die Benutzer haben 2,5 Stunden für die Migration gebraucht. Man kann sicher sagen, dass das so für mich nicht funktionieren wird, aber zumindest kann ich einige Monate damit verbringen, mich damit vertraut zu machen, bis ich eine Lösung für diese Massenmigration gefunden habe.

PS:
Im Migrationsskript sehe ich, dass doppelte E-Mails nicht importiert werden. Wie wird Duplikat bestimmt? Mir ist aufgefallen, dass xyz@gmail.com gleich behandelt wird wie xyz+1@gmail.com und xy.z@gmail.com

Gibt es noch andere Muster?

Ich habe versucht, Migrationen auf einem VPS mit ähnlichen Spezifikationen wie mein persönlicher Computer durchzuführen, aber aus irgendeinem Grund war es immer viel, viel langsamer als die Verwendung meines Computers.

Heutzutage führe ich meine Migrationen immer lokal durch. Wie viele Beiträge haben Sie?

1 „Gefällt mir“

2,5 Millionen Beiträge.
Ich werde eine lokale Migration auf einem M1 Mac versuchen, um sie zu vergleichen.

1 „Gefällt mir“

Das ist so ziemlich alles. Die Prüfung auf Eindeutigkeit wird für die kleingeschriebene und normalisierte Version der angegebenen E-Mail-Adresse durchgeführt.

Wir normalisieren, indem wir alle Punkte entfernen und alles nach dem + im Benutzernamen ignorieren.

3 „Gefällt mir“

Die Geschwindigkeit einer einzelnen CPU ist der wichtige Faktor.

Auf meinen Maschinen ist eine Rate von 800-1000 Benutzern oder Beiträgen/Minute ziemlich typisch.

Beachten Sie, dass beim endgültigen Import nur die Benutzer und Beiträge importiert werden, die noch nicht importiert wurden, sodass dies nicht sehr lange dauern wird.

Schalten Sie die Website-Einstellung Normalize emails aus (bis vor kurzem war dies die Standardeinstellung). Sie sollte wahrscheinlich in dieser Funktion hier ausgeschaltet werden:

Sie können sie in Ihrer angepassten Version des xenForo-Skripts mit SiteSetting.normalize_emails=false einfügen. Ich bin mir nicht sicher, was mit diesen Benutzern mit doppelten E-Mails passiert ist; es gibt zwei offensichtliche Dinge zu tun: ihnen eine ungültige E-Mail-Adresse geben oder den Import überspringen. Es sieht so aus, als ob ihnen ungültige zugewiesen werden? (Und es besteht eine ziemlich gute Chance, dass es sich ohnehin um ungültige Benutzer handelt). Wenn sie übersprungen wurden, werden sie beim erneuten Ausführen des Skripts importiert.

3 „Gefällt mir“

Ja, auf meinem Laptop verarbeitet er die Dinge viel schneller, mit 1000 Elementen pro Minute. Das ist etwa doppelt so schnell wie auf dem Server. Aber das sind immer noch etwa 3 Tage.

Ich habe die übersprungenen E-Mails durchgesehen und es scheint, dass er diese Konten gut ignoriert. Ich werde sie einfach vor dem endgültigen Import zusammenführen. Kaum 20 solcher Fälle.

Beachten Sie, dass beim endgültigen Import nur die Benutzer und Beiträge importiert werden, die noch nicht importiert wurden, sodass dies nicht sehr lange dauern wird.

Danke, dass Sie darauf hinweisen. Ich habe das selbst beobachtet und es scheint, dass dies der Retter sein wird, wenn ich den endgültigen Import durchführe. Also mache ich ein Backup und stelle es auf D-3 wieder her und dann ein weiteres Backup und stelle es mit der neuen DB-Backup-Datei am Tag 0 wieder her. Ist das richtig?

1 „Gefällt mir“

Sind diese Backups und Wiederherstellungen auf der Xenforo-Website, oder haben Sie eine Live-Discourse-Site, auf die Sie die Xenforo-Daten importieren möchten?

Solange Sie keine Änderungen am Skript vornehmen, die einen erneuten Datenimport erfordern, und das, was Sie jetzt auf Ihrem Laptop haben, das ist, was Sie auf Ihrem Discourse-Server haben möchten, dann können Sie einfach weiterhin neue Dumps der Xenforo-Datenbank abrufen und importieren (um zu testen, zu sehen, wie lange es dauert und so weiter) und dann am Umstellungstag frieren Sie die Xenforo-Website ein, holen sich diese Datenbank, führen das Skript noch einmal aus und laden sie auf Ihren Discourse-Server hoch.

Wenn Sie bereits Daten auf Ihrer Discourse-Site haben, die Sie behalten möchten, wird es viel komplizierter, da Sie diese Website einfrieren müssen, dann die Xenforo-Daten abrufen und dann wie oben beschrieben fortfahren müssen.

1 „Gefällt mir“

Es wird eine Neuinstallation von Discourse sein, was es einfach macht.

Ich habe viel Zeit zur Verfügung, da ich Migrationen mehrmals testen, mich gründlich mit Discourse vertraut machen, alle Add-ons nach meinen Wünschen konfigurieren und vielleicht sogar selbst einige Add-on-Anpassungen vornehmen möchte.

Was Sie erklärt haben, nimmt mir eine große Sorge, da ich dachte, ich müsste auch den Massenimport herausfinden.

2 „Gefällt mir“

Ich habe eine Frage: Gibt das Importskript Protokolle aus? Mein Testimport hängt seit einigen Stunden bei 98,2 % fest.

Eine weitere Sache, die mir aufgefallen ist: Wenn ich die Migration neu starte, dauert es etwa 30 Sekunden, um eine Charge von 1000 Beiträgen zu überspringen. Die Geschwindigkeit beträgt also effektiv 2000 Elemente pro Minute. Keine signifikante Verbesserung gegenüber den 1000 Beiträgen pro Minute für den ersten Import, da selbst beim letzten Import am Tag des Umstiegs etwa ein Tag vergehen wird. 23 Stunden davon werden nur dazu dienen, bereits importierte Elemente zu überspringen.

Nur was du siehst.

Du solltest sie wahrscheinlich stoppen und neu starten.

Ja, es werden alle Daten übersprungen, die bereits importiert wurden. Und das geht viel schneller als 2000 Beiträge/Minute. Ich vermute, du wirst es sehen, wenn du es jetzt neu startest.

Das ist es, ich habe neu gestartet und dann den obigen Beitrag verfasst. Es sind 2000 Beiträge/Minute. Um sicher zu gehen, habe ich es noch einmal versucht.

1 „Gefällt mir“

Ich habe es geschafft, die Avatare und Anhänge zu importieren. Diese Ordner wurden kopiert.

/internal_data/attachments
/data/avatars

Um meine Frage zu beantworten: Die Avatare und Anhänge werden nach dem Import finalisiert. Wenn ein Benutzer seinen Avatar ändert, nachdem seine ID importiert wurde, wird er beim zweiten Durchlauf nicht importiert/aktualisiert, da dieser Beitrag oder Benutzer übersprungen wird.

Jetzt muss ich nur noch den Import der Konversationen (kann auch übersprungen werden, ist aber gut, wenn er vorhanden ist) und die permanenten Weiterleitungen klären.

@Fajfi - Vielen Dank für deinen Beitrag zum Import-Skript. Es hat für Avatare und Anhänge einwandfrei funktioniert. Es läuft noch und hat den Teil mit den Likes noch nicht erreicht.

Der Import der Konversationen wurde behoben. Es konnten über eine halbe Million Nachrichten von XF2.3 nach Discourse importiert werden. Ich habe einen PR erstellt, falls jemand interessiert ist.

----EDIT----

Einen weiteren PR mit einer Korrektur für den Import von Likes erstellt. Es ist überraschend, dass bisher niemand von XF2.1+ zu Discourse migriert ist. Likes wurden 2019, als XF2.1 veröffentlicht wurde, in Reaktionen umbenannt.

5 „Gefällt mir“