配置 — 网关
位于 gateway.* 下的网关运行时键。
完整键索引及其他顶层配置域,请参阅 配置参考。
网关¶
{
gateway: {
mode: "local", // local | remote
port: 18789,
bind: "loopback",
publicOrigin: "https://gateway.example.com",
auth: {
mode: "token", // none | token | password | trusted-proxy
token: "your-token",
// password: "your-password", // or OPENCLAW_GATEWAY_PASSWORD
// trustedProxy: { userHeader: "x-forwarded-user" }, // for mode=trusted-proxy; see /gateway/trusted-proxy-auth
allowTailscale: true,
identityScopes: {
"admin@example.com": ["operator.admin"],
},
rateLimit: {
maxAttempts: 10,
windowMs: 60000,
lockoutMs: 300000,
exemptLoopback: true,
},
},
// Optional person-level access policy for team Gateway deployments.
roles: {
default: "guest",
definitions: {
maintainer: {
sessions: { others: "write" }, // none | view | suggest | write
agents: ["roboclaw"],
scopes: ["operator.read", "operator.write", "operator.approvals"],
},
guest: {
sessions: { others: "view" },
agents: ["roboclaw"],
scopes: ["operator.read", "operator.write"],
sandbox: "required", // inherit (default) | required
},
},
},
tailscale: {
mode: "off", // off | serve | funnel
},
controlUi: {
enabled: true,
basePath: "/openclaw",
// experimental: { customPlugins: false }, // Labs: native UI from user-installed plugins
// environment: { label: "edge", color: "amber" },
// communityInvite: true, // show the sidebar Discord invitation unless dismissed
// root: "dist/control-ui",
// github: { token: { source: "store", provider: "default", id: "CONTROL_UI_GITHUB" } },
// embedSandbox: "scripts", // strict | scripts | trusted
// allowExternalEmbedUrls: false, // dangerous: allow absolute external http(s) embed URLs
// automaticallyFetchFavicons: true, // SSRF-guarded link favicon fetches
// allowedOrigins: ["https://control.example.com"], // optional override of publicOrigin
// dangerouslyAllowHostHeaderOriginFallback: false, // dangerous Host-header origin fallback mode
},
uploads: {
enabled: true, // set false to reject client file/image uploads
},
cliAgents: {
enabled: true, // show create-capable CLI session targets in the model picker
},
terminal: {
enabled: false,
// shell: "/bin/zsh",
},
remote: {
url: "ws://127.0.0.1:18789",
transport: "ssh", // ssh | direct
token: "your-token",
// password: "your-password",
},
trustedProxies: ["10.0.0.1"],
// Optional. Default false.
allowRealIpFallback: false,
nodes: {
pairing: {
// Silent same-host pairing and access upgrades. Default: enabled.
// Set false to require explicit approval for every device.
autoApproveLocal: true,
// Optional. Default unset/disabled.
autoApproveCidrs: ["192.168.1.0/24", "fd00:1234:5678::/64"],
// SSH-verified auto-approval. Default: enabled (true).
// Set false to disable SSH verification only; this does not affect
// autoApproveCidrs above. For manual-only node pairing, set false AND
// unset autoApproveCidrs. Pass an object to tune: { user, identity,
// timeoutMs, cidrs }.
sshVerify: true,
},
commands: {
allow: ["canvas.navigate"],
deny: ["system.run"],
},
},
tools: {
// Additional /tools/invoke HTTP denies
deny: ["browser"],
// Remove tools from the default HTTP deny list for owner/admin callers
allow: ["gateway"],
},
push: {
apns: {
relay: {
baseUrl: "https://relay.example.com",
timeoutMs: 10000,
},
},
},
},
}
网关字段详情
mode:local(运行网关)或remote(连接到远程网关)。除非设置为local,否则网关拒绝启动。port:本地网关绑定端口,复用 WS + HTTP。它不选择 macOS SSH 隧道端口。优先级:--port>OPENCLAW_GATEWAY_PORT>gateway.port>18789。publicOrigin:可选的外部可访问的网关 HTTPS 来源(origin),不含路径、查询字符串或凭据。仅在本机开发期间,字面回环主机(localhost、127.0.0.1或[::1])接受 HTTP。按请求方的 MCP OAuth 需要此值,并使用<publicOrigin>/oauth/mcp/callback作为其回调 URL。Slack 会话卡片操作、插件生成的查看器链接以及指向 Control UI 的聊天深链接也使用此来源。当省略gateway.controlUi.allowedOrigins时,它提供浏览器来源允许列表。当 Control UI 位于反向代理路径前缀之后时,需单独设置gateway.controlUi.basePath。bind:auto、loopback(默认)、lan(0.0.0.0)、tailnet(Tailscale IPv4 可用时使用,否则回环)或custom(单个 IPv4 地址)。解析后的tailnet地址以及除127.0.0.1或0.0.0.0外的任何custom地址,都要求同一端口上存在127.0.0.1供同主机客户端使用;如果任一监听器无法绑定,则启动失败。非回环暴露仍仅限于所选接口。- 旧版绑定别名:请在
gateway.bind中使用绑定模式值(auto、loopback、lan、tailnet、custom),而不是主机别名(0.0.0.0、127.0.0.1、localhost、::、::1)。 - Docker 说明:默认的
loopback绑定会在容器内监听127.0.0.1。使用 Docker 桥接网络(-p 18789:18789)时,流量到达eth0,因此网关不可达。请使用--network host,或设置bind: "lan"(或通过customBindHost: "0.0.0.0"设置bind: "custom")以监听所有接口。 - 认证:默认必需。非回环绑定需要网关认证。实际上,这意味着共享 token/密码,或带有
gateway.auth.mode: "trusted-proxy"的能识别身份的反向代理。初始化向导默认会生成一个 token。 - 如果同时配置了
gateway.auth.token和gateway.auth.password(包括 SecretRefs),请将gateway.auth.mode显式设置为token或password。当两者均已配置但未设置 mode 时,启动及服务安装/修复流程会失败。 gateway.auth.mode: "none":显式的无认证模式。仅适用于受信任的本地回环配置;初始化提示有意不提供此模式。gateway.auth.mode: "trusted-proxy":将浏览器/用户认证委托给能识别身份的反向代理,并信任来自gateway.trustedProxies的身份头(参见 Trusted Proxy 认证)。此模式默认期望非回环代理来源;同主机回环反向代理需要显式设置gateway.auth.trustedProxy.allowLoopback = true。内部同主机调用者可将gateway.auth.password用作本地直接回退;gateway.auth.token与 trusted-proxy 模式保持互斥。gateway.auth.allowTailscale:为true时,Tailscale Serve 身份头可以满足 Control UI/WebSocket 认证(通过tailscale whois验证)。HTTP API 端点不使用该 Tailscale 头认证;它们改而遵循网关常规的 HTTP 认证模式。这种无 token 流程假定网关主机受信任。当tailscale.mode = "serve"时默认为true。gateway.auth.identityScopes:将已验证的 trusted-proxy 用户或 Tailscale WhoIs 登录映射到仅连接(connection-only)的操作员作用域。邮箱键不区分大小写匹配;其他身份完全匹配。对于 trusted-proxy Control UI 连接,x-openclaw-scopes会限制设备注册或升级请求,以及最终的设备加身份会话作用域。授权(grant)不会创建或修改配对记录。Token、密码和无认证连接没有已验证的身份,因此不会获得任何授权。gateway.roles:可选的具名操作员角色,适用于团队网关(team Gateways)上已认证的用户配置文件。每个定义指定sessions.others(none、view、suggest或write)、允许用于创建会话和运行 agent 的agents("*"或 agent ID 数组),以及一个封闭的scopes上限,该上限同样适用于经过身份认证的 HTTP 请求和已签名的 Control UI 插件授权。可选的sandbox默认为"inherit";也可设为"required",以便在该角色下创建的会话即使 agent 的沙箱模式为"off"也强制沙箱化。该要求由已认证的创建者一次性记录,不能通过角色更新或会话变更来修改,也不影响现有会话。被要求沙箱的人员无法启动主机执行会话,包括通过邀请;不可用的沙箱后端会默认拒绝(fail closed),提权或主机目标的覆盖均无法逃逸。管理员作用域的users.setRole网关方法会分配或清除配置文件的角色,并立即断开其活动客户端,使其以当前权限重新连接。在配置角色时,经身份认证的操作员会话不会获得可重用、不绑定个人的设备/引导 token;无身份的设备 token 或引导 token 操作员认证会被拒绝;请改为通过 trusted-proxy 或其他受支持的已验证身份重新连接。default是必需的,必须命名一个已配置的定义,并适用于未分配角色的配置文件。sessions.others: "none"还会拒绝网关范围内的usage.cost;审计诊断和其他operator.write控制平面能力仍然是共享域暴露面,而非敌对租户隔离。省略roles会使现有的 solo 和共享密钥(shared-secret)部署保持不变。参见 操作员作用域。gateway.roles.definitions.<role>.accessPolicyPlugin:可选的精确插件 ID,其注册的网关访问策略必须授权受此角色管辖的人员。例如,默认访客角色可要求"visitor-access",而独立分配的工作人员角色可省略该字段。当插件缺失或禁用、其清单缺失或格式错误、加载失败,或策略未提供当前权限时,网关会拒绝此角色的访问。插件不可用时,该引用仍是有效配置,因此独立工作人员和网关所有者可以修复它。省略该字段不会增加插件依赖。gateway.roles.definitions.<name>.modelPolicy:可选的模型上限,适用于角色的请求、排队工作和子任务。使用{}时,允许的模型遵循指定源 agent 的主模型和备用模型。sourceAgent选择该 agent;allow替换成员资格,deny排除已解析的模型引用、别名或尾部家族模式(如provider/restricted-*)。空的allow会拒绝所有模型。启用配置重载后,仅涉及现有角色模型策略的修改提交后无需重启网关即可生效:使用已被移除模型的请求会被取消,而允许的模型和无关工作继续执行。其他角色变更会热应用,并以当前权限重新连接客户端,包括与模型策略编辑组合时也是如此。现有手动模型规则仍然适用;省略的角色模型策略和 System 访问保持不变。参见 具名操作员角色。- 角色定义、代理信任、身份作用域、Tailscale 认证和 trusted-proxy 策略均可热应用。除模型策略外的其他变更会用当前权限重新连接现有客户端;唯一的例外是,当仅另一登录的身份授权发生变化,或自身作用域集合仅被重新排序时,已验证的 WebSocket 登录会保留其连接和已接受的运行。对自身已解析授权的变更会撤销保留和委派的工作;恢复授权不会重新激活该权限。挂起的握手和写入无法保留已被撤销的访问。认证模式变更仍需要重启网关。
gateway.auth.rateLimit:可选的失败认证限流器。按客户端 IP 和认证范围分别应用(共享密钥和设备令牌独立跟踪)。被阻止的尝试返回429和Retry-After。更改会热应用到现有限流器:已记录的失败、已获得的锁定截止时间和待处理的回环延迟都会保留。新的限制和豁免适用于后续尝试;删除该配置段将恢复默认值。- 在异步 Tailscale Serve 控制 UI 路径上,针对相同
{scope, clientIp}的失败尝试会在写入失败记录之前被串行化。因此,来自同一客户端的并发错误尝试会在第二个请求时触发限流器,而不是两个请求都作为普通不匹配被放行。 gateway.auth.rateLimit.exemptLoopback默认值为true;当你确实也希望 localhost 流量被限流时(用于测试设置或严格的代理部署),请将其设为false。- 来自浏览器源的 WS 认证尝试始终会进行限流,且回环豁免被禁用(针对基于浏览器的 localhost 暴力破解提供纵深防御)。
- 在回环上,这些浏览器源的锁定是按规范化后的
Origin值隔离的,因此来自一个 localhost 源的重复失败不会自动锁定另一个源。 tailscale.mode:serve(仅 tailnet,回环绑定)或funnel(公开,需要认证)。OpenClaw 将路由作为前台声明持有,因此除非路由处于活动状态,否则启动将失败;当 Gateway 停止时,该路由会被释放。不支持命名 Tailscale 服务,因为 Tailscale CLI 仅允许它们作为持久后台路由存在。tailscale.preserveFunnel:已弃用的迁移保护开关。当为true且tailscale.mode = "serve"时,OpenClaw 会在启动时重新应用 Serve 之前检查tailscale funnel status。如果无法检查该状态,启动会在普通 Gateway 监听器打开之前失败。仍然面向普通 Gateway 端口的外部 Funnel 不会获得受管入口来源信息。OpenClaw 会保持外部路由不变并发出警告。该路由只能通过显式配置且带有有效转发客户端地址的gateway.trustedProxies源来使用通用代理归属;此时受 Gateway 保护的路由需要配置认证,而聚合探针和插件认证的 webhook 保留其自身的响应和认证策略。首先配置gateway.auth.password(优先使用 SecretRef)或OPENCLAW_GATEWAY_PASSWORD,并将gateway.auth.mode设置为password。然后运行openclaw config set gateway.tailscale.mode funnel,接着运行openclaw config unset gateway.tailscale.preserveFunnel。默认值为false。controlUi.experimental.customPlugins:允许用户安装的插件提供原生浏览器 UI,包括本地开发插件。默认值:false。可通过 设置 → 实验室 → 自定义插件 UI 启用,或将此布尔值设为true。原生 UI 以已登录操作者的 Gateway 权限运行,因此仅应对受信任的插件启用。即使关闭此设置,已启用的内置插件的原生 UI 仍然可用;后端插件 API、普通插件加载、沙箱化的仪表盘小部件以及 MCP Apps 不受影响。更改会热应用并刷新已连接浏览器标签页中的插件视图。禁用后,请重新加载标签页以清除已运行的插件 JavaScript。参见 功能插件。controlUi.allowedOrigins:Gateway 浏览器连接的显式浏览器来源允许列表。省略时,如果配置了gateway.publicOrigin,则默认为该值。显式列表(包括[])会取代此默认值。来自回环、RFC1918/链路本地、.local、.ts.net或 Tailscale CGNAT 主机的私有同源 LAN/Tailnet UI 加载会被接受,无需启用 Host 头回退。controlUi.environment:用于区分 Gateway 环境的可选视觉标识。设置{ label: "edge", color: "amber" }可显示匹配的顶部条纹、智能体头像环、环境胶囊、浏览器标题后缀以及着色 favicon。label会被去除首尾空白,且必须包含 1–24 个字符。color必须是teal、amber、purple、coral、pink、blue、green、red或gray。标签和颜色在登录前可见;省略该设置可保持默认外观不变。controlUi.newSessionModelDefaults:"last-used"(默认值)会恢复记忆的新会话模型、运行时和推理选择。设置为"configured"可让新建草稿改用所选智能体的已配置默认值。适用于此 Gateway 所服务 UI 中的/new和命令面板,在浏览器刷新或重新连接后生效。显式选择保持可编辑,并在重新加载时随当前未发送的草稿一起保留;提交该草稿后,其选择会被弃用,因此下一个新建草稿将使用已配置的默认值。现有会话不受影响。工作区、放置位置和 Fast Mode 偏好会被保留;已存储的偏好不会被删除。请在智能体(或agents.defaults)上配置所需的模型和thinkingDefault;此设置不会强制使用特定模型或推理级别。controlUi.communityInvite:在侧边栏中显示 Discord 社区邀请。默认值:true。在提供 UI 的 Gateway 上设置为false,可对使用该部署的所有浏览器隐藏它,包括连接到另一个远程 Gateway 的浏览器。该设置会热重载;现有页面在浏览器刷新或重新连接后即可生效。重新启用会保留浏览器本地的关闭状态。controlUi.github.token:可选的基于 SecretRef 的服务凭据,用于在无托管智能体身份的情况下进行 GitHub 支持的个人资料验证、Control UI 项目发现以及 GitHub 悬停预览。个人资料验证仅将服务凭据用于公开账户元数据;登录提供方拥有该人员的身份。元数据缓存和配额冷却会自动进行;参见 Gateway 个人资料与 GitHub 信用。悬停预览优先使用所选智能体的有效tools.github身份(包括继承的系统身份),并且仍仅限于公共仓库。当 Gateway 需要独立于其共享进程环境来拥有服务访问权限时,请优先使用此显式设置。省略时,服务访问保留随附的GH_TOKEN然后是GITHUB_TOKEN进程环境回退。显式配置但不可用的凭据会安全失败(fail closed),而不会使用无关凭据。其确切的环境变量或存储名称会被排除在智能体执行之外;自定义名称不会清除无关的原生GH_TOKEN或GITHUB_TOKEN值。此凭据与tools.github智能体身份分开,且不会创建 OS 用户安全边界。- 工具活动描述由执行智能体提供时会自动显示;查看工具调用不会请求 utility-model 补全。先前的
controlUi.toolTitles设置已退役。运行openclaw doctor --fix可将其从现有配置中移除。 controlUi.automaticallyFetchFavicons:在 Control UI 聊天中获取链接 favicon 和浏览器标签页社交预览。默认值:true。经过认证的浏览器会向同源 Gateway 请求每个主机名。对于内联链接 favicon,Gateway 会请求https://<hostname>/favicon.ico,拒绝 IP 字面量和私有/内部目标,固定公共 DNS 结果,在同样的严格 SSRF 策略下重新验证每个重定向,限制重定向/时间/字节/并发,验证图像,并返回可私有缓存的图像 blob。OpenClaw 不会为此流程使用 Google 或其他 favicon 服务。这会将所链接的主机名和 Gateway 的网络地址披露给这些目标站点。浏览器标签页卡片还会通过 Gateway 额外请求公共页面标题、声明的 favicon 以及 Open Graph 或 Twitter 图像,并遵循相同的公共网络限制和有界的 HTML/图像处理。不会转发浏览器 cookie 或站点凭据。这些预览会将页面 URL 和 Gateway 的网络地址披露给目标站点及其声明的图像主机。设置为false可同时禁用自动 favicon 和页面预览获取;现有的实时浏览器截图预览不受影响。controlUi.dangerouslyAllowHostHeaderOriginFallback:危险模式,可为有意依赖 Host 头来源策略的部署启用 Host 头来源回退。cliAgents.enabled:在 Control UI 新会话模型选择器中显示 CLI agents 组。默认值:true;设置为false可禁用 CLI 智能体和原生 CLI 会话创建。该组仅在 Gateway 通告sessions.catalog.list时出现,并且只包含支持创建会话的目录提供方。选择一个提供方会打开与侧边栏目录操作相同的目录目标新会话流程。
在设置 → 基础设施 → 网关中配置 CLI 代理。
目录提供者也可以宣告支持基于终端的会话创建。该方法仅在 `cliAgents.enabled` 开启、网关终端可用,且所选提供者暴露了该能力时可用。调用者需提供 `cwd`;如有需要,请先使用 `worktrees.create` 创建新的工作树,因为终端启动时不会自动创建工作树。
- `terminal.enabled`:管理员作用域的操作员终端。默认值:`true`;设为 `false` 可选择退出。该终端会在所选代理工作区中启动主机 PTY,继承网关进程环境,并且对于 `sandbox.mode: "all"` 的代理会被拒绝。更改热生效:禁用会关闭已连接、已分离及对话拥有的会话,并取消待处理的打开请求;重新启用则允许创建新会话。请重新加载已打开的 Control UI 页面,以获取更新的内容安全策略。
- `terminal.shell`:可选的 Shell 可执行文件。未设置时,OpenClaw 在 Unix 上使用 `$SHELL`,在 Windows 上使用 `%ComSpec%`。更改会热生效于新打开的终端;现有终端将继续运行其原来的 Shell。
- `terminal.detachedSessionTimeoutSeconds`:终端会话在其连接断开(页面重新加载、笔记本休眠)后存活的时长,期间仍可通过 `terminal.attach` 重新连接,并回放最近输出。默认值:`300`。设为 `0` 可在连接断开时立即终止会话。更改会对现有分离会话热生效,使用其原始断开时间计算;已过期的会话立即关闭,而已连接终端继续运行。分离会话会继续运行其命令,因此在共享或暴露的主机上请调短此值。
- `remote.transport`:`ssh`(默认)或 `direct`(ws/wss)。对于 `direct`,公网主机的 `remote.url` 必须为 `wss://`;明文 `ws://` 仅接受用于回环、局域网、链路本地、`.local`、`.ts.net` 和 Tailscale CGNAT 主机。
- `remote.url`:远程客户端端点。在 macOS SSH 模式下,其回环端口会独立于 `gateway.port` 选择本地隧道端口。
- `remote.remotePort`:远程 SSH 主机上的网关端口。macOS 隧道会回退到 `remote.url` 中的端口,然后是 `18789`;当隧道与目标端口不同时,请显式设置此值。
- `remote.tlsFingerprint`:远程 `wss://` 网关的预期 SHA-256 证书指纹。macOS 应用会将其同时应用于操作员/控制连接和伴生节点连接。没有显式值时,macOS 仅在常规系统信任成功后记录首次使用固定。
- `remote.sshHostKeyPolicy`:macOS SSH 隧道的主机密钥策略。`strict` 是默认值,要求使用已受信任的密钥。`openssh` 是对受管别名的有效 OpenSSH 配置的明确选择加入;使用前请检查匹配的用户和系统 SSH 设置。macOS 应用和 `configure-remote` 在更改目标时会将此策略重置为 `strict`,除非再次明确选择加入。
- `gateway.remote.token` / `.password` 是远程客户端凭据字段。它们本身不会配置网关认证。
- `gateway.push.apns.relay.baseUrl`:外部 APNs 中继的基础 HTTPS URL,在基于中继的 iOS 构建向网关发布注册后使用。公开的 App Store 构建使用托管的 OpenClaw 中继。自定义中继 URL 必须匹配一条刻意独立的 iOS 构建/部署路径,该路径的中继 URL 指向该中继。
- `gateway.push.apns.relay.timeoutMs`:网关到中继的发送超时时间(毫秒)。默认值为 `10000`。
- 基于中继的注册会委托给特定的网关身份。配对的 iOS 应用会获取 `gateway.identity.get`,将该身份包含在中继注册中,并将注册作用域的发送授权转发给网关。其他网关无法重用该存储的注册。
- `OPENCLAW_APNS_RELAY_BASE_URL` / `OPENCLAW_APNS_RELAY_TIMEOUT_MS`:上述中继配置的临时环境变量覆盖。
- `OPENCLAW_APNS_RELAY_ALLOW_HTTP=true`:仅限开发的应急出口,用于回环 HTTP 中继 URL。生产环境的中继 URL 应保持使用 HTTPS。
- `OPENCLAW_HANDSHAKE_TIMEOUT_MS`:可选的环境变量覆盖,用于内置的网关 WebSocket 预认证握手超时。
- `channels.<provider>.healthMonitor.enabled`:按渠道选择退出健康监控重启,同时保持全局监控启用。
- `channels.<provider>.accounts.<accountId>.healthMonitor.enabled`:多账户渠道的按账户覆盖。设置后,它优先于渠道级别的覆盖。
- 本地网关调用路径仅可在 `gateway.auth.*` 未设置时使用 `gateway.remote.*` 作为回退。
- 如果 `gateway.auth.token` / `gateway.auth.password` 通过 SecretRef 显式配置但无法解析,则解析失败即关闭(不进行远程回退掩盖)。
- `trustedProxies`:终止 TLS 或注入转发客户端头的反向代理 IP。只列出您控制的代理。回环条目对于同主机代理/本地检测设置(例如 Tailscale Serve 或本地反向代理)仍然有效,但它们**不会**使回环请求有资格获得 `gateway.auth.mode: "trusted-proxy"`。
- `allowRealIpFallback`:当为 `true` 时,如果缺少 `X-Forwarded-For`,网关将接受 `X-Real-IP`。默认 `false`,以保证失败即关闭的行为。
- `gateway.nodes.pairing.autoApproveLocal`:静默批准来自受信任本地连接的配对、角色升级和作用域升级(默认值:`true`)。作用域升级还要求连接本身证明具备本地级别凭据(认证模式 `none` 或共享令牌/密码);Tailscale、受信任代理和设备令牌连接会将其已配对作用域保留为持久上限。设为 `false` 可要求对每台设备进行显式批准;仅元数据的重连刷新仍然自动进行。
- `gateway.nodes.pairing.autoApproveCidrs`:可选的 CIDR/IP 允许列表,用于自动批准首次节点设备配对(不请求任何作用域)。未设置时禁用。它不会自动批准操作员/浏览器/Control UI/WebChat 配对,也不会自动批准角色、作用域、元数据或公钥升级。
- `gateway.nodes.pairing.sshVerify`:首次节点设备配对的 SSH 验证自动批准(默认:启用)。网关会 SSH 回连配对主机(BatchMode 模式、严格主机密钥),并且仅在 `openclaw node identity` 设备密钥完全匹配时批准。与 `autoApproveCidrs` 具有相同的资格下限;探测仅限于私有/CGNAT 源地址,除非 `cidrs` 覆盖了它们。设为 `false` 可禁用,或设为 `{ user, identity, timeoutMs, cidrs }` 进行调整。参见[节点配对](pairing.md#ssh-verified-device-auto-approval-default)。
- `gateway.nodes.commands.allow` / `gateway.nodes.commands.deny`:在配对和平台允许列表评估之后,对已声明节点命令的全局允许/拒绝整形。`commands.allow` 是对分类命令(如 `camera.snap`、`camera.clip`、`codex.exec-server.stdio.v1`、`screen.record`、`health.summary`、`sms.search` 和 `sms.send`)的持久启用;`commands.deny` 会移除某个命令,即使平台默认或显式允许原本会包含它。在已配对设备或已注册云节点上进行 Codex 远程执行,还要求每次 exec-server 尝试都获得一次单独的关键一次性批准;持久允许列表永远不会授予该批准。桌面共享(`desktop.stream`)、计算机控制和移动 UI 控制则依赖节点本地启用加上配对。桌面共享在桌面节点上默认启用,并仍受显式拒绝条目约束。iOS 健康权限、Android 短信权限和网关命令授权相互独立。网关命令策略更改在默认重载模式下会热生效于已连接节点,而不会授予额外的配对批准。当节点更改其声明的命令列表时,请重新连接该节点并批准新的命令请求,以便网关存储扩展后的命令面。
- `gateway.tools.deny`:为 HTTP `POST /tools/invoke` 额外阻止的工具名称(扩展默认拒绝列表)。
- `gateway.tools.allow`:为所有者/管理员调用者从默认 HTTP 拒绝列表中移除工具名称。
这不会将携带身份的 `operator.write` 调用者升级为所有者/管理员访问权限;
`cron`、`gateway` 和 `nodes` 即使被允许列出,对非所有者调用者仍不可用。
禁用文件和图片上传¶
将 gateway.uploads.enabled 设置为 false 可禁用客户端的文件和图片上传:
默认值为 true。该更改热应用生效,无需重启 Gateway。即使来自过期的浏览器或直接 API 客户端,Gateway 也会拒绝上传;隐藏 Control UI 中的控件并非强制边界。拒绝时返回 FORBIDDEN,附带详细代码 UPLOADS_DISABLED(兼容 OpenAI 的 HTTP API 返回状态码 403 和错误代码 UPLOADS_DISABLED)。工具调用端点保留其现有的被阻止工具封装,并包含相同的上传禁用消息。
该开关涵盖聊天和新会话附件、同伴附件、终端上传、内联用户/代理头像、技能归档和文件夹上传,以及 Workboard 附件。携带新上传字节的直接节点和工具调用也会被拒绝;现有媒体传输仍然可用。包含图片或文件内容部分(包括 URL 支持的资源)的兼容 OpenAI 的请求会在获取或解码之前被拒绝。纯文本请求仍然正常。拒绝上传时整个请求会被拒绝;其附件不会被静默移除。已接受的写入仍会继续完成:例如,在开关更改前已持久化的头像仍会获得其匹配的代理配置更新。禁用上传不会撤销现有字节,也不会将已完成的上传转为拒绝。对已接受的聊天、会话创建和出站消息请求的授权重试会重放其现有回执,而不会再次上传;新的幂等键仍要求启用上传。
下载、现有媒体、代理生成的图片/文件、普通文本编辑、服务器本地内存迁移、渠道入站媒体以及内部 worker 文件传输仍然可用。此开关并非沙箱或数据丢失防护策略:它不会移除授权的 shell 访问、代理文件系统工具、配置管理或任意第三方插件能力。如需这些控制,请使用相应的工具、终端、渠道和插件策略。
兼容 OpenAI 的端点¶
- Admin HTTP RPC:默认关闭,作为
admin-http-rpc插件提供。启用该插件以注册POST /api/v1/admin/rpc。参见 Admin HTTP RPC。 - Chat Completions:默认禁用。通过
gateway.http.endpoints.chatCompletions.enabled: true启用。 - Responses API:
gateway.http.endpoints.responses.enabled。 - Responses URL 输入加固:
gateway.http.endpoints.responses.maxUrlPartsgateway.http.endpoints.responses.files.urlAllowlistgateway.http.endpoints.responses.images.urlAllowlist空的允许列表被视为未设置;使用gateway.http.endpoints.responses.files.allowUrl=false和/或gateway.http.endpoints.responses.images.allowUrl=false来禁用 URL 获取。- 可选的响应加固头:
gateway.http.securityHeaders.strictTransportSecurity会热应用到后续响应,包括健康探测。仅为您控制的 HTTPS 源设置;使用false或移除该值以停止发送此头。参见 Trusted Proxy Auth。
多实例隔离¶
在一台主机上使用唯一的端口和状态目录运行多个 Gateway:
OPENCLAW_CONFIG_PATH=~/.openclaw/a.json \
OPENCLAW_STATE_DIR=~/.openclaw-a \
openclaw gateway --port 19001
便捷标志:--dev(使用 ~/.openclaw-dev + 端口 19001)、--profile <name>(使用 ~/.openclaw-<name>)。
gateway.tls¶
{
gateway: {
tls: {
enabled: false,
autoGenerate: false,
certPath: "/etc/openclaw/tls/server.crt",
keyPath: "/etc/openclaw/tls/server.key",
caPath: "/etc/openclaw/tls/ca-bundle.crt",
},
},
}
enabled:在 Gateway 监听器处启用 TLS 终止(HTTPS/WSS)(默认值:false)。autoGenerate:默认值为true。Gateway 启动时仅当两个文件都缺失时才会生成本地自签名证书/密钥对,包括在配置的路径下;仅用于本地/开发环境。已存在的部分配对会被保留,启动将失败。生成的文件在发布时不会覆盖现有路径,并且在文件系统支持时会同步其父目录;不支持的目录刷新会发出结构化降级持久性警告。certPath:TLS 证书文件在文件系统中的路径。keyPath:TLS 私钥文件在文件系统中的路径;请保持权限受限。caPath:可选的 CA 捆绑包路径,用于客户端验证或自定义信任链。
启用自动重载后,Gateway 会监视已接受路径下的证书、密钥和 CA 文件。替换这些文件的内容会更新所有 Gateway HTTPS 监听器,而不会断开现有连接。完整材料会首先经过验证;缺失、不可读或不匹配的配对会继续使用之前的证书并记录失败日志。续期永远不会生成缺失的文件。后台观察也支持原子符号链接和投影目录替换。更改 TLS 配置或文件路径仍需要重启 Gateway。
gateway.reload.mode: "off" 也会暂停证书续期。重新启用重载后会检查当前文件,包括暂停期间所做的续期。发现和新配对负载使用当前提供的指纹。已保存的远程证书固定仍由操作员控制:在使用续期后的证书重新连接之前,请更新这些固定。
客户端命令如 triage、gateway status 和 gateway probe 仅读取公共证书以确定本地 TLS 固定。它们从不生成或修复 TLS 文件,也不需要服务器私钥或 CA 捆绑包。如果没有 certPath,它们会检查状态目录下的 gateway/tls/gateway-cert.pem。缺失或不可读的证书不会提供隐式固定;正常的连接信任检查仍然适用。启动 Gateway 以生成缺失的配对,或在连接前提供配置好的证书文件。
长生命周期的本地健康探针会记住其端点最近一次已验证的证书,从而在替换文件不完整或重新加载暂停期间保持健康检查。它们只有在验证连接后才会采用替换证书。新的探针,或错过了中间续期的探针,不能信任一个已不在配置文件中且从未被验证过的正在提供的证书。请完成或重新启用续期,使监听器与配置的证书保持一致。
gateway.reload¶
mode:控制运行时如何应用配置编辑。"off":忽略实时编辑;更改需要显式重启。"hybrid"(默认):在进程内应用热安全更改,然后在更改需要时重启。
早期的 "restart" 和 "hot" 值已弃用;openclaw doctor --fix 会将两者映射为 "hybrid"。
重新加载防抖和进行中操作延迟不再可配置,而是使用内置默认值运行。openclaw doctor --fix 会从旧配置文件中移除已弃用的 debounceMs 和 deferralTimeoutMs 键。
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 cl/openclaw