节点主机
远程节点主机(system.run)¶
当你的 Gateway 运行在一台机器上,而你希望命令在另一台机器上执行时,请使用 节点主机。模型仍然与 Gateway 通信;当选择 host=node 时,Gateway 会将 exec 调用转发到 节点主机。
| 角色 | 职责 |
|---|---|
| Gateway 主机 | 接收消息、运行模型、路由工具调用。 |
| 节点主机 | 在节点机器上执行 system.run/system.which。 |
| 审批 | 通过 ~/.openclaw/state/openclaw.sqlite#exec_approvals_config 在节点主机上强制执行。 |
审批说明:
- 基于审批的节点运行会绑定精确的请求上下文。
exec路径在审批前准备一个规范的systemRunPlan;一旦批准,Gateway 会转发该已存储的计划,而不是任何后续由调用方编辑的 command/cwd/session 字段,并在运行前重新验证工作目录。 - 对于直接的 shell/运行时文件执行,OpenClaw 还会尽力绑定一个具体的本地文件操作数,如果该文件在执行前发生变化,则拒绝运行。
- 如果 OpenClaw 无法为解释器/运行时命令识别出恰好一个具体的本地文件,则会拒绝基于审批的执行,而不是假装具备完整的运行时覆盖。对于更广泛的解释器语义,请使用沙箱、独立主机,或显式的可信允许列表/完整工作流。
无法托管节点的 Gateway 部署¶
即使节点托管不可用,Gateway 对浏览器用户仍可保持健康。在接入节点之前,请在 Gateway 上运行 openclaw doctor,并检查以下前置条件:
- 机器身份验证: Tailscale 身份头不会为节点角色连接进行身份验证。在
gateway.auth.mode: "trusted-proxy"中,新节点也无法提供代理的用户身份头。若要使用共享 token,请切换到 token 模式,并使用 SecretRef 配置gateway.auth.token;trusted-proxy 模式会拒绝混合 token 配置。trusted-proxy Gateway 只能将gateway.auth.password用于干净的 loopback/直接调用方。参见 trusted-proxy 混合 token 配置。 - 节点接入 URL: 如果只有默认的
gateway.bind: "loopback"且没有通告端点,openclaw devices join-code会报告 Gateway 仅绑定到 loopback,并建议将gateway.publicOrigin作为主要修复方式。对于公共 HTTPS 入口,请将其设置为代理可到达的 origin。现有的 Tailscale Serve、gateway.remote.url、由 bind 派生的地址,以及配对专用的plugins.entries.device-pair.config.publicUrl覆盖仍保留其优先级;publicOrigin提供 loopback 回退。远程加入 URL 需要 TLS;仅启用 LAN bind 不会启用明文远程加入 URL。显式配置的 loopback 端点可以生成 HTTP 加入 URL,但加入机器必须能够到达该 loopback 端点,例如通过本地隧道。明文 LAN 配对可以直接使用设置代码。 - 节点接入支持: 加入代码创建和
/j兑换是核心 Gateway 操作。它们不需要启用device-pair插件,即使其保留的publicUrl配置字段可以提供端点。有关打印的npx openclaw connect <url>命令,参见 加入代码。 - 设备会话运行时: 配对设备运行器支持嵌入式 OpenClaw 运行时以及显式授权的 Codex
remote-exec;ACPX 路由无法分发到配对设备。Codex 需要在gateway.nodes.commands.allow中包含codex.exec-server.stdio.v1,并经过其正常的配对和调用审批。运行时策略应位于 provider/model 路由上,而不是被忽略的整个 agent 运行时键。多 agent 名册还必须设置agents.ownership: "explicit"。参见 Codex 配对设备放置 和 运行时策略。 - 边缘路由: 当反向代理或访问边缘位于 Gateway 前面时,节点必须在加入请求、其主要 Gateway WebSocket 以及 worker WebSocket 上满足边缘身份验证。请保持
/__openclaw__/worker的 WebSocket 升级启用。你也可以将/j/*和/__openclaw__/worker从边缘身份验证中豁免,因为这两个路由都强制使用自己的短期凭据。参见 worker 协议。
对于由 Cloudflare Access 前置的 Gateway:
- 在 Cloudflare Zero Trust 中,创建一个 Access 服务 token。当 Cloudflare 显示其 Client ID 和 Client Secret 时,请复制它们。
- 在保护 Gateway 的 Access 应用上,添加一个接受该 token 的 Service Auth 策略。如果
/j/*和/__openclaw__/worker是独立的 Access 应用,请将同一策略添加到两者。 - 在节点上,提供常规的环境回退并连接:
export CF_ACCESS_CLIENT_ID="<client-id>"
export CF_ACCESS_CLIENT_SECRET="<client-secret>"
openclaw connect https://gateway.example/j/<code> --service
规范的节点连接键是 gateway.cloudflareAccess.clientId 和 gateway.cloudflareAccess.clientSecret;两者都接受 SecretInput 值。上述环境回退会将这些键持久化为 env SecretRefs,而不是复制的明文。对于已安装的节点,OpenClaw 会将环境值存储在托管服务环境文件中,而不是内联在 launchd、systemd 或 Task Scheduler 定义中。解析后的值绑定到已配置的 Gateway origin,并且不会跨重定向跟随。对于明文 http:// 或 ws:// 路由,OpenClaw 会在解析前拒绝该键值对;无凭据的 loopback 和私有网络明文行为保持不变。
启动节点主机(前台)¶
在节点机器上:
对于一键粘贴设置,请从 Control UI 的设备页面创建 节点主机 设置链接,然后在节点机器上运行其可复制的命令:
该链接为一次性使用,并在 10 分钟后过期。它会在可用时提供端点、bootstrap Token、TLS 模式和证书固定。显式 Gateway 标志会覆盖对应的 --pair 值。管理员签发的 bootstrap 注册会批准设备及其首次声明的命令面,包括声明时的 system.run 和 system.which。后续的命令、能力或权限扩展仍会创建审批请求。Gateway 命令策略和节点主机的执行审批仍然适用。本地执行审批默认为 full,且 ask: "off";如果该访问范围过宽,请在使用链接前配置它们。参见节点配对。
node run 还接受 --pair、--context-path(Gateway WS 上下文路径)、--tls、--tls-fingerprint <sha256> 和 --node-id(覆盖旧版客户端实例 ID;这不会重置配对)。在 macOS 上,传入 --share-installed-apps 以通告 device.apps;共享默认关闭。使用 --no-share-installed-apps 可禁用之前保存的可选启用。
传入 --session-host 可为该前台进程启用 worker 托管,而不更改已保存的偏好设置。自动重启会保留此选择。
通过 SSH 隧道连接远程 Gateway(回环绑定)¶
如果 Gateway 绑定到回环地址(gateway.bind=loopback,本地模式下的默认值),远程节点主机无法直接连接。请创建 SSH 隧道,并将节点主机指向隧道的本地端。
示例(节点主机 -> Gateway 主机):
# Terminal A (keep running): forward local 18790 -> gateway 127.0.0.1:18789
ssh -N -L 18790:127.0.0.1:18789 user@gateway-host
# Terminal B: export the gateway token and connect through the tunnel
export OPENCLAW_GATEWAY_TOKEN="<gateway-token>"
openclaw node run --host 127.0.0.1 --port 18790 --display-name "Build Node"
说明:
openclaw node run支持 Token 或密码身份验证。- 优先使用环境变量:
OPENCLAW_GATEWAY_TOKEN/OPENCLAW_GATEWAY_PASSWORD。 - 配置回退为
gateway.auth.token/gateway.auth.password。 - 在本地模式下,节点主机有意忽略
gateway.remote.token/gateway.remote.password。 - 在远程模式下,
gateway.remote.token/gateway.remote.password根据远程优先级规则符合条件。 - 如果已配置但尚未解析的活动本地
gateway.auth.*SecretRefs,节点主机身份验证将失败关闭。 - 节点主机身份验证解析仅认可
OPENCLAW_GATEWAY_*环境变量。
限制节点命令面¶
将 --commands <ids> 传递给 openclaw node run、openclaw node install 或
openclaw connect,以仅通告一个显式的、逗号分隔的精确命令 ID 列表。例如,Session Share 节点可以
发布会话,而无需暴露执行或其他机器能力:
openclaw connect <join-url> --service \
--commands openclaw.sessions.list.v1,openclaw.sessions.read.v1
该标志可重复使用。允许列表会保存在节点的持久机器状态中,包括已安装的服务;在后续启动时省略它会保留 已保存的列表。节点仅通告既可用又在允许列表中的命令,并且仅通告其所需能力。如果没有请求的命令可用,启动将失败。Gateway 配对审批会准确显示 已声明的命令;Gateway 命令策略仍适用于调用。
显式允许列表还会禁用计算机使用、技能扫描和 发布、插件工具发布、MCP 服务器以及 worker 托管。允许列表不会启用已禁用的插件,也不会使不可用的命令 变为可用。
在前台使用 openclaw node run --all-commands,或对已安装服务使用 openclaw node install --force --all-commands,可恢复完整的默认命令面。使用 openclaw connect 注册时,添加 --all-commands,并可选添加 --service。这会持久地移除已保存的允许列表,并替换服务的 --commands 参数。不要将 --all-commands 与 --commands 组合使用。
启动节点主机(服务)¶
openclaw node install --host <gateway-host> --port 18789 --display-name "Build Node"
openclaw node start
openclaw node restart
node install 还接受 --context-path、--tls、--tls-fingerprint、--node-id(仅限旧版客户端实例 ID)、--share-installed-apps / --no-share-installed-apps、--runtime <node|bun>(默认:node)以及用于重新安装的 --force。Bun 要求 1.4+ 版本,并具备 WAL 重置安全的 node:sqlite,且为显式可选启用;仍建议使用 Node。node status、node stop 和 node uninstall 也可用。
节点关闭会等待插件可用性监视器和活动计算机执行完成清理,并报告这些清理操作的失败。如果命令报告 Node disconnect cleanup failed,请重新连接节点以重试断开连接清理,然后再发送另一个命令。
会话主机工作区权限¶
以 --session-host 启动的节点在通告会话容量之前会检查工作区暂存。在 Unix 上,状态目录(OPENCLAW_STATE_DIR 或
~/.openclaw)及其规范父目录必须满足文件系统所有者的检查。没有 sticky 保护的组可写或全局可写父目录会阻止
会话托管,即使 node-host 目录本身是私有的。
节点日志和 environments.list 会标识出有问题的目录以及补救措施:在节点上运行 chmod go-w '<reported-path>',然后重启节点主机。在更改共享目录权限之前,请先审查这些权限;或者,将节点状态移动到私有目录下。OpenClaw 不会更改父目录权限或绕过暂存检查。受信任的 sticky 系统临时目录仍受支持。
A session-host failure does not disconnect the node or disable its desktop and
other available commands. environments.list keeps a connected node available,
reports sessionHost: false and the hosting diagnostic, and refuses session
placement until the hosting problem is repaired.
会话主机故障不会断开节点连接,也不会禁用其桌面和其他可用命令。environments.list 会保持已连接节点可用,报告 sessionHost: false 和托管诊断信息,并在托管问题修复前拒绝会话放置。
Disabled-host reasons are published only when the Gateway advertises
node-worker-host-diagnostics-v1. Older Gateways still receive disabled hosting;
the node log retains the reason. Workspace transfers also report the same
remediation if permissions change after startup.
禁用主机原因仅在 Gateway 通告 node-worker-host-diagnostics-v1 时发布。旧版 Gateway 仍会收到禁用托管;节点日志会保留原因。工作区迁移也会在启动后权限发生变化时报告相同的修复措施。
自动节点更新¶
打包的无头节点默认每小时检查一次更新,前台模式和服务模式均如此。它们会准备一个独立的运行时,等待所有节点工作空闲,然后以相同的身份、配对和启动选项重启并重新连接。节点更新不会替换全局 CLI 包或同位置的 Gateway。自动激活之间至少间隔 12 小时,繁忙的工作可以无限期推迟更新。
在节点上设置 nodeHost.autoUpdate.enabled: false 可退出。共享的 update.checkOnStart: false 和 OPENCLAW_NO_AUTO_UPDATE=1 退出选项也适用。源码检出、原生应用节点、私有 worker、dev 和 extended-stable 安装不会自动应用。需要数据库迁移的版本会推迟到正常更新流程。有关空闲工作规则和配置,请参阅 无头节点更新。
配对 + 命名¶
在 Gateway 主机上,批准设备请求:
如果节点使用更改后的身份验证详情重试,请重新运行 openclaw devices list 并批准当前的 requestId。
在设备批准待处理期间,节点会持续重新连接,指数退避上限为 30 秒。批准后,其下一次重新连接会创建一个独立的命令表面请求。在 Gateway 上:
openclaw nodes pending
openclaw nodes approve <nodeRequestId>
openclaw nodes describe --node <id|name|ip>
如果旧客户端已经报告重新连接已暂停,请使用 openclaw node restart 重启已安装的节点,或停止并重新运行一次其前台 openclaw node run 命令。
设备请求 ID 和节点请求 ID 是不同的。初始未批准的表面没有有效命令。SSH 验证和引导注册可以自动批准第一个表面;仅可信网络设备批准则不能。后续扩展需要批准,而先前已批准且仍保持声明和允许状态的命令仍可以运行。Gateway 命令策略 和节点本地 exec 批准仍然是独立的关卡。
命名选项:
openclaw node run/openclaw node install上的--display-name(持久化在共享的nodeHost.configSQLite 机器状态值中,与客户端实例 ID 和 Gateway 连接元数据一起)。openclaw nodes rename --node <id|name|ip> --name "Build Node"(Gateway 覆盖)。
无头身份状态¶
无头节点在共享 SQLite 中保留三个独立的状态记录:
~/.openclaw/state/openclaw.sqlite(config_machine_state,键nodeHost.config):客户端实例 ID、显示名称和 Gateway 连接元数据。~/.openclaw/state/openclaw.sqlite(device_identities,键primary):已签名的设备密钥对和派生的加密设备 ID。~/.openclaw/state/openclaw.sqlite(device_auth_tokens):按加密设备 ID 和角色索引的已配对设备身份验证令牌。
对于已签名节点,Gateway 使用加密设备 ID 进行配对和节点路由。客户端实例 ID 仅是连接元数据。因此,更改 --node-id 或迁移已弃用的 node.json 不会重置配对。有关支持的撤销并重新配对流程以及升级说明,请参阅 身份和配对状态。
已弃用的 identity/device.json 和 identity/device-auth.json 文件是 Doctor 管理的迁移输入。停止节点主机并运行 openclaw doctor --fix;Doctor 会在删除旧文件之前,将其行导入 SQLite 并验证。
无头节点和 macOS 应用 worker 在准备能力之前会检查此状态。待处理的设备身份验证、exec 批准,或缺少规范身份但存在已弃用身份数据的情况,需要 Doctor;启动会保留输入,并且不会创建替换密钥或导入执行策略。有效的规范身份优先于过时的 identity/device.json 数据。
系统命令(节点主机 / macOS 节点)¶
macOS 节点和无头节点主机都暴露 system.run.prepare、system.run、system.which 和 system.execApprovals.get/set;macOS 节点还暴露 system.notify。
示例:
openclaw nodes notify --node <idOrNameOrIp> --title "Ping" --body "Gateway ready"
openclaw nodes invoke --node <idOrNameOrIp> --command system.which --params '{"bins":["git"]}'
说明:
system.run在 payload 中返回 stdout/stderr/退出码。- Shell 执行通过
exec工具进行,host=node;独立的nodes.run执行路径已在 2026.3.31 中移除。nodes仍然是用于显式节点命令的直接 RPC 表面。 nodes invoke不暴露system.run或system.run.prepare;它们仅保留在 exec 路径上。- exec 路径会读取节点策略并准备规范的
systemRunPlan。Full/off 执行会解析工作目录别名,而不会添加仅用于批准的脚本检查。当调用方或节点策略要求批准绑定时,更严格的路径和脚本检查仍然有效。一旦批准被授予,gateway 会转发该存储的计划,而不是任何后续由调用方编辑的 command/cwd/session 字段。 system.notify遵循 macOS 应用上的通知权限状态;支持--priority <passive|active|timeSensitive>和--delivery <system|overlay|auto>。- 无法识别的节点
platform/deviceFamily元数据会使用保守的默认允许列表,其中排除system.run和system.which。如果你确实需要在未知平台上使用这些命令,请通过gateway.nodes.commands.allow显式添加它们。 system.run请求支持cwd、env映射、timeoutMs和needsScreenRecording— 这些是 exec 路径上携带的请求 payload 字段(见上文),而不是nodes invokeCLI 标志。- 对于 shell 包装器(
bash|sh|zsh ... -c/-lc),请求范围的env值会被缩减为显式允许列表(TERM、LANG、LC_*、COLORTERM、NO_COLOR、FORCE_COLOR)。 - 在允许列表模式下的 allow-always 决策中,已知分发包装器(
env、flock、nice、nohup、stdbuf、timeout)会持久化内部可执行文件路径,而不是包装器路径。如果解包不安全,则不会自动持久化允许列表条目。 - 在允许列表模式下的 Windows 节点主机上,通过
cmd.exe /c运行的 shell 包装器需要批准(仅允许列表条目不会自动允许包装器形式)。 - 节点主机会忽略
env对象中的PATH覆盖,并在运行命令前剥离一组大量维护的解释器/shell 启动变量(例如NODE_OPTIONS、PYTHONPATH、BASH_ENV、DYLD_*、LD_*)。如果你需要额外的 PATH 条目,请配置节点主机服务环境(或将工具安装到标准位置),而不是通过env传递PATH。 - 在 macOS 节点模式下,
system.run受 macOS 应用中的 exec 批准控制(设置 → Exec approvals)。Ask/allowlist/full 的行为与无头节点主机相同;被拒绝的提示返回SYSTEM_RUN_DENIED。 - 在无头节点主机上,
system.run受本地 SQLite exec 批准行控制;特别是在 macOS 上,请参阅下文 无头节点主机 下的 exec-host 路由环境变量。
无头节点主机(跨平台)¶
OpenClaw 可以运行一个无头节点主机(无 UI),它连接到 Gateway WebSocket 并暴露 system.run / system.which。这在 Linux/Windows 上,或在与服务器一起运行最小节点时很有用。
启动方式:
注意事项:
- 仍需要设备配对和命令界面审批;请按照 配对 + 命名 完成两个阶段。
- 客户端实例元数据、签名设备身份和配对身份验证使用独立的状态记录;参见 无头身份状态。
- 执行审批通过
~/.openclaw/state/openclaw.sqlite#exec_approvals_config在本地强制执行(参见 执行审批)。 - 在 macOS 上,无头节点主机默认在本地执行
system.run。设置OPENCLAW_NODE_EXEC_HOST=app可要求使用配套应用执行主机,且无本地回退。OPENCLAW_NODE_EXEC_FALLBACK不会更改当前路由。 - 当 Gateway WS 使用 TLS 时,添加
--tls/--tls-fingerprint。
Mac 节点模式¶
- macOS 菜单栏应用作为节点连接到 Gateway WS 服务器(因此
openclaw nodes …可针对这台 Mac 使用)。 - 在远程模式下,应用会为 Gateway 端口打开一个 SSH 隧道,并连接到
localhost。
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 cl/openclaw