Sidekiq runitスクリプトがもろすぎる: **discourse:www-data** **+ forced** **-L log/sidekiq.log** **で1秒クラッシュが発生

こんにちは。公式Dockerコンテナの実行時の事実に基づいて、これを厳密に再記述させてください。

実行中のコンテナで見られるもの(事実)

これはrunitを使用する公式Dockerインストールです(標準の/var/discourseランチャーワークフロー。インシデント直前の再ビルドなし)。コンテナ内では:

  1. runitのSidekiqサービスが存在し、監視されているのがそれです
ls -l /etc/service/sidekiq/run
sv status sidekiq

インシデント中の出力:

down: sidekiq: 1s, normally up, want up
  1. 手動でのSidekiq起動は成功します
cd /var/www/discourse
sudo -u discourse bundle exec sidekiq -C config/sidekiq.yml

これは起動したままで、Redisに接続し、ジョブを処理します。

  1. /etc/service/sidekiq/run のパッチ適用のみ(再ビルドなし)でクラッシュループが即座に修正されます。/etc/service/sidekiq/run を以下に置き換えました。
#!/bin/bash
exec 2>&1
cd /var/www/discourse
mkdir -p tmp/pids
chown discourse:discourse tmp/pids || true
exec chpst -u discourse:discourse \
  bash -lc 'cd /var/www/discourse && rm -f tmp/pids/sidekiq*.pid; exec bundle exec sidekiq -C config/sidekiq.yml'

その後:

sv status sidekiq
run: sidekiq: (pid <PID>) <SECONDS>s

したがって、SidekiqはこのイメージではUnicornマスター経由で起動されておらず、実行スクリプトがクラッシュループするrunitサービスです。

discourse_docker内で正確なコードが見られない理由

同意します。厳密なテキストがリポジトリ内にないのは、/etc/service/sidekiq/runがイメージビルド/ブート中に生成/挿入される実行時の成果物であり、必ずしもdiscourse_docker内の逐語的なファイルではないからです。しかし、上記で示したように、これはこの公式イメージ内でアクティブに監視されているサービスです。

脆弱性を引き起こしたもの(事実+最小限の推論)

  • 標準のDebianパーミッションのため、logrotateの失敗も確認されました:/var/log = root:adm 0775であったため、logrotateはグローバルなsu root admを追加するまでローテーションを拒否しました。
  • logrotateが失敗したとき、/shared/log/rails/の下にsidekiq.logを含むファイルを再作成しました。
  • このイメージのデフォルトのrunitスクリプトはdiscourse:www-dataを使用し、/shared/logに強制的に-L log/sidekiq.logを指定していましたが、これによりSidekiqは共有ボリュームのパーミッションのずれに非常に敏感になり、有用なログが記録される前に即座に終了する可能性があります。

リクエスト/提案

上記を踏まえ、デフォルトのDocker/runit Sidekiqサービスを強化することを検討していただけないでしょうか?

提案されるデフォルト:

  • discourse:discourseとして実行する(コンテナ内の一般的な所有権と一致)。
  • bundle exec sidekiq -C config/sidekiq.yml経由で起動する。
  • 共有の-L log/sidekiq.logを強制するのを避ける(または耐障害性を持たせる)。

これにより、すべてのバックグラウンド/AIジョブを停止させるサイレントなdown: 1sのクラッシュループを防ぐことができます。

ご指定のブランチ/コミットがあれば、喜んでテストします。