gateway status --json、openclaw doctor(可併用 --json)與18789 埠佔用指紋串成可複製門禁;運維面對齊官方思路:先看 status/doctor,守護用 launchd,Runtime 用固定 Node 路徑而非互動式 nvm。延伸閱讀:設定驗證門禁、環境合併與 tee 門禁、RAG/embeddings 預拉取。
為何要做「狀態 × 診斷 × 埠指紋」三連檢?
僅跑單元測試無法保證閘道行程仍由預期的使用者與二進位啟動;doctor 偏向設定與本機依賴自洽,gateway status --json 偏向執行期真相。再加上 lsof 對 18789 的 PID/命令列摘要,可在 CI 裡做「佔用者是否漂移」的 diff:例如被遺留的測試 stub 佔埠,或兩個 plist 競爭同一標籤。當遠端 Mac 在長連線與高併發下仍要保持閘道穩定,先把這三份工件寫進合併前 job,後續的模型預拉、Webhook 與整合測試才不容易把根因埋進雜訊裡。
決策矩陣:門禁動作 × 產出工件
| 門禁步驟 | 主要產出 | 失敗時優先讀 |
|---|---|---|
openclaw doctor(+--json) | 結構化診斷/invalid-key 路徑 | 設定 diff、釋出線 schema |
openclaw gateway status --json | 監聽位址、版本、守護狀態 | launchd 日誌、plist Environment |
18789 埠指紋(lsof) | PID、指令列摘要 | 殘留行程、錯誤使用者 |
可選:gateway run --headless | 前景驗收/無 UI 啟動 | Token、bind、TLS 參數 |
前置條件(官方運維向)
- Node:以安裝器或套件管理員裝在全域固定路徑(例如
/usr/local/bin/node);CI 與 launchd 的PATH必須顯式包含該前綴,勿依賴~/.zshrc內的 nvm 區塊。 - launchd:
onboard --install-daemon或官方 plist 範本;確認EnvironmentVariables內含OPENCLAW_HOME/OPENCLAW_GATEWAY_TOKEN等與文件一致。 - CLI 釘版:
npm ls -g openclaw與閘道主線對齊,避免「客戶端 JSON 欄位新、daemon 舊」的假陰性。
可複現步驟清單
下列片段可在本機或 MacPull 遠端 Mac 的非互動 shell 直接貼上;請將敏感標頭去敏後再上傳工件。
set -euo pipefail
export PATH="/usr/local/bin:${PATH}"
node -v
node -p "process.versions" | tee "${TMPDIR:-/tmp}/node-versions.txt"
command -v openclaw
# 18789 佔用指紋(macOS)
( lsof -nP -iTCP:18789 -sTCP:LISTEN 2>/dev/null || true ) | tee "${TMPDIR:-/tmp}/openclaw-port-18789.fingerprint.txt"
openclaw doctor 2>&1 | tee "${TMPDIR:-/tmp}/openclaw-doctor.txt" || true
openclaw doctor --json > "${TMPDIR:-/tmp}/openclaw-doctor.json" 2>&1 || true
openclaw gateway status --json > "${TMPDIR:-/tmp}/openclaw-gateway-status.json" 2>&1 || true
# 可選:前景驗收(依你站內釘版 CLI 支援為準)
# openclaw gateway run --headless --bind 127.0.0.1:18789
18789 指紋:將 openclaw-port-18789.fingerprint.txt 與上一筆綠建置 artifact 做 diff;PID 或命令列變更應有變更單或預期內重啟說明。
doctor 先、status 後:先清掉 invalid-key/peer 依賴問題,再解讀 status 是否顯示監聽與版本欄位。
launchd 除錯:launchctl print gui/$(id -u)/com.openclaw.gateway(標籤以實際 plist 為準)對照 plist 內 ProgramArguments 是否仍指向舊 Node。
CI 摘要:在流水線最後 echo 一行結論,例如「doctor:OK status:listening fingerprint:unchanged」,方便 PR 討論區快速掃描。
headless 參數與健康判準
headless:當你需要在門禁裡「短跑前景行程」驗證參數卻沒有圖形環境時,使用 gateway run --headless(實際旗標以當前 CLI --help 為準)可避免桌面相依;正式長跑仍建議 launchd 守護。判斷是否健康:① doctor 結束碼為 0 且無 invalid-key;② gateway status --json 中監聽欄位顯示預期 127.0.0.1:18789(或你自訂 bind);③ 可選 curl 對健康路徑回 HTTP 2xx 且延遲低於團隊約定閾值;④ 埠指紋檔與基線一致或變更已註記。
常見報錯對照
| 表面現象 | 高機率根因 | 建議動作 |
|---|---|---|
EADDRINUSE/bind 失敗 | 18789 已被其他行程佔用 | 比對指紋檔;停止非預期 PID 或改測試埠並同步門禁 |
status 顯示未監聽 | plist 未載入、崩潰循環 | log show/守護 stderr;確認 Node 絕對路徑 |
401/Unauthorized | 漏帶 Authorization: Bearer | 對齊 OPENCLAW_GATEWAY_TOKEN 注入與探針標頭 |
command not found: openclaw | non-interactive PATH 缺全域 bin | 在 CI/plist 寫死 PATH 與 which openclaw 工件 |
invalid-key | 跨版本複製設定 | 依 doctor 巢狀路徑刪改;參考站內設定門禁文 |
HowTo/FAQPage 結構化資料建議
本頁已在 <head> 內提供與內容對齊的 HowTo(逐步對應 shell 與判準)與 FAQPage(埠指紋、指令順序、PATH);若你自行分叉模板,請維持:HowToStep.text 與正文步驟一致、FAQPage.mainEntity 與下方 FAQ 標題字串一致,避免搜尋引擎判定為「問答與可見內容不符」。
列印用檢查表
node -v、which node、openclaw --version已寫入工件openclaw-port-18789.fingerprint.txt與基線比對完成doctor/gateway status --json已歸檔且門禁結論已寫入 CI 摘要行- 依賴預拉取(模型/向量/全域 peer)已在閘道健康後執行
FAQ
埠指紋變了但服務看似正常?
可能是預期內重啟(PID 變更)或二進位路徑升級;請比對命令列字串是否仍含同一 openclaw 主線與相同 config 路徑,並在 PR 附上差異說明。
要在同一台機跑多個閘道嗎?
建議以不同 OPENCLAW_HOME 與不同監聽埠分區;門禁應分檔保存各埠指紋,避免單一 18789 基線誤傷多實例。
doctor 過但 Webhook 仍失敗?
回到 status 與網路邊界(TLS、反向代理、Bearer);必要時再對照站內「WireGuard 出口白名單」專文檢查固定出口與網域分流。
總結:在遠端 Mac 上把閘道跑穩,關鍵是執行期可觀測:doctor 清設定、gateway status --json 給真相、18789 指紋防漂移;再配合依賴預拉取降低合併後才爆的機率,並用一行 CI 摘要讓審核與值班同事省下登入時間。免登入導覽:首頁、定價、購買、說明中心、技術部落格。
固定節點跑合併前檢查與可稽核工件
說明中心、定價、購買 皆免登入可瀏覽;首頁入口:macpull.com 首頁。需要更多 OpenClaw 場景請回到 技術部落格 索引。