Skip to Content

25a - 高可用部署

本文是《AI Agent 实战手册》第 25 章第 1 节。 上一节:24e-社区插件生态 | 下一节:25b-监控与告警

概述

OpenClaw 作为 24/7 运行的自主 AI Agent 平台,其生产部署的可靠性直接决定了 Agent 能否持续为你工作。截至 2026 年 2 月,OpenClaw 已拥有 186,000+ GitHub Stars,是增长最快的开源 AI Agent 项目之一。然而,CVE-2026-25253 远程代码执行漏洞的爆发和超过 42,000 个暴露实例的发现,让社区深刻认识到:部署不等于上线,安全的高可用部署才是生产就绪的前提

本节提供从单节点 Docker Compose 到多节点 Kubernetes 的完整高可用部署指南,包含经过生产验证的配置文件、反向代理与 TLS 设置、数据持久化策略和自动恢复机制。


1. 部署架构选型

单节点 vs 多节点

OpenClaw 的核心设计是单实例 Gateway + 多 Agent 会话模式。Gateway 进程负责协调所有 Agent 会话、消息路由和工具调用,而每个 Agent 会话可以独立运行在隔离的容器或进程中。

这意味着:

  • Gateway 本身不支持水平扩展——同一时间只能有一个 Gateway 实例
  • 高可用的重点是快速故障恢复(秒级重启)而非多副本负载均衡
  • 多节点部署的价值在于隔离性、资源管理和运维标准化,而非传统意义的 HA 集群

架构对比表

维度Docker Compose 单节点Kubernetes 多节点
适用场景个人/小团队、1-3 个 Agent团队/企业、多 Agent 集群
硬件需求2 vCPU / 4 GB RAM VPS3+ 节点 K8s 集群
部署复杂度⭐⭐ 低⭐⭐⭐⭐ 高
故障恢复Docker restart policy(秒级)Pod 自动重调度(秒级)
数据持久化本地 Volume 挂载PVC + StorageClass
TLS 终结Caddy/Nginx 反向代理Ingress Controller
成本(月)$4-12(Hetzner/DO VPS)$30-100+(托管 K8s)
运维开销低,手动更新中高,需 K8s 运维经验
隔离性容器级隔离Pod 级 + 网络策略隔离
监控集成手动配置原生 Prometheus/Grafana
推荐指数⭐⭐⭐⭐⭐ 大多数场景首选⭐⭐⭐ 已有 K8s 基础设施时

VPS 供应商推荐

供应商最低配置月费特点推荐场景
HetznerCX22(2 vCPU/4 GB)€3.49 起性价比极高,欧洲数据中心个人项目首选
DigitalOceanBasic Droplet(2 vCPU/4 GB)$6 起简单易用,全球节点快速上手
VultrCloud Compute(2 vCPU/4 GB)$12 起全球 32 个数据中心低延迟需求
ContaboVPS S(4 vCPU/8 GB)€5.99 起超大内存配置多 Agent 场景
RailwayPro Plan$5 起 + 用量一键部署,自动扩缩零运维需求

💡 推荐配置:2 vCPU / 4 GB RAM / 40 GB SSD 是运行单个 OpenClaw 实例的最低生产配置。如果运行多个 Agent 会话或启用浏览器自动化,建议升级到 4 vCPU / 8 GB RAM。


2. Docker Compose 单节点部署

完整 docker-compose.yml

以下是经过生产验证的安全加固版 Docker Compose 配置:

# docker-compose.yml — OpenClaw 生产部署(安全加固版) # 适用于:Hetzner / DigitalOcean / Vultr 等 VPS # 最低配置:2 vCPU / 4 GB RAM / Ubuntu 24.04 version: '3.8' services: # ============================================ # OpenClaw Gateway — 核心服务 # ============================================ openclaw-gateway: image: openclaw/openclaw:latest # 生产环境建议锁定版本号 container_name: openclaw-gateway restart: unless-stopped # --- 安全加固 --- user: "1000:1000" # 非 root 运行 cap_drop: - ALL # 移除所有 Linux capabilities security_opt: - no-new-privileges:true # 禁止提权 # --- 网络 --- ports: - "127.0.0.1:18789:18789" # ⚠️ 仅绑定 localhost,绝不暴露到公网 networks: - openclaw-net # --- 数据持久化 --- volumes: - ./data/config:/home/node/.openclaw/config:rw - ./data/workspace:/home/node/.openclaw/workspace:rw - ./data/state:/home/node/.openclaw/state:rw - ./data/credentials:/home/node/.openclaw/credentials:rw # --- 环境变量 --- environment: - NODE_ENV=production - ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY} - OPENAI_API_KEY=${OPENAI_API_KEY:-} - OPENCLAW_GATEWAY_TOKEN=${OPENCLAW_GATEWAY_TOKEN} # Gateway 绑定模式:loopback = 仅 localhost - OPENCLAW_GATEWAY_BIND=loopback # --- 健康检查 --- healthcheck: test: ["CMD", "curl", "-sf", "http://127.0.0.1:18789/health"] interval: 30s timeout: 10s retries: 3 start_period: 15s # --- 资源限制 --- deploy: resources: limits: cpus: '2.0' memory: 3G reservations: cpus: '0.5' memory: 512M logging: driver: json-file options: max-size: "50m" max-file: "5" # ============================================ # Caddy — 反向代理 + 自动 HTTPS # ============================================ caddy: image: caddy:2-alpine container_name: openclaw-caddy restart: unless-stopped ports: - "80:80" - "443:443" - "443:443/udp" # HTTP/3 支持 volumes: - ./Caddyfile:/etc/caddy/Caddyfile:ro - caddy_data:/data - caddy_config:/config networks: - openclaw-net depends_on: openclaw-gateway: condition: service_healthy networks: openclaw-net: driver: bridge internal: false volumes: caddy_data: caddy_config:

环境配置

创建 .env 文件管理敏感配置:

# .env — OpenClaw 环境变量 # ⚠️ 此文件包含敏感信息,务必加入 .gitignore # AI 模型 API 密钥 ANTHROPIC_API_KEY=sk-ant-api03-your-key-here OPENAI_API_KEY=sk-your-openai-key-here # Gateway 认证令牌(必须设置!) # 生成方式:openssl rand -hex 32 OPENCLAW_GATEWAY_TOKEN=your-64-char-hex-token-here # 可选:消息平台令牌 DISCORD_BOT_TOKEN= TELEGRAM_BOT_TOKEN= SLACK_BOT_TOKEN=

生成安全令牌:

# 生成 Gateway 认证令牌 openssl rand -hex 32 # 写入 .env 文件 echo "OPENCLAW_GATEWAY_TOKEN=$(openssl rand -hex 32)" >> .env

目录结构

openclaw-deploy/ ├── docker-compose.yml ├── .env # 敏感配置(加入 .gitignore) ├── Caddyfile # 反向代理配置 └── data/ # 持久化数据 ├── config/ # openclaw.json 等配置 ├── workspace/ # MEMORY.md, SOUL.md, 日志 ├── state/ # 会话状态、SQLite 数据库 └── credentials/ # OAuth 令牌、设备密钥

启动与验证

# 1. 创建数据目录 mkdir -p data/{config,workspace,state,credentials} # 2. 设置目录权限(匹配容器内 user 1000:1000) chown -R 1000:1000 data/ # 3. 启动服务 docker compose up -d # 4. 检查服务状态 docker compose ps docker compose logs -f openclaw-gateway # 5. 验证健康检查 curl -s http://127.0.0.1:18789/health | jq . # 6. 验证 Gateway 认证 curl -s -H "Authorization: Bearer ${OPENCLAW_GATEWAY_TOKEN}" \ http://127.0.0.1:18789/api/status | jq . # 7. 确认端口未暴露到公网 ss -tlnp | grep 18789 # 应显示 127.0.0.1:18789,而非 0.0.0.0:18789

3. Kubernetes 多节点部署

架构图

┌─────────────────────────────────────────────────────┐ │ Kubernetes Cluster │ │ │ │ ┌──────────┐ ┌──────────────┐ ┌────────────┐ │ │ │ Ingress │───▶│ Service │───▶│ Deployment │ │ │ │Controller│ │ (ClusterIP) │ │ (1 replica)│ │ │ │ + TLS │ └──────────────┘ └─────┬──────┘ │ │ └──────────┘ │ │ │ │ │ │ ┌──────────┐ ┌──────────────┐ ┌─────▼──────┐ │ │ │ConfigMap │ │ Secret │ │ PVC │ │ │ │(配置文件)│ │ (API 密钥) │ │(工作空间) │ │ │ └──────────┘ └──────────────┘ └────────────┘ │ │ │ │ ┌──────────────────────────────────────────────────┐ │ │ │ NetworkPolicy(网络隔离) │ │ │ └──────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────┘

完整 K8s 配置文件

Namespace

# namespace.yaml apiVersion: v1 kind: Namespace metadata: name: openclaw labels: name: openclaw app.kubernetes.io/part-of: openclaw

Secret(敏感信息)

# secret.yaml apiVersion: v1 kind: Secret metadata: name: openclaw-secrets namespace: openclaw type: Opaque stringData: anthropic-api-key: "sk-ant-api03-your-key-here" openai-api-key: "sk-your-openai-key-here" gateway-token: "your-64-char-hex-token" discord-bot-token: "your-discord-token"

⚠️ 生产建议:不要将 Secret 明文提交到 Git。使用 Sealed Secrets External Secrets Operator  或 HashiCorp Vault 管理密钥。

ConfigMap(应用配置)

# configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: openclaw-config namespace: openclaw data: openclaw.json: | { "agents": { "defaults": { "workspace": "/home/openclaw/.openclaw/workspace", "model": { "primary": "anthropic/claude-sonnet-4-20250514" }, "models": { "anthropic/claude-sonnet-4-20250514": {}, "openai/gpt-4.1": {} } } }, "gateway": { "port": 18789, "bind": "0.0.0.0", "auth": { "mode": "token" }, "controlUi": { "allowInsecureAuth": false, "dangerouslyDisableDeviceAuth": false } }, "channels": { "discord": { "enabled": true } } }

💡 注意:在 K8s 环境中 Gateway 绑定 0.0.0.0 是安全的,因为 Pod 网络本身是隔离的,外部访问通过 Service + Ingress 控制。

PersistentVolumeClaim(数据持久化)

# pvc.yaml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: openclaw-workspace namespace: openclaw spec: accessModes: - ReadWriteOnce resources: requests: storage: 20Gi storageClassName: local-path # 根据集群调整:gp3、standard、longhorn 等

Deployment(核心部署)

# deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: openclaw namespace: openclaw labels: app: openclaw app.kubernetes.io/name: openclaw app.kubernetes.io/component: gateway spec: replicas: 1 # OpenClaw Gateway 设计为单实例运行 strategy: type: Recreate # 非 RollingUpdate,因为只有 1 个副本且需要独占 PVC selector: matchLabels: app: openclaw template: metadata: labels: app: openclaw spec: securityContext: runAsNonRoot: true runAsUser: 1000 runAsGroup: 1000 fsGroup: 1000 containers: - name: openclaw image: ghcr.io/openclaw/openclaw:2026.2.6 # 锁定版本号 ports: - containerPort: 18789 name: gateway protocol: TCP env: - name: NODE_ENV value: "production" - name: ANTHROPIC_API_KEY valueFrom: secretKeyRef: name: openclaw-secrets key: anthropic-api-key - name: OPENAI_API_KEY valueFrom: secretKeyRef: name: openclaw-secrets key: openai-api-key - name: OPENCLAW_GATEWAY_TOKEN valueFrom: secretKeyRef: name: openclaw-secrets key: gateway-token - name: DISCORD_BOT_TOKEN valueFrom: secretKeyRef: name: openclaw-secrets key: discord-bot-token volumeMounts: - name: config mountPath: /home/openclaw/.openclaw/config subPath: openclaw.json - name: workspace mountPath: /home/openclaw/.openclaw/workspace - name: state mountPath: /home/openclaw/.openclaw/state # --- 健康检查 --- livenessProbe: httpGet: path: /health port: gateway initialDelaySeconds: 15 periodSeconds: 30 timeoutSeconds: 10 failureThreshold: 3 readinessProbe: httpGet: path: /health port: gateway initialDelaySeconds: 10 periodSeconds: 10 timeoutSeconds: 5 failureThreshold: 2 startupProbe: httpGet: path: /health port: gateway initialDelaySeconds: 5 periodSeconds: 5 failureThreshold: 12 # 最多等待 60 秒启动 # --- 资源限制 --- resources: requests: cpu: 500m memory: 512Mi limits: cpu: "2" memory: 3Gi volumes: - name: config configMap: name: openclaw-config - name: workspace persistentVolumeClaim: claimName: openclaw-workspace - name: state persistentVolumeClaim: claimName: openclaw-workspace # 共享 PVC,不同 subPath

Service

# service.yaml apiVersion: v1 kind: Service metadata: name: openclaw-service namespace: openclaw spec: type: ClusterIP selector: app: openclaw ports: - port: 18789 targetPort: gateway protocol: TCP name: http

Ingress(TLS 终结)

# ingress.yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: openclaw-ingress namespace: openclaw annotations: cert-manager.io/cluster-issuer: letsencrypt-prod nginx.ingress.kubernetes.io/proxy-read-timeout: "3600" nginx.ingress.kubernetes.io/proxy-send-timeout: "3600" # WebSocket 支持 nginx.ingress.kubernetes.io/proxy-http-version: "1.1" nginx.ingress.kubernetes.io/configuration-snippet: | proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; spec: ingressClassName: nginx tls: - hosts: - openclaw.yourdomain.com secretName: openclaw-tls rules: - host: openclaw.yourdomain.com http: paths: - path: / pathType: Prefix backend: service: name: openclaw-service port: number: 18789

NetworkPolicy(网络隔离)

# network-policy.yaml apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: openclaw-network-policy namespace: openclaw spec: podSelector: matchLabels: app: openclaw policyTypes: - Ingress - Egress ingress: # 仅允许 Ingress Controller 访问 - from: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: ingress-nginx ports: - port: 18789 protocol: TCP egress: # 允许 DNS 解析 - to: [] ports: - port: 53 protocol: UDP - port: 53 protocol: TCP # 允许访问外部 API(Anthropic、OpenAI 等) - to: - ipBlock: cidr: 0.0.0.0/0 except: - 10.0.0.0/8 - 172.16.0.0/12 - 192.168.0.0/16 ports: - port: 443 protocol: TCP

部署命令

# 一键部署所有资源 kubectl apply -f namespace.yaml kubectl apply -f secret.yaml kubectl apply -f configmap.yaml kubectl apply -f pvc.yaml kubectl apply -f deployment.yaml kubectl apply -f service.yaml kubectl apply -f ingress.yaml kubectl apply -f network-policy.yaml # 验证部署状态 kubectl get all -n openclaw kubectl logs -n openclaw deployment/openclaw -f # 进入 Pod 执行初始化 kubectl exec -it -n openclaw deployment/openclaw -- /bin/bash # 在 Pod 内运行:/app/openclaw.mjs onboard

Helm Chart 配置

社区维护的 Helm Chart serhanekicii/openclaw-helm  提供了更便捷的部署方式:

# 添加 Helm 仓库 helm repo add openclaw https://serhanekicii.github.io/openclaw-helm helm repo update # 查看可配置项 helm show values openclaw/openclaw # 安装(使用自定义 values) helm install openclaw openclaw/openclaw \ --namespace openclaw \ --create-namespace \ -f values.yaml

自定义 values.yaml 示例:

# values.yaml — Helm Chart 自定义配置 image: repository: ghcr.io/openclaw/openclaw tag: "2026.2.6" pullPolicy: IfNotPresent replicaCount: 1 gateway: port: 18789 bind: "0.0.0.0" auth: mode: token secrets: anthropicApiKey: "" # 通过 --set 传入或使用 External Secrets gatewayToken: "" persistence: enabled: true storageClass: "local-path" size: 20Gi ingress: enabled: true className: nginx annotations: cert-manager.io/cluster-issuer: letsencrypt-prod hosts: - host: openclaw.yourdomain.com paths: - path: / pathType: Prefix tls: - secretName: openclaw-tls hosts: - openclaw.yourdomain.com resources: requests: cpu: 500m memory: 512Mi limits: cpu: "2" memory: 3Gi networkPolicy: enabled: true

4. 反向代理与 TLS

为什么必须使用反向代理?

OpenClaw Gateway 的安全模型基于本地信任假设:来自 127.0.0.1 的连接被自动信任。这意味着:

  1. 绝不能将 Gateway 端口(18789)直接暴露到公网
  2. 反向代理负责 TLS 终结、认证和速率限制
  3. WebSocket 支持是必需的(Control UI 和实时通信依赖 WebSocket)

⚠️ CVE-2026-25253 教训:超过 42,000 个 OpenClaw 实例因直接暴露 Gateway 端口而被攻击者利用,导致 API 密钥泄露和远程代码执行。

Caddy 配置(推荐——自动 HTTPS)

Caddy 是最简单的选择,自动处理 Let’s Encrypt 证书申请和续期:

# Caddyfile openclaw.yourdomain.com { # 反向代理到 OpenClaw Gateway reverse_proxy localhost:18789 { # 保留客户端 IP header_up X-Forwarded-For {remote_host} header_up X-Real-IP {remote_host} header_up X-Forwarded-Proto {scheme} } # 安全头 header { X-Content-Type-Options nosniff X-Frame-Options DENY Referrer-Policy strict-origin-when-cross-origin -Server } # 速率限制(需要 caddy-ratelimit 插件) # rate_limit {remote.ip} 100r/m # 访问日志 log { output file /var/log/caddy/openclaw-access.log format json } }

Nginx + Let’s Encrypt 配置

# /etc/nginx/sites-available/openclaw upstream openclaw_gateway { server 127.0.0.1:18789; keepalive 32; } # HTTP → HTTPS 重定向 server { listen 80; server_name openclaw.yourdomain.com; return 301 https://$server_name$request_uri; } server { listen 443 ssl http2; server_name openclaw.yourdomain.com; # --- TLS 证书(Certbot 自动填充) --- ssl_certificate /etc/letsencrypt/live/openclaw.yourdomain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/openclaw.yourdomain.com/privkey.pem; # --- TLS 安全配置 --- ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256; ssl_prefer_server_ciphers off; ssl_session_cache shared:SSL:10m; ssl_session_timeout 1d; ssl_stapling on; ssl_stapling_verify on; # --- 安全头 --- add_header X-Content-Type-Options nosniff always; add_header X-Frame-Options DENY always; add_header Strict-Transport-Security "max-age=63072000; includeSubDomains" always; # --- 反向代理 --- location / { proxy_pass http://openclaw_gateway; proxy_http_version 1.1; # WebSocket 支持(Control UI 必需) proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; # 保留客户端信息 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 超时设置(Agent 会话可能持续较长时间) proxy_read_timeout 3600s; proxy_send_timeout 3600s; } # --- 速率限制 --- limit_req_zone $binary_remote_addr zone=openclaw:10m rate=30r/m; location /api/ { limit_req zone=openclaw burst=10 nodelay; proxy_pass http://openclaw_gateway; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } }

Let’s Encrypt 自动证书

# 安装 Certbot sudo apt install certbot python3-certbot-nginx # 申请证书(Nginx 模式) sudo certbot --nginx -d openclaw.yourdomain.com # 验证自动续期 sudo certbot renew --dry-run # Certbot 自动续期定时任务(通常自动配置) # 检查:systemctl status certbot.timer

OpenClaw Gateway 配置

配合反向代理,需要调整 ~/.openclaw/openclaw.json

{ "gateway": { "bind": "loopback", "trustedProxies": ["127.0.0.1"], "auth": { "mode": "token", "token": "${OPENCLAW_GATEWAY_TOKEN}" }, "controlUi": { "allowInsecureAuth": false, "dangerouslyDisableDeviceAuth": false } } }

5. 高可用策略

健康检查

OpenClaw Gateway 提供 /health 端点用于健康检查:

# 基本健康检查 curl -sf http://127.0.0.1:18789/health # 返回:{"status":"ok","uptime":12345,"version":"2026.2.6"} # 深度健康检查(包含 Agent 状态) curl -sf -H "Authorization: Bearer ${TOKEN}" \ http://127.0.0.1:18789/api/status

Docker Compose 健康检查配置(已包含在上方 docker-compose.yml 中):

healthcheck: test: ["CMD", "curl", "-sf", "http://127.0.0.1:18789/health"] interval: 30s # 每 30 秒检查一次 timeout: 10s # 超时 10 秒视为失败 retries: 3 # 连续 3 次失败标记为 unhealthy start_period: 15s # 启动后 15 秒开始检查

自动重启

Docker Compose 自动重启

# restart policy 选项: # - no:不自动重启 # - always:总是重启(包括手动停止后) # - unless-stopped:除非手动停止,否则自动重启(推荐) # - on-failure:仅在非零退出码时重启 restart: unless-stopped

systemd 守护进程(非 Docker 部署)

# /etc/systemd/system/openclaw.service [Unit] Description=OpenClaw AI Agent Gateway After=network-online.target Wants=network-online.target [Service] Type=simple User=openclaw Group=openclaw WorkingDirectory=/home/openclaw ExecStart=/usr/local/bin/openclaw gateway start Restart=always RestartSec=5 StartLimitIntervalSec=60 StartLimitBurst=5 # 安全加固 NoNewPrivileges=true ProtectSystem=strict ProtectHome=read-only ReadWritePaths=/home/openclaw/.openclaw # 环境变量 EnvironmentFile=/home/openclaw/.openclaw/.env [Install] WantedBy=multi-user.target
# 启用并启动服务 sudo systemctl daemon-reload sudo systemctl enable openclaw sudo systemctl start openclaw # 查看状态 sudo systemctl status openclaw sudo journalctl -u openclaw -f

数据持久化

OpenClaw 的所有持久数据都以文件形式存储,这是其”文件即真相”设计哲学的体现:

数据类型路径说明备份优先级
MEMORY.mdworkspace/MEMORY.mdAgent 长期记忆,跨会话持续🔴 最高
SOUL.mdworkspace/SOUL.mdAgent 身份和人格定义🔴 最高
每日日志workspace/memory/YYYY-MM-DD.md每日交互记录🟡 高
配置文件config/openclaw.json模型、通道、插件配置🟡 高
会话状态state/SQLite 数据库、向量索引🟡 高
凭证credentials/OAuth 令牌、设备密钥🔴 最高
Skillsworkspace/skills/自定义 Skills 文件🟢 中

备份策略

自动备份脚本

#!/bin/bash # backup-openclaw.sh — OpenClaw 数据自动备份 # 建议通过 cron 每日执行 BACKUP_DIR="/backups/openclaw" DATA_DIR="/path/to/openclaw/data" TIMESTAMP=$(date +%Y%m%d_%H%M%S) RETENTION_DAYS=30 # 创建备份目录 mkdir -p "${BACKUP_DIR}" # 创建压缩备份 tar -czf "${BACKUP_DIR}/openclaw-backup-${TIMESTAMP}.tar.gz" \ -C "${DATA_DIR}" \ config/ workspace/ state/ credentials/ # 清理过期备份 find "${BACKUP_DIR}" -name "openclaw-backup-*.tar.gz" \ -mtime +${RETENTION_DAYS} -delete # 可选:上传到远程存储 # aws s3 cp "${BACKUP_DIR}/openclaw-backup-${TIMESTAMP}.tar.gz" \ # s3://your-bucket/openclaw-backups/ echo "[$(date)] 备份完成: openclaw-backup-${TIMESTAMP}.tar.gz"

cron 定时任务

# 每日凌晨 3 点执行备份 echo "0 3 * * * /opt/scripts/backup-openclaw.sh >> /var/log/openclaw-backup.log 2>&1" \ | crontab -

恢复流程

# 1. 停止 OpenClaw docker compose down # 2. 解压备份 tar -xzf /backups/openclaw/openclaw-backup-20260215_030000.tar.gz \ -C /path/to/openclaw/data/ # 3. 修复权限 chown -R 1000:1000 /path/to/openclaw/data/ # 4. 重新启动 docker compose up -d # 5. 验证恢复 docker compose logs -f openclaw-gateway

实战案例:从单节点到高可用的迁移

场景

一个 3 人创业团队最初在本地 Mac Mini 上运行 OpenClaw,随着业务增长需要迁移到 VPS 实现 24/7 运行和远程访问。

迁移步骤

第 1 步:选择 VPS 并初始化

# 在 Hetzner CX22(2 vCPU/4 GB/€3.49/月)上 ssh root@your-vps-ip # 创建专用用户 adduser openclaw usermod -aG docker openclaw # 安装 Docker curl -fsSL https://get.docker.com | sh

第 2 步:导出本地数据

# 在 Mac Mini 上 tar -czf openclaw-migration.tar.gz \ ~/.openclaw/config \ ~/.openclaw/workspace \ ~/.openclaw/state \ ~/.openclaw/credentials scp openclaw-migration.tar.gz openclaw@your-vps-ip:~/

第 3 步:在 VPS 上部署

# 在 VPS 上 su - openclaw mkdir -p ~/openclaw-deploy/data cd ~/openclaw-deploy # 解压迁移数据 tar -xzf ~/openclaw-migration.tar.gz -C data/ # 创建 docker-compose.yml、Caddyfile、.env(使用上方模板) # ... # 启动 docker compose up -d

第 4 步:配置 DNS 和 TLS

# 将 openclaw.yourdomain.com 的 A 记录指向 VPS IP # Caddy 会自动申请 Let's Encrypt 证书 # 验证 HTTPS curl -v https://openclaw.yourdomain.com/health

第 5 步:验证迁移完整性

# 检查 MEMORY.md 是否完整 docker compose exec openclaw-gateway cat /home/node/.openclaw/workspace/MEMORY.md # 检查 Agent 是否正常响应 # 通过 Telegram/Discord 发送测试消息 # 设置备份 cron crontab -e # 添加:0 3 * * * /home/openclaw/scripts/backup-openclaw.sh

迁移结果

指标迁移前(Mac Mini)迁移后(Hetzner VPS)
可用性~16h/天(需开机)24/7
远程访问需 VPNHTTPS 直接访问
月成本电费 ~$5€3.49(~$3.80)
故障恢复手动重启自动重启(<10s)
数据安全无备份每日自动备份

避坑指南

❌ 常见错误

  1. 将 Gateway 端口直接暴露到公网

    • 问题:OpenClaw 的本地信任机制意味着任何能访问 18789 端口的人都拥有完全控制权。CVE-2026-25253 正是利用了这一点,导致超过 42,000 个实例被攻击
    • 正确做法:始终通过反向代理(Caddy/Nginx)访问,Gateway 绑定 127.0.0.1loopback 模式
  2. 使用 auth: none 模式运行

    • 问题:无认证模式下,任何能到达 Gateway 的请求都被信任,即使在 Docker 网络内也存在风险
    • 正确做法:始终设置 auth.mode: "token" 并使用 openssl rand -hex 32 生成强令牌
  3. 忘记配置 WebSocket 代理

    • 问题:OpenClaw Control UI 依赖 WebSocket 进行实时通信。缺少 UpgradeConnection 头会导致 UI 无法加载、设备配对失败
    • 正确做法:在 Nginx 中添加 proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade";
  4. 数据目录权限不匹配

    • 问题:Docker 容器以 node:node(UID 1000)运行,但宿主机数据目录属于 root,导致写入失败
    • 正确做法:chown -R 1000:1000 ./data/ 确保容器用户有写权限
  5. 使用 latest 标签部署

    • 问题:OpenClaw 更新频繁,latest 标签可能在 docker compose pull 后引入破坏性变更
    • 正确做法:锁定版本号(如 openclaw/openclaw:2026.2.6),手动测试后再升级
  6. 未配置日志轮转

    • 问题:OpenClaw 的 Agent 会话会产生大量日志,不限制会耗尽磁盘空间
    • 正确做法:在 docker-compose.yml 中配置 logging.options.max-sizemax-file

✅ 最佳实践

  1. 安全第一:Gateway 绑定 localhost → 反向代理 + TLS → 强令牌认证,三层缺一不可
  2. 版本锁定:生产环境始终使用固定版本号,通过 staging 环境测试新版本后再升级
  3. 自动备份:每日备份 workspace/(含 MEMORY.md、SOUL.md)和 credentials/,保留 30 天
  4. 资源限制:设置 CPU 和内存上限,防止失控的 Agent 会话耗尽服务器资源
  5. 健康监控:配置健康检查 + 外部监控(如 UptimeRobot),确保故障时及时告警
  6. 最小权限:容器以非 root 运行,移除所有不必要的 Linux capabilities
  7. 定期安全审计:运行 openclaw security audit --deep,关注 CVE 公告和社区安全通知
  8. 更新前备份:每次更新 OpenClaw 版本前,先执行完整备份,确保可回滚

相关资源与延伸阅读

资源类型说明链接
OpenClaw 官方 Docker 文档官方文档Docker 部署的权威指南docs.openclaw.ai/docker 
OpenClaw 安全加固指南社区指南三层安全架构实现digitalapplied.com 
OpenClaw Helm Chart开源项目社区维护的 K8s Helm Chartgithub.com/serhanekicii/openclaw-helm 
Caddy 官方文档官方文档自动 HTTPS 反向代理配置caddyserver.com/docs 
Let’s Encrypt 文档官方文档免费 TLS 证书申请letsencrypt.org/docs 
Docker Compose 最佳实践官方文档生产级 Compose 配置指南docs.docker.com/compose 
K8s NetworkPolicy 指南官方文档Pod 网络隔离策略kubernetes.io/docs 
CVE-2026-25253 分析安全报告OpenClaw RCE 漏洞详情iterathon.tech 
OpenClaw SSL 设置指南社区教程20 分钟完成 HTTPS 配置markaicode.com 
Hetzner VPS 部署教程社区教程从零开始的 VPS 部署aifreeapi.com 

参考来源

📝 内容基于 2025-2026 年公开资料整理,部分配置细节经过改写以适应本手册的教学目的。请以 OpenClaw 官方文档为准。


📖 返回 总览与导航 | 上一节:24e-社区插件生态 | 下一节:25b-监控与告警

Last updated on