vBulletin-Forum nach Drupal 7 migrieren

vBulletin-Forum nach Drupal 7 migrieren

Migrationsaufträge von einem System zu einem anderen sind immer eine besondere Herausforderung. Bei einem aktuellen Projekt ging es darum, die Webseite zu modernisieren und auf eine neuere Drupal-Version zu heben. In der Regel ist das keine große Sache. Die Besonderheit hier war, dass zu der Webseite ein Forum gehört, dass seit ca. 18 Jahren lief und zunächst mit der Software Phorum betrieben und später auf vBulletin umgestellt wurde. Das vBulletin-Forum wurde dann mit dem Modul DrupalvB an die Drupal-Webseite angebunden, so dass die User sich nur an der Drupal-Seite anmelden mussten, um auch das Forum nutzen zu können. Das ganze lief zur Zufriedenheit des Betreibers, hatte aber auch seine Schwächen. Es gab zwei völlig unterschiedliche Administrationsbereiche (einmal für Drupal und einmal für das Forum), was die Arbeit der Admins erschwerte. vBulletin ist nicht kostenlos und bei einem Upgrade bestand die Gefahr, dass irgendwann die Verbindung zwischen Drupal und vBulletin nicht mehr funktionieren würde. Die Forum-Software ist nicht einfach zu administrieren und viele Funktionen wurden überhaupt nicht benötigt. Bei dem nun anstehenden Upgrade der Drupal-Seite fiel daher die Entscheidung die Inhalte des vBulletin-Forum in ein Drupal-Forum zu migrieren.

Drupalseitig werden dazu diese Module benötigt:

  1. vBulletin (and Photopost) to Drupal: https://www.drupal.org/project/vbtodrupal
  2. Extensible BBCode (xbbcode): https://www.drupal.org/project/xbbcode
  3. Smiley: https://www.drupal.org/project/smiley
  4. Advanced Forum: https://www.drupal.org/project/advanced_forum
  5. Author Pane: https://www.drupal.org/project/author_pane
  6. Taxonomy Access Control: https://www.drupal.org/project/taxonomy_access
  7. und natürlich das Drupal Forum-Modul (im Core enthalten)
  8. Je nachdem welche weiteren Funktionen man in vBulletin verwendet hat, benötigt man unter Umständen weitere Drupal-Module wie Organic Groups. Das war hier nicht der Fall, weshalb wir darauf auch nicht weiter eingehen.

Das vbtodrupal-Modul übernimmt den Import der Daten aus dem vBulletin-Forum. Taxonomy Access Control wird benötigt, um die Zugangsberechtigungen zu den Forum-Boards aufzubauen. Die übrigen Module rüsten ein paar Funktionen nach, die das Forum schöner machen. BBcode ist nicht zwingend erforderlich, da man ebensogut Drupals "FilteredHTML" Eingabeformat verwenden kann. Da in den vBulletin-Posts aber jede Menge bbcode-Tags enthalten waren, die überwiegend erhalten bleiben sollten, war das BBcode-Modul eine gute Wahl.

Bei der eigentlichen Migration zeigten sich dann ein paar Stolpersteine, auf die wir nachfolgend eingehen wollen.

Vorbereitungen

Zunächst werden alle überflüssige Gruppen in vBulletin gelöscht. Warum etwas importieren, was man später nicht mehr braucht? Achtung: Gibt es in Gruppen, die in Drupal und vBulletin gleich heißen, so bricht der spätere Import ab! Entweder man löscht die betreffenden Gruppen in vBulletin oder benennt sie um. Für die Body-Felder von Node und Comment des Inhaltstypen Forum-Thema wird bbcode als einziger erlaubter Eingabefilter eingestellt.

Datenbank importieren

Um den Import der vBulletin-Daten in die Drupal-Datenbank durchfühen zu können, muss der Drupal Datenbankuser auch Lese-Zugriff auf die vBulletin-Datenbank haben. Bei der vorgefundenen Serverkonfiguration war dies nicht möglich. Jeder DB-User durfte aus Sicherheitsgründen nur auf genau eine Datenbank zugreifen. Daher haben wir alle Tabellen der vBulletin-DB in die Drupal-DB importiert. Da die vBulletin-Tabellen alle den Prefix "vb3_" hatten, ließen sie sich einfach von den Drupal-Tabellen unterscheiden und am Ende leicht wieder löschen. Die Drupal-Datenbank darf dagegen keinen Tabellen-Prefix verwenden, sonst bricht der Import mit einer Fehlermeldung ab. Sollte die Drupal-DB einen Prefix verwenden, muss man diesen also entfernen!

Der Pfad für die Ablage der Dateianhänge in vBulletin ist in der Tabelle vb3_datastore im Feld “options” hinterlegt. Hier stand der absolute Pfad “usr/www/users/xxx/yyy/files/attachments”. Den gab es allerding gar nicht und deutete darauf hin, dass hier noch die Konfiguration eines älteren Servers eingetragen war. Kurios, dass vBulletin sich daran nicht gestört hat. Das vbtodrupal-Modul dagegen schon. Da der Inhalt des Feldes "options" ein endlos langer Bandwurm ist, war die einfachste Methode den Pfad zu ändern, den Feldinhalt kopieren, im Texteditor ändern, zurückkopieren, speichern.

Nach dem Import

Falls im alten Forum Dateianhänge gestattet waren, trägt man Im Feld "Dateianhang" die erlaubten Dateitypen ein, standardmäßig steht da nur “txt”.

Für die importierten Kommentare, muss nach dem Import auf das neue bbcode-Format umgestellt werden. Das geht am besten per SQL.
Für die Nodes:
UPDATE field_data_body SET body_format = 'xbbcode' WHERE bundle = 'forum'
UPDATE field_revision_body SET body_format = 'xbbcode' WHERE bundle = 'forum'

Für die Kommentare:
UPDATE field_data_comment_body SET comment_body_format = 'xbbcode' WHERE bundle = 'comment_node_forum'
UPDATE field_revision_comment_body SET comment_body_format = 'xbbcode' WHERE bundle = 'comment_node_forum'

Wenn es in vBulletin User gab, die Beiträge verfasst hatten und in vBulletin gelöscht wurden (und nicht im Drupal-Backend) muss man per SQL die uid der Drupal Kommentartabelle auf ‘0’ (= "Gast") setzen. Bei den Nodes wurde das während des Importes vom vbtodrupal-Modul korrekt gemacht, nur leider nicht bei den Kommentarten (= die Antworten auf einen Forumbeitrag).

Jetzt müssen die Gruppen geprüft und ggf. die Berechtigungen in Taxonomy Access Control ergänzt werden, da die Foren von Haus aus keine Zugriffsbeschränkungen haben.

Der Such-Index muss einmal neu aufgebaut werden (via "Admin-Menü >> Konfiguration >> Suche und Metadaten >> Sucheinstellungen >> Seite neu indizieren"). Hierbei traten erneut Fehler auf, die zum Abbruch des Reindexing führten. Der Fehler tritt auf, wenn der Beitrag einen Kommentar von einem nicht mehr existierenden User hat aber nur wenn dieser als letzter kommentiert hat. Auch dieses Problem ließ sich leicht per SQL lösen. Um die betroffenen Node zu finden schaut man einfach im Such-Index nach bis zu welcher Node erfolgreich indiziert wurde, die nächste ist dann die die Probleme macht und muss per SQL bearbeitet werden.

Beispiel für die User-ID 1000052:

UPDATE comment SET uid='0' WHERE uid='1000052';

Jetzt erneut den Suchindex aufbauen lassen und schauen, ob der Fehler noch bei weiteren User-IDs auftritt. In unserem Fall waren es nur zwei,.

Ein weiteres Problem gab es mit beschädigten Beiträgen. Diese waren alle sehr alt und stammten noch aus der Zeit als Phorum als Forum-Software lieft. Offenbar wurden sie bei der damaligen Migration des Forums nach vBulletin bereichts fehlerhaft übernommen, denn sie waren in vBulletin nicht lesbar. Da sie dort aber keine Probleme bereiteten und wohl niemand sie vermisst hatte, wurden die Fehler noch einmal migriert. Da alle fehlerhaften Nodes zu einem User (mit der uid 1001233) gehörten, der außerdem gesperrt war, wurde hier nach uid gelöscht:

DELETE FROM node WHERE uid=’1001233’
DELETE FROM node_revision WHERE uid=’1001233’

Ab jetzt lief der Neuaufbau des Such-Index fehlerfrei durch. Auch der Neuaufbau der Berechtigungen, den Drupal anmahnte lief ohne Probleme durch.

Zum Abschluss wurden die vBulletin-Tabellen aus der Drupal-DB gelöscht. Die Kommentar-Benachrichtigungseinstellungen wurden auf "Standardstatus >> Keine" gesetzt  und der Inhaltstyp nur auf "Forenthema".

Das war's. Seitdem läuft das Forum unter Drupal. Die Administration hat sich deutlich vereinfacht. Und die User vermissen kaum eine Funktion des alten Forums