アップグレード失敗後の破損(ウェブアクセス不可)Discourse インストールの復旧方法

Discourse インストールを最新ベータ版(2.4.0 beta 11)に Web 経由でアップグレードしようとしましたが、現在アクセスできなくなっています(ご自身でお試しください。HTTP 500 エラーが返されます)。

状況

インストールされていたバージョンは 2.4.0 beta 6 のままで、2.4.0 beta 11 へのアップグレードを試みました。
かなり標準的なインストールだったと思いますが、カスタムプラグインが入っていたかどうかは覚えていません(今確認することもできませんが)、多くても 1〜2 個だったと思います。Discourse のデフォルト設定のほとんどは変更していません。

行ったこと

アップデート通知メールに記載されたワンクリックブラウザ更新リンクをクリックし、/admin/upgrade へ移動しました。

Web アップデーターによると、実際の Discourse バージョンをアップグレードする前に、まず Docker Manager の更新を行う必要があったため、それを選択しました。いくつかの処理が実行され、プログレスバーが半分程度進んだところで、Web ログ出力画面の上部に「アップグレード中に何かが失敗しました。ログを確認してください」というメッセージが表示されました。ログをスクロールして確認しましたが、すぐに目につくような問題は見つかりませんでした。残念ながらログを保存できず、単にページを再読み込みしてしまいました。失敗によりアップグレードがロールバックされただけで、再試行できるかもしれないと考えたからです。

興味深いことに、その後 admin/upgrade/ ページには「docker_manager は最新であり、更新の必要はありません」と表示されました。そのため(おそらく誤って)アップグレードは成功し、エラーメッセージはバグだったと推測しました。また、フォーラムがまだ動作しているか確認しましたが、問題なく動作しているように見えました。

これで Discourse インストール自体のアップグレードオプション(以前はグレーアウトしていた)が表示されたので、それを実行しました。再びログ出力に何らかの記録が残りましたが、あまり注意を払わず、プログレスバーが半分程度進んだところで、先ほどと同様にログ出力上部に「何かが失敗しました」というエラーメッセージが表示されました。

今回は前と同じように、ページを再読み込みしました(これも残念ながらログを保存できませんでした)。予想通り、Discourse は「最新」と表示されるようになりました。

現在 admin/upgrade/ で見ているのは以下の通りです:

しかし、実際のフォーラムは機能しておらず、500 エラーしか返しません。

動作していること

  • /admin/upgrade/ は動作し、Discourse が最新であると表示されます。
  • 「Processes」タブをクリックして実行中のプロセス一覧を取得することもできます。

しかし、「Backups」タブですでに 500 エラーが返り、/admin も同様です。/admin/upgrade/ 下の 2 つのタブを除き、フォーラムの機能する部分は見つかりませんでした。

回復方法

何が失敗したのか、またどこから手をつければよいのか見当もつきません。Web インターフェースなしでエラーの内容を特定するために、どのようにログにアクセスすればよいのかもわかりません。Discourse インストールは Digital Ocean でホストされており、マシンおよびおそらくコンテナに SSH で接続できますが、ログを探す場所がわかりません。

ログを探す場所のヒントをいただければ大変助かります。

現時点での最善の案は、バックアップに戻り、最後のバックアップ以降に投稿された内容を失うこと(幸いトラフィックは多くないため、1 日分のコンテンツの損失は許容範囲です)です。

現在の計画と不足しているもの

Digital Ocean で Droplet から週次バックアップを行うように設定しており、Discourse インストールも毎日バックアップするように設定されたと思います。S3 は設定していないため、バックアップはローカルに保存されているはずです。ただし、Digital Ocean の Droplet バックアップは 5 日前のもので、ここ数日のコンテンツは失いたくありません。

おおまかな計画は、以下の手順で既知の動作状態までバックアップから戻すことです:

  1. 今日または昨日の Discourse バックアップをダウンロードする。
  2. Digital Ocean を通じて Droplet 全体を 5 日前のバックアップにロールバックし、動作する Discourse インストールを復元する。
  3. ダウンロードしたバックアップをインポートしてコンテンツを復元する(最後の Discourse バックアップ以降のものは除く)。

ロールバック(ステップ 2)は Digital Ocean 経由で行えますし、そこまでに到達したら既存のバックアップのインポート方法(ステップ 3)も考えるつもりですが、Web インターフェースにアクセスできず /admin/backups/ が HTTP 500 エラーを返す状況で、バックアップに到達する方法がわかりません。

SSH を通じてバックアップを探すにはどこを確認すればよいですか?また、Digital Ocean 経由で古い Droplet バックアップにロールバックした後、それを復元するために何が必要ですか?

フォーラムを検索しましたが、S3 へのバックアップホスティングに関するトピックは見つかりましたが、ローカルに保存されている場合の保存場所については見つかりませんでした。

このトピックの助けを借りて、私の環境ではバックアップが /var/discourse/shared/standalone/backups/default に保存されていることが分かりました。

現在の仮説としては、そこに保存されている .tar.gz ファイルのいずれかをコピーし、Droplet をロールバックした後、同じ場所にバックアップファイルを戻せば、Discourse がそれを検出して Web インターフェース経由での復元が可能になるというものです。

cd /var/discourse
./launcher rebuild app

どうもありがとう、成功しました!バックアップと復元の全手順を踏むよりずっと簡単ですね!:slight_smile: