Hallo Discourse-Community,
ich möchte meine Erfahrungen beim Importieren eines IPB 3.1-Forums in Discourse 2.1 teilen, in der Hoffnung, dass dies für andere nützlich sein wird.
Eine kurze Zusammenfassung über die Community:
- Thema: Yii PHP Framework (Code-bezogene Diskussionen und Support)
- Mitglieder: ~26.000
- Themen: ~64.000
- Beiträge: ~293.000
Der Import dauerte 27 Stunden und 46 Minuten auf einer Maschine mit 16 GB RAM und 4 CPU-Kernen.
Anforderungen für den Import:
- Mitglieder behalten, aber alle SPAM-Konten bereinigen (~250.000 Konten, von denen nach der Bereinigung ~26.000 übrig bleiben)
- SSO von der Website implementieren (Benutzerkonten werden nicht von Discourse verwaltet)
- Themen, Beiträge und Kategorien mit ihren ursprünglichen URLs behalten, damit Web-Suchergebnisse weiterhin funktionieren und auch andere Links von Plattformen wie Stackoverflow
Dies basiert auf Migrating from Invision Power Board to Discourse - #23 by pfaffman, vielen Dank an @pfaffman für die hervorragende Arbeit am Importer.
Vorbereitung
Daten aus IPB exportieren
mysqldump <databasename> > /tmp/ipb.sql
cd /var/www/yiiframework.com/forum/ && tar czvf uploads.tgz uploads/
Kopieren Sie den SQL-Dump und die Uploads auf den neuen Server und legen Sie sie in /var/discourse/shared/standalone/ ab.
Ich gehe hier von einer einfachen Docker-Installation von Discourse aus.
Welches Skript verwenden?
Es gibt zwei Import-Skripte, ipboard.rb und ipboard3.rb. Das Skript ipboard3.rb sieht sehr roh aus und passt auch nicht zu unserem Tabellenschema, daher habe ich mich für ipboard.rb entschieden.
Die aktuelle Version des ipboard.rb-Import-Skripts verarbeitet Anhänge nicht gut und konvertiert auch keine Code-Tags, was für uns sehr wichtig ist, da wir viel über PHP-Code sprechen. Daher habe ich folgende Änderungen am Skript vorgenommen:
Hochgeladene Anhänge verfügbar machen
Das Import-Skript ersetzt Beitragsanhänge durch URLs zur hochgeladenen Datei.
Wenn Sie Ihre IPB-Instanz an der URL, unter der sie vorher war, online halten möchten, können Sie einfach die URL angeben (UPLOADS ist eine Konfiguration des Import-Skripts, siehe unten) zum Upload-Verzeichnis, und Sie sind fertig:
UPLOADS="https://www.yiiframework.com/forum/uploads"
Da wir jedoch zu Discourse importieren, um das alte Forum vollständig zu entfernen, müssen wir die Uploads woanders hinlegen. Wenn Sie einen nginx-Proxy vor Discourse verwenden, können Sie diesen so konfigurieren, dass er die hochgeladenen Dateien aus einem Verzeichnis auf dem Server bereitstellt. Fügen Sie Folgendes in den server-Teil der nginx-Konfiguration ein:
location /ipb_uploads/ {
alias /var/www/ipb_uploads/;
}
Und konfigurieren Sie die Anhangs-URL (siehe unten) wie folgt:
UPLOADS="https://forum.yiiframework.com/ipb_uploads"
MySQL im Discourse-Container einrichten
Starten Sie eine Bash-Shell im Discourse-App-Container:
docker exec -it app bash
Installieren Sie im Container MySQL und importieren Sie die Datenbank:
apt-get install mysql-server mysql-client libmysqlclient-dev
service mysql start
echo "create database ipb" | mysql -uroot -p
mysql -uroot -p ipb < /shared/ipb.sql
Als ich den ersten Import zum Testen des Skripts versuchte, lief er über mehrere Tage, um 200.000 Benutzer zu importieren, von denen wir wussten, dass ein großer Teil SPAM-Konten waren. Daher haben wir einige SQL-Abfragen erstellt, um Konten zu löschen, die nie etwas gepostet haben:
Beachten Sie, dass wir SSO verwenden werden, sodass gelöschte Benutzer beim Einloggen neu erstellt werden.
Wenn Sie kein SSO verwenden, können Ihre Kriterien für das Löschen von Benutzern anders sein.
Sie können Ihre Daten auch ohne Bereinigung importieren.
mysql -uroot -p
# dann die Bereinigungsabfragen anwenden
Als Nächstes müssen wir Abhängigkeiten für das Import-Skript installieren:
cd /var/www/discourse
echo "gem 'mysql2'" >>Gemfile
echo "gem 'reverse_markdown'" >>Gemfile
bundle install --no-deployment
Um den Datenbankzugriff auf die Discourse-Postgres-Datenbank zu ermöglichen, ersetzen Sie peer durch trust in /etc/postgresql/10/main/pg_hba.conf. Beachten Sie, dass 10 für die Postgres-Version steht. Wenn die Datei in Ihrer Einrichtung nicht existiert, ersetzen Sie 10 durch die Version von Postgres, die Sie aktuell verwenden.
Starten Sie Postgres neu, um die Änderungen zu laden: service postgresql restart
Importieren
Vorbereiten von Avataren und hochgeladenen Dateien:
mkdir /shared/imports
mv /shared/uploads.tgz /shared/imports
cd /shared/imports && tar xzvf uploads.tgz
Führen Sie das Import-Skript aus:
cd /var/www/discourse
DB_HOST="localhost" DB_NAME="yiisite" DB_USER="root" DB_PW="root" TABLE_PREFIX="ipb_" IMPORT_AFTER="1970-01-01" UPLOADS="https://www.forum.yiiframework.com/ipb_uploads" AVATARS_DIR="/shared/imports/uploads/" USERDIR="user" bundle exec ruby script/import_scripts/ipboard.rb | tee import.log
Stellen Sie sicher, dass die UPLOADS-URL wie oben besprochen angepasst wird, da Uploads in den Beiträgen als Links zur ursprünglichen hochgeladenen Datei enthalten sein werden.
Bereinigung
Wenn alles gut gelaufen ist, bereinigen Sie mit service mysql stop, apt-get purge mysql-server, rm -rf /var/lib/mysql
Einrichtung der URL-Weiterleitung
Um bestehende URLs zum Forum intakt zu halten, erstellt das Import-Skript Permalinks für jedes Thema, die die URL der Themen und Kategorien in IPB widerspiegeln.
Diese Permalinks decken jedoch keine Links zu bestimmten Beiträgen in einem Thema oder verschiedene Seiten ab.
Damit diese URLs ordnungsgemäß funktionieren, müssen Sie einige URL-Umschreibungsregeln konfigurieren. Es gibt 3 Optionen:
- Verwenden der Einstellung
permalink normalizationsin Discourse, um unnötige Teile aus den URLs zu entfernen - Umschreibungsregeln in nginx, wenn Sie einen nginx-Proxy vor Discourse haben
- Wenn das alte Forum an einer anderen URL/Host als Discourse war, können Sie ein benutzerdefiniertes Skript zur Umschreibung der URLs verwenden (das habe ich getan)
Hier ist der PHP-Code, den wir für die URL-Weiterleitung verwenden:
Verwandte Ressourcen
- Migrate a XenForo forum to Discourse
- Migrating from Invision Power Board to Discourse - #23 by pfaffman
- Feature: Invision Power Board Importer by pfaffman · Pull Request #5543 · discourse/discourse · GitHub
- Discourse-Bereitstellung mit SaltStack:
server-salt/states/discourse at master · yiisoft-contrib/server-salt · GitHub