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 VPS | 3+ 节点 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 供应商推荐
| 供应商 | 最低配置 | 月费 | 特点 | 推荐场景 |
|---|---|---|---|---|
| Hetzner | CX22(2 vCPU/4 GB) | €3.49 起 | 性价比极高,欧洲数据中心 | 个人项目首选 |
| DigitalOcean | Basic Droplet(2 vCPU/4 GB) | $6 起 | 简单易用,全球节点 | 快速上手 |
| Vultr | Cloud Compute(2 vCPU/4 GB) | $12 起 | 全球 32 个数据中心 | 低延迟需求 |
| Contabo | VPS S(4 vCPU/8 GB) | €5.99 起 | 超大内存配置 | 多 Agent 场景 |
| Railway | Pro 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:187893. 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: openclawSecret(敏感信息)
# 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,不同 subPathService
# 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: httpIngress(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: 18789NetworkPolicy(网络隔离)
# 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 onboardHelm 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: true4. 反向代理与 TLS
为什么必须使用反向代理?
OpenClaw Gateway 的安全模型基于本地信任假设:来自 127.0.0.1 的连接被自动信任。这意味着:
- 绝不能将 Gateway 端口(18789)直接暴露到公网
- 反向代理负责 TLS 终结、认证和速率限制
- 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.timerOpenClaw 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/statusDocker 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-stoppedsystemd 守护进程(非 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.md | workspace/MEMORY.md | Agent 长期记忆,跨会话持续 | 🔴 最高 |
| SOUL.md | workspace/SOUL.md | Agent 身份和人格定义 | 🔴 最高 |
| 每日日志 | workspace/memory/YYYY-MM-DD.md | 每日交互记录 | 🟡 高 |
| 配置文件 | config/openclaw.json | 模型、通道、插件配置 | 🟡 高 |
| 会话状态 | state/ | SQLite 数据库、向量索引 | 🟡 高 |
| 凭证 | credentials/ | OAuth 令牌、设备密钥 | 🔴 最高 |
| Skills | workspace/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 |
| 远程访问 | 需 VPN | HTTPS 直接访问 |
| 月成本 | 电费 ~$5 | €3.49(~$3.80) |
| 故障恢复 | 手动重启 | 自动重启(<10s) |
| 数据安全 | 无备份 | 每日自动备份 |
避坑指南
❌ 常见错误
-
将 Gateway 端口直接暴露到公网
- 问题:OpenClaw 的本地信任机制意味着任何能访问 18789 端口的人都拥有完全控制权。CVE-2026-25253 正是利用了这一点,导致超过 42,000 个实例被攻击
- 正确做法:始终通过反向代理(Caddy/Nginx)访问,Gateway 绑定
127.0.0.1或loopback模式
-
使用
auth: none模式运行- 问题:无认证模式下,任何能到达 Gateway 的请求都被信任,即使在 Docker 网络内也存在风险
- 正确做法:始终设置
auth.mode: "token"并使用openssl rand -hex 32生成强令牌
-
忘记配置 WebSocket 代理
- 问题:OpenClaw Control UI 依赖 WebSocket 进行实时通信。缺少
Upgrade和Connection头会导致 UI 无法加载、设备配对失败 - 正确做法:在 Nginx 中添加
proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade";
- 问题:OpenClaw Control UI 依赖 WebSocket 进行实时通信。缺少
-
数据目录权限不匹配
- 问题:Docker 容器以
node:node(UID 1000)运行,但宿主机数据目录属于 root,导致写入失败 - 正确做法:
chown -R 1000:1000 ./data/确保容器用户有写权限
- 问题:Docker 容器以
-
使用
latest标签部署- 问题:OpenClaw 更新频繁,
latest标签可能在docker compose pull后引入破坏性变更 - 正确做法:锁定版本号(如
openclaw/openclaw:2026.2.6),手动测试后再升级
- 问题:OpenClaw 更新频繁,
-
未配置日志轮转
- 问题:OpenClaw 的 Agent 会话会产生大量日志,不限制会耗尽磁盘空间
- 正确做法:在 docker-compose.yml 中配置
logging.options.max-size和max-file
✅ 最佳实践
- 安全第一:Gateway 绑定 localhost → 反向代理 + TLS → 强令牌认证,三层缺一不可
- 版本锁定:生产环境始终使用固定版本号,通过 staging 环境测试新版本后再升级
- 自动备份:每日备份
workspace/(含 MEMORY.md、SOUL.md)和credentials/,保留 30 天 - 资源限制:设置 CPU 和内存上限,防止失控的 Agent 会话耗尽服务器资源
- 健康监控:配置健康检查 + 外部监控(如 UptimeRobot),确保故障时及时告警
- 最小权限:容器以非 root 运行,移除所有不必要的 Linux capabilities
- 定期安全审计:运行
openclaw security audit --deep,关注 CVE 公告和社区安全通知 - 更新前备份:每次更新 OpenClaw 版本前,先执行完整备份,确保可回滚
相关资源与延伸阅读
| 资源 | 类型 | 说明 | 链接 |
|---|---|---|---|
| OpenClaw 官方 Docker 文档 | 官方文档 | Docker 部署的权威指南 | docs.openclaw.ai/docker |
| OpenClaw 安全加固指南 | 社区指南 | 三层安全架构实现 | digitalapplied.com |
| OpenClaw Helm Chart | 开源项目 | 社区维护的 K8s Helm Chart | github.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 |
参考来源
- OpenClaw Docker Setup: Secure Deployment (2026 年 2 月)
- Deploying OpenClaw on Kubernetes (2026 年 2 月)
- OpenClaw Installation and Deployment: Complete Guide (2026 年 2 月)
- Secure Your OpenClaw Web UI with SSL (2026 年 2 月)
- OpenClaw Security Hardening Guide (2026 年 2 月)
- Deploy OpenClaw Securely on Kubernetes with Helm (2026 年 1 月)
- OpenClaw Security Checklist (2026 年 1 月)
- OpenClaw Moltbot AI Agent Security Production Guide (2026 年 2 月)
- How OpenClaw Solves Data Privacy: Local Persistent Memory (2026 年 2 月)
- Clawdbot Installation & Deployment Complete Guide (2026 年 1 月)
📝 内容基于 2025-2026 年公开资料整理,部分配置细节经过改写以适应本手册的教学目的。请以 OpenClaw 官方文档为准。
📖 返回 总览与导航 | 上一节:24e-社区插件生态 | 下一节:25b-监控与告警