Openclaw Gateway 啟動(dòng)流程完整教程
Gateway 啟動(dòng)流程詳解
以 openclaw gateway run 命令為入口,追蹤從 CLI 到 WebSocket 服務(wù)就緒的完整初始化鏈路。
總覽:調(diào)用鏈
openclaw gateway run
└─ src/cli/gateway-cli/run.ts # CLI 參數(shù)解析與預(yù)檢
└─ runGatewayCommand(opts)
└─ runGatewayLoop(params) # 進(jìn)程鎖 + 信號(hào)管理 + 主循環(huán)
└─ src/cli/gateway-cli/run-loop.ts
└─ startGatewayServer(port, opts)
└─ src/gateway/server.impl.ts
│
├─ createChannelManager() # 通道管理器
│ └─ src/gateway/server-channels.ts
│
└─ startGatewaySidecars(...) # 配套服務(wù)
└─ src/gateway/server-startup.ts
└─ startChannels()
└─ for plugin of listChannelPlugins():
startChannel(plugin.id)
└─ for id of accountIds:
plugin.gateway.startAccount(...)
└─ extensions/whatsapp/src/channel.ts
startAccount()
└─ monitorWebChannel()
└─ monitorWebInbox()第一階段:CLI 參數(shù)解析
入口文件:src/cli/gateway-cli/run.ts
addGatewayRunCommand() 將以下選項(xiàng)掛載到 Commander CLI:
| 選項(xiàng) | 說明 |
|---|---|
--port <port> | WebSocket 端口(默認(rèn) 18789) |
--bind <mode> | 綁定模式:loopback / lan / tailnet / auto / custom |
--token <token> | 共享 token(也可通過 OPENCLAW_GATEWAY_TOKEN 環(huán)境變量設(shè)置) |
--auth <mode> | 認(rèn)證模式:token 或 password |
--password <pw> | password 模式下的密碼 |
--tailscale <mode> | Tailscale 暴露模式:off / serve / funnel |
--force | 啟動(dòng)前強(qiáng)制殺死占用端口的進(jìn)程 |
--dev | 開發(fā)模式:自動(dòng)創(chuàng)建配置和 workspace |
--verbose | 詳細(xì)日志輸出 |
--ws-log <style> | WebSocket 日志樣式:auto / full / compact |
第二階段:預(yù)檢與配置驗(yàn)證
函數(shù):runGatewayCommand(opts) —— src/cli/gateway-cli/run.ts
按順序執(zhí)行以下檢查:
- 開發(fā)模式檢測(cè):
OPENCLAW_PROFILE=dev或--dev時(shí)進(jìn)入開發(fā)模式,調(diào)用ensureDevGatewayConfig() - 日志配置:?jiǎn)⒂脮r(shí)間戳前綴、設(shè)置 verbose 等級(jí)、配置 WebSocket 日志樣式
- 端口解析:
--port優(yōu)先,否則讀取config.gateway.port,默認(rèn) 18789 - 強(qiáng)制釋放端口:
--force時(shí)調(diào)用forceFreePortAndWait()嘗試 SIGTERM → SIGKILL - 認(rèn)證配置解析:
- 合并 config + 命令行參數(shù)
- 調(diào)用
resolveGatewayAuth()解析最終的 token / password / tailscale 認(rèn)證
- 配置存在性檢查:非
local模式必須存在~/.openclaw/config.json - 綁定模式驗(yàn)證:非
loopback綁定必須配置 token 或 password - 進(jìn)入主循環(huán):調(diào)用
runGatewayLoop()進(jìn)入下一階段
第三階段:進(jìn)程鎖 + 信號(hào)管理
函數(shù):runGatewayLoop(params) —— src/cli/gateway-cli/run-loop.ts
runGatewayLoop()
│
├─ 1. acquireGatewayLock() # 獲取文件鎖,防止多實(shí)例
│ └─ src/infra/gateway-lock.ts
│ 寫入 .pid 鎖文件,并持有獨(dú)占句柄
│
├─ 2. 注冊(cè)信號(hào)處理器
│ ├─ SIGTERM → request("stop") # 容器/系統(tǒng)關(guān)機(jī)
│ ├─ SIGINT → request("stop") # Ctrl+C
│ └─ SIGUSR1 → request("restart") # 熱重啟(需授權(quán)令牌)
│
├─ 3. while (true) 主循環(huán)
│ ├─ server = await params.start() # 啟動(dòng)服務(wù)器(見第四階段)
│ └─ await new Promise(resolve => { restartResolver = resolve })
│ # 掛起等待信號(hào);SIGUSR1 觸發(fā)時(shí) restartResolver() 解除
│
└─ 4. finally 清理
├─ lock.release() # 釋放文件鎖
└─ cleanupSignals() # 移除所有信號(hào)處理器超時(shí)保護(hù):信號(hào)觸發(fā)后 5 秒若未完成關(guān)閉,強(qiáng)制 process.exit(0)
第四階段:Gateway 服務(wù)器完整初始化
函數(shù):startGatewayServer(port, opts) —— src/gateway/server.impl.ts
共 26 個(gè)子階段,按順序執(zhí)行:
階段 1:環(huán)境變量準(zhǔn)備
- 設(shè)置
OPENCLAW_GATEWAY_PORT供子進(jìn)程使用 - 記錄已接受的環(huán)境變量選項(xiàng)(
OPENCLAW_RAW_STREAM等)
階段 2:配置加載和遷移
readConfigFileSnapshot()讀取配置快照- 檢測(cè)遺留配置(
legacyIssues),自動(dòng)調(diào)用migrateLegacyConfig()遷移并寫回 - Nix 模式下拒絕自動(dòng)遷移,拋出錯(cuò)誤
- 驗(yàn)證配置 schema 有效性
階段 3:插件自動(dòng)啟用
applyPluginAutoEnable()根據(jù)環(huán)境變量自動(dòng)激活插件- 有變更時(shí)寫回配置并記錄日志
階段 4:基礎(chǔ)運(yùn)行時(shí)初始化
loadConfig()加載最新配置- 按需啟動(dòng)診斷心跳(
startDiagnosticHeartbeat()) setGatewaySigusr1RestartPolicy()設(shè)置重啟策略initSubagentRegistry()初始化子 Agent 注冊(cè)表resolveDefaultAgentId()/resolveAgentWorkspaceDir()解析默認(rèn) Agent 工作目錄loadGatewayPlugins()加載所有插件,合并 Gateway RPC 方法
階段 5:渠道插件日志器初始化
- 為每個(gè)已注冊(cè)渠道(Telegram、Discord、WhatsApp 等)創(chuàng)建獨(dú)立子日志器
- 為每個(gè)渠道創(chuàng)建
RuntimeEnv - 合并渠道 RPC 方法與核心方法
階段 6:運(yùn)行時(shí)配置解析
resolveGatewayRuntimeConfig()綜合解析:- 綁定地址(
bindHost) - 是否啟用 Control UI
- 是否啟用 OpenAI 兼容端點(diǎn)
- 認(rèn)證配置(
resolvedAuth) - Tailscale 配置(
tailscaleMode) - TLS 運(yùn)行時(shí)(
gatewayTls) - Hooks 配置(
hooksConfig)
- 綁定地址(
階段 7:Control UI 資源準(zhǔn)備
- 如有自定義
controlUi.root,驗(yàn)證路徑是否存在 - 否則調(diào)用
resolveControlUiRootSync()自動(dòng)定位前端資源 - 找不到時(shí)觸發(fā)
ensureControlUiAssetsBuilt()自動(dòng)構(gòu)建
階段 8:Wizard 會(huì)話跟蹤器
createWizardSessionTracker()創(chuàng)建 onboarding wizard 會(huì)話管理器
階段 9:創(chuàng)建 Gateway 運(yùn)行時(shí)狀態(tài)
loadGatewayTlsRuntime()加載 TLS 證書createGatewayRuntimeState()創(chuàng)建核心運(yùn)行時(shí)(最重要的子階段):- 創(chuàng)建 HTTP/WebSocket 服務(wù)器并綁定端口
- 初始化 WebSocket 客戶端集合(
wss、clients) - 創(chuàng)建廣播函數(shù)(
broadcast、broadcastToConnIds) - 初始化聊天運(yùn)行狀態(tài)緩沖區(qū)(
chatRunState、chatRunBuffers) - 按需啟動(dòng) Canvas Host(A2UI 服務(wù)器)
- 注冊(cè) Control UI 路由、OpenAI 兼容端點(diǎn)、OpenResponses 端點(diǎn)
階段 10:節(jié)點(diǎn)注冊(cè)和訂閱管理
new NodeRegistry()創(chuàng)建分布式節(jié)點(diǎn)注冊(cè)表createNodeSubscriptionManager()創(chuàng)建節(jié)點(diǎn)事件訂閱管理器- 定義
nodeSendEvent/nodeSendToSession/nodeSendToAllSubscribed等通信函數(shù) applyGatewayLaneConcurrency()應(yīng)用車道并發(fā)配置
階段 11:定時(shí)任務(wù)服務(wù)
buildGatewayCronService()創(chuàng)建 cron 服務(wù),支持定時(shí) AI 任務(wù)
階段 12:渠道管理器
createChannelManager()—— src/gateway/server-channels.ts- 封裝通道生命周期管理:
startChannels/startChannel/stopChannel/markChannelLoggedOut - 每個(gè)通道賬號(hào)獨(dú)立維護(hù)
ChannelRuntimeStore(aborts / tasks / runtimes)
階段 13:服務(wù)發(fā)現(xiàn)
getMachineDisplayName()獲取機(jī)器顯示名稱startGatewayDiscovery()啟動(dòng) mDNS/Bonjour 局域網(wǎng)廣播- 按配置支持廣域發(fā)現(xiàn)和 Tailscale 發(fā)現(xiàn)模式
階段 14:技能遠(yuǎn)程注冊(cè)
setSkillsRemoteRegistry(nodeRegistry)注冊(cè)技能遠(yuǎn)程節(jié)點(diǎn)注冊(cè)表primeRemoteSkillsCache()預(yù)熱遠(yuǎn)程技能緩存- 注冊(cè)技能變更監(jiān)聽器(防抖 30 秒)
階段 15:維護(hù)定時(shí)器
startGatewayMaintenanceTimers()啟動(dòng):tickInterval:定時(shí)廣播 presence 版本和心跳事件healthInterval:定期刷新健康狀態(tài)快照dedupeCleanup:定期清理去重緩存
階段 16:Agent 事件處理器
createAgentEventHandler()綁定 Agent 運(yùn)行事件到廣播- 將 Agent 輸出(stream delta、工具事件等)實(shí)時(shí)推送給已連接客戶端
階段 17:心跳事件處理器
onHeartbeatEvent()將心跳事件廣播給所有客戶端startHeartbeatRunner()啟動(dòng)周期性心跳產(chǎn)生器cron.start()啟動(dòng) cron 服務(wù)
階段 18:執(zhí)行審批管理器
new ExecApprovalManager()創(chuàng)建命令執(zhí)行審批管理器createExecApprovalForwarder()創(chuàng)建執(zhí)行請(qǐng)求轉(zhuǎn)發(fā)器
階段 19:WebSocket 處理器綁定
attachGatewayWsHandlers()將所有 RPC 方法和事件處理器綁定到 WebSocket 服務(wù)器- 注入完整上下文:cron、節(jié)點(diǎn)注冊(cè)表、聊天狀態(tài)、wizard、通道管理器等
階段 20:?jiǎn)?dòng)日志輸出
logGatewayStartup()打印服務(wù)器監(jiān)聽地址、TLS 狀態(tài)、配置路徑等啟動(dòng)信息
階段 21:更新檢查調(diào)度
scheduleGatewayUpdateCheck()異步檢查是否有新版本可用
階段 22:Tailscale 暴露
startGatewayTailscaleExposure()按配置執(zhí)行tailscale serve或tailscale funnel命令
階段 23:側(cè)車服務(wù)啟動(dòng)(重要)
startGatewaySidecars()—— src/gateway/server-startup.ts- 按順序啟動(dòng) 9 個(gè)配套服務(wù)(單個(gè)失敗不阻斷后續(xù)):
startGatewaySidecars()
│
├─ 1. 瀏覽器控制服務(wù)器 startBrowserControlServerIfEnabled()
├─ 2. Gmail Watcher startGmailWatcher()
├─ 3. Gmail 模型驗(yàn)證 getModelRefStatus()
├─ 4. 內(nèi)部 Hook 處理器 clearInternalHooks() + loadInternalHooks()
├─ 5. 通信渠道 startChannels() ← 見第五階段
├─ 6. Hook 事件觸發(fā) triggerInternalHook("gateway:startup") [+250ms]
├─ 7. 插件服務(wù) startPluginServices()
├─ 8. 內(nèi)存后端 startGatewayMemoryBackend() [異步,不等待]
└─ 9. 重啟哨兵恢復(fù) scheduleRestartSentinelWake() [+750ms]環(huán)境變量開關(guān):
OPENCLAW_SKIP_GMAIL_WATCHER=1— 跳過 Gmail WatcherOPENCLAW_SKIP_CHANNELS=1/OPENCLAW_SKIP_PROVIDERS=1— 跳過通道啟動(dòng)
階段 24:熱重載處理器
createGatewayReloadHandlers()創(chuàng)建配置熱重載和重啟請(qǐng)求處理器
階段 25:配置重載監(jiān)聽
startGatewayConfigReloader()監(jiān)聽~/.openclaw/config.json文件變化- 智能判斷:小改動(dòng)觸發(fā)熱重載(
applyHotReload),大改動(dòng)觸發(fā)重啟(requestGatewayRestart)
階段 26:關(guān)閉處理器創(chuàng)建
createGatewayCloseHandler()構(gòu)建優(yōu)雅關(guān)閉函數(shù),注冊(cè)所有需要清理的資源:- 停止 mDNS/Bonjour 廣播
- 清理 Tailscale 配置
- 停止所有通道
- 關(guān)閉 cron、心跳、維護(hù)定時(shí)器
- 關(guān)閉 WebSocket 連接
- 關(guān)閉 HTTP 服務(wù)器
第五階段:通道啟動(dòng)(startChannels 展開)
調(diào)用鏈:startGatewaySidecars → startChannels() → server-channels.ts
startChannels()
└─ for (plugin of listChannelPlugins()) # 遍歷所有已注冊(cè)通道插件
└─ startChannel(plugin.id)
│
├─ loadConfig() # 加載最新配置
├─ plugin.config.listAccountIds() # 獲取該通道的賬號(hào) ID 列表
│
└─ for (id of accountIds) # 并發(fā)啟動(dòng)所有賬號(hào)
│
├─ plugin.config.isEnabled() → 禁用則標(biāo)記 running=false
├─ plugin.config.isConfigured() → 未配置則標(biāo)記 running=false
│
├─ new AbortController() # 創(chuàng)建中止控制器
├─ setRuntime(running=true) # 標(biāo)記賬號(hào)為運(yùn)行中
│
└─ plugin.gateway.startAccount({
cfg, accountId, account,
runtime, abortSignal, log,
getStatus, setStatus
})
│
└─ [以 WhatsApp 為例]
extensions/whatsapp/src/channel.ts
startAccount()
└─ monitorWebChannel()
└─ monitorWebInbox()
# 輪詢/監(jiān)聽 WhatsApp Web 收件箱
# 通過 abortSignal 控制生命周期生命周期管理:
- 每個(gè)賬號(hào)的 task 存入
store.tasks,AbortController 存入store.aborts - 賬號(hào)異常退出時(shí)自動(dòng)記錄
lastError并標(biāo)記running=false stopChannel()調(diào)用abort.abort()通知通道優(yōu)雅退出- 可選的
plugin.gateway.stopAccount()提供額外清理邏輯
第六階段:穩(wěn)定運(yùn)行態(tài)
Gateway 服務(wù)就緒后持續(xù)運(yùn)行,處理以下任務(wù):
| 任務(wù) | 觸發(fā)方式 | 說明 |
|---|---|---|
| WebSocket RPC 調(diào)用 | 客戶端請(qǐng)求 | 處理 send、status、channel.* 等 RPC 方法 |
| Agent 事件廣播 | onAgentEvent | 將 AI 輸出實(shí)時(shí)推送給已連接客戶端 |
| 心跳廣播 | 定時(shí)器 | 維持客戶端連接活躍 |
| 配置熱重載 | 文件監(jiān)聽 | 配置文件變化時(shí)自動(dòng)應(yīng)用新配置 |
| 健康狀態(tài)刷新 | 定時(shí)器 | 定期刷新 /health 端點(diǎn)快照 |
| Cron 任務(wù)執(zhí)行 | 定時(shí)器 | 按計(jì)劃執(zhí)行 AI 定時(shí)任務(wù) |
| mDNS 廣播 | Bonjour | 局域網(wǎng)內(nèi)持續(xù)廣播服務(wù)信息 |
| SIGUSR1 熱重啟 | 進(jìn)程信號(hào) | 無需重啟進(jìn)程,原地重新初始化服務(wù)器 |
關(guān)鍵文件索引
| 文件 | 職責(zé) |
|---|---|
| src/cli/gateway-cli/run.ts | CLI 參數(shù)定義與預(yù)檢(506 行) |
| src/cli/gateway-cli/run-loop.ts | 進(jìn)程鎖 + 信號(hào)處理 + 主循環(huán)(203 行) |
| src/gateway/server.impl.ts | 服務(wù)器完整初始化(791 行,26 個(gè)子階段) |
| src/gateway/server-channels.ts | 通道生命周期管理器(309 行) |
| src/gateway/server-startup.ts | 配套服務(wù)啟動(dòng)編排(417 行,9 個(gè)配套服務(wù)) |
| src/gateway/auth.ts | 認(rèn)證解析與連接授權(quán) |
| src/infra/gateway-lock.ts | 文件鎖機(jī)制,防止多實(shí)例 |
| src/gateway/config-reload.ts | 配置熱重載監(jiān)聽器 |
| extensions/whatsapp/src/channel.ts | WhatsApp 通道賬號(hào)啟動(dòng)示例 |
到此這篇關(guān)于Openclaw Gateway 啟動(dòng)流程完整教程的文章就介紹到這了,更多相關(guān)Openclaw Gateway 啟動(dòng)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持腳本之家!
相關(guān)文章

OpenClaw端口占用排查:Gateway Connection Refused的解決指南
用戶在 Windows 11 上全新安裝 OpenClaw 后,完成 onboarding 流程,但在啟動(dòng) Gateway 時(shí)遇到 連接被拒絕錯(cuò)誤,下面小編就和大家詳細(xì)介紹一下如何排查并解決吧2026-03-17
OpenClaw Gateway設(shè)備Token不匹配問題排查與解決全指南
用戶在使用 OpenClaw 2026.2.15 版本時(shí),突然遇到設(shè)備Token不匹配的錯(cuò)誤,下面小編就和大家詳細(xì)介紹一下如何排查問題并解決,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以2026-03-13
OpenClaw 樹莓派部署終極避坑指南之快速解決OpenClaw Gateway儀表盤登錄問題
本文詳細(xì)介紹了在樹莓派上部署OpenClawGateway時(shí)遇到的四個(gè)核心問題及其解決方案:局域網(wǎng)無法訪問、跨域錯(cuò)誤、HTTPS安全上下文限制和設(shè)備配對(duì)驗(yàn)證,通過逐一解決這些問題,您2026-03-13




