网关端口、已运行和远程模式
Gateway:端口、“已在运行”与远程模式¶
Gateway 使用哪个端口?
gateway.port 控制 WebSocket + HTTP(Control UI、hooks 等)的单一多路复用端口。优先级如下:
为什么 openclaw gateway status 显示 'Runtime: running' 但 'Connectivity probe: failed'?
“Running” 是 supervisor(launchd/systemd/schtasks)视角下的状态;connectivity probe 则是 CLI 实际连接到 Gateway WebSocket 的结果。请以 openclaw gateway status 中的这些行为准:Probe target:(探针使用的 URL)、Listening:(端口上实际绑定的地址)、Last gateway error:(进程存活但端口未监听时的常见根本原因)。
为什么 openclaw gateway status 显示的 'Config (cli)' 和 'Config (service)' 不同?
你在编辑一个配置文件,而服务运行的是另一个配置(通常是 --profile / OPENCLAW_STATE_DIR 不匹配)。
解决办法:在你希望服务使用的同一个 --profile / 环境中运行:
'another gateway instance is already listening' 是什么意思?
OpenClaw 通过启动时立即绑定 WebSocket 监听器(默认 ws://127.0.0.1:18789)来强制运行时锁。如果绑定失败并返回 EADDRINUSE,它会抛出 GatewayLockError(“another gateway instance is already listening”)。
解决办法:停止另一个实例,释放端口,或使用 openclaw gateway --port <port> 运行。
如何以远程模式运行 OpenClaw(客户端连接到其他地方的 Gateway)?
设置 gateway.mode: "remote" 并指向远程 WebSocket URL,可选地附带共享密钥远程凭据:
{
gateway: {
mode: "remote",
remote: {
url: "ws://gateway.tailnet:18789",
token: "your-token",
password: "your-password",
},
},
}
openclaw gateway仅在gateway.mode为local(或你传入覆盖标志)时启动。- macOS 应用会监视配置文件,并在这些值更改时实时切换模式。
gateway.remote.token/.password仅是客户端侧的远程凭据;它们本身不会启用本地 Gateway 认证。
Control UI 显示 'unauthorized'(或不断重新连接)。该怎么办?
你的 Gateway 认证路径与 UI 的认证方式不匹配。
事实(来自代码):
- Control UI 将令牌保存在
sessionStorage中,范围限于当前浏览器标签页和所选 Gateway URL,因此同一标签页的刷新可以继续工作,而无需持久的 localStorage 令牌持久化。 - 在
AUTH_TOKEN_MISMATCH时,当 Gateway 返回重试提示(canRetryWithDeviceToken=true、recommendedNextStep=retry_with_device_token)时,受信任的客户端可以尝试一次有限制的重试,使用缓存的设备令牌。 - 该缓存令牌重试会复用与设备令牌一同存储的已批准作用域;显式
deviceToken/ 显式scopes调用者保留其请求的作用域集合,而不是继承缓存的作用域。 - 在该重试路径之外,连接认证的优先级顺序为:显式共享令牌/密码优先,然后是显式
deviceToken,再是已存储的设备令牌,最后是引导令牌。 - 内置设置码引导程序返回一个
scopes: []的节点设备令牌,外加一个用于受信任移动设备接入的有限制操作员交接令牌。操作员交接令牌可以读取设置时的本机配置,但不授予配对修改作用域或operator.admin。
解决办法:
- 最快:
openclaw dashboard(打印并复制 dashboard URL,尝试打开;如果是无头环境则显示 SSH 提示)。 - 还没有令牌:
openclaw doctor --generate-gateway-token。 - 远程:先用
ssh -N -L 18789:127.0.0.1:18789 user@host建立隧道,然后打开http://127.0.0.1:18789/。 - 共享密钥模式:设置
gateway.auth.token/OPENCLAW_GATEWAY_TOKEN或gateway.auth.password/OPENCLAW_GATEWAY_PASSWORD,然后在 Control UI 设置中粘贴匹配的密钥。 - Tailscale Serve 模式:确认已启用
gateway.auth.allowTailscale,并且你打开的是 Serve URL,而不是绕过了 Tailscale 身份头的原始 loopback/tailnet URL。 - 受信任代理模式:确认你是通过所配置的识别身份代理访问的。同主机的 loopback 代理还需要
gateway.auth.trustedProxy.allowLoopback = true。 - 在一次重试后仍然不匹配:轮换/重新批准配对的设备令牌:
- 轮换被拒绝:配对设备会话只能轮换自己的设备,除非它们还拥有
operator.admin;并且显式的--scope值不能超出调用者当前的操作员作用域。 - 仍然卡住:运行
openclaw status --all,并查看 Troubleshooting。认证详情请参阅 Dashboard。
我设置了 gateway.bind 为 tailnet,但它只在 loopback 上监听
tailnet 绑定会从你的网络接口(100.64.0.0/10)中选择一个 Tailscale IP。如果机器不在 Tailscale 上(或该接口处于关闭状态),Gateway 会回退到 loopback,而不是暴露其他网络接口。
解决办法:在该主机上启动 Tailscale 并重启 Gateway,或显式切换到 gateway.bind: "loopback" / "lan"。
tailnet 是显式选择;auto 则优先使用 loopback。使用 gateway.bind: "tailnet" 可以将非 loopback 暴露限制在 Tailnet 内,同时保留所需的同主机 127.0.0.1 监听器。
我可以在同一台主机上运行多个 Gateway 吗?
通常不可以——一个 Gateway 可以运行多个消息通道和 agent。仅在需要冗余(例如救援机器人)或硬隔离时才使用多个 Gateway,并用各自的 OPENCLAW_CONFIG_PATH、OPENCLAW_STATE_DIR、agents.defaults.workspace 和唯一的 gateway.port 相互隔离。
建议:每个实例使用 openclaw --profile <name> ...(自动创建 ~/.openclaw-<name>),在每个 profile 配置中设置唯一的 gateway.port(手动运行时使用 --port),并通过 openclaw --profile <name> gateway install 为每个 profile 安装一个对应的服务。
Profile 还会为服务名添加后缀:launchd 为 `ai.openclaw.<profile>`,systemd 为 `openclaw-gateway-<profile>.service`,Windows 为 `OpenClaw Gateway (<profile>)`。不带 profile 的 `openclaw-gateway` systemd 单元仅存在于默认 profile 中;旧版改名前的 systemd 单元名 `clawdbot-gateway` 会自动迁移。
完整指南:[多个网关](../../gateway/multiple-gateways.md)。
“invalid handshake” / 代码 1008 是什么意思?
Gateway 是一个 WebSocket 服务器,期望第一条消息是 connect 帧。其他任何内容都会以 代码 1008(策略违规)关闭连接。
常见原因:你在浏览器中打开了 HTTP 地址而不是使用 WS 客户端;使用了错误的端口/路径;或者代理/隧道剥离了认证头,或发送了非 Gateway 的请求。
解决方法:使用 WS 地址(ws://<host>:18789,HTTPS 下使用 wss://...);不要在日常浏览器标签页中打开 WS 端口;并在启用认证时,在 connect 帧中包含 token/密码。CLI/TUI 示例:
协议详情:Gateway 协议。
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 cl/openclaw