生成模型:Claude Opus 4.6 (anthropic/claude-opus-4-6) Token 消耗:输入 ~230k tokens,输出 ~5k tokens(本节)
VPS(Virtual Private Server)部署是将 OpenClaw Gateway 运行在云端服务器上的方案,适用于需要持久在线、公网可达或多用户共享的场景。本节结合 OpenClaw 的 Docker 镜像(参见 29.2 节)和反向代理支持,给出完整的 VPS 部署指南。
典型的 VPS 部署架构如下:
┌─────────────────────────────┐
互联网 │ VPS (Ubuntu) │
─────────────► │ │
HTTPS :443 │ ┌─────────┐ ┌───────────┐ │
─────────────► │ │ Caddy │──►│ Gateway │ │
WSS :443 │ │ /Nginx │ │ :18789 │ │
│ └─────────┘ └───────────┘ │
│ │ │
│ ▼ │
│ 自动 TLS 证书 │
│ (Let's Encrypt) │
└─────────────────────────────┘
核心组件:
反向代理(Caddy / Nginx / Traefik):处理 TLS 终止、自动证书续期、WebSocket 升级
OpenClaw Gateway:Docker 容器运行在 loopback,处理业务逻辑
29.5.2 Docker Compose 生产配置
基于 29.2 节的 Docker 配置,扩展为生产环境:
注意 Gateway 端口映射为 127.0.0.1:18789:18789——这确保 Gateway 不直接暴露到公网,所有外部流量必须经过反向代理。
Caddy 是最适合 OpenClaw 的反向代理——它自动管理 TLS 证书,且原生支持 WebSocket 代理:
Caddy 会自动:
从 Let's Encrypt 申请 TLS 证书
代理 WebSocket 连接(包括 Upgrade 和 Connection 头)
关键:proxy_read_timeout 必须设置一个较大的值(如 86400 秒),否则 Nginx 会在默认 60 秒后关闭 WebSocket 连接。
当 Gateway 运行在反向代理之后时,所有连接的 remoteAddress 都是代理的 IP(通常是 127.0.0.1),而非真实客户端 IP。这会导致:
OpenClaw 通过 gateway.trustedProxies 配置解决此问题:
当连接来自受信任代理时,Gateway 会读取 X-Forwarded-For 或 X-Real-IP 头来获取真实客户端 IP:
OpenClaw 的安全审计系统(src/security/audit.ts)会在以下情况发出警告:
bind=loopback + controlUi.enabled=true + trustedProxies 为空:可能意味着用户在反向代理后运行但忘记配置受信任代理
除了反向代理的 TLS 终止外,Gateway 也支持原生 TLS:
推荐做法:在 VPS 场景中使用反向代理做 TLS 终止,而非 Gateway 原生 TLS。反向代理(特别是 Caddy)的证书管理更加成熟,且不需要在 OpenClaw 配置中管理证书文件。
在 VPS 上部署 OpenClaw 时,建议执行以下安全加固措施:
trustedProxies: ["127.0.0.1"]
端口映射 127.0.0.1:18789:18789
29.5.7 使用 Tailscale 替代公网暴露
如果不需要公开访问,可以用 Tailscale 替代反向代理方案,避免将 Gateway 暴露到公网:
--bind tailnet 会将 Gateway 绑定到 Tailscale 的 100.64.x.x 地址,仅 tailnet 内的设备可以访问——无需防火墙配置,无需 TLS 证书管理。
VPS 部署的推荐架构是:反向代理(Caddy)+ Docker 容器(Gateway),反向代理处理 TLS 和 WebSocket 代理,Gateway 绑定 loopback。
受信任代理(trustedProxies)是反向代理场景的必要配置,确保 Gateway 能通过 X-Forwarded-For / X-Real-IP 获取真实客户端 IP。
Caddy 是最简单的选择——两行配置即可完成 TLS + WebSocket 代理;Nginx 需要额外配置 proxy_read_timeout 和 WebSocket 升级头。
安全加固的核心是:密码认证 + loopback 绑定 + 受信任代理 + 防火墙。
如果不需要公网访问,Tailscale --bind tailnet 是最安全简单的替代方案。