Discourseのブートストラップ中にPups execエラーを解決する方法

ゼロから開発目的で新しい Discourse インスタンスを作成していますが、このブートストラップ エラーが再び発生しています。

FAILED
--------------------
Pups::ExecError: cd /var/www/discourse && su discourse -c 'bundle exec rake db:migrate' failed with return #<Process::Status: pid 1002 exit 1>
Location of failure: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in `spawn'
exec failed with the params {"cd"=>"$home", "tag"=>"migrate", "hook"=>"db_migrate", "cmd"=>["su discourse -c 'bundle exec rake db:migrate'"]}
bootstrap failed with exit code 1

コンテナのセットアップは、webonly と dataonly (redis) の 2 つのコンテナと、外部の PostgreSQL データベースで行っています。maxmind の設定をコメントアウトしても何も変わりません。

ここで他にできることはありますか?

メモリが不足している可能性が最も高いです。その場合は、スワップを追加するか、より多くのRAMを搭載したインスタンスに移行してください。free -h を試してください。

いいえ、4GBのRAMと十分なディスク容量(2 x 32GB)があります。全体的な環境は、ビルドが問題なく実行されている他のDockerマシンと同じです。

MEMステータス:

root@docker3a:/var/discourse# free -h
total used free shared buff/cache available
Mem: 3.8Gi 819Mi 1.4Gi 22Mi 1.9Gi 3.0Gi
Swap: 974Mi 52Mi 922Mi

「いいね!」 1

dmesg の出力で、関連する可能性のある最近のエラーはありますか?

ログ全体を共有していただけますか?

それは奇妙な推測です。通常、Discourseでメモリ不足が移行エラーを引き起こすことはありません。

x86_64 アーキテクチャを検出しました。
ランチャーを最新の状態に保ちます
ランチャーは最新の状態です
2.0.20250226-0128: discourse/base からプルしています
ダイジェスト: sha256:6f18aa2cd22bba0deb91d69194e577d4f96130ad555ae8ec646a8792cbfe37db
ステータス: イメージは discourse/base:2.0.20250226-0128 と同じです
docker.io/discourse/base:2.0.20250226-0128
/usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups.rb
/usr/local/bin/pups --stdin
18:C 2025年4月19日 16:38:41.670 # oO0OoO0OoO0Oo Redis が起動しています oO0OoO0OoO0Oo
18:C 2025年4月19日 16:38:41.670 # Redis バージョン=7.0.15, ビット数=64, コミット=00000000, 変更=0, pid=18, 起動したばかり
18:C 2025年4月19日 16:38:41.670 # 設定がロードされました
18:M 2025年4月19日 16:38:41.670 * モノトニッククロック: POSIX clock_gettime
18:M 2025年4月19日 16:38:41.670 * 実行モード=standalone, ポート=6379。
18:M 2025年4月19日 16:38:41.670 # サーバーが初期化されました
18:M 2025年4月19日 16:38:41.671 * バージョン 7.0.15 で生成された RDB をロードしています
18:M 2025年4月19日 16:38:41.671 * RDB の経過時間 72606 秒
18:M 2025年4月19日 16:38:41.671 * 作成時の RDB メモリ使用量 0.82 Mb
18:M 2025年4月19日 16:38:41.671 * RDB のロードが完了しました。キー数: 0、期限切れキー数: 0。
18:M 2025年4月19日 16:38:41.671 * ディスクから DB がロードされました: 0.000 秒
18:M 2025年4月19日 16:38:41.671 * 接続を受け入れる準備ができました
999:C 2025年4月19日 16:39:59.006 # oO0OoO0OoO0Oo Redis が起動しています oO0OoO0OoO0Oo
999:C 2025年4月19日 16:39:59.006 # Redis バージョン=7.0.15, ビット数=64, コミット=00000000, 変更=0, pid=999, 起動したばかり
999:C 2025年4月19日 16:39:59.006 # 設定がロードされました
999:M 2025年4月19日 16:39:59.006 * モノトニッククロック: POSIX clock_gettime
999:M 2025年4月19日 16:39:59.006 # 警告: サーバー TCP リスニングソケット *:6379 を作成できませんでした: bind: アドレスが既に使用されています
999:M 2025年4月19日 16:39:59.006 # ポート 6379 (TCP) でのリスニングに失敗しました。中止します。
18:signal-handler (1745080813) SIGTERM を受信し、シャットダウンをスケジュールしました...
18:M 2025年4月19日 16:40:13.541 # ユーザーがシャットダウンを要求しました...
18:M 2025年4月19日 16:40:13.541 * 終了前に最終 RDB スナップショットを保存しています。
18:M 2025年4月19日 16:40:13.549 * ディスクに DB が保存されました
18:M 2025年4月19日 16:40:13.549 # Redis は終了する準備ができました。さようなら...


失敗
--------------------
Pups::ExecError: cd /var/www/discourse &amp;&amp; su discourse -c 'bundle exec rake db:migrate' が終了コード #&lt;Process::Status: pid 1002 exit 1&gt; で失敗しました
失敗場所: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in `spawn'
exec がパラメータ {\"cd\"=&gt;\"$home\", \"tag\"=&gt;\"migrate\", \"hook\"=&gt;\"db_migrate\", \"cmd\"=&gt;[\"su discourse -c 'bundle exec rake db:migrate'\"]} で失敗しました
ブートストラップが終了コード 1 で失敗しました
** ブートストラップに失敗しました ** 上にスクロールして、以前のエラーメッセージを探してください。複数ある可能性があります。
./discourse-doctor が問題を診断するのに役立つかもしれません。
48b8aa6c912bbabc42d6b9373808088f5aa9079de1e1f7360fc858891a48556b

これは web_only コンテナなのに、なぜ redis が搭載されているのですか?

yml コンテナ定義を共有していただけますか?そして、なぜ 2 つのコンテナをインストールして実行しているのですか?

ファルコさん、おっしゃる通りです。私が愚かでした :wink:
修正します…

OK、web_only と redis の分離を修正しました。エラーメッセージは次のとおりです。

FAILED
--------------------
Pups::ExecError: cd /var/www/discourse & su discourse -c 'bundle exec rake db:migrate' failed with return #<Process::Status: pid 981 exit 1>
Location of failure: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in `spawn'
exec failed with the params {"cd"=>"$home", "tag"=>"migrate", "hook"=>"db_migrate", "cmd"=>["su discourse -c 'bundle exec rake db:migrate'"]}
bootstrap failed with exit code 1
** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one.
./discourse-doctor may help diagnose the problem.
801049b69a89d38b1ae5c299d356fc5f8dc6a8f518b1260c2dde05e0b6081556

しかし、これは私の知識不足による誤解かもしれません。

データベースは、PostgreSQL データベースを持つ別の LXC コンテナ上の外部にあるはずです。データベースユーザーとデータベースは存在しますが、web_only の最初のブートストラップの前にはデータベースは空です。スクリプトは最初のビルド時にリモートシステムでデータベース自体を作成しますか?それとも、まずデータベースコンテナを作成し、そのデフォルトスキーマとデータを手動で外部 PostgreSQL デーモンにエクスポートする必要がありますか?

全体的なセットアップの可視化

forum2 Setup.excalidraw

図をありがとうございます。それはかなり洗練されたセットアップですね。理由があり、その領域を理解している場合にのみ行うでしょう。

もし、まだ以下が表示されているのであれば、何が問題なのかを示すものだと思います。Redisは、リッスンする必要のあるポートを開くことができません。

したがって、質問は、Redisがこのコンテナでそれを実行すべきなのか、そしてもしそうなら、マシンのどこで別のRedisが実行されているのかということです。 lsof がここで役立つツールかもしれません。

@Ed_S

ヒントをいただきありがとうございます。まず、外部PostgreSQLデータベースを使用したDiscourseの一般的なセットアップに関する質問について、Falcoからの返信を待ちたいと思います。

はい、セットアップは、単一のアプリコンテナを使用する標準的なものと比較して、少し洗練されています。私はhetzner.deの仮想化環境であるProxmox(https://proxmox.com)を備えた専用のルートマシンで、すべてを実行しています。

「いいね!」 1

ログ全体、特に移行が失敗した部分を共有していただく必要があります。エラーが共有されていないため推測になりますが、AIプラグインを使用しており、データベースに必要なアドオンがインストールされていないのではないでしょうか。

いいえ、AIプラグインなしでインストールしました。ただし、このインスタンスは将来的にAI機能のプレイグラウンドになります。

以下にtarballを添付します。
./launcher bootstrap web_only >> web_only_bootstrap.log
redisとweb_onlyのymlファイルも含まれています。パスワードは削除済みです。

forum2_build.tar.gz (3.3 KB)

Longshot:

links:
  - link:
      name: redis
      alias: data

なぜ alias: redis ではないのですか?

「いいね!」 1

/samples/web_only.yml のファイルには次のように記載されています。

# Use 'links' key to link containers together, aka use Docker --link flag.
links:
- link:
name: data
alias: data

私の場合は、dataコンテナはredisコンテナです。

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
NAMES
a27999b28a90 local_discourse/redis \"/sbin/boot\" 2 days ago Up 20 hours

したがって、name: redisalias: data になります。

Dockerのドキュメントによると、これはレガシー機能ですが、まだ使用可能です。Legacy container links | Docker Docs を参照してください。

より良いアプローチは、まず標準的な「オールインワン」セットアップ(app.yml)を作成することだと思います。そして、コンテナから初期スキーマとデータを外部のPostgresマシンにSQLダンプします。@Falco、どう思いますか?

しかし、それはわずか28行しかなく、ほとんどの行が欠落しています。

私の新しい推測では、データベースにまったく接続していない可能性がありますが、redisと通信できていない可能性もあります。

以下を試してください。

./launcher bootstrap web_only >> web_only_bootstrap.log 2>&1

インストーラーは、有効な認証情報が提供され、データベースに到達できる限り、必要なものをすべて自動的に作成します。これは別のPostgreSQLサーバーを使用するようにDiscourseを構成するで文書化されています。

web_only_bootstrap2.tar.gz (9.1 KB)

こちらの方が良いはずです :wink:

これは新規インストールですか、それとも新しいサーバーへの移行ですか?

ログファイルを確認して、「migrate」を検索して移行エラーを見つける必要があります。

こちらがエラーです。

PG::DuplicateObject: ERROR:  type "hotlinked_media_status" already exists

移行されたものがコミットで元に戻された問題の可能性があります。これは関連していますが、解決策ではありません: https://meta.discourse.org/t/restore-fails-with-hotlinked-media-status-already-exists/323795。もしかしたらこちらが: Upgrading 2.7 to 3.1 failing: "hotlinked_media_status" already exists - #5 by merefield

また、これは修正すべきですが、実際には何も害はありません。

Plugin name is 'discourse-topic-voting', but plugin directory is named 'discourse-voting'

これを再度行う場合は、ファイルをtarに含めずに、ファイルへのリンクのみを提示してください。

「いいね!」 1