Discourseアップグレードエラー「FAILED TO BOOTSTRAP」

皆様、こんにちは。

初めて投稿させていただきます。ご対応いただき、事前に感謝申し上げます。Discourse で動作するフォーラム(https://forum.troygrady.com)の、通常ではあるものの遅れ気味のアップデート手順を進めており、画面の指示に従ってコマンドラインで「git pull」と「rebuild」を実行した時点でアップグレードが失敗してしまいました。

以下に「./launcher rebuild app」コマンドの出力を示します。また、「discourse doctor」スクリプトも実行しましたので、セキュリティ上の懸念があまりないと思われる場合は、その出力をここに投稿するか、リンクを送付することも可能です。

補足しますが、私は PHP/SQL の開発者としてそれなりに経験があり、Linux アプリケーションの管理も時々行っていますが、Discourse 自体については全くの素人です。また、初期インストールを私が行ったわけでもありません。まさに「お得意のケース」ですね。

ここでは単に画面の指示に従っているだけです。まずは Docker の UI 内の青い「upgrade」ボタンをクリックすることから始まりました。それが完了すると、コマンドラインからログインして git pull と launcher rebuild を実行するよう指示されました。その結果、現在のような状況に至っています。

なお、今回のアップグレードを行う前は、フォーラムは全く問題なく完璧に動作していました。もし診断の助けになるなら、その点も参考にしていただければ幸いです。今回のアップグレードを行う唯一の理由は、皆様からリリースされる最新機能に遅れをとらないためです。これは「壊れていなければ直すな」という私の考えとの矛盾ですが、アップグレードによって自分では修正できないようなエラーが発生するのを恐れていました。そして、実際にそうなってしまいました。

現時点ではフォーラムは完全にオフラインです。これは当社のコアコンポーネントであるため、できるだけ早く復旧させたいと考えています。

どのような知見でも、大変ありがたく存じます。

FAILED

Pups::ExecError: cd /var/www/discourse && su discourse -c ‘bundle exec rake db:migrate’ failed with return #<Process::Status: pid 3972 exit 1>
Location of failure: /pups/lib/pups/exec_command.rb:112:in `spawn’
exec failed with the params {“cd”=>“$home”, “hook”=>“db_migrate”, “cmd”=>[“su discourse -c ‘bundle exec rake db:migrate’”]}
f89318158c2c276c69a60d600def8a838ae4ad4bc7bafbe665fb1cd77c130ad1
** FAILED TO BOOTSTRAP ** 上記にスクロールして、以前のエラーメッセージをお探ください。複数のエラーが含まれている可能性があります。
./discourse-doctor で問題の診断に役立つかもしれません。

ようこそ、Discourse コミュニティへ。

どこにインストールしようとしていますか?OS は何ですか?公式ガイドに従っていますか?

おそらく実際には以前のエラーメッセージが存在していると思われます。データベース(サーバー)にアクセスできない状況のようです。

フォーラムが再び稼働し始めたら、マネージドホスティングの利用を検討されてはいかがでしょうか。

「いいね!」 1

こんにちは、Gavin さん!迅速なご返信をありがとうございます。私たちは Digital Ocean の Droplet を利用しており、ログインすると以下のような表示になります。

Welcome to Ubuntu 16.04.6 LTS (GNU/Linux 4.4.0-210-generic x86_64)

公式ガイドの利用については、お答えできません。この環境は約 3〜4 年間、問題なく稼働してきましたが、初期設定を担当したのは私ではありません。これまで必要だったのは、ブラウザ内でのアップグレードと、ごく稀なコマンドラインによる再構築のみで、それらはすべて私たちがほとんど手出しすることなく正常に動作していました。

再構築時のターミナル出力全体をファイルに保存しており、それをスキャンすることは可能です。ただし、私たちは仮想 Droplet 環境を使用しており、セットアップ以降は何も変更していません。実際、Discourse がブラウザ内でのアップグレードでスムーズに動作しているため、ほとんどログインすることさえありません。そのため、なぜ突然データベースにアクセスできなくなったのか、何が変化したのか見当が付きません。

もちろんです。これは長年問題なく動作してきたケースですので、変更を迫られる状況ではありません。ただし、私が対応するのではなく、定期的にインストール状況を確認し、最新の状態を保つために専門家に依頼することは喜んで行います。Discourse の専門家を探せるリソースやディレクトリはありますでしょうか?

ありがとうございます!

それを更新する必要があります。古いです。非常に古いです。

まず、動作するようにしましょう。エラーログを投稿してください。実際のエラーが何なのかを確認する必要があります。

再構築出力から警告とエラーを grep して、以下のような結果が得られました。

227:initdb: 警告: ローカル接続に対して「trust」認証を有効にしています
294:update-alternatives: 警告: リンクグループ psql.1.gz が破損しているため、代替 /usr/share/postgresql/13/man/man1/psql.1.gz の再インストールを強制しています
324:update-alternatives: 警告: リンクグループ postmaster.1.gz が破損しているため、代替 /usr/share/postgresql/13/man/man1/postmaster.1.gz の再インストールを強制しています

1684:createdb: エラー: データベース作成に失敗しました: エラー: データベース “discourse” は既に存在します
1811:I, [2021-08-29T20:18:40.246150 #1] INFO – : > cd /var/www/discourse && bash -c “touch -a /shared/log/rails/{production,production_errors,unicorn.stdout,unicorn.stderr,sidekiq}.log”
1813:I, [2021-08-29T20:18:40.253584 #1] INFO – : > cd /var/www/discourse && bash -c “ln -s /shared/log/rails/{production,production_errors,unicorn.stdout,unicorn.stderr,sidekiq}.log /var/www/discourse/log”
2563:StandardError: エラーが発生しました。この移行とそれ以降のすべての移行はキャンセルされました:
2698:-- add_column(:groups, :imap_last_error, :text)
2961:** ブートストラップに失敗しました ** 上へスクロールして、それ以前のエラーメッセージを確認してください。複数存在する可能性があります。
3118:createdb: エラー: データベース作成に失敗しました: エラー: データベース “discourse” は既に存在します
3245:I, [2021-08-29T20:22:40.262592 #1] INFO – : > cd /var/www/discourse && bash -c “touch -a /shared/log/rails/{production,production_errors,unicorn.stdout,unicorn.stderr,sidekiq}.log”
3247:I, [2021-08-29T20:22:40.274767 #1] INFO – : > cd /var/www/discourse && bash -c “ln -s /shared/log/rails/{production,production_errors,unicorn.stdout,unicorn.stderr,sidekiq}.log /var/www/discourse/log”
3960:StandardError: エラーが発生しました。この移行とそれ以降のすべての移行はキャンセルされました:
4087:** ブートストラップに失敗しました ** 上へスクロールして、それ以前のエラーメッセージを確認してください。複数存在する可能性があります。
4224:/error – ‘error’ という単語を検索
4358:createdb: エラー: データベース作成に失敗しました: エラー: データベース “discourse” は既に存在します
4485:I, [2021-08-29T20:26:59.373901 #1] INFO – : > cd /var/www/discourse && bash -c “touch -a /shared/log/rails/{production,production_errors,unicorn.stdout,unicorn.stderr,sidekiq}.log”
4487:I, [2021-08-29T20:26:59.381142 #1] INFO – : > cd /var/www/discourse && bash -c “ln -s /shared/log/rails/{production,production_errors,unicorn.stdout,unicorn.stderr,sidekiq}.log /var/www/discourse/log”
5200:StandardError: エラーが発生しました。この移行とそれ以降のすべての移行はキャンセルされました:
5327:** ブートストラップに失敗しました ** 上へスクロールして、それ以前のエラーメッセージを確認してください。複数存在する可能性があります。

Gavin、改めてご確認いただきありがとうございます。OS のアップグレードをおろそかにしてしまい、申し訳ありません。

上記は、スクリプトの出力から「error」と「warning」という単語を検索した結果に過ぎません。出力全体はここに保存してあります。もしその出力で他に確認すべき点があれば、お知らせください。喜んで投稿します。

ああ、申し訳ありません。出力が説明不足だったと気づきました。「StandardError」メッセージの詳細はこちらです。重複キーにより INSERT クエリが失敗したようです。可読性のためクエリの中身は伏せていますが、必要であれば含めることもできます。

I, [2021-08-29T20:23:37.257772 #1] INFO – : > cd /var/www/discourse && su discourse -c ‘bundle exec rake db:migrate’
2021-08-29 20:23:42.937 UTC [3996] discourse@discourse ERROR: duplicate key value violates unique constraint “data_explorer_queries_pkey”
2021-08-29 20:23:42.937 UTC [3996] discourse@discourse DETAIL: Key (id)=(-2) already exists.
2021-08-29 20:23:42.937 UTC [3996] discourse@discourse STATEMENT: INSERT INTO
[…]
FROM plugin_store_rows
WHERE plugin_name = ‘discourse-data-explorer’ AND type_name = ‘JSON’

rake aborted!
StandardError: エラーが発生しました。このマイグレーション以降のすべてのマイグレーションはキャンセルされました。

ERROR: duplicate key value violates unique constraint “data_explorer_queries_pkey”
DETAIL: Key (id)=(-2) already exists.

これを試してみてください

「いいね!」 1

はい、それで問題ありません(すでにご確認いただいている通りです)。

アップグレード自体の過程で何らかの問題が発生しました。

#marketplace にご要望を投稿するか、そこに定期的に回答している方を探すために閲覧してみてください。

必要なことは、Discourse が再び稼働し始めたら、以下の手順を実行することだけです。

  • Discourse のバックアップを取得する
  • バックアップをダウンロードする
  • Droplet を更新する
  • アプリを再構築する

これで、今後数年間は問題なく使えるはずです。

ありがとうございます。

私の理解が合っていれば、プラグイン「Data Explorer」が使用するデータベーステーブルに重複した行が存在しており、その重複行を削除することで再構築スクリプトが実行可能になるようです。そのスレッドによれば、このエラー(または同様のエラー)は以前も発生しており、Discourse のアップデートで将来的にこの問題が防止されるようになっている可能性があります。つまり、今後実施するアップグレードではこの問題に直面しないかもしれません。

私の読み方が正しいかご確認いただければ幸いです!

これは Ubuntu のアップグレードについておっしゃっているのでしょうか?もしそうであれば、了解しました。

その通りです

再度、おっしゃる通りです :slight_smile:

はい :smiley:

了解しました!指示をいただきました。迅速なフィードバックをありがとうございます。

「いいね!」 1

この件について結論を申し上げますと、このエラーに遭遇された方々にとって、いくつかの問題が発生したようです。

アップグレード自体に関しては、「data_explorer」プラグイン内の重複行が問題を引き起こしており、削除する必要がありました。

しかし、その一環として Ubuntu 16 から 20 への OS アップグレードも実施したところ、ネットワークエラーが発生し、再起動時に Digital Ocean の Droplet が到達不能となりました。具体的には、OS が新しい「Netplan」設定に移行する際、設定上の何らかの要因により、ネットワークインターフェースの起動スクリプトが実行される時点で完了できなくなったようです。その結果、Droplet は起動しましたが、ネットワークは機能しませんでした。その後、ブラウザ内のリカバリコンソールからアクセスし、ネットワークインターフェーススクリプトを再度実行することでインターフェースが起動し、外部からの接続が可能になりました。Droplet の再起動を避ける限り、Netplan 設定の修正をテストして適用するまでの間は問題ありません。

これはおそらく特殊なケースだとは思いますが、どこかで「OS アップグレードは通常問題を引き起こさない」と読んだ記憶があります。確かに大半のケースではその通りなのでしょうが、今回はそうではなく、技術的な専門家のタイムゾーンが重なり、復旧作業が可能になるまでの約半日、サービスが停止してしまいました。

さて、現在はすべて解決しました。迅速なご対応をいただき、皆様ありがとうございます。

「いいね!」 5