为什么需要专门的 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 小时 |
总结
生产环境部署不是”安装完就完事”,而是持续优化 + 主动监控 + 快速响应的循环。
关键要点:
- ✅ systemd + Nginx 是基础
- ✅ 监控 + 告警 是眼睛和耳朵
- ✅ 备份 + 演练 是保险
- ✅ 安全加固 是底线
从哪里开始?
- 先跑通单机生产架构
- 配置基础监控(Prometheus + Grafana)
- 建立备份习惯
- 根据业务增长考虑高可用架构
相关资源: