2026年、launchd 配下の OpenClaw ゲートウェイトークン—レンタル ProxyMac Mac mini で SSH は認証できるのにデーモンが token_missing_config を繰り返すとき
OpenClaw を Apple Silicon Mac mini に載せ、香港・日本・韓国・シンガポール・米国 の ProxyMac ホストで運用するチームは、Terminal にベアラトークンを貼り付け openclaw gateway status が緑になるのを確認したあと再起動し—launchd がゲートウェイを再起動し続け、ログに token_missing_config や「認証は設定されているがトークンが無い」と出るパターンに直面します。失敗の本質は暗号ではなく、資格情報の居場所について対話シェル、~/.openclaw/ 以下の JSON、launchd が継承する環境ブロックの三つが食い違っていることです。本稿では (1) そのズレのメンタルモデル、(2) 四行の整合マトリクス、(3) PagerDuty の前に権限ミスを捕まえるファイルシステム確認、(4) 強化された plist パターン、(5) 九ステップの運用手順 を示し、launchd と SSH 環境、Keychain とシークレット衛生、ゲートウェイ再起動とリカバリ、JSONL 診断 へ橋渡しします。
- 症状の束: 人手の CLI 検査では通る一方、終了コード 78 相当の再起動が 45〜90 秒 ごとに続く。
- 見えない地雷: ゲートウェイはユーザ
runnerだが JSON は/Users/admin/にある—典型的なマルチアカウント・ドリフト。 - テレメトリの軸: JSONL の
auth行を、ゲートウェイのラベルを編集したあとのlaunchctl print gui/$(id -u)出力と突き合わせる。
なぜ「確実に export した」のにゲートウェイはトークンを忘れるのか
OpenClaw は上流ドキュメントに沿い、まず設定ファイルからゲートウェイ認証を解決し、任意の環境上書きを適用します。SSH セッションは ~/.zprofile を読み、オンボーディング中に export した値を引き継ぎ、対話 UID が所有するファイルを問題なく読めます。LaunchAgent は launchd から起動し、明示的な EnvironmentVariables と削られた PATH だけを継承し、~ は サービスアカウントの ホームとして解決されます—別の管理者として JSON を編集していた場合でもです。これらが揃うまでデーモンはクラウドリージョンに関係なくループします。
sudo -u svcaccount printenv OPENCLAW_GATEWAY_TOKEN が空なのに Terminal では値が表示されるなら、環境の不一致が証明されています—トークンそのものの欠陥ではありません。
三方向パリティ:対話シェル、ディスク上の JSON、LaunchAgent の環境
| ソース | ~/.openclaw/openclaw.json を読むか |
シェルの export を見るか | 無人ゲートウェイ向け推奨 |
|---|---|---|---|
| SSH ログインシェル | はい—サービスユーザと UID が一致する必要がある | はい—dotfile を読んだ後 | デバッグのみ |
ssh host command 非ログイン |
場合により—シェルモード次第 | 多くの場合いいえ | カナリア検証 |
| LaunchAgent plist | はい—ジョブを実行するアカウント由来のホーム | plist のキーのみ | 本番の基準ライン |
| plist が起動するラッパスクリプト | はい—スクリプトが権限を正しく落とせば | exec 前にスクリプトが export したもの |
高度なシークレット注入 |
API を疑う前に JSON の場所・所有者・POSIX 権限を確認する
LaunchAgent と同じ UID でエンコードされているユーザとして ls -le ~/.openclaw/openclaw.json を実行してください。権限は 600、所有者はその UID であるべきです—テナント向け mini で意図しないシステムデーモンとして動かしていない限り root 所有は稀です。複数エンジニアが sudo tee で触ったあと、ゲートウェイユーザには否定される ACL 断片が残り、管理者の対話読み取りだけは成功することがあります。launchctl print gui/$UID(ドメインは環境に合わせて gui と user を選ぶ)と突き合わせ、実際に OpenClaw を監督している plist ラベルを確認してください。
ディスク圧迫で設定ルートを動かした場合は—ディスクローテーションの記事 を参照—JSON 内の相対パスがデーモンのカレントディレクトリからまだ解決できるか再確認してください。
plist のパターン:EnvironmentVariables とラッパ経由の exec
OPENCLAW_LOG_LEVEL=debug のような短い非秘密フラグは、そのまま EnvironmentVariables に宣言します。ベアラトークンは、XML に長大な文字列を貼り付けるより、ファイル参照か Keychain ロードを行う小型ラッパを シークレット指針 に沿って使う方が安全です。ラッパは /usr/local/libexec/openclaw/ かロックダウンした ~/svc/bin に置き、四半期ごとに所有権レビューを挟んでください。
launchctl kickstart -k gui/$(id -u)/your.label を一度だけ—連打するとジョブトランザクションが重なり、構造化ログ のタイムラインが読めなくなります。
HK/JP/KR/SG/US の mini でトークンループを止める九ステップ
- CI のフックを一時停止 し、人間がクリーンな一回の起動サイクルを取れるまでゲートウェイの自動再起動を止める。
- UID/GID を記録 — LaunchAgent セッション内の
idとlaunchctl print user/$(id -u)ドメイン。 - 設定 diff: 設定のバージョン管理 の Git バックアップと
diff ~/.openclaw/openclaw.json。 - JSON 構文:
python3 -m json.toolまたはjq .で緊急編集の trailing comma を検出。 - 環境比較: SSH の
env | sortとlaunchctl printの EnvironmentVariables 節。 - PATH 整合:
openclawがProgramArgumentsの絶対パスで解決されるよう PATH の記事 に合わせる。 - クリーン再起動: リカバリ順序 に従い kickstart—盲目的な bootout 連打は避ける。
- JSONL tail: インバウンドを戻す前に
authenticated=trueに相当する行を確認。 - ドキュメント化: チケットにマスク済み抜粋と plist のチェックサムを貼る。
FAQ
テナント間でトークンを共有してよいか? ベンダーダッシュボードが許せばリージョンごとに別資格情報を—一台の mini をローテしたときの爆発半径を小さくします。
新しい mini へ移すとトークンは壊れるか? ファイルは移せますが発行側セッションは別問題—ホスト同一性が変わるなら明示的ローテーションを計画してください。
インバウンド Webhook はどこに置くか? 認証が安定してから HTTP ゲートウェイのパターン で入口を配線し、部分セットアップをリトライが増幅しないようにします。
決定的なホームディレクトリが ProxyMac テナントに効く理由
レンタル Mac mini M4 を HK/JP/KR/SG/US で使うと、設定ツリー向けの長寿命パス、自動化アカウントの予測可能な UID、常時オンゲートウェイ向けの Apple Silicon 効率が一度に揃います—地域ごとに金属を購入する必要はありません。リージョン比較は 料金、運用ドリルは ヘルプセンター、Keychain プロンプトが要る作業は VNC でリハーサルしてください。