openclaw doctor・一八七八九番の lsof 指紋をマージ前に連鎖する手順です。launchd と同じNode 絶対パス(nvm 回避)で headless 運用します。関連:validate CI ゲート、埋め込みプリフェッチ、環境マージ HowTo。料金・購入・ヘルプはログイン不要です。
この連鎖で潰す三つの盲点
- 人間だけの目視:SSH で眺めたときは緑でも、JSON フィールドなら自動で落とせた退行がある。
- ポートの幽霊:昨日の実験で残った
18789の待受が今日のジョブと衝突し、doctor単体では TCP 状態と突合していない。 - PATH の物語:CI は
nvm経由、launchdは別のnodeでゲートは緑でも本番が想定バイナリを再起動しない。
判断表:何を第一信頼にするか
| 信号 | 強み | 死角 |
|---|---|---|
| gateway status JSON | CI の差分や要約にそのまま載せやすい。 | 直後のクラッシュでは遅延があり得る。lsof とセットにする。 |
| doctor | プロバイダ配線や権限系を早く落とす。 | 18789 の独占所有を証明しない。 |
lsof 指紋 |
Mac 上のリスナ衝突の事実に近い。 | ログに秘密を混ぜないよう PID 行の取り扱いに規律が要る。 |
前提チェックリスト(上から順に)
本番に近いイメージで上から潰します。依存取得を先に済ませ定常レイテンシを測ると、常駐ゲートウェイ運用と整合します。
- Node は
node -vと絶対パスをログへ。nvmエイリアスは避ける。 - OpenClaw CLI はグローバルでピン留め。
command -v openclawを plist のProgramArguments草案と並べて記録。 - OPENCLAW_CONFIG_HOME を検証対象の設定木へ。秘密はマスク変数のみ。
- プリフェッチ:npm・モデル・コンテナ層を先に温め status を現実値に(上記埋め込み記事と併用)。
ステップ:マージ前ゲート脚本
依存インストールの後・マージの前に一度だけ走らせ、Webhook 用の一行要約に載せる単一ログ openclaw-gate.log を残します。
export CI=true
# `openclaw gateway status --help` にある JSON・非対話系フラグを追記
export OPENCLAW_GATE_LOG="${OPENCLAW_GATE_LOG:-openclaw-gate.log}"
: > "$OPENCLAW_GATE_LOG"
{
echo "=== node path ==="
command -v node
node -v
echo "=== openclaw path ==="
command -v openclaw
openclaw --version
echo "=== gateway status json ==="
openclaw gateway status --json > gateway-status.json
python3 -m json.tool gateway-status.json | head -n 80
echo "=== doctor ==="
openclaw doctor
echo "=== config validate ==="
openclaw config validate --config "${OPENCLAW_CONFIG_HOME:?}/openclaw.json"
echo "=== lsof 18789 ==="
lsof -nP -iTCP:18789 -sTCP:LISTEN || true
} 2>&1 | tee "$OPENCLAW_GATE_LOG"
記録した openclaw の絶対パスを launchd の plist に写します。listen アドレスやトークンを変えたあとはデーモンを再起動し、リスナと認証情報の部分ホットリロードを盲信しない運用に寄せます。
健康判据(三点すべて満たす)
- JSON:プロセス状態が実行中で、ビルド印がピン留めした CLI と一致する。
- HTTP:ループバックの
curlがドキュメント上のヘルス経路で 2xx。エッジと同じトークンを使う。 - TCP:
lsofが期待する PID ひとつ、または CI スモーク専用の明示ポートのみ。
headless パラメータと観測性
CI=true と openclaw gateway status --help の JSON・非対話フラグを明示し、tee で openclaw-gate.log に集約します。依存をプリプルしたうえで JSON・doctor・lsof 抜粋だけを webhook のCI 要約へ載せれば、ゲートウェイを再走させず安定します。
よくある署名と第一対応
| ログの形 | 想定原因 | まずやること |
|---|---|---|
EADDRINUSE(18789) |
古いゲートウェイまたはラベル重複。 | lsof の PID を止めるか、CI スモークを別ポートへ。 |
JSON は健全だが curl が失敗 |
bind インタフェース違いやトークン不一致。 | openclaw.json の listen と curl のホスト・Authorization を突合。 |
launchd 下で command not found: openclaw |
PATH にグローバル npm の bin が無い。 | ProgramArguments を絶対パスにするか plist で PATH を先頭補強。 |
HowTo/FAQPage 構造化データのメモ
先頭の JSON-LD に HowTo(六 step)と FAQPage(四問)の例を併記しています。用語は社内に合わせ差し替え、BlogPosting と同一 URL への併記が扱いやすいです。
FAQ
PR ジョブで常駐デーモンまで入れるべきか。 推奨しません。CLI のみのゲートにし、長寿命ホストだけ launchd を載せます。並列 PR と一八七八九番の取り合いを防ぎます。
status の前にプリフェッチする理由。 冷えたキャッシュはレイテンシと readiness で偽陽性を増やします。リードの validate ゲート記事と組み合わせ、プールイメージを一度温めてから測定します。
成果物の保持期間。 インシデント検証用に少なくとも十四日程度を目安にし、tarball には SHA256 を併記します。