课程大纲
课程大纲系列主页
学习进度已完成 0/12

部署运维、性能优化与成本控制

高级进行中

适用版本: OpenClaw v2026.4.11(stable) 验证日期: 2026-04-13 目标读者: 想让 OpenClaw 长期稳定运行、可更新、可回滚、省钱 难度: ⭐⭐⭐⭐ 高级 / 运维向 适合首次阅读: 否——建议先完成前 9 篇并跑稳至少一周

目标

把 OpenClaw 从「能跑起来」升级到「长期稳定、可更新、可回滚、可恢复」。这一篇是部署运维手册,按顺序执行即可。

前置条件

部署选择决策树

先回答这几个问题:

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。确认运行中:

bash
openclaw daemon status

三、Docker Compose 部署

📖 以下模板经过生产验证,但必须替换标注的字段才能使用。

准备 secrets 目录

bash
mkdir -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

yaml
name: 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 篇《安全最佳实践(重磅章节)》

启动并验证

bash
docker 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 daemonopenclaw 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 doctoropenclaw daemon restart。Docker 更简单:改 image tag 重启。

Q: 备份需要备份 sessions/ 吗?

看你需不需要保留完整对话历史。sessions/ 文件大且增长快,如果只做灾备恢复(恢复 Agent 人格和记忆),备份 workspace 核心文件就够了。


下一步

部署和运维就绪了。接下来去第 11 篇《实战案例与完整工作流》,看看其他人怎么用 OpenClaw 解决真实问题。

部署运维、性能优化与成本控制 | 资讯狗 | Zixungou