2026年 OpenClaw 在云端 Docker 与 Tailscale 零公网暴露部署示意

在公有云或托管机上跑 OpenClaw Gateway,常见诉求是:MCP / Streamable HTTP 只出现在 tailnet,主机与云安全组不开放公网监听。最稳的组合是 Docker Compose 里用官方 Tailscale 镜像做侧车:侧车负责 tailscale up 与状态目录持久化,Gateway 容器只连 tailscale0 或仅绑定 127.0.0.1 再由侧车转发。具体镜像名、端口与健康检查以你锁定的 OpenClaw 版本为准;下面给的是网络与鉴权分层的可复现顺序,便于写进 Runbook。与「云上/远程 Mac 上怎么常驻」相关的路径对照,可并行阅读 了解更多:2026 OpenClaw 远程 Mac 部署实操

一、Compose 侧车:别让 ports: 0.0.0.0 偷开公网面

侧车与 Gateway 放在同一 Docker network,卷挂载各自的状态目录,避免两个容器抢同一 /var/lib/tailscale。常见坑是顺手写了 ports: "443:443" 或把 Gateway 绑到 0.0.0.0——云厂商安全组再严,也会在数据面多出一个公网入口。正确姿势:Gateway 只监听 bridge 内地址或 127.0.0.1,由 tailnet 内客户端或 MagicDNS 访问;需要 TLS 终止时,用仅 tailnet 可达的反代容器,而不是对公网 publish。HTTP 传输层与工具超时对齐,可对照 了解更多:OpenClaw MCP stdio 与 Streamable HTTP 超时排错

口诀:先确认 docker ps 里没有意外映射到宿主公网,再谈 ACL 与证书。

二、Gateway 绑 tailnet:HTTPS 与 Token 两层都要

侧车 up 成功后,用 tailscale cert 或内网 Caddy 自动申请仅 tailnet 信任链的证书,避免自签证书在客户端被静默拒绝。Token 应走环境变量注入或 Docker secret 文件挂载,不要写进镜像层;若前面还有反代,统一在反代校验 Authorization: Bearer,Gateway 再做第二道,避免「只信一层」被绕过。轮换 Token 后记得滚动重启,否则旧进程仍缓存旧值。团队评审时把「谁持有 auth key、谁可改 ACL」写进职责表,和轮换 API Key 同一套流程即可。

三、Serve 与 Funnel:合规边界别混用

tailscale serve 典型面向 tailnet 内访问;funnel 会把服务暴露到公网路径。若制度要求零公网暴露,应在策略上默认禁用 Funnel,并在审计里检查是否有人为调试打开。Serve 模式下还要注意主机名与路径前缀是否与 Gateway 的 base path 一致,否则客户端会表现为「偶发 404 / 重定向环」。

四、连接失败:按固定顺序减变量

1)在侧车容器执行 tailscale status,确认已加入正确 tailnet、无 NeedsLogin2)从另一台 tailnet 成员 ping 100.x.x.xcurl -v https://机器名,排除 ACL 拒绝。3)对 Gateway 直连 curlAuthorization,区分 TLS 问题与 401。4)若仅 Streamable HTTP 失败而 stdio 正常,回到超时与路径层。刻意复现:临时收紧 ACL 再放开,确认观测与回滚都记录在案。

  • 侧车重启后是否丢失状态卷导致重新登录?
  • 是否混用了宿主 tailscaled 与容器侧车双栈?
  • 云厂商元数据服务是否被误配进「仅内网」路由?

尾段:网关在 Linux,重活仍可落在 Mac mini

Gateway 放在云端小实例上很省成本,但 iOS 构建、签名与图形化排障仍需要 macOS。把控制面放在 tailnet 内的 Linux 容器、把重负载丢给独占 Mac mini,能同时吃到 Apple Silicon 的内存带宽与 macOS 原生工具链;机器侧 静音与约 4W 级待机功耗适合长期在线,Gatekeeper、SIP、FileVault 也降低无人值守面风险。若你要把本文方案接到云上独享 MacMac mini M4 仍是 2026 年高性价比起点——前往 Macstripe 首页 查看机型与区域。