Skip to content

docs(ops): 起動スクリプトをリポジトリ管理下に置き、本番障害の罠を記録 - #7

Merged
appdevelopsk merged 1 commit into
mainfrom
docs/ops-launcher
Sep 18, 2026
Merged

appdevelopsk merged 1 commit into
mainfrom
docs/ops-launcher

Conversation

@appdevelopsk

Copy link
Copy Markdown
Owner

背景

2026-09-17〜18 に本番が 502 → 500 と連続で停止した。復旧の過程で、
PM2 が実行している起動スクリプトが VPS 上にしか存在しないことが判明した。

PM2 pm_exec_path : /opt/appcfg/toolify-start.sh
リポジトリ       : 実体なし・全ブランチの履歴にも一度もなし
deploy.yml/docs  : 言及ゼロ

VPS のディスクが飛べば復元手段がない。スクリプト自身は冒頭で
「リポジトリ内の本ファイルがソース」と述べていたが、事実と異なっていた。

変更

  • ops/toolify-start.sh を追加。VPS の現物をそのまま取得(diff 0 で一致を確認済み)。
    冒頭コメントだけ、正本の所在と反映手順を事実に合わせて修正した。
  • docs/DEPLOY.md に「0. 起動スクリプトと踏んだ罠」を追加。

記録した罠(すべて実際に本番を落としたもの)

# 症状
1 rsync -az --delete の同期先に起動スクリプトを置く 毎デプロイで消え 502
2 HOSTNAME=127.0.0.1 自己 proxy の EPROTO全ページ 500
3 PORT 未指定 既定 3000 は別アプリが占有し EADDRINUSE
4 NODE_OPTIONS heap 300 V8 が Ineffective mark-compacts で abort
5 dump.pm2 の古い値 実害なし(実効値はスクリプトの export が上書き・実測確認済み)
6 デプロイ「成功」表示 落ちるのはスモークテストだけで、上から見ると成功に見える

2 の切り分けは nginx と同じヘッダを付けて叩く必要がある(素の curl は 200 を返す)。
5 は「古い値が残っている=危険」と短絡しかけた例で、pm2 deletepm2 resurrect
で実地に再現して実害なしと確認した経緯まで残した。

変更しないもの

deploy.yml は触っていない。 スクリプトの自動配置は罠 1 と干渉して
同じ事故を作り込むため、VPS への反映は手動のままとする(手順は DEPLOY.md に記載)。

本番の挙動は一切変わらない(ドキュメントとスクリプトの保全のみ)。

https://claude.ai/code/session_01ENHPNZ5ngcdrTHJ2H6oAFd

PM2 が実行している /opt/appcfg/toolify-start.sh は VPS 上にしか存在せず、
全ブランチの履歴を通じて一度も追跡されていなかった(VPS のディスクが飛べば
復元手段がない)。現物をそのまま ops/toolify-start.sh として取り込む。

あわせて docs/DEPLOY.md に 2026-09-17〜18 の本番障害で判明した罠を記録:

- rsync -az --delete の同期先に起動スクリプトを置くと毎回消える(502 の原因)
- HOSTNAME=127.0.0.1 は自己 proxy の EPROTO で全ページ 500。公開ドメイン名を使う
- 既定ポート 3000 は別アプリが占有しているので PORT=8500 が必須
- NODE_OPTIONS の heap 上限 300 では V8 が OOM abort する(現在 400)
- dump.pm2 の古い値は実効値を汚さない。判定は /proc/<pid>/environ で行う
- 上記はいずれもデプロイが「成功」表示のまま起きる(落ちるのはスモークテストだけ)

deploy.yml は変更しない。自動配置は上記1点目と干渉するため反映は手動のままとする。
本番の挙動は変わらない(ドキュメントとスクリプトの保全のみ)。

Claude-Session: https://claude.ai/code/session_01ENHPNZ5ngcdrTHJ2H6oAFd
@appdevelopsk
appdevelopsk merged commit b7ead2a into main Sep 18, 2026
2 checks passed
@appdevelopsk
appdevelopsk deleted the docs/ops-launcher branch September 18, 2026 00:48
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant