見えない二重書き込みの摩擦
Docker Compose は宣言的ですが、秘密は単一の真実でなければなりません。環境変数 OPENCLAW_GATEWAY_TOKEN とマウントした openclaw.json の gateway.auth.token が食い違うと、RPC は通っても WebSocket だけが落ちます。
クローズコード 1006 は多くの場合トランスポート欠陥(プロキシ切断、TLS 中断、RST)、1008 はポリシー違反(トークン不一致、Origin 不一致)です。HTTP 200 のヘルスだけでは観測できません。
ペアリングはローカル中間ファイルに依存します。匿名ボリュームは force-recreate で消えるため、UI がペアリング待ちのまま止まります。
TLS 終端のリバースプロキシではアイドルがクライアント ping より短いと本番だけ問題が出ます。
新しいイメージでも JSON が古いままだと split-brain 記事と混線します。バイナリ漂流とトークン漂流は証拠で切り分けます。
ログ sidecar が chmod を変えてもチケットに無ければ、認証失敗に見えるだけです。
ホストで Kubernetes と compose がポート共有すると WebSocket が認証エラーに見えます。
compose プロジェクト名無しのバックアップは別名前空間に古い pairing シャードを混入させます。
公式ドキュメントと同じ層別切り分け
公式トラブルシュート順はプロセス→トランスポート→認可→ペアリングです。Compose は証跡取得が docker logs 側になります。
プロセスは listen と再起動サンダルを確認します。systemd の話だけで ENTRYPOINT を無視しないこと。
トランスポートは publish と NAT と IPv6 を確認します。
認可は単一のソースオブトゥルースへ寄せ、Vault のファイル出力順も compose の順と同期させます。
ペアリングは命名ボリュームと UID/GID を明示します。
ガバナンスは compose のマージで secrets と env_file を必ずレビューします。
閾値と SL A の目安
レジストリが遅いときは start_period を45〜90秒にするまで評価します。
外向き WS は一分ごと、内向き curl は15秒など非対称にします。
SSD ではペアリングは10秒以内が目安、40秒超はディスク確認へ。
エンドツーエンドのローテーションは五分以内を狙い Vault と compose を同一パイプラインへ。
クローズコード保管は最低十四日、厳しければ三十日と疑似匿名化。
cgroup の CPU throttle は握手だけ伸ばすのでダッシュボードへ載せます。
トポロジ × トークン × WS × ペアリング
| トポロジ | トークン | WebSocket | ペアリング |
|---|---|---|---|
| ブリッジ publish | 単一起源 | 公開ポートと URL を一致 | 命名ボリューム |
| network_mode:host | JSON が読みやすい | NAT 無し・衝突注意 | パスは実機に近い |
| リバースプロキシ TLS | サーバのみが秘密を保持 | idle は ping より長く Upgrade を維持 | 必要なら sticky |
| Sidecar secrets | 競り合い回避 | ログを混同しない | 共有 pairing を GC しない |
行列は bridge / host / プロキシ / sidecar の選択肢と関連記事へ繋がります。
経済的には QA が漂流すると単一ベースノードより負けやすいです。
compose スニペット(値は置換)
version: "3.9"
services:
openclaw-gateway:
image: ghcr.io/example/openclaw-gateway:latest
env_file:
- .env.gateway
environment:
OPENCLAW_GATEWAY_TOKEN: "${OPENCLAW_GATEWAY_TOKEN}"
volumes:
- ./openclaw.json:/etc/openclaw/openclaw.json:ro
- gateway_pairing:/var/lib/openclaw/pairing
ports:
- "18789:18789"
healthcheck:
test: ["CMD", "curl", "-fsS", "http://127.0.0.1:18789/health"]
interval: 30s
timeout: 5s
retries: 5
start_period: 45s
volumes:
gateway_pairing:
1: compose config とログを保存。
2: 権威を決める。
3: ペアリングを命名ボリュームへ。
4: start_period を調整。
5: プロキシ idle と Upgrade。
6: openclaw doctor。
7: ローテーション記録。
8: URL 問題なら remote matrix。
関連リンクとナビ
リモートゲートウェイで gateway.remote.url を確認してください。
split-brain 記事でバイナリと設定を切り分けます。
daemon インストール runbook がヘルスチェック換算に有用です。
FAQ と結び
FAQ は日常運用向けであり個人情報の評価は別チケットです。
bare metal とオーケストレータが同居するとき identity の所有者を決めます。
env と JSON はなぜ衝突する?
Compose は .env を早期に展開し、bind-mount は後からです。優先順位を文章化してください。
1008 は常に鍵ミス?
ポリシーや Origin のことが多いです。サーバ側メッセージを読んでください。
recreate 後にペアリングが固まる?
匿名ボリュームがファイルを失うので命名ボリュームへ切り替えます。
インシデントには compose project を記載。
まとめ:トークンの単一起源・ペアリングの恒久化・層別ヘルスがそろって Compose が運用可能になります。
限界:不正プロキシや Vault の乱れた順序は Compose が救えません。
対比:SFTPMAC のレンタル Mac は SLA と検証可能な転送で 24/7 ゲートウェイを補強します。
doctor 実行ログを残す。
