OpenClaw ゲートウェイをレンタルのクラウド Mac miniに置くと、Apple Silicon を一括購入せずに本物の macOS サービスへ近づけられる。コスト感は1 日あたり約 16.9 ドル程度を目安に据えやすい。落とし穴は、マシンを捨て VPS のように扱うことだ。複数オペレーター、自動化アカウント、ベンダーの「ゴールデンイメージ」が見えないところで積み重なる。本稿はマルチテナント衛生に集中する:~/.openclaw あるいは OPENCLAW_HOME の分離、各ゲートウェイの一意な LaunchAgent Label、テンプレ由来のUID クローンへの対処、TCP/UNIX ソケットの衝突回避、そして環境変数とキーチェーンへの秘密の振り分け。初回構築は ゲートウェイオンボーディングと TCC と併読し、アップグレード後のジョブずれは LaunchAgent 復旧と再起動 で揃える。
共有ゲートウェイのリスク地図
共有ホストは三つの失敗モードを増幅する。状態の混線(セッションが互いの設定を上書き)、スケジューラ混乱(重複した launchd ラベル)、アイデンティティの漂流(クローンイメージが同じ数値 UID を再利用し、plist のパスは正しそうだが別人を指す)。下表は各リスクと緩和策を対応づける。誰かが openclaw gateway install を走らせる前に運用へ組み込むこと。
| リスク | 症状 | 緩和 |
|---|---|---|
| デフォルト設定根の共有 | SQLite ロック、資格情報混在、謎クラッシュ | 各人の OPENCLAW_HOME を ~/Users/<短名> 配下に固定 |
| LaunchAgent Label の重複 | 実際に動くジョブは一つだけ | テナント接頭辞を付け com.acme.openclaw.gateway.alice のようにする |
| イメージ UID クローン | plist が /Users/build などテンプレユーザーを指す | 古いジョブを bootout し、実ユーザ初回ログイン後に再インストール |
| TCP/UNIX エンドポイントの重複 | EADDRINUSE、ヘルスチェックのフラップ、エージェントのリトライループ | 席ごとに 18789–18809 のようなブロックを割り当て |
| 世界読み取り可能な鍵ファイル | 一発の cat で SSH セッション横断漏えい | 長期トークンはキーチェーン、環境スタブは chmod 600 |
初回の切り分けには30–45 分を見積もる:ゲートウェイ起動、エージェント接続、TCC プロンプト完了、再起動後の自己回復まで一気通貫で確認する。リハーサルを飛ばすと「自分のノートでは動いた」が、二人目の請負者が同じ mini に入った瞬間に夜間インシデントになる。
オペレーター別 OPENCLAW_HOME
個人用 Mac では ~/.openclaw で十分。レンタル共有では罠だ。mkdir -p ~/.openclaw-alice のようにディレクトリを切り、install/doctor より前にそのユーザのシェル設定で OPENCLAW_HOME をエクスポートする。パスは社内 Wiki に明記し、オンコールがチルダを皆同義と誤解しないようにする。
グループ ACL で一つのツリーを共有しないほうがよい。ゲートウェイは認証済みデバイスメタデータやローカルキャッシュ、単一ライターを前提とした IPC を混ぜる。POSIX グループは論理テナンシーの代替にならず、二人が同時に $OPENCLAW_HOME/tmp で UNIX ソケットを bind しようとしたときにだけ遅延させる。バックアップを集約するなら接頭辞ごとに tarball をオブジェクトストレージへ、一本の rsync マージは避ける。
自動化アカウントもテナントである。CI ユーザーがヘルスチェックを回すなら OPENCLAW_HOME=/var/lib/openclaw-ci(所有権を正しく)を与え、人間のツリーに寄生させない。監査で「どのツリーがその API キーを保持したか」を即答できる。
デモ用アカウントと本番アカウントで OPENCLAW_HOME を混ぜない。キャンペーン用の短命トークンが共有 SQLite に残ると、次の借り手が意図せず履歴を読める。チェックリストに沿ってディレクトリを物理削除または安全消去する。
LaunchAgent の Label とパス
macOS は Label で LaunchAgent を識別する。衝突は未定義挙動を招き、二番目の plist は Console に警告を残して放置されがちだ。逆 DNS でチームと席を埋め込む:com.yourorg.openclaw.gateway.designer1。ファイル名もラベルに揃え、インシデント時の grep を短くする。
ProgramArguments はそのユーザの実際のツールチェーン(npm グローバル、brew、固定 tarball)に合わせた絶対パスにする。ベンダー提供のマイナー macOS 更新のあと、バイナリパスが期待どおりか再確認する。Homebrew の Cellar 再配置はシンボリックリンクを静かにすり替える。編集は launchctl bootout → ファイル差し替え → bootstrap の順が安全で、bootout なしのホットスワップはゾンビ状態を残し真因を隠す。
StandardOutPath と StandardErrorPath は各 OPENCLAW_HOME 配下のログへ。共有 /tmp/openclaw.log は chmod 争奪と、デバッグログ時のトークン漏えいリスクを生む。テナント別ローテーションはコンプライアンス照会でも「誰が再起動したか」を示せる。
同一ユーザがカナリアと安定版の二ゲートウェイを持つなら、Label と OPENCLAW_HOME を二系統そろえ、当番手順書にラベル・ポート帯・ログパス・オーナーを表形式で載せる。
UID クローンとイメージリセット
クラウド Mac ベンダーはしばしば凍結イメージを配り、テンプレユーザが /Users/build や /Users/macuser を UID 501 で保持したままだ。新しい借り手へクローンするとき、~/Library/LaunchAgents とその UID のブートストラップ領域を明示的に掃除しない限り、launchd はテンプレアカウント登録済みジョブを再読込する。必ず本番ユーザでログインし id -u を取り、launchctl print gui/$(id -u) に自ラベルだけが並ぶことを確認する。
ホスト名だけ変えてホームを浄化しないままデモ短名を再利用しない。前イベントの com.vendor.openclaw がスナップショットに残り再起動で蘇ることがある。後述の番号付きチェックリストの bootout は任意ではない。
まれに仮想化スタックの誤移行で二人の人間アカウントが同じ UID を共有する。権限調整では救えず、OpenClaw は誤ったキーチェーン項目を読む。ベンダーへエスカレーションし、日常はサブスクごとにローカルアカウント一意性を保証する事業者を選ぶ。
グローバルチームでは夏時間やタイムゾーン切替が cron/LaunchAgent の窓をずらし、「昨夜まで動いた」の錯覚を生む。メンテ窓は UTC で固定し、plist の StartCalendarInterval に明示する。
ポートとソケットの衝突
TCP リスナーと UNIX ドメインソケットが最も騒がしい衝突面だ。オペレーターごとに文書化したポート帯を割り当てる——例:Alice が 18789–18799、Bob が 18800–18810——マッピングをインフラリポジトリへ。OpenClaw や隣接プロキシがデフォルトを掴むときは設定で上書きし、再起動レースで隣人のポートを奪わないようにする。
UNIX ソケットは OPENCLAW_HOME/run または tmp 配下に置き、グローバル /tmp/openclaw.sock を避ける。不潔終了後に古いソケットファイルが残ることがある。起動スクリプトは既知パスを unlink するか明確に失敗させ、半端な bind を残さない。同一 mini に nginx/Caddy があるなら /opt/tenants/<name> へテナント別設定を分け、意図しない include マージを防ぐ。
外部エージェントのヘルスチェックはテナントポートを明示する。「localhost:gateway」一般論は二ゲートウェイ共存で破綻する。ヘルス URL を OPENCLAW_HOME と同じ行に書き、Slack から .env を誤コピーしないようにする。
Tailscale や WireGuard を使うなら仮想 IP とポート帯を社内 DNS に登録し、二人が同じループバック番号を別トンネルへ向ける偽陽性を避ける。
環境変数とキーチェーン
環境変数は早期ロードされ非対話 SSH に向き、十二要素とも相性がいい。ただし共有 Mac で chmod 600 を忘れるとドットファイルが世界読み取りになりうる。複数管理者が同時に ps eww を叩くと、起動直後の環境が一瞬露出する点にも注意。
macOS キーチェーンはログインユーザに秘密を紐づけ、UNIX 権限が健全ならテナント横断読取りを起こしにくい。LaunchAgent 起動のゲートウェイは GUI セッション解鎖後のキーチェーンを継承する。ヘッドレスでは初回アンロック手順を TCC 文書と並べる。短命 CI トークンはシークレットマネージャから環境注入し aggressive にローテーションし、共有 .zshrc には書かない。
実務ポリシー:長期個人 API キーはオペレーターごとのキーチェーン項目。短命自動化キーは自動化 plist の EnvironmentVariables に書き plist 自体を chmod 0400。ブレイクグラスマスターはオフライン保管しレンタルディスクに置かない。四半期ごとに見直す。OpenClaw の秘密面はリリースで変わる。
Git でインフラを管理するなら sops 等で暗号化してから push する。.env.example はプレースホルダのみとし、たとえテストでも実プレフィックスを載せない。
オフボーディング前の番号付きチェックリスト
クラウド mini を返却または再イメージする前に、別エンジニアの目の前で実行する——こっそり単独作業は禁止。
- 証跡のエクスポート:
OPENCLAW_HOME、plist コピー、直近 24 時間ログを暗号ストレージへ tarball。CLI とゲートウェイの版も記録。 - 資格情報の失効:OpenClaw 関連 API キーと OAuth リフレッシュをローテーションし IdP で旧 ID を無効化。
- LaunchAgent の bootout:各テナントラベルで
launchctl bootout gui/$UID ~/Library/LaunchAgents/<file>.plistを実行しlaunchctl printで確認。 - plist ファイル削除:
~/Library/LaunchAgentsから OpenClaw 項目を消しクローン蘇生を防ぐ。 - 設定根の消去:方針に従い各
OPENCLAW_HOMEを shred するかボリュームを安全消去。 - キーチェーン掃除:OpenClaw 関連項目を削除し検索ヒットゼロを確認。
- ポート解放:割当ブロックにリスナが残っていないことを確認し、解放記録を次借り手へ渡す。
- 共有環境断片の除去:シェルプロファイル、
/etc/paths.d注入、旧ホーム参照の CI crontab を掃除。 - TCC 点検:残存プライバシー承認を記録。次テナントがカメラ/マイク/自動化の同意を継承してはならないならリセット。
- ベンダーチケット:証跡 tarball のチェックサムと「自組織の LaunchAgent ラベルがゼロになった」宣言を添付。
いずれかが失敗したら手を止める。中途半端なワイプは返却遅延より悪い——幽霊状態を次顧客に渡し、隔離の目的を壊す。
FAQ
エンジニア二人は同一のクラウド Mac mini 上で ~/.openclaw を安全に共有できるか?
できない。ランタイム DB・デバイス信頼・セッションキャッシュが混ざり、同一ソケットと TCC 承認を奪い合う。各自のホーム配下に OPENCLAW_HOME を用意すること。
プロバイダのクローンイメージがオフボーディング後に LaunchAgent を壊すのはなぜか?
ゴールデンイメージは同一 UID と古い plist パスを残しがちで、launchd が別テナントのラベルを蘇生したり Program が削除済みユーザーを指したりする。必ず bootout し LaunchAgents を掃除し、アクティブアカウントから再インストールする。
OpenClaw の API キーは環境ファイルと macOS キーチェーンのどちらに置くべきか?
共有ホストでは長期個人トークンはキーチェーン、時間単位で回す CI 風の注入はプレーンな環境ファイルに。テナントごとの権限なしに共有ディスクへコミットしないこと。
本物の macOS 挙動が要る OpenClaw ゲートウェイにとって Mac mini は依然として実用的な拠点だ。MacHTML は SSH/VNC 付きのクラウド Mac mini をレンタル提供し、ハードの CapEx なしに隔離戦略や LaunchAgent 衛生、クリーンな引き継ぎを稽古できる。macOS が要るプロジェクトの間だけ起動し、専用機へ移したら電源を落とせばよい。
クラウド Mac で隔離された OpenClaw
実機 Apple Silicon でマルチテナントゲートウェイ衛生を練習:独立ホーム、一意ラベル、退租前に検証できるゼロ化フロー。