Benutzer-Sitzungen beim Umzug auf einen neuen Host erhalten

Fortsetzung der Diskussion aus Verschieben Ihrer Discourse-Instanz auf einen anderen Server:

Ein Problem bei der Migration einer Discourse-Instanz auf einen neuen Server oder sogar bei der Wiederherstellung eines Backups auf einer neu erstellten Instanz besteht darin, dass alle angemeldeten Benutzersitzungen möglicherweise verloren gehen – was bedeutet, dass sich Benutzer erneut anmelden müssen. Je nach Community kann dies unerwünscht sein, weil:

  • Einige Benutzer davon abgeschreckt werden könnten, teilzunehmen, wenn sie Schwierigkeiten haben, sich erneut anzumelden.
  • Einige Benutzer Hilfe bei der Wiederherstellung ihrer Passwörter benötigen könnten.
  • Einige Benutzer neue Konten erstellen könnten, wodurch sich ihre Beitragsverläufe und Benutzernotizen aufspalten und ein „Zombie-Konto" zurückbleibt.

Der Verlust von Sitzungen kann auftreten, da die Discourse-Sitzungs-Cookies mit einem zufällig generierten Geheimschlüssel verschlüsselt sind, der standardmäßig in Redis gespeichert wird. Redis-Daten sind nicht im Backup enthalten, sodass beim Wiederherstellen der Site auf einem neuen Host ein neuer Geheimschlüssel generiert wird.

Der Vorteil dieses Ansatzes besteht darin, dass eine kompromittierte Backup-Datei nicht den Schlüssel enthält, der erforderlich wäre, um Benutzersitzungen zu kompromittieren – was sehr negative Folgen haben könnte.

Bei der Migration einer Discourse-Instanz kann dies jedoch umgangen werden, indem man die folgenden Schritte befolgt, um den Geheimschlüssel zu kopieren. Dies ermöglicht die Migration zwischen Hosts, während die Benutzersitzungen erhalten bleiben.

Schritt 1: Den Geheimnis abrufen

Gehen Sie zu Ihrer bestehenden Discourse-Instanz, starten Sie eine Rails-Konsole und rufen Sie den Geheimschlüssel ab:

admin@host:/var/discourse$ ./launcher enter app
root@host:/var/www/discourse# rails console
[1] pry(main)> GlobalSetting.safe_secret_key_base
=> "90.......fed"

Notieren Sie den Wert in der letzten Zeile und bewahren Sie ihn sicher auf.

Schritt 2: Das Geheimnis in der neuen Instanz festlegen

Angenommen, Sie haben bereits eine Discourse-Instanz vorbereitet, die ein Backup empfangen soll, um Ihre Installation zu migrieren. Bearbeiten Sie die app.yml, um das soeben erhaltene Geheimnis festzulegen. Fügen Sie es im Abschnitt env hinzu:

env:
  DISCOURSE_SECRET_KEY_BASE: "90.......fed"

Starten Sie danach die Instanz neu:

admin@newhost $ launcher rebuild app

Schritt 3: Das Geheimnis in der neuen Instanz überprüfen

Dies ist derselbe Vorgang wie in Schritt 1, nur dass Sie die Befehle auf dem neuen Host ausführen:

admin@newhost:/var/discourse$ ./launcher enter app
root@newhost:/var/www/discourse# rails console
[1] pry(main)> GlobalSetting.safe_secret_key_base
=> "90.......fed"

Der ausgegebene Geheimschlüssel sollte exakt dem aus Schritt 1 entsprechen.

Schritt 4: Mit der Migration fortfahren

Setzen Sie die Quell-Discourse-Instanz auf „Nur lesen", erstellen Sie ein Backup, kopieren Sie es auf die Ziel-Discourse-Instanz und stellen Sie es wieder her. Aktualisieren Sie die DNS-Einträge (oder verwenden Sie einen Hack mit der hosts-Datei zum Testen), damit Benutzer auf die neue Site geleitet werden.

Früher angemeldete Sitzungen sollten nun auf dem neuen Host erhalten bleiben.

Warnung

Sie sollten den Geheimschlüssel auf keinen Fall zwischen mehreren Discourse-Instanzen teilen. Der Besitz des Geheimschlüssels würde es jemandem ermöglichen, seine Sitzungs-Cookie auf einer Site zu entschlüsseln und zu ändern, was sehr schwerwiegende Sicherheitsfolgen haben könnte.

Wie immer: Üben und testen Sie die oben genannten Schritte zunächst an einer Sandbox-Instanz oder Testinstallationen, bevor Sie an einer echten Discourse-Instanz arbeiten. Bereiten Sie sich auf Erfolg vor!

Zu guter Letzt: Vielen Dank an @david für die Beschreibung dieser Methode – ich habe sie lediglich getestet und hier dokumentiert (und Sie sind herzlich eingeladen, sie zu bearbeiten oder zu erweitern!).

1 „Gefällt mir“