BryanV
(Bryan Van de ven)
1
こんにちは、皆様。
https://discourse.bokeh.org にて、数年間セルフホスト型の Discourse インスタンスを運用してまいりました。全体的には非常に安定しており、メンテナンスもほぼ不要でした。特にアップデートは、問題なく完璧に完了する「何事もなかったこと」のような作業であることがほとんどでした。
しかし、本日、2.7beta7 へのアップデート(完了時には問題なさそうに見えました)を行った後、サイトが完全に機能不全に陥ってしまいました。最初はページが正しくレンダリングされなかったり、JS コンソールにエラーが出たりと、かろうじて動いていましたが、ロールバックを試みたところ、UI が完全に使えなくなってしまいました。ドロップレットにログインして、以下のような試みも行いましたが、いずれも失敗しました。
リビルド
./launcher rebuild app
これは数回試行しましたが、いくつかの方法で失敗しました。
Discourse Doctor
./discourse-doctor
復元
./launcher enter app
discourse restore <backup file>
これも失敗しました。
全消去(Wipe)
また、「wipe」を実行してから復元を試みました。
./launcher stop app
./launcher destroy app
rm -r /var/discourse/shared/standalone/
その後、リビルドが成功し、「Congratulations, you installed Discourse!」という「新規インストール」状態まで戻すことができました。
そこで再度 discourse restore を実行しましたが、これも失敗しました。
EXCEPTION: 1 posts are not remapped to new S3 upload URL. S3 migration failed for db 'default'.
/var/www/discourse/lib/file_store/to_s3_migration.rb:131:in `raise_or_log'
/var/www/discourse/lib/file_store/to_s3_migration.rb:86:in `migration_successful?'
/var/www/discourse/lib/file_store/to_s3_migration.rb:357:in `migrate_to_s3'
/var/www/discourse/lib/file_store/to_s3_migration.rb:65:in `migrate'
/var/www/discourse/lib/file_store/s3_store.rb:240:in `copy_from'
/var/www/discourse/lib/backup_restore/uploads_restorer.rb:62:in `restore_uploads'
/var/www/discourse/lib/backup_restore/uploads_restorer.rb:44:in `restore'
/var/www/discourse/lib/backup_restore/restorer.rb:62:in `run'
script/discourse:145:in `restore'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/thor-1.1.0/lib/thor/command.rb:27:in `run'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/thor-1.1.0/lib/thor/invocation.rb:127:in `invoke_command'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/thor-1.1.0/lib/thor.rb:392:in `dispatch'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/thor-1.1.0/lib/thor/base.rb:485:in `start'
script/discourse:286:in `'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/lib/bundler/cli/exec.rb:63:in `load'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/lib/bundler/cli/exec.rb:63:in `kernel_load'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/lib/bundler/cli/exec.rb:28:in `run'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/lib/bundler/cli.rb:494:in `exec'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/lib/bundler/vendor/thor/lib/thor/command.rb:27:in `run'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/lib/bundler/vendor/thor/lib/thor.rb:392:in `dispatch'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/lib/bundler/cli.rb:30:in `dispatch'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/lib/bundler/vendor/thor/lib/thor/base.rb:485:in `start'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/lib/bundler/cli.rb:24:in `start'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/exe/bundle:49:in `block in '
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/lib/bundler/friendly_errors.rb:130:in `with_friendly_errors'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/exe/bundle:37:in `'
/usr/local/bin/bundle:23:in `load'
/usr/local/bin/bundle:23:in `'
Trying to rollback...
Rolling back...
Cleaning stuff up...
Dropping functions from the discourse_functions schema...
Removing tmp '/var/www/discourse/tmp/restores/default/2021-04-23-235404' directory...
Marking restore as finished...
Notifying 'system' of the end of the restore...
Finished!
[FAILED]
奇妙なことに、復元中はサイトが正常に戻りつつあり、古いコンテンツが表示されていました。しかし、その後に失敗が発生し、現在は何も表示されず、アカウントも消えてしまっています。
何かご助言や提案をいただければ幸いです。ここ 1 週間分の毎日バックアップ(必要であればさらに過去は Glacier に保存されています)があります。数日前に未使用のカテゴリーを削除しましたが、それが原因でしょうか?より古いバックアップから試してみますが、確実に復元できる手順についてのご指摘下さい。
「いいね!」 2
BryanV
(Bryan Van de ven)
2
古いバックアップでは解決しませんでした。復元中は「まあまあ大丈夫」に見えるのですが、
最後まで進んだ直後に、突然この状態になります:
余談ですが、バックアップには、元々メーリングリストからインポートされたが、Discourse サイトで数年間存在していた投稿は含まれていないのでしょうか?以前は 24,000 件の投稿がありましたが、今回は 5,000 件しかありませんでした。
「いいね!」 2
BryanV
(Bryan Van de ven)
3
Discourse の異なるバージョン、例えば 2.7beta6 などの古いバージョンでアプリを再ビルドする方法はありますか?
「いいね!」 2
BryanV
(Bryan Van de ven)
4
あるいは、単一の投稿が何らかの問題を引き起こしているのかもしれません。
例外:1件の投稿が新しいS3アップロードURLに再マッピングされませんでした。S3マイグレーションはデータベース ‘default’ で失敗しました。
この投稿を見つけ、削除または除去することは可能でしょうか?
「いいね!」 2
BryanV
(Bryan Van de ven)
6
@pfaffman はい、S3 に画像があります。
「いいね!」 2
pfaffman
(Jay Pfaffman)
7
うーん、もしかして壊れた投稿が一つだけあるのかもしれませんね。データベースを復元して修正し、新しいデータベースでバックアップファイルを再構築する必要があるでしょう。でも、実際には判断が難しいですね。
「いいね!」 2
BryanV
(Bryan Van de ven)
8
そのための手順はどこかに記載されていますか?どの投稿が壊れているかを特定する方法はありますか?
編集:あるいは、専門知識を持つ人に有料で依頼することは可能でしょうか?
「いいね!」 2
Don
9
新しい Droplet のバックアップまたはスナップショットから復元できるものはありますか?
「いいね!」 2
BryanV
(Bryan Van de ven)
10
新しい Droplet のバックアップや、復元可能なスナップショットはありますか?
残念ながらありません。DigitalOcean のバックアップは週 1 回のみで、私は Discourse の日次バックアップを S3 に設定し、1 週間分の最新データと、1 年前のデータを Glacier に保存していました。過去の Discourse アップグレードで多くの成功経験があったため、それが十分かつより良い方法だと考えていました(以前も正常にテスト復元を行っていました)。
「いいね!」 2
Benjamin_D
(Benjamin Decotte)
12
例えば、ベータ版アップグレードの直前のコミットである
version: 94301854938a0b36dd64666fb7a7c8406544a781
のように設定します。
「いいね!」 3
BryanV
(Bryan Van de ven)
13
実は、更新の件です。絶望的な状況で、ファイルの S3 への同期中に、エラーの「1 つの投稿」を報告してロールバックを開始する前に、リカバリスクリプトを強制的に中断しました。
サイトは実際に再起動し、セーフモードでアクセス可能になりました。その後、最新のベータ版とは明らかに互換性がなくなった「コードブロック用の COPY PASTE」テーマコンポーネントを無効化しました。その結果、セーフモードなしでもサイトはほぼ正常に動作しているようです。ただし:
- できるだけ「クリーン」な状態にするために、推奨される対応はありますか?例えば、アセットを S3 に再アップロードして「リベイク」するなど。そのための最新かつ最良の手順はどこにありますか?
追記:私の確認では、すべて通常通り回復したようです。古い投稿内の画像も S3/CDN から正しく読み込まれています。では、私の質問は、画像を S3 にアップロードする場合、このオプションはオフにするべきでしょうか?
スケジュールされたバックアップにアップロードを含める。これを無効にすると、データベースのみがバックアップされます。
冗長性をさらに高めるためにチェックしておくものだと思っていましたが、どうやらこれが復旧時の問題の根源のようですね。
「いいね!」 2
Don
14
以前、他のホスティングプロバイダーに移行した際、復元時にS3で問題が発生しました。そのため確認したところ、答えは「はい」でした。画像をS3に保存している場合は、アップロードを含まないバックアップ(データベースのみ)を作成する必要があります。ただし、あなたのケースでもこれが解決策かどうかはわかりません。試す場合は、事前にスナップショットを作成してください。
詳細はこちらをご覧ください:Restore a backup from the command line - #28
実際に試しましたが、問題なく正常に動作しました。
「いいね!」 2
pfaffman
(Jay Pfaffman)
15
お手伝いできます。月曜日以降、または危険手当が発生する場合はそれ以前に対応可能です。
当社の S3 への連絡先は、ページ下部に記載されているメールアドレスまで Contact Us - Literate Computing からお問い合わせください。
「いいね!」 2
BryanV
(Bryan Van de ven)
16
@pfaffman ありがとうございます!サイトは現在、完全に正常に動作しているようですが、もしよろしければ、ご都合のよい時に簡単な確認や健全性チェックを行っていただければ幸いです。いずれにせよ、今後の緊急時に備えて、あなたの商業連絡先情報を記録しておきました。 
以下は、他の誰かの参考になるかもしれない復元手順(レトロ)です。
概要
(成功した)アップグレード後、互換性のない非公式のテーマコンポーネントプラグインにより、サイトの UI が破損しました。このことは当时知られていなかったため、バックアップからの復元プロセスが開始されましたが、最適ではない構成により問題が発生しました。
詳細
- 2.7beta7 へのアップグレードが開始され、正常に完了しました。
- しかし、アップグレード後、サイトの UI は深刻な損傷を受けました:投稿本文が完全に欠落し、トップナビゲーション(ユーザー/ログインを含む)も完全に欠落し、JS コンソールはエラーを報告しました。
- その原因は、コードブロックのコピー&ペースト用のサードパーティ製テーマコンポーネントの互換性の問題であることが判明しましたが、当時は知られていませんでした。
- また、セーフモードに入る可能性も当時は認識されていませんでした。もしそれが知られていれば、残りの問題は回避できたはずです。
- 直接ナビゲーションにより
\\admin へのアクセスを確保し、ロールバックを試みました。これにより即座にユーザーがログアウトし、壊れた UI では再度ログインする方法がないように見えました。
- 最新の S3 バックアップ tarball を用いて手動復元を開始するために、DO Droplet にログインしました。
- S3 アセットのアップロード後の最終段階近くで、多くの復元試行が失敗しました。これは単一の投稿に何らかのエラーがあったためです。
- これは明らかに、S3 へのアセット再アップロードを試みる復元が不安定であるためです(Meta には複数の報告があります)。
- しかし、アセットはすでに S3 に保存されているため、アップロードアセットをバックアップする必要はありませんでした!
- 多くの復元試行の最中に、サイトを一時的に消去して「クリーンな状態」からやり直す試みも行われました。そのため、復元失敗後のロールバックは、空のサイトに戻ってしまいました。
- 最終的に、必死の賭けとして、復元を実行し、S3 アップロード中(失敗とロールバックの直前)にスクリプトを強制的に中止しました。
- サイトはオンラインに戻りましたが、以前の UI 問題が表示されました。しかし、セーフモードが知られており使用されたため、プラグインとテーマを無効化するとサイトは正常に機能しました。
- すべての非公式プラグインとテーマを削除しました(「コピー&ペースト」コンポーネントを含む)。その後、サイトは正常に機能しました。
- 以前にアップロードされた画像が引き続き読み込まれ、S3 CDN から提供されていることを確認しました。
最終的なアップロードと「再焼き付け」は不要だったと推測されます。アセットはすでに S3 に残っており、投稿を新しい URL を使用するように更新する必要もなかったからです。
スクリプトを中止した後、どの復元ステップが残っていたか(あるいは見逃されたか)については確信が持てませんが、現状のサイトではこれまで誰も問題に遭遇していません。
教訓 / 対応策
- 将来の問題診断には、まずセーフモードから始めること
- バックアップにアップロードを含める設定をオフにする(この状況について Discourse に警告を出すよう提案)
- すべての非公式プラグインとテーマコンポーネントを削除すること
- 新しい組み込みのコードブロックコピー機能をオンにするよう提案すること
- 回復のためのバックアップとして、Digital Ocean の週次イメージバックアップを有効化すること
「いいね!」 6
テーマコンポーネントですか、それともプラグインですか?作者にお知らせいただけますか?
「いいね!」 3
BryanV
(Bryan Van de ven)
18
「いいね!」 4
BryanV
(Bryan Van de ven)
19
復元プロセスについて1つ提案するとすれば、より堅牢にするためのオプションを提供することです。例えば、復元を成功させる上で唯一の障害が1つの不良投稿である場合、「その不良投稿を削除しますか?」と聞かれたら、迷わずYキーを連打するでしょう。
「いいね!」 3
gerhard
(Gerhard Schlager)
20
それは次の 2.8 ベータのいずれかに含まれる予定です。残念ながら、近日リリース予定の 2.7 にはまだ対応していません。
お助けの声を以前見逃してしまい、申し訳ありません。S3 に保存されたアップロードがリストアを破損させてしまうことで困っている他の皆さんへのヒントを共有します。バックアップから dump.sql.gz ファイルを抽出し、ファイル名を変更してください。例えば、元のバックアップが discourse-2020-10-09-133921-v20201007124955.tar.gz だった場合、結果として得られるファイル名は discourse-2020-10-09-133921-v20201007124955.sql.gz とします。このファイルをリストアすれば正常に動作するはずです。
「いいね!」 7