【OpenClaw -03】OpenClaw 生产环境部署实战:从 Daemon 化到多节点高可用架构
生产环境部署 OpenClaw 不是简单的 npm install 就能了事。当 Gateway 需要从"本地玩具"进化为"7×24 小时在线的生产力中枢",我们必须解决守护进程化、多设备协同、远程安全访问以及状态持久化等一系列工程化问题。本文基于 OpenClaw 官方文档与真实生产环境验证,拆解从单节点 Daemon 到多节点集群的完整部署路径。
OpenClaw 生产环境部署实战:从 Daemon 化到多节点高可用架构
标签: OpenClaw AI Agent Systemd Tailscale 分布式架构
> 摘要 生产环境部署 OpenClaw 不是简单的 npm install 就能了事。当 Gateway 需要从"本地玩具"进化为"7×24 小时在线的生产力中枢",我们必须解决守护进程化、多设备协同、远程安全访问以及状态持久化等一系列工程化问题。本文基于 OpenClaw 官方文档与真实生产环境验证,拆解从单节点 Daemon 到多节点集群的完整部署路径。
一、Daemon 模式:让 Gateway 脱离终端存活
OpenClaw 默认以前台进程方式运行 openclaw gateway start,这对于生产环境而言显然不够。一旦 SSH 会话断开或服务器重启,Gateway 随之消失。正确的做法是通过系统级服务管理实现守护进程化。
1.1 Systemd 服务化方案(Linux)
官方并未提供开箱即用的 systemd unit 文件,但社区验证的标准配置如下。创建 /etc/systemd/system/openclaw-gateway.service:
[Unit]
Description=OpenClaw AI Gateway
After=network.target
[Service]
Type=simple
User=openclaw
WorkingDirectory=/home/openclaw
ExecStart=/usr/local/bin/openclaw gateway start
ExecStop=/usr/local/bin/openclaw gateway stop
ExecReload=/usr/local/bin/openclaw gateway restart
Restart=always
RestartSec=10
Environment=NODE_ENV=production
Environment=OPENCLAW_GATEWAY_TOKEN=${OPENCLAW_GATEWAY_TOKEN}
[Install]
WantedBy=multi-user.target
关键参数解析:
- User=openclaw:严禁以 root 身份运行 Gateway。建议创建独立用户,限制其仅对 ~/.openclaw 目录有写权限
- Restart=always:Gateway 崩溃或进程被杀时自动拉起,确保服务高可用
- Environment:通过环境变量注入敏感配置(如 Token),避免硬编码在配置文件中
启用并启动服务:
sudo systemctl daemon-reload
sudo systemctl enable openclaw-gateway
sudo systemctl start openclaw-gateway
# 查看状态
systemctl --user status openclaw-gateway
journalctl -u openclaw-gateway -f
对于 headless 服务器(如云服务器),必须启用 user lingering,确保无登录会话时服务仍持续运行:
sudo loginctl enable-linger $USER
1.2 macOS LaunchDaemon 方案
在 macOS 服务器或 Mac mini 常驻场景下,使用 launchd 管理更为合适。创建 /Library/LaunchDaemons/com.openclaw.gateway.plist:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.openclaw.gateway</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/bin/openclaw</string>
<string>gateway</string>
<string>start</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
<key>StandardOutPath</key>
<string>/var/log/openclaw/gateway.log</string>
<key>StandardErrorPath</key>
<string>/var/log/openclaw/gateway.error</string>
</dict>
</plist>
加载服务:
sudo launchctl load /Library/LaunchDaemons/com.openclaw.gateway.plist
sudo launchctl start com.openclaw.gateway
与 Nodes 的角色分工
OpenClaw 的架构并非简单的"服务端-客户端"模型,而是"中央网关 + 外围执行节点"的星型拓扑。理解这一层关系,是构建生产级集群的前提。
2.1 架构角色定义
┌─────────────────────────────────────────────────────────────┐
│ OpenClaw 网络拓扑 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────┐ WebSocket (18789) │
│ │ Gateway │◄──────────────────────────────────┐ │
│ │ (中央调度) │ │ │
│ │ │ ┌──────────────────┐ │ │
│ │ • 消息路由 │◄────────┤ Control Client │ │ │
│ │ • 会话管理 │ (macOS App / CLI / Web) │ │ │
│ │ • LLM 请求代理 │ └──────────────────┘ │ │
│ │ • 任务队列 │ │ │
│ └────────┬────────┘ │ │
│ │ │ │
│ │ WebSocket (role: node) │ │
│ ├─────────────────────────────────────────┐ │ │
│ │ │ │ │
│ ▼ ▼ │ │
│ ┌─────────────────┐ ┌──────────────────┐ ┌────────┴─┐│
│ │ iOS Node │ │ Android Node │ │ Headless ││
│ │ (相机/定位) │ │ (通知/传感器) │ │ Node ││
│ └─────────────────┘ └──────────────────┘ │(Linux/ ││
│ │ 无界面) ││
│ └──────────┘│
└─────────────────────────────────────────────────────────────┘
Gateway(网关):唯一需要暴露的服务端组件,负责维护与所有通讯渠道(Telegram、WhatsApp、Slack 等)的长连接,管理会话状态,调度 LLM 请求。一个生产环境通常只部署一个 Gateway 实例。
Nodes(节点):外围执行单元,通过 WebSocket 连接到 Gateway,声明 role: node。它们可以是:
- iOS/Android 节点:提供相机、定位、通知推送等移动端能力
- macOS 节点:提供屏幕录制、浏览器自动化、本地文件操作
- Headless Nodes:无图形界面的 Linux/Windows 服务器,提供 Shell 执行、容器管理、后台计算能力
2.2 设备配机制(Pairing)
不同于传统 API 的 Token 校验,OpenClaw 采用显式设备配对模型,这是其安全设计的核心。
当新 Node 首次连接 Gateway 时,流程如下:
Node 首次连接 Gateway
│
▼
Gateway 创建设备配对请求 (role: node)
│
├─── 存储至 ~/.openclaw/devices/pending.json
│
▼
管理员执行:openclaw devices list
(查看 Pending 请求)
│
▼
管理员执行:openclaw devices approve <requestId>
│
▼
Node 获得长期 Token,写入 ~/.openclaw/devices/paired.json
│
▼
Node 重连,携带 Token,正式加入集群
生产环境操作建议:
- 对于 headless 节点,使用 Telegram Bot 进行远程配对。在 Telegram 中向 Bot 发送 /pair 获取 setup code,手机 App 扫码或粘贴后,在 Telegram 中执行 /pair approve 完成授权
- 定期审查已配对设备:openclaw devices list 可查看所有已配对节点及其最后活动时间
- Token 轮换:如需撤销某节点权限,删除 paired.json 中对应条目,该节点将立即断开且无法重连
2.3 节点能力编排
节点并非简单的"受控端",而是具备特定能力(Capabilities)的执行单元。Gateway 根据任务类型智能路由:
| 节点类型 | 暴露能力 | 典型任务场景 |
|---|---|---|
| iOS Node | camera.*, location.get, notifications.* |
现场拍照上传、地理位置标记、推送通知 |
| macOS Node | canvas.*, screen.record, system.* |
浏览器自动化、屏幕录制、GUI 操作 |
| Headless Node | system.run, docker.*, fs.* |
服务器命令执行、容器编排、批量文件处理 |
在 Gateway 配置中,可为特定任务绑定默认执行节点:
{
"tools": {
"exec": {
"node": "headless-worker-01"
}
}
}
三、远程访问安全:Tailscale 零信任网络
生产环境最常见的部署模式是:Gateway 跑在云服务器(VPS)或家中 Mac Mini 上,管理员通过手机、笔记本远程操控。直接暴露 18789 端口到公网是灾难性的,OpenClaw 官方推荐通过 Tailscale 构建零信任访问层。
3.1 安全模型对比
| 方案 | 安全性 | 复杂度 | 适用场景 |
|---|---|---|---|
| 公网暴露 + 密码 | 低 | 低 | 严禁生产使用 |
| SSH 隧道 | 中 | 中 | 临时调试 |
| Tailscale Serve | 高 | 低 | 推荐方案:Gateway 保持 loopback,仅 Tailnet 内访问 |
| Tailscale Funnel | 中 | 低 | 需要公网访问时(需强制密码认证) |
此方案下,Gateway 始终绑定 127.0.0.1:18789,不直接暴露任何公网端口,通过 Tailscale 的反向代理安全接入。
配置 ~/.openclaw/openclaw.json:
{
"gateway": {
"port": 18789,
"bind": "loopback",
"tailscale": {
"mode": "serve",
"resetOnExit": true
},
"auth": {
"mode": "token",
"token": "${OPENCLAW_GATEWAY_TOKEN}"
}
}
}
工作流程:
- Gateway 启动时,自动执行 tailscale serve --https=443 http://127.0.0.1:18789
- 管理员在笔记本上连接 Tailscale,通过 https://gateway-host.tailnet-name.ts.net 访问 Web UI
- 流量全程经过 WireGuard 加密,且仅 Tailnet 内设备可达
- 当 Gateway 停止时,resetOnExit: true 自动清理 Tailscale serve 配置
3.3 多设备远程 CLI 访问
对于习惯命令行的管理员,可通过 SSH 隧道或直接 Tailscale IP 访问 Gateway WebSocket:
方案 A:SSH 隧道(无需修改 Gateway 配置)
# 本地建立隧道
ssh -L 18789:localhost:18789 user@gateway-host
# 本地 CLI 直接连接 localhost:18789
openclaw tui --url ws://localhost:18789 --token <token>
方案 B:直接 Tailscale IP(需调整绑定地址)
若 Gateway 配置为 bind: “tailnet”,则直接监听 Tailscale 网卡 IP:
openclaw config set gateway.bind tailnet
openclaw gateway restart
# 客户端通过 Tailscale IP 连接
openclaw tui --url ws://100.x.x.x:18789 --token <token>
注意:bind: tailnet 模式下,本地 127.0.0.1:18789 将不再可用,需确保所有本地客户端也使用 Tailscale IP 连接。
3.4 访问控制加固
在 Tailscale ACL 中精确控制 Gateway 访问权限:
{
"acls": [
{
"action": "accept",
"src": ["tag:openclaw-admin"],
"dst": ["tag:openclaw-gateway:18789"]
}
],
"tagOwners": {
"tag:openclaw-gateway": ["autogroup:admin"],
"tag:openclaw-admin": ["autogroup:admin"]
}
}
此配置确保只有标记为 openclaw-admin 的设备能访问 Gateway 的 18789 端口,即使 Tailnet 内有其他设备也无法触及。
四、状态持久化与存储管理
OpenClaw 将所有状态默认存储于 ~/.openclaw/ 目录,生产环境必须理解其结构并实施备份策略。
4.1 目录结构详解
~/.openclaw/
├── openclaw.json # 主配置文件(热重载)
├── agents/
│ ├── default/
│ │ ├── sessions/ # 会话历史(JSON 格式)
│ │ ├── memory/ # 向量记忆(sqlite-vec)
│ │ └── workspace/ # 代理工作目录
│ └── work/ # 多代理配置
├── devices/
│ ├── pending.json # 待审批设备(短期有效)
│ └── paired.json # 已配对设备 + Token(敏感)
├── credentials/
│ ├── telegram-pairing.json
│ └── openai-api-keys.json
├── nodes/ # 旧版节点配对(已弃用,但仍可能残留)
├── logs/
│ └── gateway.log
└── skills/ # 安装的插件/技能
关键文件说明:
- sessions/:包含所有对话历史,采用分层存储。生产环境建议定期归档旧会话以避免磁盘膨胀
- devices/paired.json:包含节点访问 Token,应视为机密文件,权限建议设为 600
- memory/:使用 sqlite-vec 存储向量记忆,配合 FTS5 实现混合检索。大容量场景下可考虑挂载到独立 SSD
4.2 会话存储配置
在多代理场景下,可通过 CLI 指定会话存储作用域:
# 查看特定代理的会话
openclaw sessions --agent work
# 查看所有代理的活跃会话(最近 120 分钟)
openclaw sessions --all-agents --active 120 --json
对于需要高可用性的部署,建议将 ~/.openclaw 目录挂载到:
- NFS/SMB:多 Gateway 实例共享状态(需注意文件锁竞争)
- 云盘同步(rclone/rsync):定期备份到对象存储
- Docker Volume:容器化部署时映射到宿主机持久卷
4.3 配置热重载与版本管理
OpenClaw Gateway 支持配置热重载,修改 openclaw.json 后无需重启服务即可生效。但生产环境建议:
- 版本控制:将 openclaw.json 纳入 Git 管理,变更前创建分支
- 验证配置:使用 openclaw doctor --fix 在应用前检查配置合法性
- 回滚机制:热重载失败时,Gateway 会拒绝非法配置并保持原配置运行,通过日志排查问题
五、日志管理与可观测性
生产环境必须建立完善的日志收集与监控体系,OpenClaw 提供了原生日志工具,也可对接外部系统。
5.1 原生日志命令
# 实时追踪日志(类似 tail -f)
openclaw logs --follow
# 结构化 JSON 输出(便于 ELK/Loki 收集)
openclaw logs --json --since 1h
# 仅查看错误级别
openclaw logs --level error --follow
日志轮转配置:
对于 systemd 部署,建议配置 journald 或 logrotate 避免日志占满磁盘:
# /etc/logrotate.d/openclaw
/var/log/openclaw/*.log {
daily
rotate 7
compress
missingok
notifempty
create 0600 openclaw openclaw
}
5.2 健康检查与监控
Gateway 暴露 HTTP 健康端点,可用于负载均衡或监控探针:
curl -H "Authorization: Bearer <token>" http://localhost:18789/health
生产环境建议配置:
- 进程监控:通过 systemctl status openclaw-gateway 或 pm2 monit 监控进程存活
- 端口监控:检测 18789 端口是否可连接
- 业务监控:定期执行 openclaw doctor 检查配置健康度,异常时触发告警
5.3 多节点状态监控
查看整个集群的节点在线状态:
# 查看所有已配对节点及其连接状态
openclaw nodes status
# 查看特定节点详细信息(能力、权限、最后心跳)
openclaw nodes describe --node "Living Room iPad"
# 测试节点连通性
openclaw nodes run --node "headless-worker-01" --raw "uname -a"
六、生产部署 checklist
基于以上内容,整理生产环境部署的核查清单:
| 检查项 | 命令/配置 | 风险等级 |
|---|---|---|
| 非 root 运行 | User=openclaw in systemd |
高 |
| Token 环境变量注入 | Environment=OPENCLAW_GATEWAY_TOKEN=... |
高 |
| Loopback 绑定 | "bind": "loopback" + Tailscale |
高 |
| 设备配对审批 | 定期执行 openclaw devices list |
中 |
| 状态目录备份 | 定时 rsync ~/.openclaw |
中 |
| 日志轮转 | logrotate 配置 | 低 |
| Session 作用域 | "dmScope": "per-channel-peer" 防信息泄露 |
高 |
| 自动重启策略 | Restart=always |
中 |
结语
OpenClaw 的生产化部署并非简单的安装配置,而是从"个人工具"到"基础设施"的思维转变。通过 Systemd/LaunchDaemon 实现进程守护,利用 Tailscale 构建零信任网络,借助显式设备配对确保多节点安全接入,再配合完善的状态持久化与日志管理,才能构建真正可靠的 7×24 小时 AI 代理中枢。
随着 OpenClaw 生态的持续演进,未来还将面临集群化 Gateway、多活灾备、跨云节点调度等更复杂的架构挑战。建议持续关注官方文档中关于 Cluster Coordination 与 Zero-Trust Security 的更新,提前为架构升级做好准备。
更多推荐





所有评论(0)