为什么这篇值得先看
如果你只把 Gateway 看成“一个要启动的命令”,你会在渠道接入、审批、配置回滚和日志排查时吃很多亏。OpenClaw 的很多表面问题看起来发生在 Telegram、WhatsApp、Dashboard 或 Control UI,实际根因却在 Gateway 的配置、认证、pairing 或健康状态。
这篇不是为了画一张漂亮架构图,而是帮你形成一个可排错的心智模型:消息从哪里来、谁有权进来、请求在哪一层被挡住、什么时候应该看界面,什么时候应该回到 CLI 和配置文件。
先抓住这 3 个关键点
- Gateway 不是附属组件,而是消息、配对、授权、工具调用和运行探针流转的核心枢纽。
- pairing、auth、Control UI 和 Dashboard 之所以会互相影响,本质上都是围绕 Gateway 的状态、凭据和策略。
- 团队用法、自动化、安全加固、远程节点和渠道稳定性都建立在你对 Gateway 边界的理解上。
一张文字版运行图
可以先把 OpenClaw 想成 5 层:
- 入口层:Telegram、WhatsApp、Browser、Webhook、移动端或远程节点产生请求。
- 准入层:pairing、allowlist、dmPolicy、groupPolicy、设备 approval 决定谁能进来。
- Gateway 层:处理连接、认证、会话、工具调用、健康探针、日志和重启行为。
- 界面层:Dashboard、Control UI、WebChat 让你观察状态、审批请求或发起对话。
- 执行层:agent、skills、browser、hooks、worker 或外部系统真正完成任务。
很多新手会把这 5 层混在一起。例如“Telegram 没回应”可能是 bot token 错了,也可能是 dmPolicy 把陌生私聊挡住了,也可能是 Gateway 没 ready,还可能是 Control UI 里有待批准请求没有处理。正确做法是从入口到准入再到 Gateway 状态逐层缩小范围。
Gateway 负责什么
从官方 Gateway CLI 和 Gateway configuration 页面可以看出,Gateway 至少承担这些职责:
- 启动与绑定:根据配置、端口、认证和安全护栏决定能否启动。官方 CLI 文档提示,缺少必要的
gateway.mode=local时不能把它当成普通默认值糊弄过去。 - 连接与认证:处理 WebSocket、token、password、local/remote 访问和 CLI 查询。
- 健康与就绪:
/healthz更偏存活探针,/readyz更偏服务是否真正稳定。排查时不要只看“进程还在不在”。 - 渠道治理:配置页把 WhatsApp、Telegram、Discord 等渠道放在
channels.<provider>下,并把 DM / group access 作为共享治理模型。 - 设备与节点配对:Gateway pairing 处理节点/设备加入,而不是简单等同于聊天渠道的私信配对。
- 重启与诊断:
openclaw gateway restart --safe、stability bundle、startup trace 都属于真实运维阶段会用到的能力。
Gateway 不负责什么
为了避免误判,也要明确它不该背哪些锅:
- 它不能替你自动判断某个群聊是否应该响应。群聊是否要求 @、是否允许某个群,仍要回到渠道配置。
- 它不能把不安全的开放访问变成安全访问。
dmPolicy: "open"和allowFrom: ["*"]这种配置要有明确理由。 - 它不能替你保管所有团队流程。审批、轮换、事故响应和 owner 责任仍然需要团队制度配合。
- 它不是所有外部系统的最终执行者。Browser、webhook、skills 和 agent 执行失败时,Gateway 只是观察和转发中轴。
实操步骤
- 先从“消息从 channel 进来后会经过哪里”这个问题开始梳理,不要直接背术语。
- 把 pairing、allowlist、审批理解成准入机制,而不是互不相干的独立功能页。
- 再把 Dashboard / Control UI 视为 Gateway 状态的不同观察入口:一个偏本地运行态,一个偏交互与治理。
- 回看配置文件,确认哪些字段定义 Gateway 行为,哪些字段只是某个 channel 的局部策略。
- 最后为你自己的部署画一张 5 层运行图,并标出每一层的排错入口。
配置或命令示例
openclaw gateway health --url ws://127.0.0.1:18789
openclaw gateway restart --safe
openclaw dashboard
openclaw pairing list telegram
openclaw pairing approve telegram <CODE>
下面这个简化配置展示了 Gateway 与 channel 配置的边界。gateway 负责运行态,channels.telegram 负责 Telegram 入口策略。
{
gateway: {
mode: "local",
channelHealthCheckMinutes: 5,
channelStaleEventThresholdMinutes: 30
},
channels: {
telegram: {
enabled: true,
botToken: "123:abc",
dmPolicy: "pairing",
groups: { "*": { requireMention: true } }
}
}
}
排错顺序
遇到“OpenClaw 没反应”时,按这个顺序比盲目重启更稳:
- 先确认进程与端口:Gateway 是否启动、端口是否被占用、是否因为缺少配置被拒绝启动。
- 再确认 ready 状态:能响应不等于 ready。看
/readyz或 gateway health,确认插件、channels 和 hooks 是否已经稳定。 - 再确认准入策略:陌生私聊看
dmPolicy和 pairing;群聊看groupPolicy、groups、requireMention。 - 再确认 credentials / state:已配对设备、待处理请求、allowlist 存储都属于敏感状态,不要随手删。
- 最后看执行层:如果 Gateway 和准入都正常,再排 skills、Browser、webhook、agent 指令或外部服务。
团队部署时的边界清单
- 谁可以修改 Gateway 配置,谁只能在 Control UI 审批请求。
- 是否允许
open私聊策略;如果允许,是否限定环境和有效期。 - 是否启用 group mention gating,哪些群必须
requireMention: true。 - Gateway token、password、paired device state 和 allowlist 文件是否按敏感数据处理。
- 重启时优先使用普通 restart、safe restart,还是明确需要 force。
- 是否记录 Gateway stability bundle,方便事故后复盘。
常见坑
- 把 channel 看成独立系统,结果忽略它们都要经过 Gateway 的准入、认证与日志链路。
- 遇到审批或 pairing 异常时,只盯前端界面,不回头看底层服务状态。
- 把
/healthz当成“全部正常”,忽略/readyz或 channel 稳定性还没通过。 - 团队里没有统一的 Gateway 认知,最后每个人都在用不同模型排错。
完成检查
- 你能解释 pairing、auth、Dashboard 和 channels 为什么会互相牵连。
- 你知道哪些配置项是在定义准入,哪些是在定义渠道行为。
- 你知道 health、ready、restart、stability 各自解决什么问题。
- 你已经为后续的安全、渠道接入和自动化内容建立了共同语言。
为什么建议把这篇收藏起来
- 这篇决定你后面看 channels、security、automation 时是不是能融会贯通。
- 它不是“架构炫技”,而是减少错误决策的一篇底层理解文。
- 当你准备上线或让团队多人接手时,这篇可以作为共同排错语言。