为什么需要专门的 OpenClaw 生产部署指南?

OpenClaw 的安装指南帮助你把系统跑起来,而生产部署指南教你让它稳定、安全、可扩展地运行。

生产环境与开发环境的区别:

维度开发环境生产环境
可用性偶机重启可接受99.9%+ SLA
监控手动检查日志自动化告警 + 可视化
安全本地信任网络暴露公网,严格防护
扩展性单机运行水平扩展 + 负载均衡
变更管理随意修改CI/CD + 灰度发布

本文聚焦于企业级运维场景,涵盖从单机优化到分布式架构的完整实践。


一、生产环境架构设计

1.1 单机生产架构(适合小型团队)

┌─────────────────────────────────────────┐
│          Nginx (SSL 终止 + 反向代理)      │
├─────────────────────────────────────────┤
│      OpenClaw Gateway (systemd)         │
├─────────────────────────────────────────┤
│  SQLite 数据库 + 文件存储                │
└─────────────────────────────────────────┘

适用场景:

  • 个人使用或小团队(<10 人)
  • 日均消息量 <10,000 条
  • 单点故障可接受(或快速手动恢复)

1.2 高可用架构(推荐生产环境)

                    ┌─────────────┐
                    │   DNS/GSLB  │
                    └──────┬──────┘
                           │
              ┌────────────┴────────────┐
              │                         │
       ┌──────▼──────┐          ┌──────▼──────┐
       │  Nginx LB-1 │          │  Nginx LB-2 │
       └──────┬──────┘          └──────┬──────┘
              │                        │
              └────────────┬───────────┘
                           │
              ┌────────────┴────────────┐
              │                         │
       ┌──────▼──────┐          ┌──────▼──────┐
       │ OpenClaw-1  │          │ OpenClaw-2  │
       └──────┬──────┘          └──────┬──────┘
              │                        │
              └────────────┬───────────┘
                           │
              ┌────────────▼────────────┐
              │   PostgreSQL (主从)      │
              │   Redis (会话缓存)       │
              └─────────────────────────┘

适用场景:

  • 中大型团队(10+ 人)
  • 7x24 小时业务关键
  • 需要自动故障转移

二、基础环境准备

2.1 系统优化

内核参数调优(/etc/sysctl.conf):

# 网络优化
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_tw_reuse = 1
net.ipv4.ip_local_port_range = 10000 65535

# 文件描述符
fs.file-max = 2097152

# Swap 优化(降低使用倾向)
vm.swappiness = 10

应用配置:

sudo sysctl -p

文件描述符限制(/etc/security/limits.conf):

* soft nofile 65535
* hard nofile 65535

2.2 防火墙配置

# 仅允许必要端口
sudo ufw default deny incoming
sudo ufw default allow outgoing

# SSH(如果使用自定义端口,替换 22)
sudo ufw allow 22/tcp comment 'SSH'

# HTTP/HTTPS
sudo ufw allow 80/tcp comment 'HTTP'
sudo ufw allow 443/tcp comment 'HTTPS'

# 应用规则
sudo ufw enable

三、OpenClaw 生产配置

3.1 环境变量配置

创建 /etc/openclaw/production.env:

# OpenClaw 核心配置
NODE_ENV=production
LOG_LEVEL=info

# 数据库(生产环境推荐 PostgreSQL)
DATABASE_URL=postgresql://openclaw:password@localhost/openclaw_prod

# Redis(会话存储 + 任务队列)
REDIS_URL=redis://localhost:6379/0

# 安全配置
SESSION_SECRET=your-random-64-char-secret-key
JWT_SECRET=your-jwt-secret-key

# API Provider 配置
OPENAI_API_KEY=sk-...
ANTHROPIC_API_KEY=sk-ant-...

# 渠道配置(根据启用渠道添加)
TELEGRAM_BOT_TOKEN=your-telegram-token
SIGNAL_URL=http://localhost:8080

权限控制:

sudo chown root:openclaw /etc/openclaw/production.env
sudo chmod 640 /etc/openclaw/production.env

3.2 Systemd 服务配置

优化版 /etc/systemd/system/openclaw.service:

[Unit]
Description=OpenClaw Gateway Service
After=network.target postgresql.service redis.service
Wants=postgresql.service redis.service

[Service]
Type=simple
User=openclaw
Group=openclaw
WorkingDirectory=/opt/openclaw

# 环境变量
EnvironmentFile=/etc/openclaw/production.env
Environment="NODE_ENV=production"

# 启动命令
ExecStart=/usr/bin/node /opt/openclaw/dist/index.js
Restart=always
RestartSec=10
StartLimitInterval=60
StartLimitBurst=3

# 资源限制
LimitNOFILE=65535
LimitNPROC=4096

# 安全加固
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/var/lib/openclaw /var/log/openclaw

# 日志
StandardOutput=journal
StandardError=journal
SyslogIdentifier=openclaw

[Install]
WantedBy=multi-user.target

启用服务:

sudo systemctl daemon-reload
sudo systemctl enable openclaw
sudo systemctl start openclaw
sudo systemctl status openclaw

四、Nginx 反向代理 + SSL

4.1 生产级 Nginx 配置

/etc/nginx/sites-available/openclaw.conf:

# 上游服务器(单机或多机)
upstream openclaw_backend {
    # 单机部署
    server 127.0.0.1:18766 max_fails=3 fail_timeout=30s;

    # 高可用部署(取消注释)
    # server 10.0.1.10:18766 max_fails=3 fail_timeout=30s;
    # server 10.0.1.11:18766 max_fails=3 fail_timeout=30s;

    # 保持连接
    keepalive 32;
}

# HTTP → HTTPS 重定向
server {
    listen 80;
    listen [::]:80;
    server_name openclaw.yourdomain.com;

    # Let's Encrypt 验证路径
    location /.well-known/acme-challenge/ {
        root /var/www/html;
    }

    location / {
        return 301 https://$server_name$request_uri;
    }
}

# HTTPS 配置
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name openclaw.yourdomain.com;

    # SSL 证书(Let's Encrypt)
    ssl_certificate /etc/letsencrypt/live/openclaw.yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/openclaw.yourdomain.com/privkey.pem;
    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 10m;

    # 安全头
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    add_header X-Frame-Options DENY always;
    add_header X-Content-Type-Options nosniff always;
    add_header X-XSS-Protection "1; mode=block" always;

    # 日志
    access_log /var/log/nginx/openclaw-access.log;
    error_log /var/log/nginx/openclaw-error.log;

    # 反向代理
    location / {
        proxy_pass http://openclaw_backend;
        proxy_http_version 1.1;

        # 请求头
        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;

        # 超时
        proxy_connect_timeout 60s;
        proxy_send_timeout 60s;
        proxy_read_timeout 60s;

        # 缓冲
        proxy_buffering on;
        proxy_buffer_size 4k;
        proxy_buffers 8 4k;
    }

    # WebSocket 支持(如需要)
    location /ws {
        proxy_pass http://openclaw_backend;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
        proxy_set_header Host $host;
        proxy_read_timeout 86400;
    }
}

启用配置:

sudo ln -s /etc/nginx/sites-available/openclaw.conf /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

4.2 SSL 证书自动续期

# 获取证书(首次)
sudo certbot --nginx -d openclaw.yourdomain.com

# 测试自动续期
sudo certbot renew --dry-run

# 系统已自动添加 cron 任务(/etc/cron.d/certbot)

五、监控与告警

5.1 Prometheus + Grafana 监控栈

安装 Prometheus:

# 创建用户
sudo useradd --no-create-home --shell /bin/false prometheus

# 下载
wget https://github.com/prometheus/prometheus/releases/download/v2.45.0/prometheus-2.45.0.linux-amd64.tar.gz
tar xvf prometheus-2.45.0.linux-amd64.tar.gz
cd prometheus-2.45.0.linux-amd64

# 安装
sudo mkdir -p /etc/prometheus /var/lib/prometheus
sudo cp prometheus promtool /usr/local/bin/
sudo cp prometheus.yml /etc/prometheus/
sudo chown -R prometheus:prometheus /etc/prometheus /var/lib/prometheus

Prometheus 配置(/etc/prometheus/prometheus.yml):

global:
  scrape_interval: 15s
  evaluation_interval: 15s

scrape_configs:
  # OpenClaw Gateway 指标(需暴露 /metrics 端点)
  - job_name: 'openclaw'
    static_configs:
      - targets: ['localhost:18766']
    metrics_path: '/metrics'

  # Node Exporter(系统指标)
  - job_name: 'node'
    static_configs:
      - targets: ['localhost:9100']

  # Nginx Prometheus Exporter
  - job_name: 'nginx'
    static_configs:
      - targets: ['localhost:9113']

  # PostgreSQL Exporter
  - job_name: 'postgresql'
    static_configs:
      - targets: ['localhost:9187']

Systemd 服务:

[Unit]
Description=Prometheus
After=network.target

[Service]
Type=simple
User=prometheus
ExecStart=/usr/local/bin/prometheus \
  --config.file /etc/prometheus/prometheus.yml \
  --storage.tsdb.path /var/lib/prometheus \
  --web.console.templates=/etc/prometheus/consoles \
  --web.console.libraries=/etc/prometheus/console_libraries

Restart=always

[Install]
WantedBy=multi-user.target

5.2 关键监控指标

指标类别指标名称告警阈值
可用性服务启动时间>5 分钟
性能P95 响应时间>3 秒
错误率5xx 错误率>1%
资源CPU 使用率>80% (5 分钟)
资源内存使用率>85%
资源磁盘使用率>80%
数据库连接池使用率>80%
数据库查询慢日志>1 秒

5.3 告警规则(Prometheus)

/etc/prometheus/alerts.yml:

groups:
  - name: openclaw_alerts
    interval: 30s
    rules:
      # 服务宕机
      - alert: OpenClawServiceDown
        expr: up{job="openclaw"} == 0
        for: 2m
        labels:
          severity: critical
        annotations:
          summary: "OpenClaw 服务宕机"
          description: "{{ $labels.instance }} 已宕机超过 2 分钟"

      # 高错误率
      - alert: HighErrorRate
        expr: rate(http_requests_total{status=~"5.."}[5m]) / rate(http_requests_total[5m]) > 0.01
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "错误率过高"
          description: "5 分钟内 5xx 错误率 >1%"

      # 高内存使用
      - alert: HighMemoryUsage
        expr: (process_resident_memory_bytes{job="openclaw"} / 1024 / 1024) > 1500
        for: 10m
        labels:
          severity: warning
        annotations:
          summary: "内存使用过高"
          description: "OpenClaw 内存使用超过 1.5GB"

六、日志管理

6.1 结构化日志

OpenClaw 配置(config/production.json):

{
  "logging": {
    "level": "info",
    "format": "json",
    "outputs": ["console", "file"],
    "file": {
      "path": "/var/log/openclaw/app.log",
      "maxSize": "100M",
      "maxFiles": 10,
      "compress": true
    }
  }
}

6.2 集中式日志(Loki + Promtail)

安装 Loki:

wget https://github.com/grafana/loki/releases/download/v2.9.0/loki-linux-amd64.zip
unzip loki-linux-amd64.zip
sudo mv loki-linux-amd64 /usr/local/bin/loki

Loki 配置(/etc/loki/local-config.yaml):

server:
  http_listen_port: 3100

ingester:
  lifecycler:
    address: 127.0.0.1
    ring:
      kvstore:
        store: inmemory
      replication_factor: 1

schema_config:
  configs:
    - from: 2024-01-01
      store: boltdb-shipper
      object_store: filesystem
      schema: v11
      index:
        prefix: index_
        period: 24h

storage_config:
  boltdb_shipper:
    active_index_directory: /tmp/loki/boltdb-shipper-active
    cache_location: /tmp/loki/boltdb-shipper-cache
    shared_store: filesystem
  filesystem:
    directory: /tmp/loki/chunks

Promtail 配置(/etc/promtail/config.yml):

server:
  http_listen_port: 9080

positions:
  filename: /tmp/positions.yaml

clients:
  - url: http://localhost:3100/loki/api/v1/push

scrape_configs:
  - job_name: openclaw
    static_configs:
      - targets:
          - localhost
        labels:
          job: openclaw
          __path__: /var/log/openclaw/*.log

  - job_name: nginx
    static_configs:
      - targets:
          - localhost
        labels:
          job: nginx
          __path__: /var/log/nginx/*.log

七、备份与灾难恢复

7.1 自动化备份脚本

/usr/local/bin/backup-openclaw.sh:

#!/bin/bash
set -euo pipefail

BACKUP_DIR="/backup/openclaw"
RETENTION_DAYS=30
DATE=$(date +%Y%m%d_%H%M%S)

# 创建备份目录
mkdir -p "$BACKUP_DIR/$DATE"

# 1. 数据库备份(PostgreSQL)
pg_dump -U openclaw -h localhost openclaw_prod | gzip > "$BACKUP_DIR/$DATE/db.sql.gz"

# 2. 文件存储备份
tar -czf "$BACKUP_DIR/$DATE/storage.tar.gz" /var/lib/openclaw

# 3. 配置文件备份
tar -czf "$BACKUP_DIR/$DATE/config.tar.gz" /etc/openclaw

# 4. 清理旧备份
find "$BACKUP_DIR" -type d -mtime +$RETENTION_DAYS -exec rm -rf {} \;

# 5. 上传到远程存储(可选)
# rclone copy "$BACKUP_DIR/$DATE" s3:backups/openclaw/$DATE

echo "Backup completed: $BACKUP_DIR/$DATE"

Cron 任务(每日凌晨 2 点):

# 编辑 crontab
sudo crontab -e

# 添加:
0 2 * * * /usr/local/bin/backup-openclaw.sh >> /var/log/backup.log 2>&1

7.2 恢复流程

# 1. 停止服务
sudo systemctl stop openclaw

# 2. 恢复数据库
gunzip -c /backup/openclaw/20260215_020000/db.sql.gz | psql -U openclaw -h localhost openclaw_prod

# 3. 恢复文件存储
tar -xzf /backup/openclaw/20260215_020000/storage.tar.gz -C /

# 4. 恢复配置
tar -xzf /backup/openclaw/20260215_020000/config.tar.gz -C /

# 5. 重启服务
sudo systemctl start openclaw
sudo systemctl status openclaw

八、安全加固

8.1 Fail2Ban 防暴力破解

/etc/fail2ban/jail.local:

[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 5

[sshd]
enabled = true
port = 22
logpath = /var/log/auth.log

[nginx-http-auth]
enabled = true
filter = nginx-http-auth
logpath = /var/log/nginx/error.log

8.2 自动安全更新

# 安装 unattended-upgrades
sudo apt-get install unattended-upgrades

# 配置
sudo dpkg-reconfigure -plow unattended-upgrades

九、CI/CD 流水线

9.1 GitOps 工作流

# .github/workflows/deploy-openclaw.yml
name: Deploy OpenClaw

on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3

      - name: Deploy to production
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.PRODUCTION_HOST }}
          username: ${{ secrets.PRODUCTION_USER }}
          key: ${{ secrets.SSH_PRIVATE_KEY }}
          script: |
            cd /opt/openclaw
            git pull origin main
            npm ci --production
            npm run build
            sudo systemctl restart openclaw
            sudo systemctl status openclaw

十、性能优化清单

  • 启用 HTTP/2 和 HTTP/3
  • 配置 CDN(静态资源)
  • 数据库连接池调优
  • Redis 缓存热点数据
  • 日志异步写入
  • 启用 gzip/brotli 压缩
  • 限制请求速率(rate limiting)

十一、灾难演练计划

演练场景频率验证目标
服务重启每月自动启动 + 日志正常
数据库恢复每季度备份可用性
服务器宕机切换每半年故障转移 <5 分钟
数据恢复(误删)每年RTO <1 小时

总结

生产环境部署不是”安装完就完事”,而是持续优化 + 主动监控 + 快速响应的循环。

关键要点:

  1. ✅ systemd + Nginx 是基础
  2. ✅ 监控 + 告警 是眼睛和耳朵
  3. ✅ 备份 + 演练 是保险
  4. ✅ 安全加固 是底线

从哪里开始?

  1. 先跑通单机生产架构
  2. 配置基础监控(Prometheus + Grafana)
  3. 建立备份习惯
  4. 根据业务增长考虑高可用架构

相关资源: