Docker Compose集群部署OpenClaw:多实例高可用方案

说出来你可能不信,之前单实例跑OpenClaw的时候,升级一下就中断服务了。有次正在陪女朋友吃饭,收到消息说服务挂了,尴尬死了。后来我用了Docker Compose集群部署,升级维护期间服务完全不中断,真香!


一句话概括

这篇文章告诉你:怎么用Docker Compose部署多个OpenClaw实例,实现高可用和负载均衡,再也不用担心升级服务中断了。


单实例的问题

先说说之前我用单实例遇到的那些破事儿:

问题1:升级服务中断

# 升级需要先停止旧容器
docker stop openclaw
docker rm openclaw

# 然后启动新容器
docker run -d ...

这个过程中服务是完全中断的!

有一次我正在陪女朋友吃饭,收到用户消息说服务挂了。一看,原来是我在升级OpenClaw…尴尬死了。

问题2:意外重启会挂

有次服务器重启后,Docker没设置开机自启,导致OpenClaw没跑起来,用户发了十几条消息一条都没回。

问题3:没办法负载均衡

单实例性能有限,消息高峰期会卡顿。特别是AI对话,有时候要等好几秒。


集群架构设计

后来我搞了Docker Compose集群,架构如下:

                         ┌─────────────┐
                         │   Nginx     │
                         │  负载均衡   │
                         └──────┬──────┘
                                │
              ┌────────────────┼────────────────┐
              │                │                │
     ┌────────┴────────┐ ┌─────┴─────┐ ┌──────┴──────┐
     │   容器1         │ │  容器2    │ │   容器3     │
     │ openclaw-1      │ │openclaw-2 │ │ openclaw-3  │
     │ :8080           │ │  :8081    │ │  :8082      │
     └────────┬────────┘ └─────┴─────┘ └──────┬──────┘
               │                │                │
               └────────────────┼────────────────┘
                               │
                    ┌──────────┴──────────┐
                    │      共享存储        │
                    │   /opt/openclaw     │
                    │  数据持久化         │
                    └─────────────────────┘

优点

  • 升级零 downtime
  • 一个实例挂了,其他接着服务
  • 负载均衡,性能更好

缺点

  • 成本高(需要多台VPS)
  • 配置复杂

实战部署

1. 创建目录

mkdir -p /opt/openclaw-cluster
cd /opt/openclaw-cluster

2. 创建docker-compose.yml

version: '3.8'

services:
  # OpenClaw 实例1
  openclaw-1:
    image: openclaw/openclaw:latest
    container_name: openclaw-1
    ports:
      - "8081:8080"
    volumes:
      - ./data:/root/.openclaw
    environment:
      - NODE_NAME=openclaw-1
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8080"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 60s

  # OpenClaw 实例2
  openclaw-2:
    image: openclaw/openclaw:latest
    container_name: openclaw-2
    ports:
      - "8082:8080"
    volumes:
      - ./data:/root/.openclaw
    environment:
      - NODE_NAME=openclaw-2
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8080"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 60s

  # OpenClaw 实例3
  openclaw-3:
    image: openclaw/openclaw:latest
    container_name: openclaw-3
    ports:
      - "8083:8080"
    volumes:
      - ./data:/root/.openclaw
    environment:
      - NODE_NAME=openclaw-3
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8080"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 60s

  # Nginx 负载均衡
  nginx:
    image: nginx:latest
    container_name: openclaw-nginx
    ports:
      - "8080:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
    depends_on:
      - openclaw-1
      - openclaw-2
      - openclaw-3
    restart: unless-stopped

3. 创建Nginx配置

vim nginx.conf

写入:

events {
    worker_connections 1024;
}

http {
    # 负载均衡配置
    upstream openclaw_backend {
        least_conn;  # 最少连接数
        
        server openclaw-1:8080 weight=1 max_fails=3 fail_timeout=30s;
        server openclaw-2:8080 weight=1 max_fails=3 fail_timeout=30s;
        server openclaw-3:8080 weight=1 max_fails=3 fail_timeout=30s;
        
        # 保持连接
        keepalive 32;
    }

    server {
        listen 80;
        server_name _;

        location / {
            proxy_pass http://openclaw_backend;
            
            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;
            
            # 超时设置
            proxy_connect_timeout 60s;
            proxy_send_timeout 60s;
            proxy_read_timeout 60s;
            
            # 健康检查
            proxy_next_upstream error timeout http_502 http_503 http_504;
        }
        
        # 健康检查端点
        location /health {
            access_log off;
            return 200 "OK";
        }
    }
}

4. 启动集群

docker-compose up -d

5. 验证

# 查看容器状态
docker-compose ps

# 查看Nginx日志
docker logs openclaw-nginx -f

# 测试访问
curl http://localhost:8080

# 测试负载均衡(多次请求看不同实例)
for i in {1..5}; do curl http://localhost:8080; done

常用操作

升级所有实例

# 拉取新镜像
docker-compose pull

# 重启所有服务(零 downtime)
docker-compose up -d --no-deps

查看日志

# 查看所有日志
docker-compose logs -f

# 查看单个实例
docker logs -f openclaw-1
docker logs -f openclaw-2
docker logs -f openclaw-3

扩容/缩容

# 方法1:手动修改docker-compose.yml
# 添加更多实例...

# 方法2:命令行(需要修改docker-compose.yml支持)
docker-compose up -d --scale openclaw-1=5

监控

# 监控脚本
watch -n 5 'docker-compose ps'

健康检查配置

每个实例都配置了健康检查:

healthcheck:
  test: ["CMD", "curl", "-f", "http://localhost:8080"]
  interval: 30s      # 检查间隔
  timeout: 10s      # 超时时间
  retries: 3       # 重试次数
  start_period: 60s # 启动等待时间

作用

  • 自动检测实例是否健康
  • 不健康的实例自动从负载均衡中移除
  • 恢复后自动加回

数据共享

多个实例共享同一个数据目录:

volumes:
  - ./data:/root/.openclaw

注意

  • 多个实例同时写入可能有冲突
  • 建议用数据库或消息队列
  • 或者配置只读模式

成本

配置 数量 单价 总价
VPS 3台 30/月 90/月
域名 1个 - 30/年

总计:约100/月


适用场景

推荐上集群

  • 企业级应用
  • 对可用性要求高
  • 预算充足

不需要集群

  • 个人使用
  • 学习测试
  • 对可用性要求一般

常见问题FAQ

Q1:实例之间数据不一致?

:共享存储可能有竞态条件,建议:

  • 使用外部数据库
  • 或者配置锁机制

Q2:如何查看哪个实例在处理请求?

:查看Nginx日志

docker logs openclaw-nginx

Q3:某个实例挂了怎么办?

:Nginx会自动把挂掉的实例从池中移除,其他实例继续服务。


进阶配置

1. 配置健康检查

healthcheck:
  test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
  interval: 30s
  timeout: 10s
  retries: 3

2. 配置监控

# docker-compose.yml
services:
  monitoring:
    image: prom/prometheus
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml

3. 配置自动扩容

# 使用Kubernetes进行自动扩容(进阶)
kubectl autoscale deployment openclaw --cpu-percent=80 --min=1 --max=10

写在最后

Docker Compose集群部署确实比单实例香:

  • 升级零 downtime
  • 一个实例挂了,其他接着服务
  • 负载均衡,性能更好

缺点:成本高点,需要3台VPS。

中小用户其实单实例就够了,生产环境建议上集群。

有问题评论区问,看到了都会回。


下期预告

下一期讲讲一键脚本安装,5分钟搞定部署。敬请期待!

往期文章

  • Windows Docker安装OpenClaw
  • Linux服务器Docker部署OpenClaw
  • VPS云端部署OpenClaw+公网访问

参考资料

  • OpenClaw官网:https://openclaw.ai
  • Docker Compose文档:https://docs.docker.com/compose/
  • Nginx文档:https://nginx.org/en/docs/
Logo

小龙虾开发者社区是 CSDN 旗下专注 OpenClaw 生态的官方阵地,聚焦技能开发、插件实践与部署教程,为开发者提供可直接落地的方案、工具与交流平台,助力高效构建与落地 AI 应用

更多推荐