Openclaw Gateway 启动流程完整教程
Gateway 启动流程详解
以 openclaw gateway run 命令为入口,追踪从 CLI 到 WebSocket 服务就绪的完整初始化链路。
总览:调用链
openclaw gateway run
└─ src/cli/gateway-cli/run.ts # CLI 参数解析与预检
└─ runGatewayCommand(opts)
└─ runGatewayLoop(params) # 进程锁 + 信号管理 + 主循环
└─ src/cli/gateway-cli/run-loop.ts
└─ startGatewayServer(port, opts)
└─ src/gateway/server.impl.ts
│
├─ createChannelManager() # 通道管理器
│ └─ src/gateway/server-channels.ts
│
└─ startGatewaySidecars(...) # 配套服务
└─ 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 参数解析
入口文件:src/cli/gateway-cli/run.ts
addGatewayRunCommand() 将以下选项挂载到 Commander CLI:
| 选项 | 说明 |
|---|---|
--port <port> | WebSocket 端口(默认 18789) |
--bind <mode> | 绑定模式:loopback / lan / tailnet / auto / custom |
--token <token> | 共享 token(也可通过 OPENCLAW_GATEWAY_TOKEN 环境变量设置) |
--auth <mode> | 认证模式:token 或 password |
--password <pw> | password 模式下的密码 |
--tailscale <mode> | Tailscale 暴露模式:off / serve / funnel |
--force | 启动前强制杀死占用端口的进程 |
--dev | 开发模式:自动创建配置和 workspace |
--verbose | 详细日志输出 |
--ws-log <style> | WebSocket 日志样式:auto / full / compact |
第二阶段:预检与配置验证
函数:runGatewayCommand(opts) —— src/cli/gateway-cli/run.ts
按顺序执行以下检查:
- 开发模式检测:
OPENCLAW_PROFILE=dev或--dev时进入开发模式,调用ensureDevGatewayConfig() - 日志配置:启用时间戳前缀、设置 verbose 等级、配置 WebSocket 日志样式
- 端口解析:
--port优先,否则读取config.gateway.port,默认 18789 - 强制释放端口:
--force时调用forceFreePortAndWait()尝试 SIGTERM → SIGKILL - 认证配置解析:
- 合并 config + 命令行参数
- 调用
resolveGatewayAuth()解析最终的 token / password / tailscale 认证
- 配置存在性检查:非
local模式必须存在~/.openclaw/config.json - 绑定模式验证:非
loopback绑定必须配置 token 或 password - 进入主循环:调用
runGatewayLoop()进入下一阶段
第三阶段:进程锁 + 信号管理
函数:runGatewayLoop(params) —— src/cli/gateway-cli/run-loop.ts
runGatewayLoop()
│
├─ 1. acquireGatewayLock() # 获取文件锁,防止多实例
│ └─ src/infra/gateway-lock.ts
│ 写入 .pid 锁文件,并持有独占句柄
│
├─ 2. 注册信号处理器
│ ├─ SIGTERM → request("stop") # 容器/系统关机
│ ├─ SIGINT → request("stop") # Ctrl+C
│ └─ SIGUSR1 → request("restart") # 热重启(需授权令牌)
│
├─ 3. while (true) 主循环
│ ├─ server = await params.start() # 启动服务器(见第四阶段)
│ └─ await new Promise(resolve => { restartResolver = resolve })
│ # 挂起等待信号;SIGUSR1 触发时 restartResolver() 解除
│
└─ 4. finally 清理
├─ lock.release() # 释放文件锁
└─ cleanupSignals() # 移除所有信号处理器超时保护:信号触发后 5 秒若未完成关闭,强制 process.exit(0)
第四阶段:Gateway 服务器完整初始化
函数:startGatewayServer(port, opts) —— src/gateway/server.impl.ts
共 26 个子阶段,按顺序执行:
阶段 1:环境变量准备
- 设置
OPENCLAW_GATEWAY_PORT供子进程使用 - 记录已接受的环境变量选项(
OPENCLAW_RAW_STREAM等)
阶段 2:配置加载和迁移
readConfigFileSnapshot()读取配置快照- 检测遗留配置(
legacyIssues),自动调用migrateLegacyConfig()迁移并写回 - Nix 模式下拒绝自动迁移,抛出错误
- 验证配置 schema 有效性
阶段 3:插件自动启用
applyPluginAutoEnable()根据环境变量自动激活插件- 有变更时写回配置并记录日志
阶段 4:基础运行时初始化
loadConfig()加载最新配置- 按需启动诊断心跳(
startDiagnosticHeartbeat()) setGatewaySigusr1RestartPolicy()设置重启策略initSubagentRegistry()初始化子 Agent 注册表resolveDefaultAgentId()/resolveAgentWorkspaceDir()解析默认 Agent 工作目录loadGatewayPlugins()加载所有插件,合并 Gateway RPC 方法
阶段 5:渠道插件日志器初始化
- 为每个已注册渠道(Telegram、Discord、WhatsApp 等)创建独立子日志器
- 为每个渠道创建
RuntimeEnv - 合并渠道 RPC 方法与核心方法
阶段 6:运行时配置解析
resolveGatewayRuntimeConfig()综合解析:- 绑定地址(
bindHost) - 是否启用 Control UI
- 是否启用 OpenAI 兼容端点
- 认证配置(
resolvedAuth) - Tailscale 配置(
tailscaleMode) - TLS 运行时(
gatewayTls) - Hooks 配置(
hooksConfig)
- 绑定地址(
阶段 7:Control UI 资源准备
- 如有自定义
controlUi.root,验证路径是否存在 - 否则调用
resolveControlUiRootSync()自动定位前端资源 - 找不到时触发
ensureControlUiAssetsBuilt()自动构建
阶段 8:Wizard 会话跟踪器
createWizardSessionTracker()创建 onboarding wizard 会话管理器
阶段 9:创建 Gateway 运行时状态
loadGatewayTlsRuntime()加载 TLS 证书createGatewayRuntimeState()创建核心运行时(最重要的子阶段):- 创建 HTTP/WebSocket 服务器并绑定端口
- 初始化 WebSocket 客户端集合(
wss、clients) - 创建广播函数(
broadcast、broadcastToConnIds) - 初始化聊天运行状态缓冲区(
chatRunState、chatRunBuffers) - 按需启动 Canvas Host(A2UI 服务器)
- 注册 Control UI 路由、OpenAI 兼容端点、OpenResponses 端点
阶段 10:节点注册和订阅管理
new NodeRegistry()创建分布式节点注册表createNodeSubscriptionManager()创建节点事件订阅管理器- 定义
nodeSendEvent/nodeSendToSession/nodeSendToAllSubscribed等通信函数 applyGatewayLaneConcurrency()应用车道并发配置
阶段 11:定时任务服务
buildGatewayCronService()创建 cron 服务,支持定时 AI 任务
阶段 12:渠道管理器
createChannelManager()—— src/gateway/server-channels.ts- 封装通道生命周期管理:
startChannels/startChannel/stopChannel/markChannelLoggedOut - 每个通道账号独立维护
ChannelRuntimeStore(aborts / tasks / runtimes)
阶段 13:服务发现
getMachineDisplayName()获取机器显示名称startGatewayDiscovery()启动 mDNS/Bonjour 局域网广播- 按配置支持广域发现和 Tailscale 发现模式
阶段 14:技能远程注册
setSkillsRemoteRegistry(nodeRegistry)注册技能远程节点注册表primeRemoteSkillsCache()预热远程技能缓存- 注册技能变更监听器(防抖 30 秒)
阶段 15:维护定时器
startGatewayMaintenanceTimers()启动:tickInterval:定时广播 presence 版本和心跳事件healthInterval:定期刷新健康状态快照dedupeCleanup:定期清理去重缓存
阶段 16:Agent 事件处理器
createAgentEventHandler()绑定 Agent 运行事件到广播- 将 Agent 输出(stream delta、工具事件等)实时推送给已连接客户端
阶段 17:心跳事件处理器
onHeartbeatEvent()将心跳事件广播给所有客户端startHeartbeatRunner()启动周期性心跳产生器cron.start()启动 cron 服务
阶段 18:执行审批管理器
new ExecApprovalManager()创建命令执行审批管理器createExecApprovalForwarder()创建执行请求转发器
阶段 19:WebSocket 处理器绑定
attachGatewayWsHandlers()将所有 RPC 方法和事件处理器绑定到 WebSocket 服务器- 注入完整上下文:cron、节点注册表、聊天状态、wizard、通道管理器等
阶段 20:启动日志输出
logGatewayStartup()打印服务器监听地址、TLS 状态、配置路径等启动信息
阶段 21:更新检查调度
scheduleGatewayUpdateCheck()异步检查是否有新版本可用
阶段 22:Tailscale 暴露
startGatewayTailscaleExposure()按配置执行tailscale serve或tailscale funnel命令
阶段 23:侧车服务启动(重要)
startGatewaySidecars()—— src/gateway/server-startup.ts- 按顺序启动 9 个配套服务(单个失败不阻断后续):
startGatewaySidecars()
│
├─ 1. 浏览器控制服务器 startBrowserControlServerIfEnabled()
├─ 2. Gmail Watcher startGmailWatcher()
├─ 3. Gmail 模型验证 getModelRefStatus()
├─ 4. 内部 Hook 处理器 clearInternalHooks() + loadInternalHooks()
├─ 5. 通信渠道 startChannels() ← 见第五阶段
├─ 6. Hook 事件触发 triggerInternalHook("gateway:startup") [+250ms]
├─ 7. 插件服务 startPluginServices()
├─ 8. 内存后端 startGatewayMemoryBackend() [异步,不等待]
└─ 9. 重启哨兵恢复 scheduleRestartSentinelWake() [+750ms]环境变量开关:
OPENCLAW_SKIP_GMAIL_WATCHER=1— 跳过 Gmail WatcherOPENCLAW_SKIP_CHANNELS=1/OPENCLAW_SKIP_PROVIDERS=1— 跳过通道启动
阶段 24:热重载处理器
createGatewayReloadHandlers()创建配置热重载和重启请求处理器
阶段 25:配置重载监听
startGatewayConfigReloader()监听~/.openclaw/config.json文件变化- 智能判断:小改动触发热重载(
applyHotReload),大改动触发重启(requestGatewayRestart)
阶段 26:关闭处理器创建
createGatewayCloseHandler()构建优雅关闭函数,注册所有需要清理的资源:- 停止 mDNS/Bonjour 广播
- 清理 Tailscale 配置
- 停止所有通道
- 关闭 cron、心跳、维护定时器
- 关闭 WebSocket 连接
- 关闭 HTTP 服务器
第五阶段:通道启动(startChannels 展开)
调用链:startGatewaySidecars → startChannels() → server-channels.ts
startChannels()
└─ for (plugin of listChannelPlugins()) # 遍历所有已注册通道插件
└─ startChannel(plugin.id)
│
├─ loadConfig() # 加载最新配置
├─ plugin.config.listAccountIds() # 获取该通道的账号 ID 列表
│
└─ for (id of accountIds) # 并发启动所有账号
│
├─ plugin.config.isEnabled() → 禁用则标记 running=false
├─ plugin.config.isConfigured() → 未配置则标记 running=false
│
├─ new AbortController() # 创建中止控制器
├─ setRuntime(running=true) # 标记账号为运行中
│
└─ plugin.gateway.startAccount({
cfg, accountId, account,
runtime, abortSignal, log,
getStatus, setStatus
})
│
└─ [以 WhatsApp 为例]
extensions/whatsapp/src/channel.ts
startAccount()
└─ monitorWebChannel()
└─ monitorWebInbox()
# 轮询/监听 WhatsApp Web 收件箱
# 通过 abortSignal 控制生命周期生命周期管理:
- 每个账号的 task 存入
store.tasks,AbortController 存入store.aborts - 账号异常退出时自动记录
lastError并标记running=false stopChannel()调用abort.abort()通知通道优雅退出- 可选的
plugin.gateway.stopAccount()提供额外清理逻辑
第六阶段:稳定运行态
Gateway 服务就绪后持续运行,处理以下任务:
| 任务 | 触发方式 | 说明 |
|---|---|---|
| WebSocket RPC 调用 | 客户端请求 | 处理 send、status、channel.* 等 RPC 方法 |
| Agent 事件广播 | onAgentEvent | 将 AI 输出实时推送给已连接客户端 |
| 心跳广播 | 定时器 | 维持客户端连接活跃 |
| 配置热重载 | 文件监听 | 配置文件变化时自动应用新配置 |
| 健康状态刷新 | 定时器 | 定期刷新 /health 端点快照 |
| Cron 任务执行 | 定时器 | 按计划执行 AI 定时任务 |
| mDNS 广播 | Bonjour | 局域网内持续广播服务信息 |
| SIGUSR1 热重启 | 进程信号 | 无需重启进程,原地重新初始化服务器 |
关键文件索引
| 文件 | 职责 |
|---|---|
| src/cli/gateway-cli/run.ts | CLI 参数定义与预检(506 行) |
| src/cli/gateway-cli/run-loop.ts | 进程锁 + 信号处理 + 主循环(203 行) |
| src/gateway/server.impl.ts | 服务器完整初始化(791 行,26 个子阶段) |
| src/gateway/server-channels.ts | 通道生命周期管理器(309 行) |
| src/gateway/server-startup.ts | 配套服务启动编排(417 行,9 个配套服务) |
| src/gateway/auth.ts | 认证解析与连接授权 |
| src/infra/gateway-lock.ts | 文件锁机制,防止多实例 |
| src/gateway/config-reload.ts | 配置热重载监听器 |
| extensions/whatsapp/src/channel.ts | WhatsApp 通道账号启动示例 |
到此这篇关于Openclaw Gateway 启动流程完整教程的文章就介绍到这了,更多相关Openclaw Gateway 启动内容请搜索脚本之家以前的文章或继续浏览下面的相关文章,希望大家以后多多支持脚本之家!
相关文章

OpenClaw端口占用排查:Gateway Connection Refused的解决指南
用户在 Windows 11 上全新安装 OpenClaw 后,完成 onboarding 流程,但在启动 Gateway 时遇到 连接被拒绝错误,下面小编就和大家详细介绍一下如何排查并解决吧2026-03-17
OpenClaw Gateway设备Token不匹配问题排查与解决全指南
用户在使用 OpenClaw 2026.2.15 版本时,突然遇到设备Token不匹配的错误,下面小编就和大家详细介绍一下如何排查问题并解决,文中的示例代码讲解详细,感兴趣的小伙伴可以2026-03-13
OpenClaw 树莓派部署终极避坑指南之快速解决OpenClaw Gateway仪表盘登
本文详细介绍了在树莓派上部署OpenClawGateway时遇到的四个核心问题及其解决方案:局域网无法访问、跨域错误、HTTPS安全上下文限制和设备配对验证,通过逐一解决这些问题,您2026-03-13





最新评论