Wir haben es versucht und stoßen auf diese Probleme: Alle Beiträge wurden importiert, aber die Themenüberschriften werden nicht angezeigt und externe Bilder werden nicht gerendert. Das aktuelle SMF2-Forum ist: https://forum.mundofotografico.com.br wir versuchen, zu Discourse zu migrieren hier: https://discourse.fotografos.online - Alle Themen und richtigen Beschreibungen sind nicht durchgekommen, Bilder werden nicht geladen… bitte helft! @marcozambi @miligraf @FireAllianceNX @pfaffman
Ich beginne gerade mit dem SMF-Migrationsprozess und importiere derzeit Beiträge in eine Testinstanz mit etwa 1000/Stunde, sodass bisher alles gut läuft, abgesehen von dem MySQL-Performance-Skript, bei dem MySQL aus irgendeinem Grund den Befehl ‘ALTER USER’ nicht mochte. Ich habe manuell ein ‘CREATE USER’ durchgeführt und danach war alles in Ordnung.
Ich habe den Kommentar zu gelöschten Benutzern gelesen, aber ich kann nicht einfach neue Benutzer/gefälschte E-Mails erstellen, um all meine gelöschten Benutzer abzudecken (mein Forum läuft seit über 20 Jahren und ich habe wahrscheinlich mehr gelöschte als echte Benutzer). Ich vermute, ich habe 4-5000 gelöschte Benutzer. Nicht alle werden gepostet haben, aber viele werden es getan haben, sodass ich wahrscheinlich Hunderte von „fehlenden“ Benutzern habe.
Die Beiträge werden als zugehörig zu „system“ importiert, was nicht wirklich ideal ist. Ich habe mich gefragt, ob Folgendes funktionieren würde.
- Erstellen Sie vor dem Import einen Dummy-Benutzer, z. B. „Gelöschter Benutzer“.
- Ermitteln Sie die Benutzernummer für „Gelöschter Benutzer“.
- Ändern Sie die Zeile „user_id: user_id_from_imported_user_id(message[:id_member]) || -1,“ in smf2.rb und ersetzen Sie die ‘-1’ durch die Benutzernummer von „Gelöschter Benutzer“ (ich glaube, der Systembenutzer ist -1?).
Würde das funktionieren? Gibt es auch andere Stellen in smf2.rb, an denen ich eine ähnliche Änderung vornehmen müsste?
Hallo, meinen Sie mit „gelöscht“, dass sie tatsächlich aus der SMF-Datenbank gelöscht wurden, oder sind sie noch in der Datenbank mit ihrem Benutzernamen und ihrer E-Mail-Adresse vorhanden und als gesperrt markiert? Wie werden Beiträge von diesen „gelöschten“ Benutzern derzeit in SMF angezeigt?
Ich bin mitten in einer riesigen Migration von Drupal zu Discourse, ebenfalls von einem seit langem bestehenden Forum mit unzähligen gesperrten Benutzern. Ich wollte unbedingt dieselben gesperrten Benutzernamen und ihre zugehörigen E-Mail-Adressen in Discourse beibehalten, daher musste ich diese Funktion zum Drupal-Importer-Skript für Discourse hinzufügen. Im Grunde importiert das Skript alle Benutzer als normale aktive Benutzer, und wenn sie öffentlich sichtbare Beiträge hatten, werden diese wie im ursprünglichen Forum importiert. Dann habe ich ganz am Ende des Prozesses eine Funktion hinzugefügt, die ich aus einem anderen Importer-Skript übernommen habe, um die Drupal-Datenbank zu durchlaufen und, wenn der Benutzer als gesperrt markiert war, auch das Discourse-Konto zu sperren. Sie können den Code dafür in meiner Beitragsübersicht hier sehen.
Hallo. Die Benutzer werden tatsächlich gelöscht, d.h. es gibt keinen Eintrag mehr für sie in der Tabelle smf_member. SMF hat keine Funktion zum Suspendieren von Benutzern. Man kann Benutzer sperren, aber das scheint für ein Konto, bei dem der Benutzer gestorben ist oder das Interesse am Hobby/Forum verloren hat, nicht richtig zu sein. Aus Datenschutzgründen ist das auch nicht wirklich richtig.
SMF-Beiträge haben zwei Felder, die für jeden Eintrag gespeichert sind… die Benutzernummer, die für gelöschte Benutzer auf Null gesetzt wird, und den Namen des Posters, der den Benutzernamen des Posters enthält. So kann man sehen, welcher Benutzer die Nachricht gepostet hat, aber es sind keine Details (E-Mail, vollständiger Name usw.) mehr für den Benutzer verfügbar. Ihre Beiträge werden mit einem “Gast”-Marker angezeigt.
Ich könnte für jeden Benutzer, der eine Nachricht mit einer Mitglieds-ID von Null gepostet hat, ein neues Benutzerkonto erstellen und eine Dummy-E-Mail-Adresse für das Konto zuweisen, und dann den Benutzer anschließend als suspendiert markieren. Ich könnte Konten als suspendiert markieren, basierend auf dem Format der Dummy-E-Mail-Adresse, wenn ich etwas Einzigartiges, aber Identifizierbares verwenden würde. Das fühlt sich in einigen Fällen jedoch etwas seltsam an… Konten für Personen zu erstellen, von denen ich weiß, dass sie vor 10-15 Jahren gestorben sind!
Ich habe jedoch Zeit zum Nachdenken… die Migration hat teilweise funktioniert, aber jetzt muss ich herausfinden, warum Anhänge nicht angehängt wurden, In-Forum-Links nicht geändert wurden und warum die Passwörter für migrierte Benutzer nicht funktionieren. Es gibt vielleicht noch andere Probleme, aber ich werde zuerst an der Behebung dieser Probleme arbeiten und dann sehen, was sonst noch auftaucht.
Meinst du Postgres? Ich bin mir nicht sicher, worum es hier geht.
Was ich tun würde, ist, wenn die Benutzer-ID 0 ist, den Benutzernamen für die ID zu verwenden. Wenn find_username_by_import_id den Benutzer nicht findet, erstelle den Benutzer, setze die E-Mail-Adresse auf fake_email (es ist eine Funktion in base.rb, die eine gefälschte E-Mail-Adresse generiert) und den Benutzernamen mit dem vorhandenen Benutzernamen. Wenn du ehrgeizig bist, könntest du am Ende des Skripts alle Benutzer sperren, die @email.invalid in ihrer E-Mail-Adresse haben. Sie werden nicht aktiv sein, daher denke ich nicht, dass es viel ausmacht, wenn du sie nicht sperrst.
Eine andere Möglichkeit wäre, eine Abfrage durchzuführen, die irgendwie eine Liste aller gelöschten Benutzer generiert und sie dann erstellt, bevor du mit den Beiträgen beginnst, aber das scheint schwieriger zu sein.
Wenn du einen Benutzer namens deleted user erstellen möchtest und möchtest, dass all diese Beiträge diesem Benutzer gehören und nicht system, könntest du das tun und einfach die -1 durch die Benutzernummer von deleted user ersetzen. Du könntest ihn als normalen Benutzer erstellen oder etwas Besonderes tun und ihm eine Benutzer-ID von -2 oder etwas Ähnlichem geben.
In einigen Systemen liegt das daran, dass Anhänge manchmal im Text des Beitrags enthalten sind und in anderen der Anhangsdatensatz in der Datenbank steht.
Hast du das Plugin Migrated password hashes support installiert, nachdem du den Import durchgeführt hast (es kann den Import in zumindest einigen Umständen stören). Hash-Passwörter von SMF2 auf die gleiche Weise wie smf?
Entschuldigung, falscher Name für das Skript. Es ist das MySQL-Skript, auf das im ersten Beitrag Bezug genommen wird.
– file: ~/smf2/script_for_mysql_tuning.sql
ALTER USER ‘user’@‘%’ IDENTIFIED WITH mysql_native_password BY ‘pass’;
Vielen Dank für die Vorschläge zu Benutzern und insbesondere zu fake_email. Meine erste Aufgabe ist es, genug Ruby zu lernen, um Änderungen am Importskript vornehmen zu können!
SMF2-Anhänge sind Datensätze in der Datenbank. Nachdem ich ein wenig tiefer gegraben habe, sieht es so aus, als ob einige importiert wurden, aber nur ein paar Hundert von Zehntausenden. Ich werde weiter graben, um herauszufinden, warum.
Ahhh, das ist wahrscheinlich das, was mir fehlt! Ich bin ziemlich sicher, dass SMF2 die gleiche Hashing-Methode (gesalzenes MD5, wenn ich mich recht erinnere) wie SMF1 verwendet, daher wird das Plugin hoffentlich das Problem beheben. Ich muss noch weitere Importläufe durchführen, bevor ich mich zu sehr darum kümmere, dass sich Benutzer anmelden.
Eine weitere Frage kommt mir in den Sinn. Gibt es eine Möglichkeit, das System zurückzusetzen, damit ich einen weiteren Import durchführen kann? Ich hätte ein Backup machen sollen, bevor ich angefangen habe, aber ich habe es vergessen ![]()
Oh. Sie meinen nur, MySQL einzurichten. Ich verstehe.
Wenn Sie andere Sprachen kennen, können Sie wahrscheinlich einfach so weitermachen.
Ich habe mehrere Importer geschrieben, bevor ich etwas wie Ruby gelernt habe. ![]()
Hier ist eine Möglichkeit, eine neue Discourse-Datenbank zu löschen und zu erstellen.
sv stop unicorn;DISABLE_DATABASE_ENVIRONMENT_CHECK=1 IMPORT=1 rake db:drop db:create db:migrate; sv start unicorn
Wenn Sie daran denken, ein Backup zu erstellen, kann das etwas schneller gehen. Vielleicht.
Ein weiterer Trick, sobald Sie die Benutzer eingerichtet haben, besteht darin, das Skript zu stoppen, nachdem die Benutzer importiert wurden, und dann ein Backup zu erstellen. Dies ermöglicht es Ihnen, den Import von Beiträgen zu debuggen, ohne alle Benutzer erneut importieren zu müssen.
Ich kenne einige. Ich habe 1976 mein erstes Programm in binärem Maschinencode auf einem Intel 4004 geschrieben. Ich fange an, smf2.rb mit ein wenig DuckDuckGoing zu verstehen, um einige der mir neuen Codestrukturen zu verstehen.
Vielen Dank für die Datenbank-Drop/Create-Methode. Zeit, neu anzufangen und zu sehen, ob ich einige inkrementelle Änderungen am Importer für meine Daten vornehmen kann.
Ich habe den Importer so modifiziert, dass er Dummy-Konten mit einer gefälschten E-Mail-Adresse für gelöschte Benutzer erstellt und die Dummy-Konten ihre korrekten Beiträge besitzen. Das ist also ein guter Anfang.
Als Nächstes versuche ich, die Anhänge zu verstehen, da ich bei den bisher importierten Beiträgen keine sehe (und es sollten einige vorhanden sein).
Wenn ich eine Nachricht normal über die Discourse-Webseite erstelle, erhalte ich einen Eintrag in der Tabelle posts (id=4346), zwei Einträge in der Tabelle uploads (ids=403 und 404), vier Einträge in upload_references (403/Draft/4, 403/Post/4346, 404/Draft/4, 404/Post/4346). Ich sehe auch 403 im Feld image_upload_id für den Beitrag 4346 und HTML, das sich auf die beiden Uploads im Feld posts/cooked bezieht.
Für importierte Beiträge erhalte ich einen Beitragseintrag in der Tabelle posts für jede importierte SMF-Nachricht und einen Eintrag in der Tabelle uploads für jeden Anhang, der mit einer importierten SMF-Nachricht verbunden ist. Die Einträge in der Tabelle uploads verweisen auf Dateien auf der Festplatte, die die korrekten Bilder enthalten, sodass dieser Teil in Ordnung ist. Allerdings erhalte ich keine Einträge in upload_references für die hochgeladenen Bilder oder eine der Upload-IDs im Feld image_upload_id in der Tabelle posts.
Ich gehe davon aus, dass ich versuchen muss, die Einträge in upload_references zu erstellen und die Felder posts-image_upload_id und cooked zu füllen, aber ich wollte zuerst prüfen, ob es keine andere Methode zur Verknüpfung von Uploads mit Beiträgen gibt, die vom Importer verwendet wird (oder zu verwenden versucht wird)?
Es scheint, als müssten Sie einen Verweis auf den Host/Upload zu raw hinzufügen. Es gibt eine Funktion, die einen Link für Sie generiert. Ich kann mich nicht erinnern, wie sie heißt. Ich glaube, sie befindet sich im Uploads-Modell, aber es könnte einfacher sein, sie in einem anderen Importskript zu finden, wenn Sie nicht wissen, was ein Modell ist.
Ich habe Fortschritte beim Anpassen des Importskripts gemacht, um es an die Eigenheiten meines Forums anzupassen, bin aber vor ein paar Tagen abrupt zum Stillstand gekommen. Nach dem neuesten Update von Discourse beta kann ich den Importcontainer nicht mehr erstellen. Ich erhalte…
> FAILED
> --------------------
> Pups::ExecError: cd /var/www/discourse & apt-get update & DEBIAN_FRONTEND=noninteractive apt-get install -y libmariadb-dev failed with return #<Process::Status: pid 439 exit 100>
> Location of failure: /usr/local/lib/ruby/gems/3.1.0/gems/pups-1.1.1/lib/pups/exec_command.rb:117:in `spawn'
> exec failed with the params {"cd"=>"$home", "cmd"=>["echo \"gem 'mysql2'\" >> Gemfile", "apt-get update & DEBIAN_FRONTEND=noninteractive apt-get install -y libmariadb-dev", "su discourse -c 'bundle config unset deployment'", "su discourse -c 'bundle install --no-deployment --path vendor/bundle --jobs 4 --without test development'"]}
> bootstrap failed with exit code 100
> ** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one.
Ich habe die Beiträge über den Ablauf des Yarn-Schlüssels gesehen und das behoben. Das verhinderte die Installation des Pakets libmariadb-dev, aber ich habe das Paket manuell installiert, was korrekt funktioniert hat. Der Neuaufbau des Imports funktioniert mit aktiviertem MySQL-Import-Template immer noch nicht, selbst nach der manuellen Installation des MariaDB-Pakets.
Ich habe einen neuen Server erstellt und mit einer frischen Installation von Discourse begonnen, um potenzielle Probleme mit dem vorherigen Server/Installation zu vermeiden. Der neue Server gibt jedoch denselben Fehler wie der alte aus.
Ich habe keine Ideen mehr, was ich als Nächstes versuchen könnte, daher freue ich mich über jeden Vorschlag!
Siehe Apt-get update fails inside container yarn repo not signed - #5 by pfaffman. Sie müssen die MySQL-Vorlage bearbeiten.
Vielen Dank, dass Sie mich in die richtige Richtung gewiesen haben. Ich sehe jetzt, was ich falsch gemacht habe!
Wir beginnen mit der Testmigration eines SMF 2 (genauer gesagt v2.0.15) Forums und eines der ersten Probleme, die auftraten, ist ein Problem, wenn Kategorien ein kaufmännisches Und (&) in ihrem Namen haben:
Thread-Titel mit dem gleichen Zeichen scheinen in Ordnung zu sein:

Bisher scheint das kaufmännische Und (&) das einzige problematische Zeichen zu sein und z.B. deutsche Umlaute sind in Ordnung:
Wir sind wahrscheinlich auch von Problemen betroffen, die hier im Thread gemeldet wurden (gelöschte Benutzer, Anhänge, Links im Forum), aber der Import läuft noch, daher werde ich ein Update geben, sobald er abgeschlossen ist.
In diesem Zusammenhang frage ich mich, ob die Importgeschwindigkeit wirklich so langsam sein soll. Wir importieren derzeit mit 1750 Elementen/Minute (anfangs waren es etwas näher an 2000 Elementen/Minute) auf einer AMD Ryzen 5 3600 Maschine mit 64 GB RAM (Hetzner, Ubuntu 22.04), was die gesamte Migration auf etwa 3 Tage bringt.
Das ist eine ziemlich gute Geschwindigkeit.
Ich stelle mir vor, dass die gemeldeten Probleme immer noch bestehen, obwohl eine überraschende Anzahl von Dingen nur in einem Forum vorkommt. Wenn Sie einige Dinge repariert haben möchten und ein Budget haben, helfe ich Ihnen gerne weiter.
Danke! Ich melde mich bei Ihnen, sobald die Dinge konkreter werden.
Im Moment befinden wir uns (eine kleine gemeinnützige Organisation, die sich auf Tabletop-Rollenspiele und verwandte Hobbys konzentriert) in der Evaluationsphase – es besteht Konsens darüber, dass wir eine neue Software wünschen und Discourse bisher die bevorzugte Option ist. Aber wir müssen alle To-dos (Migration, neues Theme, neue Plugins/Theme-Komponenten, falls erforderlich) sammeln und sehen, ob wir alles in unser Budget einpassen können.
Gibt es einen besonderen Grund für diesen Schritt?
Soweit ich das nach sorgfältigem erneuten Lesen des OP erkennen kann, wurde diese Datei smf2.rb nicht geändert/gepatcht?
Und wenn smf2.rb auf dem Host in (zum Beispiel) /var/discourse/smf2 liegt und Sie Ihre Volume-Mounts in Schritt 2 entsprechend eingerichtet haben, wird es ohnehin im Gastsystem unter /shared/smf2 gemountet.
Ich verstehe die Notwendigkeit, es als separaten Schritt hineinzukopieren, nicht. Aber das zu verstehen, könnte der Schlüssel sein, um herauszufinden, warum 95 % der Anhänge vom Skript nicht richtig gefunden werden…
Es scheint, als hätten Sie Recht mit der (fehlenden Notwendigkeit), es zu kopieren. Vielleicht hat der Autor es geändert und seine Änderungen wurden anschließend in den Kern übernommen.
Wenn Sie 5 % und nicht 0 % der Anhänge erhalten, dann scheint etwas mit dem Skript nicht zu stimmen.
In einigen Systemen gibt es zwei Möglichkeiten, Dateien anzuhängen: eine, indem sie in der Datei erwähnt wird (sodass sie im Rohtext des Beitrags enthalten ist und auf diese Weise behandelt wird) und eine andere, indem sie in irgendeiner Metadaten-/Tabelle an den Beitrag angehängt wird. Ich vermute, dass Sie 95 % in Ihrer Datenbank auf die eine Weise und das Skript auf die andere Weise haben.
Aber es sieht so aus, als würde es beide Wege versuchen? Sie müssen einen Beitrag finden, der einen Anhang haben sollte, in der Datenbank und im Dateisystem nachsehen, wie er gespeichert ist, und dann den Code ansehen, warum er ihn nicht abruft.
Danke @pfaffman, das ist beruhigend! Ich dachte irgendwie, dass das wahrscheinlich der Fall ist, aber da ich solche Probleme mit diesem Import habe, habe ich mein Wissen und meine Fähigkeiten auf jeder Ebene angezweifelt!
Danke für die Tipps, alles wird geschätzt @pfaffman - dies ist ein lange verzögerter erneuter Versuch mit demselben Forum, an dem ich letztes Jahr gearbeitet habe. Es ist eine Pro-Bono-Arbeit, aber ich könnte Sie wieder einbeziehen, wenn Sie Zeit haben.
Es ist ein sehr altes SMF2-Forum, das Anhänge in den beiden Formen hat:
<id>_<File_name_NO_CLEAR-case_rules_jpg>_<32charprobablyMD5hash0fsom4thing><id>_<40charprobablySHA1hash0fsom4thing>
Ich versuche immer noch herauszufinden, ob es ein Muster für die Fehler gibt.
Meine Vermutung (ohne den Code anzusehen!) ist, dass eines davon das ist, was das Skript tut, und das andere nicht (wahrscheinlich ist eine die alte Methode, sodass neue Beiträge die andere Methode verwenden, aber es wurde nicht zurückgegangen, um die zu korrigieren, die die andere Methode verwendeten).
Schau dir also convert_message_body und die Felder in der Anhängentabelle an. Vielleicht haben sie aus irgendeinem Grund von MD5 zu SHA1 oder umgekehrt gewechselt.
Wie gesagt, es könnte sein, dass eine Version davon einen Verweis auf den Upload hat, anstatt ihn in der Tabelle zu verknüpfen, also würdest du ein gsub machen, um nach diesem Muster zu suchen, und dann, wenn es übereinstimmt, den Schlüssel erhalten, ihn in der Tabelle nachschlagen und dann create_upload mit dieser Datei erstellen.
Hoffentlich reicht das aus, um dich in Gang zu bringen, aber bitte kontaktiere mich, wenn du mehr Hilfe benötigst, als ich dir hier geben kann.

