Meine phpBB-Migrationsreise (PostgreSQL)

soft deleted posts werden als reguläre posts importiert (und sind sichtbar). das ist offensichtlich ein problem, da benutzer meiner meinung nach standardmäßig soft delete verwenden und gelöschte posts sensible informationen enthalten können.

relevante spalten sind: post_delete_user, post_delete_time, post_visibility, post_delete_reason

scheint, als ob post_visibility die einzig relevante ist – die anderen spaltenwerte werden nicht gelöscht, wenn ein post soft deleted und dann wiederhergestellt wird. normal = 1, unsichtbar = 2

meine lösung ist, soft deleted posts einfach zu verwerfen, weil es niemanden interessiert.

führe dies auf deiner quell-db vor der migration aus:

DELETE FROM phpbb_posts WHERE post_visibility = 2;
1 „Gefällt mir“

Ich habe eine einfache “kontinuierliche Migration”-Pipeline. Es ist eine Sammlung von Shell-Skripten, die Aufgaben wie diese ausführen:

  • phpBB-Datenbank, Anhänge usw. vom Remote-Server herunterladen
  • Discourse-Instanzen erstellen/verwalten
  • Spezifische site_settings werden angewendet, wenn eine Discourse-Instanz aus einer Vorlageninstanz erstellt wird
  • Diese sichern/wiederherstellen
  • Migration mit einem bestimmten Satz von Import-Skripten aus einem Git-Repository ausführen
  • Aufgaben nach der Migration durchführen

Im Grunde ermöglicht mir dies, an einer Discourse-Instanz (dctemplate) vor der Migration zu arbeiten, mit der ich herumspiele. Ich passe die Discourse-Einstellungen nach meinen Wünschen an.

Nachts lade ich die Live-Daten des bestehenden phpBB herunter und führe eine neue Migration auf einer neuen Discourse-Instanz (dcstaging) durch, die gerade aus der neuesten Vorlage erstellt wurde.

Dies dauert natürlich Stunden. Daher betreibe ich auch ein lokales phpBB mit einer sehr kleinen Datenbank, mit der ich Tests durchführe und die Migrationsskripte verbessere. Ich kann relativ schnelle Migrationen durchführen, um auf einer anderen Discourse-Instanz (dcdev) zu testen.

Der Test-Workflow tagsüber sieht also so aus:

Ich habe einige Arbeiten an der Vorlage vorgenommen und bin zufrieden damit, wo ich bin:

./dc_template_create.sh dctemplate

Ups, ich habe einen Fehler in meiner Vorlage gemacht. Stelle sie auf den vorherigen Zustand zurück:

./dc_template_restore.sh dctemplate

Führe eine schnelle Migration durch, um einige Dinge zu testen:

# Erstelle eine neue Instanz dcdev aus dctemplate (und wende spezifische site_settings auf dcdev an)
./dc_template_restore.sh dcdev dctemplate
./dc_migrate.sh dcdev # wird mit dem spezifischen Migrationsskript-Repository für diese Instanz ausgeführt

Führe eine lange Migration über Nacht vom echten, Live-phpBB durch:

./dc_template_create.sh dctemplate
./dc_template_restore.sh dcstaging dctemplate

./phpbb_pull.sh
./dc_migrate.sh dcstaging
sleep 300
./dc_rake.sh dcstaging # zusätzliche Aufgaben nach der Migration, die nicht vom Importer behandelt werden (Moderatoren erstellen, detaillierte Verschlagwortung, einige Themen verschieben usw.)

Wenn jemand interessiert ist, könnte ich es ein wenig aufräumen und teilen.

2 „Gefällt mir“

Discourse hat Tags, daher könnte es ratsam sein, diese zu nutzen und Unterkategorien abzuschaffen, wo es sinnvoll ist.

Meine Unterkategorien hatten jeweils mehrere angeheftete/sticky Themen, und wenn sie zu einer großen Kategorie zusammengefasst werden, sind das viel zu viele angeheftete Themen. Es ist störend.

Meine Lösung war, von Kategorien wie:

Essen
- Amerikanisch
- Chinesisch
- ...

zu dieser zu wechseln:

Essen
- Vorgestellt

Amerikanisch, Chinesisch usw. werden zu Tags, und alle angehefteten Themen kommen in “Vorgestellt” und werden dort nicht mehr angeheftet.

# Alle angehefteten Themen in einer Kategorie lösen und in eine Unterkategorie verschieben
def move_pinned_topics_to_subcategory(category, subcategory_name)
  subcategory = Category.where(name: subcategory_name).find_by(parent_category_id: category.id)
  topics = Topic.where(category_id: category.id).where.not(pinned_at: nil)
  topics.each do |topic|
    topic.update(pinned_at: nil, pinned_globally: false, pinned_until: nil,
      category_id: subcategory.id) if not topic.title[/Über die .+ Kategorie/]
  end
  Category.update_stats
end

food_cat = Category.find_by(name: 'Essen')
move_pinned_topics_to_subcategory(food_cat, 'Vorgestellt')
4 „Gefällt mir“

mein Forum hat auch eine frühere, tote Inkarnation (auch phpBB), von der wir einen wget-Siterip haben, also arbeite ich an einem Importer dafür. HTML-Dateien mit Nokogiri parsen, in eine intermediäre Datenbank aufnehmen und dann mit der Importer-Basisklasse arbeiten, um Zeilen in Discourse zu bekommen.

Ich habe das hier gesehen:

Ich vermute, das ist ein ungewöhnliches Problem, aber wenn jemand anderes dieses Problem hat, werde ich es vielleicht etwas aufpolieren und teilen. Lasst es mich wissen.

Oder wenn jemand das schon gemacht hat und es mit mir teilen möchte, ist das noch besser. Ich bin noch nicht sehr weit in dem Projekt.

2 „Gefällt mir“