课程大纲
部署运维、性能优化与成本控制
适用版本: OpenClaw v2026.4.11(stable) 验证日期: 2026-04-13 目标读者: 想让 OpenClaw 长期稳定运行、可更新、可回滚、省钱 难度: ⭐⭐⭐⭐ 高级 / 运维向 适合首次阅读: 否——建议先完成前 9 篇并跑稳至少一周
目标
把 OpenClaw 从「能跑起来」升级到「长期稳定、可更新、可回滚、可恢复」。这一篇是部署运维手册,按顺序执行即可。
前置条件
- 已完成第 1-9 篇,尤其是第 9 篇《安全最佳实践(重磅章节)》的安全基线
- workspace 稳定跑过至少一周
- 有 Docker 和 cron 的基本认知
部署选择决策树
先回答这几个问题:
text你有闲置的 Mac mini / Mini PC 吗? ├── 有 → 本地部署(launchd / systemd) └── 没有 ↓ 个人使用还是团队? ├── 个人 → VPS 原生部署(最简单) └── 团队 / 需要隔离 ↓ 需要可观测性和弹性? ├── 不需要 → Docker Compose on VPS └── 需要 → Docker Compose + 监控栈
| 部署方式 | 适合谁 | 月成本参考 |
|---|---|---|
| 本地 Mac / Mini PC | 有闲置硬件的个人 | 电费 ¥10-30/月 |
| VPS 原生 | 个人,不想管 Docker | ¥50-200/月 |
| Docker Compose | 小团队,需要隔离和一键部署 | ¥100-500/月 |
| K8s / 云托管 | 企业高并发 | ¥700+/月 |
90% 的个人用户选 VPS 原生或本地部署就够了。 Docker Compose 适合需要隔离和标准化的团队。K8s 只在企业级才需要。
一、版本策略(所有部署方式通用)
📖 无论你选哪种部署方式,先理解版本管理。
OpenClaw 使用日期版本号(如 v2026.4.11),分三个通道:
| 通道 | 行为 | 适用场景 |
|---|---|---|
| stable | 延迟推送,有 jitter 分散 | ✅ 生产环境 |
| beta | 每小时检查更新 | 测试环境 |
| dev | 手动 openclaw update | 开发者 |
生产部署一律 pin 精确版本
bash# ❌ 快速体验可以,生产不行 npm install -g openclaw@latest # ✅ 生产部署:pin 到你验证过的版本 # ⚠️ 请替换:换成你实际验证通过的版本号 npm install -g [email protected]
Docker 部署同理:
yaml# ❌ 不要用 latest image: openclaw/openclaw:latest # ✅ pin 精确版本 # ⚠️ 请替换:换成你验证过的版本 image: openclaw/openclaw:2026.4.11
升级前自动备份
bash# 开启升级前自动备份(OpenClaw 原生支持) openclaw config set update.backupBeforeUpdate true
二、原生部署(最简单)
Linux(systemd user unit)
bash# 创建 systemd user unit mkdir -p ~/.config/systemd/user cat > ~/.config/systemd/user/openclaw.service << 'EOF' [Unit] Description=OpenClaw Gateway After=network.target [Service] ExecStart=/usr/bin/env openclaw gateway Restart=on-failure RestartSec=5 Environment=NODE_ENV=production [Install] WantedBy=default.target EOF systemctl --user daemon-reload systemctl --user enable --now openclaw systemctl --user status openclaw
macOS(launchd)
OpenClaw 的 onboard --install-daemon 已经自动创建了 launchd plist。确认运行中:
bashopenclaw daemon status
三、Docker Compose 部署
📖 以下模板经过生产验证,但必须替换标注的字段才能使用。
准备 secrets 目录
bashmkdir -p openclaw-prod/{config,secrets} cd openclaw-prod chmod 700 secrets # ⚠️ 请替换:每个文件写入你的真实值 echo -n 'sk-ant-xxx' > secrets/anthropic_api_key.txt echo -n 'your-telegram-bot-token' > secrets/telegram_bot_token.txt chmod 600 secrets/*.txt
docker-compose.yml
yamlname: openclaw-prod services: openclaw: # ⚠️ 请替换:pin 到你验证过的版本 image: openclaw/openclaw:2026.4.11 container_name: openclaw restart: unless-stopped user: "1000:1000" read_only: true tmpfs: - /tmp:size=100M,mode=1777 cap_drop: - ALL security_opt: - no-new-privileges:true deploy: resources: limits: cpus: '2.0' memory: 2G volumes: - workspace:/home/openclaw/.openclaw/workspace:rw - ./config/openclaw.json:/home/openclaw/.openclaw/openclaw.json:ro secrets: - anthropic_api_key - telegram_bot_token environment: - ANTHROPIC_API_KEY_FILE=/run/secrets/anthropic_api_key - TELEGRAM_BOT_TOKEN_FILE=/run/secrets/telegram_bot_token # ⚠️ 请替换:换成你的时区 - OPENCLAW_TZ=Asia/Shanghai ports: - "127.0.0.1:18789:18789" # 仅 loopback healthcheck: test: ["CMD", "openclaw", "daemon", "status", "--quiet"] interval: 30s timeout: 10s retries: 3 logging: driver: "json-file" options: max-size: "10m" max-file: "5" volumes: workspace: secrets: anthropic_api_key: file: ./secrets/anthropic_api_key.txt telegram_bot_token: file: ./secrets/telegram_bot_token.txt
💡 为什么用
secrets:+_FILE而不是environment:直接传值: 后者会把明文 Key 留在docker inspect输出、容器环境变量以及 Agent 上下文中。前者从文件读取,只有容器内的 OpenClaw 进程看得到。即使 Agent 会话历史被导出,明文 Key 也不会出现在其中。这是凭证注入模式(Credential Passthrough)的生产级做法,详见第 9 篇《安全最佳实践(重磅章节)》。
启动并验证
bashdocker compose up -d docker compose logs -f openclaw # 确认看到 "Gateway listening on 127.0.0.1:18789"
上面是最小可用模板。如需 Tailscale 远程访问或 LiteLLM 缓存代理,按需添加对应 service。
四、回滚、备份与恢复(核心主线)
📖 这是运维最重要的部分。 部署和性能都可以慢慢调,但没有回滚和备份能力的系统不算生产就绪。
回滚流程
原生部署回滚:
bash# 查看当前版本 openclaw --version # 回滚到上一个已知好版本 # ⚠️ 请替换:换成你要回滚的目标版本 npm install -g [email protected] openclaw daemon restart openclaw doctor # 自动迁移配置 schema
Docker 回滚:
bash# 改 docker-compose.yml 的 image tag # image: openclaw/openclaw:2026.4.9 docker compose up -d docker compose logs -f openclaw
备份策略
分层备份,优先级从高到低:
| 层级 | 内容 | 频率 | 方式 |
|---|---|---|---|
| L1 核心人格 | SOUL.md / IDENTITY.md / USER.md | 每次改动后 | Git commit |
| L2 长效记忆 | MEMORY.md / AGENTS.md / HEARTBEAT.md | 每周 | Git commit |
| L3 日志 | memory/*.md / sessions/ | 每天 | tar + 远程存储 |
| L4 配置 | openclaw.json / credentials/ | 每次改动后 | Git commit(脱敏) |
自动备份脚本
bash#!/bin/bash # ⚠️ 请替换:BACKUP_DIR 和远程存储路径换成你的实际值 BACKUP_DIR="/backup/openclaw/$(date +%Y-%m-%d)" mkdir -p "$BACKUP_DIR" # L1 + L2:核心文件 tar -czf "$BACKUP_DIR/workspace-core.tar.gz" \ -C ~/.openclaw workspace/SOUL.md workspace/IDENTITY.md \ workspace/USER.md workspace/MEMORY.md workspace/AGENTS.md # L3:日志和会话 tar -czf "$BACKUP_DIR/workspace-logs.tar.gz" \ -C ~/.openclaw workspace/memory/ # L4:配置(不含凭证) cp ~/.openclaw/openclaw.json "$BACKUP_DIR/" # 生成校验和 cd "$BACKUP_DIR" && sha256sum * > SHA256SUMS # 清理 30 天前的备份 find /backup/openclaw -mindepth 1 -maxdepth 1 -mtime +30 -exec rm -rf {} \;
把这个脚本注册为每日 cron:
bash# ⚠️ 请替换:脚本路径换成你的实际存放位置 echo "0 4 * * * /path/to/backup.sh" | crontab -
恢复演练
每月至少做一次恢复演练:
bash# 1. 在临时目录解压最近的备份 mkdir -p /tmp/openclaw-restore-test tar -xzf /backup/openclaw/$(date +%Y-%m-%d)/workspace-core.tar.gz -C /tmp/openclaw-restore-test/ # 2. 校验文件完整性 cd /backup/openclaw/$(date +%Y-%m-%d) sha256sum -c SHA256SUMS # 3. 对比当前 workspace 和备份 diff ~/.openclaw/workspace/SOUL.md /tmp/openclaw-restore-test/workspace/SOUL.md # 4. 清理测试目录 rm -rf /tmp/openclaw-restore-test
💡 建议: 没演练过的备份等于没有备份。每月 1 号花 10 分钟跑一次恢复验证。
五、性能优化与成本控制
性能调优杠杆
| 杠杆 | 操作 | 效果 |
|---|---|---|
| 模型选择 | 简单任务用快模型(Sonnet),复杂任务用强模型(Opus) | 延迟降 2-3x |
| Profile 精简 | cron 任务用 lean profile 启动 | 启动 token 减 50%+ |
| 技能控制 | 保持 20 个以内活跃技能 | 触发准确率提升 |
| 上下文管理 | MEMORY.md 控制在 150 行以内 | 每轮 token 消耗可控 |
| Cron stagger | 多任务错峰执行 | 避免 API 429 |
| 日志归档 | 30 天以上的 daily log 归档 | 磁盘释放 |
成本控制
- 模型分级路由: 日常用 Sonnet,深度推理用 Opus,兜底用 DeepSeek——通过
agents.defaults.model.fallbacks配置 - Key 轮转: 多个 API Key 自动轮转,避免单 Key 限流
- 嵌入免费化: 语义索引用硅基流动的免费 bge-m3 模型
- 用量追踪: 每周看一次 cron 任务的 token 消耗,优化最贵的 2-3 个任务
💡 让 OpenClaw 帮你做运维配置(点击展开,复制发给 Bot)
text帮我检查和优化 OpenClaw 的运维配置。按步骤来,每步确认后再进下一步: [第 1 步:部署状态检查] 检查并报告: - openclaw --version(当前版本) - openclaw daemon status(运行状态) - 部署方式(原生 / Docker / systemd) - Gateway 绑定地址(是否 127.0.0.1) [第 2 步:版本策略] 检查当前是否 pin 了精确版本(而非 latest)。 如果没有,告诉我当前版本号,建议 pin 住。 检查 update.backupBeforeUpdate 是否开启。 [第 3 步:备份状态] 检查是否有定期备份(crontab 中是否有备份脚本)。 如果没有,根据我的部署方式生成备份脚本,展示给我确认。 [第 4 步:性能概览] - MEMORY.md 行数(超 200 需要清理) - 活跃技能数量(超 20 建议裁剪) - 最近 7 天 cron 任务的总 token 消耗(如果有 usage tracking) [第 5 步:生成优化建议] 基于检查结果给我 3-5 条具体 action item,每条标注优先级。 不要修改任何文件,只报告。 每步等我确认。
验证清单
bash# 1. 版本已 pin openclaw --version # 确认不是 "latest" 而是精确版本号 # 2. Gateway 绑定正确 ss -tlnp | grep 18789 # 应显示 127.0.0.1:18789 # 3. 备份存在且可恢复 ls /backup/openclaw/$(date +%Y-%m-%d)/ sha256sum -c /backup/openclaw/$(date +%Y-%m-%d)/SHA256SUMS # 4. Docker healthcheck 正常(如果用 Docker) docker inspect openclaw --format='{{.State.Health.Status}}' # 应显示 healthy # 5. 升级前备份已开启 openclaw config get update.backupBeforeUpdate # 应显示 true
常见问题
Q: openclaw.json 和 openclaw.yaml 是什么关系?
openclaw.json(JSON5 格式)是 OpenClaw 的主配置文件。部分第三方教程提到 openclaw.yaml,那是早期版本或社区工具的配置格式,当前 OpenClaw 官方只读 openclaw.json。迁移时注意区分。
Q: daemon 和 gateway 是同一个东西吗?
是的。openclaw daemon 和 openclaw gateway 命令操作的是同一个进程——Gateway 守护进程。daemon 是 CLI 管理命令(start/stop/status),gateway 是直接前台启动。生产环境用 daemon(配合 systemd/launchd),调试用 gateway。
Q: Docker 部署和原生部署怎么选?
个人用原生更简单。Docker 的价值在于:隔离性(沙箱天然强)、标准化(docker-compose.yml 一份走天下)、回滚方便(改 image tag 就行)。团队多人协作建议 Docker。
Q: 升级失败了怎么回滚?
如果开了 update.backupBeforeUpdate,OpenClaw 会自动保存升级前的状态。手动回滚:npm install -g openclaw@旧版本号 → openclaw doctor → openclaw daemon restart。Docker 更简单:改 image tag 重启。
Q: 备份需要备份 sessions/ 吗?
看你需不需要保留完整对话历史。sessions/ 文件大且增长快,如果只做灾备恢复(恢复 Agent 人格和记忆),备份 workspace 核心文件就够了。
下一步
部署和运维就绪了。接下来去第 11 篇《实战案例与完整工作流》,看看其他人怎么用 OpenClaw 解决真实问题。