2026:單台租用 Mac mini 上的 OpenClaw 開發、預發與生產隔離(LaunchAgent、連接埠、金鑰)
團隊之所以在 香港、日本、韓國、新加坡、美國 租用的 Mac mini M4 上交付 OpenClaw 自動化,是因為 macOS 與筆記型電腦一致;但沒有什麼比「預發環境的提示詞改寫了生產 MCP 技能」更能瞬間摧毀信任。本文說明 (一) 單台 mini 為何仍需要三道硬牆;(二) 量化各環境可觸碰邊界的 爆炸半徑矩陣;(三) 人類可用 grep 維護的 資料夾加連接埠命名契約;(四) 基於 launchd 的可重複 LaunchAgent 模式;(五) 如何拆分金鑰與 JSONL 紀錄而不複製 GPU;(六) 合併自動化變更前的預檢清單。並行閱讀 並行 agent 並發與佇列、金鑰與鑰匙圈,以及 JSONL 診斷與輪替範本。
為何在 Apple Silicon mini 上仍要堅持三環境,而不是「單資料夾莽到底」
財務把環境看成帳單行項目;平台工程師把它看成故障域。若單一 LaunchAgent 同時擁有 Slack Webhook 與生產 Terraform 狀態的寫權限,一次合併衝突就可能釀成事故。在單台實體機上拆分 開發 / 預發 / 生產 成本低,因為 M4 的 CPU 餘量充足——真正昂貴的是鬆散的目錄共享。隔離帶來三件可交付成果:彼此獨立的回復、可在不觸碰客戶 Webhook 的情況下做真實浸泡測試、以及把「Sarah 試新技能」與「計費機器人誤觸」區分開的稽核軌跡。
在 ProxyMac 情境下,你還應把「同一帳單下的多環境」告知安全團隊:網路出口、磁碟配額與備份策略是否按環境分層。若全部寫進同一份變更紀錄,事後究責會簡單得多。新人到職時,用一張圖解釋三個 plist、三個連接埠、三套金鑰,比口頭說「別動生產資料夾」有效十倍。
- 數值護欄:每個環境根目錄至少保留 20 GB 可用 APFS 空間,以免負載測試時 JSONL 尖峰拖慢其他 agent—磁碟個位數時請另做清理 Runbook。
- 人為護欄:預發警示與生產事故頻道絕不可複用;雜訊混流會訓練值班人員忽略兩類訊號。
- 自動化護欄:在 API 配額穩定滿一週前,將預發
maxConcurrentTasks上限設為生產的 一半。
爆炸半徑矩陣:各環境允許觸碰什麼
| 環境 | 允許的副作用 | 無工單禁止 | 典型 API 金鑰範圍 |
|---|---|---|---|
| 開發 | 本地 git 分支、沙盒 SaaS 專案 | 匯出客戶 PII | 唯讀鏡像或短效 PAT |
| 預發 | 對複製資料跑全技能圖 | 生產 DNS 變更 | 獨立 Stripe testmode + 非生產 AWS 角色 |
| 生產 | 客戶工作流程、計費 Webhook | 實驗性編譯器 | 最小權限角色並按季度輪替 |
把矩陣貼在架構圖旁,避免新人僅憑資料夾名推斷權限。若某行被違反,先凍結發布並用 版本升級與回復手冊 回復,再偵錯程式碼。
可憑肌肉記憶輸入的資料夾與連接埠契約
建立三個同級目錄,例如 ~/openclaw-dev、~/openclaw-staging、~/openclaw-prod—絕不要把預發嵌在生產內部。每個目錄內鏡像相同子結構(config、skills、logs、tmp),以便支援指令稿完全一致。將閘道綁定到 127.0.0.1 上間隔開的連接埠:例如開發 18789、預發 18799、生產 18809;空隙留給結對偵錯時的臨時連接埠轉送。
在內部 wiki 用五列表紀錄:環境名稱、絕對路徑、TCP 連接埠、LaunchAgent Label、所屬 Unix 使用者。當有人問「哪個 plist 卡死」時,答案應是一次 grep,而不是在 ~/Library/LaunchAgents 裡考古。
LaunchAgent 模式:每環境一個 plist,拒絕巨型單 plist
使用三個獨立 plist,例如 com.yourorg.openclaw.dev.plist、...staging.plist、...prod.plist。每個 plist 設定 WorkingDirectory、非預設 PATH 的 EnvironmentVariables,以及指向該環境 logs 樹的 StandardOutPath / StandardErrorPath。早期上線可把 ThrottleInterval 設為 10 秒,避免崩潰迴圈狂打供應商。
範例骨架(依安裝路徑裁剪):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"><dict>
<key>Label</key><string>com.example.openclaw.staging</string>
<key>WorkingDirectory</key><string>/Users/automation/openclaw-staging</string>
<key>ProgramArguments</key><array>
<string>/opt/homebrew/bin/openclaw</string>
<string>gateway</string>
<string>--port</string><string>18799</string>
</array>
<key>RunAtLoad</key><true/>
<key>KeepAlive</key><true/>
</dict></plist>
127.0.0.1,遠端存取走 SSH 連接埠轉送或經評審的邊緣代理—切勿把原始閘道連接埠暴露到公網。
金鑰、紀錄與輪替:避免交叉污染
將 API 金鑰放在獨立鑰匙圈項目或權限為 0400 的 .env 中,每環境一份。輪替生產金鑰時,絕不要讓預發「暫時」讀取同一路徑—捷徑幾乎總會變成永久設定。紀錄方面,為每條 JSONL 事件加 env=staging 等前綴,並使用不同檔名,使 輪替作業 不會在追開發雜訊時截斷生產歷史。
按環境對 http://127.0.0.1:<port>/healthz(或閘道等價路徑)做健康檢查,參考 健康探針模式。告警閾值應不同:開發在實驗期可容忍約 百分之五 抖動;生產在連續 兩次 失敗後應呼叫值班。
技能晉升生產前的預檢清單
- 比對設定:確保預發
openclaw.json(或等價物)與生產僅在明確列出的鍵上不同。 - 回放演練:將最近 50 條類生產事件以匿名載荷透過預發重放。
- 校驗連接埠:
lsof -nP -iTCP -sTCP:LISTEN僅在回環上顯示預期監聽。 - 檢查磁碟:
df -h顯示承載生產紀錄的 APFS 卷至少 20 GB 空閒。 - 校驗 MCP 伺服器:各環境工具清單指向不同工作目錄。
- 回復演練:在維護視窗練習對生產 plist 執行
launchctl unload/ load。 - 簽收:在變更單紀錄審核人縮寫—自動化變更應與應用程式發布同等嚴謹。
常見問題
生產應以 root 執行嗎?否—專用服務帳戶搭配檔案 ACL 優於 root;root 會放大 TCC 提示與稽核難度。
能共享一個 Node 執行階段嗎?版本可一致,但 NODE_OPTIONS 與全域 npm 前綴應按環境隔離,以免踩到 Homebrew PATH 文章中的坑。
GitOps 呢?鏡像分支(main、staging、dev)並對應到目錄,盡量使用唯讀複製—見 設定版本管理。
環境隔離後,ProxyMac Mac mini 版圖為何仍適合多環境 OpenClaw
隔離到位後,單台 Mac mini M4 仍提供並發閘道所需的 統一記憶體 餘量、與開發筆電一致的原生 macOS 行為,以及在 香港/日本/韓國/新加坡/美國 可預測的計費而無需 CapEx 尖峰。當預發需要編譯 Swift 套件而生產 agent 同時回應 Webhook 時,這一組合尤其明顯。請在 定價頁比較方案,在 說明中心 查閱遠端存取範式,並在 launchctl 只用文字說不清時保留 VNC 指引。