対象読者:リモート Macで OpenClaw を載せる開発者と小規模運用担当。核心キーワード:OpenClaw、gateway、ヘルスチェック、LaunchAgent。バインド・トークン・更新の要点と、環境変数・plist・検査シェル・ログの再現手順を整理します。CI プリフライトと接続すると停止検知が早くなります。併読:セキュリティ実戦、MCP プリフライト、依存プレプル自動化。
2026 年セルフホスト gateway の典型リスク(バインド・トークン・更新)
設定ドリフトと無言停止が増えやすい領域です。バインドを広げると露出が増え、トークンの平文漏えいや更新後のキー変更で LaunchAgent がループし、CI 前置だけが黙って失敗します。
| 論点 | よくあるミス | 運用メモ |
|---|---|---|
| バインド | 0.0.0.0 かつ認証薄い |
127.0.0.1 既定、外向きは別記事のトンネル等 |
| トークン | リポ直書き・チャット貼付 | plist 環境変数または Keychain、ローテを Runbook 化 |
| 更新 | いきなり本番差し替え | 別ラベルで試し kickstart 前後にヘルス二重確認 |
前提条件と環境変数
Node は公式要件どおり fnm 等で固定し、先頭ログに openclaw --version。導入は公式 curl スクリプト優先。workspace に openclaw.json と logs/、トークンとポートは plist に明示します。
HowTo:六手順
- 1:
node -v固定、シェルと launchd の PATH 一致 - 2:workspace 絶対パスを
WorkingDirectoryに - 3:手動で
openclaw gateway(または文書の起動子)を一度成功 - 4:標準出力・エラーをログファイルへ
- 5:
~/Library/LaunchAgentsに plist、launchctl bootstrap gui/$(id -u) - 6:CI 等からヘルスシェル、失敗時は通知と
kickstart
ゲートウェイ起動とバインド戦略
| パターン | セキュリティ | 向くシーン |
|---|---|---|
127.0.0.1+長いトークン |
高 | リモート Mac 単体・CI 同梱の既定案 |
| Unix ドメインソケット | 高 | 同一ホスト内のプロキシ連携 |
0.0.0.0 裸 |
低 | 原則禁止(VPC 内でも WAF/認証必須) |
手動疎通後に plist 化すると EADDRINUSE 等を早く潰せます。MacPull のリモート Macなら依存プレプル旁路とヘルスチェックを同一 runner に寄せやすく、復帰も短くなります。
ヘルスチェック用スクリプト雛形(LaunchAgent と併用)
URL は文書の readiness に合わせて差し替え。-sf で失敗時非ゼロ、CI 前置や StartCalendarInterval から呼びます。
#!/bin/bash
set -euo pipefail
: "${OPENCLAW_GATEWAY_TOKEN:?}"
: "${GATEWAY_URL:=http://127.0.0.1:18789/health}"
curl -sf -H "Authorization: Bearer ${OPENCLAW_GATEWAY_TOKEN}" "${GATEWAY_URL}" >/dev/null
echo "ok $(date -Iseconds)" >>"${OPENCLAW_LOG_DIR:-$HOME}/openclaw-health.log"
plist 要点:Label 一意、ProgramArguments に openclaw と gateway、RunAtLoad、KeepAlive、必要なら ThrottleInterval 秒。
<?xml version="1.0" encoding="UTF-8"?> <plist version="1.0"><dict> <key>Label</key><string>com.example.openclaw.gateway</string> <key>WorkingDirectory</key><string>/Users/you/ws</string> <key>EnvironmentVariables</key><dict> <key>OPENCLAW_GATEWAY_TOKEN</key><string>REPLACE</string> <key>PATH</key><string>/opt/homebrew/bin:/usr/bin:/bin</string> </dict> <key>ProgramArguments</key><array> <string>/opt/homebrew/bin/openclaw</string><string>gateway</string> </array> <key>RunAtLoad</key><true/><key>KeepAlive</key><true/> <key>StandardOutPath</key><string>/Users/you/ws/logs/out.log</string> <key>StandardErrorPath</key><string>/Users/you/ws/logs/err.log</string> </dict></plist>
ログ観測とよくあるエラー FAQ(最小トラブルシュート)
ログ三手
tail -n 200err ログでスタック確認launchctl print gui/$(id -u)/ラベルで終了コードlsof -nP -iTCP -sTCP:LISTENでポート競合
Q. すぐ Exited:Node・PATH・WorkingDirectory。手動と plist を突合。
Q. 401:トークン/ヘッダ綴り。設定と揃える。
Q. 更新後のみ不安:which openclaw を plist と一致確認し kickstart -k。