Migrieren Sie ein bbPress WordPress-Plugin-Forum zu Discourse

Ich habe kürzlich erfolgreich eine bbPress-Datenbankmigration mit dem integrierten Migrationsskript von Discourse durchgeführt. Jetzt teile ich dies als schrittweises Tutorial.

Hinweis: Dieses Tutorial gilt für das bbPress-Plugin, nicht für die veraltete eigenständige Version von bbPress.

Welche Daten können importiert werden?

  • Benutzer (einschließlich anonymer Benutzer)
  • Kategorien
  • Themen
  • Beiträge
  • Private Nachrichten (über BuddyPress)
  • Anhänge
  • Permalinks

Bevor Sie mit der Migration beginnen, richten Sie eine Entwicklungsumgebung auf Ihrem Rechner (oder in einer virtuellen Maschine) ein und führen Sie den Import dort aus, nicht im Docker-Container. Als ich es im Docker-Container versucht habe, trat das Problem „peer authentication failed" auf. Daher empfehle ich Ihnen dringend, einen Entwicklungsrechner zu verwenden. Weitere Informationen finden Sie im Installationsleitfaden für die Entwicklung unter macOS oder Ubuntu / Debian.

Discourse erfordert Ruby 3.4+. Sie können Ihre Ruby-Version wie folgt überprüfen:

ruby -v

Nun müssen wir die Abhängigkeit libmysqlclient-dev installieren, um das mysql2-Gem verwenden zu können.

sudo apt-get install libmysqlclient-dev

Nach der erfolgreichen Installation wechseln Sie in den Pfad Ihrer Discourse-Entwicklungsinstallation (typischerweise ~/discourse).

cd ~/discourse

Konfigurieren der Datenbankverbindung

Das bbPress-Importskript liest alle Datenbankverbindungseinstellungen aus Umgebungsvariablen aus. Sie müssen die Skriptdatei nicht bearbeiten. Folgende Umgebungsvariablen werden unterstützt:

Variable Standard Beschreibung
BBPRESS_HOST localhost MySQL-Datenbankhost
BBPRESS_USER root MySQL-Benutzername
BBPRESS_PW (leer) MySQL-Passwort
BBPRESS_DB bbpress MySQL-Datenbankname
BBPRESS_PREFIX wp_ WordPress-Tabellenpräfix
BBPRESS_ATTACHMENTS_DIR /path/to/attachments Pfad zum bbPress-Anhangsverzeichnis

Wenn Sie Ihre Datenbank von localhost migrieren, müssen Sie in der Regel nur den Datenbanknamen festlegen:

IMPORT=1 bundle && IMPORT=1 BBPRESS_DB="my_bbpress" bundle exec ruby script/import_scripts/bbpress.rb

Wenn Sie Ihre Datenbank von einem externen Server migrieren, müssen Sie zusätzlich den Host, den Benutzernamen und das Passwort festlegen:

IMPORT=1 bundle && IMPORT=1 BBPRESS_HOST="REMOTE_HOST_NAME" BBPRESS_USER="DB_USERNAME" BBPRESS_PW="MY_SECURE_PASSWORD" BBPRESS_DB="DB_NAME" bundle exec ruby script/import_scripts/bbpress.rb

Herzlichen Glückwunsch! Ihre Datenbank wurde erfolgreich von bbPress nach Discourse migriert :clap: :wave: :boom:

Erstellen Sie nun über die Admin-Seite /admin/backups ein Backup und importieren Sie es auf Ihrer Live-Discourse-Website.


Nachdem Sie Ihr bbPress-Forum zu Discourse verschoben haben, installieren Sie das offizielle WordPress-Plugin von Discourse, falls Sie Ihre WordPress-Website weiterhin als Hauptseite nutzen und diese mit Discourse verbinden möchten.

15 „Gefällt mir“

Just wanted to thank you for providing this step-by-step guide. We migrated our site from bbpress to Discourse with minimal headache thanks to you. Since we’re running multisite wordpress there were a few tweaks to make to the importer, but other than that it went very smoothly. Thanks!

3 „Gefällt mir“

If you can share your tweaks then it will be helpful to other multisite owners.

1 „Gefällt mir“

Admittedly I didn’t take very good notes, and have since killed the VM it
was on (sorry!) but the basic gist is that if your bbpress install is not
on the primary site of the Multisite setup you’ll need to a) set the
environmental variable for BBPRESS_PREFIX to include your site’s ID number
(e.g. wp_6_ ) and then edit the migration script to use wp_users rather
than #{BBPRESS_PREFIX} for the Users sql. This is because on Multisite
installations the wp_users table is shared across sites and then each site
has its own tables for posts, postmeta, etc.

5 „Gefällt mir“

thanks for the details :thumbsup:

I recently posted on how to import bbpress into discourse

2 „Gefällt mir“

Great job on the tutorial! But it’s confusing to have two different guides on this. Do they serve different purposes? Otherwise we should figure out how to merge them.

That guide is about how to import bbpress inside of a development environment, mine is how to import bbpress using the docker container. It’s just 2 different ways to go. I’d recommend importing via docker container since it doesn’t ask for the additional step of setting up a development environment, which can be cumbersome.

Hello I am stuck trying to import successfully after all users are done importing.

As soon it begins to import anonymous users it cancels with an error of “Invalid Email… and Validation failed: Username can’t be blank (ActiveRecord::RecordInvalid)”.

I added the error below, does anyone encountered this before or have any ideas on what I should do?

Thanks,

importing anonymous users...
Invalid email '' for ''. Using '6be92499a6f885cb271d94bffd5e667b@email.invalid'
Error on record: {:id=>"", :email=>"", :name=>"", :website=>nil}
Traceback (most recent call last):
	23: from script/import_scripts/bbpress.rb:512:in `<main>'
	22: from /home/lutechi/discourse/script/import_scripts/base.rb:49:in `perform'
	21: from script/import_scripts/bbpress.rb:31:in `execute'
	20: from script/import_scripts/bbpress.rb:153:in `import_anonymous_users'
	19: from /home/lutechi/discourse/script/import_scripts/base.rb:249:in `create_users'
	18: from /home/lutechi/discourse/script/import_scripts/base.rb:249:in `each'
	17: from /home/lutechi/discourse/script/import_scripts/base.rb:261:in `block in create_users'
	16: from /home/lutechi/discourse/script/import_scripts/base.rb:337:in `create_user'
	15: from /home/lutechi/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/activerecord-5.2.3/lib/active_record/transactions.rb:212:in `transaction'
	14: from /home/lutechi/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/database_statements.rb:267:in `transaction'
	13: from /home/lutechi/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/transaction.rb:236:in `within_new_transaction'
	12: from /home/lutechi/.rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:230:in `mon_synchronize'
	11: from /home/lutechi/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/transaction.rb:239:in `block in within_new_transaction'
	10: from /home/lutechi/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/database_statements.rb:267:in `block in transaction'
	 9: from /home/lutechi/discourse/script/import_scripts/base.rb:338:in `block in create_user'
	 8: from /home/lutechi/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/activerecord-5.2.3/lib/active_record/suppressor.rb:48:in `save!'
	 7: from /home/lutechi/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/activerecord-5.2.3/lib/active_record/transactions.rb:315:in `save!'
	 6: from /home/lutechi/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/activerecord-5.2.3/lib/active_record/transactions.rb:385:in `with_transaction_returning_status'
	 5: from /home/lutechi/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/activerecord-5.2.3/lib/active_record/transactions.rb:212:in `transaction'
	 4: from /home/lutechi/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/database_statements.rb:265:in `transaction'
	 3: from /home/lutechi/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/activerecord-5.2.3/lib/active_record/transactions.rb:387:in `block in with_transaction_returning_status'
	 2: from /home/lutechi/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/activerecord-5.2.3/lib/active_record/transactions.rb:315:in `block in save!'
	 1: from /home/lutechi/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/activerecord-5.2.3/lib/active_record/validations.rb:52:in `save!'
/home/lutechi/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/activerecord-5.2.3/lib/active_record/validations.rb:80:in `raise_validation_error': Validation failed: Username can't be blank (ActiveRecord::RecordInvalid)

Danke für dieses nützliche Tutorial – es hat bei mir funktioniert, obwohl ich ein paar kleine Probleme habe:

  1. Der Installationsprozess scheint PostgreSQL 11 installiert zu haben, während die von Discourse unterstützte Version PostgreSQL 10 erfordert. Das sorgt also für einige Verwirrung!

  2. Meine importierten Benutzer scheinen sich nicht mit ihren WordPress-Anmeldedaten bei Discourse anmelden zu können. Ich habe es mit meinem eigenen Benutzerkonto sowohl mit dem Benutzernamen als auch mit der E-Mail-Adresse versucht, aber beides funktioniert nicht. Ich kann mich problemlos bei WordPress anmelden, und das Benutzerkonto ist in Discourse vorhanden, zusammen mit den zugehörigen Forumsthemen. Vielleicht hat sich etwas an den Passwörtern oder der Authentifizierung geändert?

Nutzen Sie SSO von WordPress?

Dafür ist das Migrate Password-Plugin erforderlich. Hast du es installiert?

3 „Gefällt mir“

Hallo Michael,

Nein, das ist der erste Hinweis auf das Plugin, den ich gefunden habe. Vielen Dank, dass du darauf hingewiesen hast – vielleicht habe ich irgendwo einen Schritt übersehen! Danke für den Hinweis, ich werde mir das morgen genauer ansehen, wenn meine Augen nicht mehr so müde sind!

Ruth

3 „Gefällt mir“

Hi :waving_hand:

Können auch von Nutzern hochgeladene Bilder migriert werden?
Das Plugin für die Nutzer-Uploads war GD bbPress Attachments.

Cheers :beers:

Das Skript scheint Anhänge zu importieren.

Du musst eine Umgebungsvariable BB_PRESS_ATTACHMENTS_DIR mit dem Pfad zu den Anhängen festlegen.

1 „Gefällt mir“

Die Uploads des bbPress-Plugins scheinen im Ordner /uploads der WordPress-Installation gespeichert zu sein. Dafür wurde GD bbPress Attachments verwendet. Ich bin mir nicht sicher, welchen Pfad ich in die Variable BB_PRESS_ATTACHMENTS_DIR eintragen soll. Könntest du mir dabei etwas helfen? Soll ich den vollständigen URL-Pfad zu den Uploads angeben, z. B. http://www.example.com/httpdocs/wp-content/uploads/2018/02/picture.png, oder etwas anderes?

Ich habe gesehen, dass das Import-Skript nicht erfolgreich abgeschlossen wurde, da der Schritt import_private_messages fehlgeschlagen ist. Private Nachrichten waren im Forum nicht aktiviert. Ich habe diesen Schritt aus dem Skript entfernt, und es schlägt nun mit der Meldung fehl: table wp_bb_attachments doesn't exist, was auch zutrifft. Ich kann jedoch keine Tabelle für Anhänge in der Datenbank finden. Wie konnten die Anhänge dann überhaupt funktionieren? :thinking:

Die Anhänge müssen sich in einem Verzeichnis auf dem Server befinden, auf dem Sie den Import ausführen.

Wenn Sie die Anhangstabelle nicht sehen, nach der das Skript sucht, kann es sein, dass Sie eine andere Methode zur Handhabung von Anhängen verwendet haben, als das Skript erwartet. Ich vermute, sie befinden sich entweder in einer anderen Tabelle, die Sie noch nicht gefunden haben, oder der relative Dateiname steht in den Beiträgen selbst.

Es klingt so, als müssten Sie eine weitere Funktion zum Importieren erstellen. Wenn Sie ein Budget haben, kann ich helfen. Unter Redirecting… finden Sie Informationen zu Imports. Sie scheinen keinen Vollservice zu benötigen, sodass Ihre Kosten geringer ausfallen würden als dort angegeben.

Da Discourse immer in einem Docker-Container läuft, sollte dieses Verzeichnis dann in den Import-Container eingebunden werden?

Richtig. Wenn Sie den Import aus einem Container ausführen, müssen Sie diese Bilder an einen Ort legen, von dem aus sie im Container sichtbar sind, und diesen Pfad verwenden.

1 „Gefällt mir“

Eine letzte Frage. Da du deinen Importdienst erwähnt hast, habe ich die Website geprüft und in meiner Datenbank weiter recherchiert, um zu finden, wo die Anhänge gespeichert sind. Ein Satz auf deiner Seite hat mich ein wenig beunruhigt:

Beispielsweise können einige Foren Dateien an einen Beitrag anhängen, ohne sie im Nachrichtentext zu erwähnen. Das Importskript identifiziert Anhänge, indem es Referenzen darauf im Nachrichtentext ersetzt; wenn dies geschieht, werden diese nicht verlinkten Anhänge ausgelassen.

Ich habe festgestellt, dass meine Anhänge in der Tabelle wp_postsmeta als _wp_attached_file gespeichert sind. Der Beitrag selbst, der diesen Anhang verknüpft, enthält jedoch keine Erwähnung davon im Nachrichtentext. Es scheint, dass die einzige Verknüpfung hier die post_id und ihre meta_id ist. Bedeutet das, dass dies ein „nicht verlinkter Anhang