Openclaw Gateway 启动流程完整教程

  发布时间:2026-03-20 11:12:07   作者:weixin_37747029   我要评论
这篇文章给大家介绍了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>认证模式:tokenpassword
--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

按顺序执行以下检查:

  1. 开发模式检测OPENCLAW_PROFILE=dev--dev 时进入开发模式,调用 ensureDevGatewayConfig()
  2. 日志配置:启用时间戳前缀、设置 verbose 等级、配置 WebSocket 日志样式
  3. 端口解析--port 优先,否则读取 config.gateway.port,默认 18789
  4. 强制释放端口--force 时调用 forceFreePortAndWait() 尝试 SIGTERM → SIGKILL
  5. 认证配置解析
    • 合并 config + 命令行参数
    • 调用 resolveGatewayAuth() 解析最终的 token / password / tailscale 认证
  6. 配置存在性检查:非 local 模式必须存在 ~/.openclaw/config.json
  7. 绑定模式验证:非 loopback 绑定必须配置 token 或 password
  8. 进入主循环:调用 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 客户端集合(wssclients
    • 创建广播函数(broadcastbroadcastToConnIds
    • 初始化聊天运行状态缓冲区(chatRunStatechatRunBuffers
    • 按需启动 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 servetailscale funnel 命令

阶段 23:侧车服务启动(重要)

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 Watcher
  • OPENCLAW_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 展开)

调用链startGatewaySidecarsstartChannels()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 调用客户端请求处理 sendstatuschannel.* 等 RPC 方法
Agent 事件广播onAgentEvent将 AI 输出实时推送给已连接客户端
心跳广播定时器维持客户端连接活跃
配置热重载文件监听配置文件变化时自动应用新配置
健康状态刷新定时器定期刷新 /health 端点快照
Cron 任务执行定时器按计划执行 AI 定时任务
mDNS 广播Bonjour局域网内持续广播服务信息
SIGUSR1 热重启进程信号无需重启进程,原地重新初始化服务器

关键文件索引

文件职责
src/cli/gateway-cli/run.tsCLI 参数定义与预检(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.tsWhatsApp 通道账号启动示例

到此这篇关于Openclaw Gateway 启动流程完整教程的文章就介绍到这了,更多相关Openclaw Gateway 启动内容请搜索脚本之家以前的文章或继续浏览下面的相关文章,希望大家以后多多支持脚本之家!

相关文章

最新评论