新しいホストに移行する際にユーザーセッションを維持する

Move your Discourse Instance to a Different Server の議論の続きです:

Discourse インスタンスを新しいサーバーに移行する際、あるいは新しく構築されたインスタンスにバックアップを復元する際に発生する問題の一つは、ログイン中のユーザーセッションがすべて失われてしまうことです。これにより、ユーザーは再度ログインする必要に迫られます。コミュニティによっては、これは望ましくない可能性があります。なぜなら:

  • 再ログインに手間取ることで、一部のユーザーが参加をためらう可能性があるため。
  • パスワードの回復に支援を必要とするユーザーがいる可能性があるため。
  • 一部のユーザーが新しいアカウントを作成し、投稿履歴やユーザーノートから分離してしまい、ゾンビアカウントを残す可能性があるため。

セッションが失われる原因は、Discourse のセッションクッキーがランダムに生成された秘密鍵で暗号化されており、デフォルトでは Redis に保存されていることにあります。Redis のデータはバックアップに含まれないため、サイトを新しいホストに復元すると、新しい秘密鍵が再生成されます。

このアプローチの利点は、バックアップファイルが漏洩しても、ユーザーセッションを侵害するために必要な鍵が含まれていないことです。これにより、非常に深刻な結果を招くのを防げます。

ただし、Discourse インスタンスを移行する際には、以下の手順に従って秘密鍵をコピーすることで回避できます。これにより、ユーザーセッションを維持したままホスト移行が可能になります。

ステップ 1: 秘密鍵の取得

既存の Discourse インスタンスに入り、rails コンソールを実行して秘密鍵を取得します。

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

最終行に表示された値をメモし、安全に保管してください。

ステップ 2: 新しいインスタンスで秘密鍵を設定

すでにバックアップを受信して移行するための Discourse インスタンスが準備できていると仮定して、取得した秘密鍵を設定するために app.yml を編集します。env セクションに追加します。

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

追加後、インスタンスを再構築します。

admin@newhost $ launcher rebuild app

ステップ 3: 新しいインスタンスで秘密鍵を確認

これはステップ 1 と同じですが、新しいホストでコマンドを実行します。

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

表示される秘密鍵は、ステップ 1 の鍵と完全に一致している必要があります。

ステップ 4: 移行を続行

ソース側の Discourse を読み取り専用にし、バックアップを取得して、宛先の Discourse にコピーし、復元します。DNS レコードを更新するか(テスト用のホストファイルのハックを使用)、ユーザーが新しいサイトにアクセスするように設定します。

以前にログインしていたセッションは、これで新しいホストに維持されるはずです。

警告

秘密鍵を複数の Discourse インスタンス間で共有しては絶対になりません。秘密鍵を入手された場合、そのサイト上のセッションクッキーを復号化・改ざんされ、非常に深刻なセキュリティ上の問題を引き起こす可能性があります。

いつもの通り、実際の Discourse インスタンスで作業する前に、サンドボックスインスタンスやテスト環境で上記の手順を実践・検証してください。成功に向けて準備を整えましょう!

最後に、この方法を説明してくれた @david に心から感謝します。私はここでそれをテストし、まとめただけです(編集や改善を歓迎します)。

「いいね!」 1