Migration eines vBulletin 4 Forums zu Discourse

Hallo. Ich möchte nur meine Lösung teilen.
Was die Probleme mit Zitaten betrifft. Wie ich bereits sagte, hatte ich Probleme – reguläre Ausdrücke erfassen Zitate nicht, wenn:

  • Benutzernamen und Post-IDs in Anführungszeichen eingeschlossen sein können
  • verschachtelte Zitate

Ich habe mich entschieden, eine Suche und Ersetzung mit einer anderen Logik durchzuführen. Anstatt nach Tags und ihren Inhalten zu suchen, habe ich einen regulären Ausdruck verwendet, der nur nach Tags sucht:

war:
raw.gsub!(%r{\\[quote=\"?([^;]+);(\\d+)\"?\\](.+?)\\[\\/quote\\]}im) do

wurde zu:
raw.gsub!(%r{(\\[QUOTE(=\"?([^;]+);(\\d+)\"?)?\\])|(\\[\\/QUOTE\\])}im) do

und dann habe ich die Bestimmung der Quelle eines Zitats leicht geändert:

      if $3 && $4
        if topic_lookup = topic_lookup_from_imported_post_id(post_id)
          post_number = topic_lookup[:post_number]
          topic_id = topic_lookup[:topic_id]
          "\\n[quote=\\\"#{new_username},post:#{post_number},topic:#{topic_id}\\\"]\\n"
        else
          "\\n[quote=\\\"#{new_username}\\\"]\\n"
        end
      elsif $5
        "\\n[/quote]\\n"
      end

Außerdem habe ich den Spoiler-Code geändert. Anstatt:

    # [spoiler=Some hidden stuff]SPOILER HERE!![/spoiler]
    raw.gsub!(%r{\\[spoiler=\"?(.+?)\"?\\](.+?)\\[/spoiler\\]}im) do
      "\\n#{$1}\\n[spoiler]#{$2}[/spoiler]\\n"
    end

der den Text verschwommen darstellt, konvertiere ich ihn in ein Details-Tag:

    raw.gsub!(%r{(\\[spoiler(=\"?(.*?)\"?)?\\])|(\\[\\/spoiler\\])}im) do
      if $3
        "\\n[details=#{$3}]\\n"
      elsif $1
        "\\n[details]\\n"
      elsif $4
        "\\n[/details]\\n"
      end
    end

Denn es stellt sich heraus, dass in der vBulletin-Welt – Spoiler nicht der verschwommene Inhalt ist, sondern der zusammengeklappte Inhalt. Daher halte ich es für das vBulletin-Importskript viel angemessener, Spoiler in Details anstelle von verschwommenen Spoilern zu konvertieren.

Ich habe auch das Erwähnungs-Tag bemerkt. In meinem Fall sahen die Erwähnungen in vBulletin so aus:
[mention=XXX]username[/mention]

Der im Skript verwendete reguläre Ausdruck berücksichtigt nicht, dass das Tag die Benutzer-ID enthalten kann.

    # [MENTION]<username>[/MENTION]
    raw.gsub!(%r{\\[mention\\](.+?)\\[/mention\\]}i) do
      new_username = get_username_for_old_username($1)
      "@#{new_username}"
    end

Ich habe das auch auf meine Weise behoben:

    # [MENTION]<username>[/MENTION]
    raw.gsub!(%r{\\[mention(=\\d+)?\\](.+?)\\[/mention\\]}i) do
      new_username = get_username_for_old_username($2)
      "@#{new_username}"
    end
1 „Gefällt mir“

Das stimmt nicht, als ich mit der Migration meines 24 Jahre alten vBulletin-Forums, das vB 3 verwendet, begann. Es gab mehrere Inkompatibilitäten und andere Probleme mit dem Skript. Ich habe jedoch viel Aufwand betrieben, um einen Importer für vBulletin 3 auf Basis des Skripts für vB4 zu erstellen.

Das verbesserte Skript ist in Discourse enthalten, es heißt vbulletin3.rb. Die Verwendung des vB3-Importskripts ist dieselbe wie in dieser Anleitung beschrieben. Führen Sie einfach bundle exec ruby script/import_scripts/vbulletin3.rb aus.

Das vBulletin3 hat einige signifikante Änderungen/Verbesserungen:

  1. Forenberechtigungen werden kopiert
  2. Moderatorengruppen für Foren werden erstellt
  3. Beitretbare Benutzergruppen werden mit korrekter Konfiguration erstellt
  4. Forenverschachtelung wird bis zu 3 Ebenen tief importiert (Maximum von Discourse)
  5. Permalinks werden für alle Threads und Beiträge registriert, um Link-Rot zu verhindern
  6. Einige grundlegende Foreneinstellungen werden übernommen (z. B. Titel, Benachrichtigungs-E-Mail, Firmenname)
  7. Umfragen werden importiert
  8. Größere Verbesserungen bei der Konvertierung von bbcode → Markdown
  9. URL-Deep-Links zu Threads, Beiträgen und Anhängen werden in Discourse-Referenzen umgewandelt. Hierfür muss die Umgebungsvariable FORUM_URL auf forum.hostname/path (ohne Protokoll) gesetzt werden.

Anstatt zu versuchen, vBulletin-Private-Nachrichten in Discourse-Private-Nachrichten umzuwandeln, erhalten Benutzer stattdessen eine System-Private-Nachricht, die ein Archiv der von ihnen erhaltenen privaten Nachrichten enthält. Die PM-Konstruktion von vBulletin ist nicht wirklich mit Discourse kompatibel. Der Versuch, sie zu konvertieren, würde auch einige Datenschutzaspekte aufdecken, je nachdem, wie Leute PMs in vBulletin verwendet haben.

Wie es wahrscheinlich auch bei anderen Importern der Fall ist, kann die Konvertierung eine ganze Weile dauern. Das Konvertierungsskript dauerte auf meiner Workstation 5,5 Stunden für 7.000 Benutzer, 16.000 Threads und 415.000 Beiträge. Ich habe keine Ahnung, wie lange die Nachbearbeitung gedauert hat, ich habe sie über Nacht laufen lassen. Von Anfang bis Ende war das Forum 30 Stunden lang nicht erreichbar. Am Ende bin ich mit dem Ergebnis zufrieden.

2 „Gefällt mir“

Das ist ja mal ein Throwback :slight_smile:

Dein Forum sieht sehr gut aus. Mir gefallen die abwechselnden Farben bei den Themenzeilen.

Es scheint, dass sowohl dieser Thread als auch der Importer zu diesem Zeitpunkt veraltet sind. Ich habe mit Hilfe dieses Threads einige Probleme behoben, bin aber jetzt beim Schritt des Benutzerimports stecken geblieben. Weiß jemand, wie man das beheben kann?

in at’: can’t convert NilClass into an exact number (TypeError)`

Entweder ist die Abfrage falsch oder irgendwie fehlt ein Wert in der Tabelle

Es ist ziemlich bizarr, so viele Jahre später darauf zu antworten, aber ich führe gerade einen VB-Import mit dem Massenimporteur durch und eine Reihe von Bildern fehlten, und der Grund dafür ist, dass sie den Dateinamen des Anhangs in ein anderes Feld verschoben haben.

 SELECT a.filedataid attachment_id, a.userid user_id, a.filename filename
             FROM attachment a
            WHERE a.attachmentid = 383075;

Die Datei NUMBER.attach ist jetzt das Feld filedataid, nicht das Feld attachment_id. Diese Abfrage muss also im Skript aktualisiert werden.

Ich wurde gebeten, ein vbulletin 4.25 Forum nach Discourse zu migrieren…. Wenn ich diesen Thread lese, habe ich gemischte Gefühle… es scheint möglich zu sein, aber potenziell ein riesiger Schmerz und Zeitfresser (beides könnte ich im Moment vermeiden)….\n\nGibt es irgendwo ein aktualisiertes Skript für vbulletin 4.25? Ich kann auf der offiziellen Seite nur 3 und 5 sehen?

Nun, es gibt vbulletin und vbulletin5 Skripte im Verzeichnis bulk imports, die nur ein paar Monate alt sind. Das Ausführen dieser Massenimporte ist ziemlich knifflig und nicht gut dokumentiert.

Ich habe über 100 Importe durchgeführt und bin ziemlich sicher, dass ich noch nie einen durchgeführt habe, der nicht aus dem einen oder anderen Grund eine Anpassung des Skripts erforderte.

Ich habe mehrere Importskripte geschrieben, bevor ich überhaupt Ruby gelernt habe (Aber ein Professor Mitte der 1980er Jahre versicherte mir, dass ich nach seinem Kurs über Programmiersprachen sagen könnte, dass ich jede Sprache kenne, wenn ich ein Wochenende und ein Buch hätte; er hatte meistens Recht.)

Aber ja, es wird wahrscheinlich mindestens genauso viel Ärger und Zeitaufwand bedeuten, wie Sie sich vorstellen.

Ich vermute, dass das vbulletin-Skript eine gute Arbeit leisten wird; ich würde das Massenimport-Skript wahrscheinlich nicht empfehlen, es sei denn, Sie haben über eine Million Beiträge + Benutzer.

1 „Gefällt mir“

Danke dafür :slight_smile:
Ich muss wohl entscheiden, was ich an meinem Wochenende mache :smiley:

1 „Gefällt mir“

Ich würde mich sehr über Hilfe freuen :face_with_spiral_eyes:

Ich habe den Thread gelesen und einige Schritte befolgt, die ich hier gesehen habe, aber ich komme nicht weiter.

  1. Ich verbinde mich per SSH mit meinem VPS
  2. Ich gehe in das Docker-Image
  3. Ich installiere mariadb-server
  4. Ich versuche, den mysql-Befehl zum Erstellen einer Datenbank auszuführen, erhalte aber die Meldung „kann keine Verbindung zum lokalen Server über Socket herstellen“

Die Anleitungen hier sind ein paar Jahre alt – ich sehe, dass ein paar Leute den gleichen Fehler hatten, aber ich sehe keine Lösungen dafür.

Hat das jemand in letzter Zeit gemacht und kann mich in die richtige Richtung weisen? Ich glaube nicht, dass ich eine Schritt-für-Schritt-Anleitung übersehe, oder?

Bearbeitung: Nur um hinzuzufügen, ich habe alle möglichen Tricks versucht und am Ende ein Docker-Image von mariadb auf dem lokalen Host (nicht Docker) installiert und dann den Port freigegeben – ich kann mich jetzt mit der Datenbank aus dem Docker-Image verbinden … aber das Ausführen des Skripts ergibt: Gemfile: Nicht definierte lokale Variable oder Methode ‘mysql2’ Ich habe versucht, das Gemfile zu installieren, aber es schlägt fehl … und bevor ich weiter nach Fehlern suche, habe ich einfach das Gefühl, dass ich veraltete Informationen und potenziell alte Pakete verwende… Ich bin einfach sehr verwirrt und könnte etwas Anleitung gebrauchen!

Jede Hilfe wird geschätzt!

…Ich habe durchgehalten und es endlich geschafft, das Skript auszuführen! Allerdings schlägt es nach dem Start mit folgender Fehlermeldung fehl:

"root@vps-xxxxxxxx-app:/var/www/discourse/script/import_scripts# bundle exec ruby vbulletin.rb
/var/www/discourse/config/initializers/013-excon_defaults.rb:4:in `<main>': can't modify frozen Hash: {:chunk_size=>1048576,                                                             :ciphers=>"ECDHE-ECDSA- [................]"

…und ich glaube, ich bin am Ende meiner Fehlersuchfähigkeiten angelangt.

Ich weiß nicht, ob es einen Unterschied macht, es von /var/www/discourse aus zu starten, aber ich tue es immer. Hier ist, was im OP empfohlen wird.

Ich erkenne diesen Fehler nicht.

1 „Gefällt mir“

Als ich gestern Abend nach stundenlanger „Recherche“ aufgab, hatte ich so viele Dinge außerhalb meiner Komfortzone verändert, dass ich befürchtete, mehr Schaden als Nutzen anzurichten. Ich war auch daran interessiert zu hören, ob jemand dies kürzlich getan hatte und ob es einen magischen Schritt gab, den ich verpasste, anstatt in wiederkehrende Sackgassen zu geraten :winking_face_with_tongue:

Es ist möglich, dass es ein neues Problem gibt. Ich habe neulich einen mbox-Import durchgeführt, und ich stelle mir vor, dass er denselben Code aufruft, der Ihnen den Fehler verursacht hat.

Oh. Ich habe es in einem Container gemacht und diese Anweisungen sind für eine Entwicklungsumgebung. Haben Sie eine Entwicklungsumgebung eingerichtet? Haben Sie es zum Laufen gebracht? Das ist schwierig über ein VPN.

Ich werde es morgen löschen und es erneut versuchen, heute Abend Migräne.

Ich werde Sie auf dem Laufenden halten :slightly_smiling_face:

1 „Gefällt mir“

Haben Sie eine Entwicklungsumgebung eingerichtet? War das Ihr erster Schritt?

Ich habe versucht, es über den Host-VPS zu machen und es durch den Container zu fummeln. Als ich fertig war, war ich mir nicht mehr sicher, was ich wo getan hatte. Es ist wahrscheinlich ein Fähigkeitsproblem… Ich fange morgen wieder von vorne an.

Wenn Sie es auf einer VM tun, ist die Ausführung in einem Container wahrscheinlich einfacher. Ich würde mir einige andere Import-Anleitungsbeispiele ansehen (diese enthalten die MySQL-Vorlage).

Sie betreten den Container, bearbeiten möglicherweise die Gem-Datei und führen bundle install aus.

Die Verwendung eines Containers für MySQL oder MariaDB ist wahrscheinlich sinnvoll. (aber dann müssen Sie sicherstellen, dass die Container sich gegenseitig sehen können)

1 „Gefällt mir“

Ich habe aufregende Neuigkeiten…

Ich habe das Skript zum Laufen gebracht (ich werde eine Anleitung erstellen, sobald alles erledigt ist), es hat Benutzergruppen importiert, hängt aber beim Importieren von Benutzern fest, ich glaube, es hat etwas mit der Zeitzonenvariable zu tun?

importing users
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/tzinfo-2.0.6/lib/tzinfo/timestamp.rb:138:in `for': Integer values are not supported (ArgumentError)

            raise ArgumentError, "#{value.class} values are not supported" unless is_time_like?(value)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/tzinfo-2.0.6/lib/tzinfo/timezone.rb:575:in `utc_to_local'
        from script/import_scripts/vbulletin.rb:1019:in `parse_timestamp'
        from script/import_scripts/vbulletin.rb:166:in `block (2 levels) in import_users'
        from /var/www/discourse/script/import_scripts/base.rb:267:in `block in create_users'
        from /var/www/discourse/script/import_scripts/base.rb:266:in `each'
        from /var/www/discourse/script/import_scripts/base.rb:266:in `create_users'
        from script/import_scripts/vbulletin.rb:148:in `block in import_users'
        from /var/www/discourse/script/import_scripts/base.rb:951:in `block in batches'
        from <internal:kernel>:187:in `loop'
        from /var/www/discourse/script/import_scripts/base.rb:950:in `batches'
        from script/import_scripts/vbulletin.rb:126:in `import_users'
        from script/import_scripts/vbulletin.rb:82:in `execute'
        from /var/www/discourse/script/import_scripts/base.rb:47:in `perform'
        from script/import_scripts/vbulletin.rb:1027:in `<main>'

Der Standardwert im Skript ist „America/Los Angeles“ – das vBulletin-Forum ist auf (GMT) Westeuropäische Zeit, London, Lissabon, Casablanca eingestellt und die Discourse-Instanz, in die ich importiere, hat zwei Einträge: America/Los Angeles und Europe/Paris.

Wissen Sie, welches ich auswählen sollte?

Es spielt keine große Rolle, welche Sie wählen.

Ich glaube, es könnte daran liegen, dass das Datum nicht so gespeichert wird, wie das Skript es erwartet.

1 „Gefällt mir“