CentOS 服务器安装 OpenClaw 完整教程

适用系统:CentOS 7/8、Alibaba Cloud Linux 3、Rocky Linux、AlmaLinux
更新时间:2026-05-07
作者:AI 助手


目录

  1. 系统要求
  2. 环境准备
  3. 安装依赖
  4. 安装 Node.js
  5. 安装 Python
  6. 安装 PM2
  7. 安装 OpenClaw
  8. 配置 OpenClaw
  9. 启动服务
  10. 配置 Nginx 反向代理
  11. 配置防火墙
  12. 设置开机自启
  13. 常见问题
  14. 附录

一、系统要求

1.1 硬件要求

配置项 最低要求 推荐配置
CPU 2 核 4 核+
内存 4 GB 8 GB+
磁盘 50 GB 100 GB+ SSD
带宽 5 Mbps 10 Mbps+

1.2 系统要求

操作系统 版本 状态
CentOS 7.x / 8.x ✅ 支持
Alibaba Cloud Linux 3.x ✅ 支持(本教程基于此系统)
Rocky Linux 8.x / 9.x ✅ 支持
AlmaLinux 8.x / 9.x ✅ 支持
Ubuntu / Debian - ⚠️ 参考本文,包管理器改用 apt

1.3 网络要求

  • 服务器可访问外网(下载依赖)
  • 开放端口:80、443、8080-9000(根据项目需求)
  • 域名已解析到服务器 IP(可选,用于 HTTPS)

二、环境准备

2.1 更新系统

# 登录服务器
ssh root@your-server-ip

# 更新系统包
sudo yum update -y

# 安装基础工具
sudo yum install -y wget curl vim git net-tools telnet

2.2 创建用户(推荐)

# 创建 admin 用户(避免使用 root 运行服务)
sudo useradd -m -s /bin/bash admin

# 设置密码
sudo passwd admin

# 添加 sudo 权限
sudo usermod -aG wheel admin

# 切换到 admin 用户
su - admin

2.3 配置 SSH(安全加固)

# 编辑 SSH 配置
sudo vim /etc/ssh/sshd_config

# 修改以下配置
PermitRootLogin no          # 禁止 root 登录
PasswordAuthentication yes  # 允许密码登录(或改为 no 仅使用密钥)
MaxAuthTries 3              # 最大尝试次数

# 重启 SSH
sudo systemctl restart sshd

三、安装依赖

3.1 安装开发工具包

# 安装开发工具组
sudo yum groupinstall -y "Development Tools"

# 安装常用依赖
sudo yum install -y \
    gcc gcc-c++ make \
    openssl-devel libffi-devel \
    zlib-devel bzip2-devel \
    readline-devel sqlite-devel \
    ncurses-devel xz-devel \
    tk-devel gdbm-devel \
    libpcap-devel libuuid-devel

3.2 安装额外库

# EPEL 源(提供额外软件包)
sudo yum install -y epel-release

# 安装常用库
sudo yum install -y \
    ImageMagick ImageMagick-devel \
    ffmpeg ffmpeg-devel \
    libxml2 libxml2-devel \
    libxslt libxslt-devel \
    libjpeg-turbo libjpeg-turbo-devel \
    libpng libpng-devel \
    freetype freetype-devel

四、安装 Node.js

OpenClaw 基于 Node.js 运行,需要安装 Node.js 18+。

4.1 使用 NVM 安装(推荐)

# 安装 NVM(Node Version Manager)
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash

# 加载 NVM
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"

# 验证安装
nvm --version

# 安装 Node.js 18(LTS 版本)
nvm install 18
nvm use 18
nvm alias default 18

# 验证
node -v  # v18.x.x
npm -v   # 9.x.x

4.2 使用 NodeSource 安装(备选)

# 添加 NodeSource 源
curl -fsSL https://rpm.nodesource.com/setup_18.x | sudo bash -

# 安装 Node.js
sudo yum install -y nodejs

# 验证
node -v
npm -v

4.3 配置 npm

# 配置国内镜像(加速下载)
npm config set registry https://registry.npmmirror.com

# 配置全局安装路径
mkdir -p ~/.npm-global
npm config set prefix '~/.npm-global'

# 添加到 PATH
echo 'export PATH=~/.npm-global/bin:$PATH' >> ~/.bashrc
source ~/.bashrc

五、安装 Python

OpenClaw 部分功能依赖 Python 3.8+。

5.1 安装 Python 3.9

# CentOS 8 / Alibaba Cloud Linux 3 可直接安装
sudo yum install -y python39 python39-pip python39-devel

# 创建软链接
sudo alternatives --set python3 /usr/bin/python3.9

# 验证
python3 --version  # Python 3.9.x
pip3 --version

5.2 配置 pip 镜像

# 配置国内镜像
mkdir -p ~/.config/pip
cat > ~/.config/pip/pip.conf << 'EOF'
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
trusted-host = pypi.tuna.tsinghua.edu.cn
EOF

5.3 安装虚拟环境工具

# 安装 virtualenv
pip3 install --user virtualenv

# 验证
virtualenv --version

六、安装 PM2

PM2 是 Node.js 进程管理器,用于守护 OpenClaw 服务。

# 全局安装 PM2
npm install -g pm2

# 验证
pm2 --version

# 配置 PM2 开机自启
pm2 startup systemd

# 执行生成的命令(根据提示)
sudo env PATH=$PATH:/usr/bin pm2 startup systemd -u admin --hp /home/admin

七、安装 OpenClaw

7.1 下载 OpenClaw

# 创建工作目录
mkdir -p ~/workspace
cd ~/workspace

# 克隆 OpenClaw 仓库(假设使用 Git)
git clone https://github.com/your-org/openclaw.git

# 或下载压缩包
# wget https://your-domain.com/openclaw-latest.tar.gz
# tar -xzf openclaw-latest.tar.gz

cd openclaw

7.2 安装 Node.js 依赖

# 安装项目依赖
npm install

# 或使用 pnpm(更快)
npm install -g pnpm
pnpm install

7.3 安装 Python 依赖

# 创建 Python 虚拟环境
virtualenv venv

# 激活虚拟环境
source venv/bin/activate

# 安装依赖
pip install -r requirements.txt

# 退出虚拟环境
deactivate

7.4 构建项目

# 构建前端(如有)
npm run build

# 或
pnpm run build

八、配置 OpenClaw

8.1 基础配置

# 复制配置文件模板
cp config.example.json config.json

# 编辑配置
vim config.json

8.2 配置文件示例

{
  "server": {
    "host": "0.0.0.0",
    "port": 8080,
    "env": "production"
  },
  "database": {
    "type": "sqlite",
    "path": "./data/openclaw.db"
  },
  "redis": {
    "enabled": false,
    "host": "127.0.0.1",
    "port": 6379
  },
  "log": {
    "level": "info",
    "path": "./logs"
  },
  "security": {
    "jwt_secret": "your-random-secret-key-here",
    "allowed_hosts": ["your-domain.com", "www.your-domain.com"]
  },
  "ai_models": {
    "default_provider": "openai",
    "providers": {
      "openai": {
        "enabled": true,
        "api_key": "sk-your-openai-api-key",
        "base_url": "https://api.openai.com/v1",
        "models": {
          "gpt-4": "gpt-4",
          "gpt-4-turbo": "gpt-4-turbo-preview",
          "gpt-3.5": "gpt-3.5-turbo"
        },
        "default_model": "gpt-3.5-turbo",
        "max_tokens": 4096,
        "temperature": 0.7
      },
      "anthropic": {
        "enabled": false,
        "api_key": "sk-ant-your-anthropic-key",
        "base_url": "https://api.anthropic.com",
        "models": {
          "claude-3-opus": "claude-3-opus-20240229",
          "claude-3-sonnet": "claude-3-sonnet-20240229",
          "claude-3-haiku": "claude-3-haiku-20240307"
        },
        "default_model": "claude-3-sonnet-20240229",
        "max_tokens": 4096,
        "temperature": 0.7
      },
      "azure_openai": {
        "enabled": false,
        "api_key": "your-azure-api-key",
        "base_url": "https://your-resource.openai.azure.com/openai/deployments/",
        "api_version": "2024-02-15-preview",
        "models": {
          "gpt-4": "gpt-4-deployment-name",
          "gpt-35": "gpt-35-turbo-deployment-name"
        },
        "default_model": "gpt-35-turbo-deployment-name"
      },
      "kimi": {
        "enabled": false,
        "api_key": "your-kimi-api-key",
        "base_url": "https://api.moonshot.cn/v1",
        "models": {
          "kimi-latest": "moonshot-v1-8k",
          "kimi-128k": "moonshot-v1-128k",
          "kimi-32k": "moonshot-v1-32k"
        },
        "default_model": "moonshot-v1-8k",
        "max_tokens": 4096
      },
      "deepseek": {
        "enabled": false,
        "api_key": "your-deepseek-api-key",
        "base_url": "https://api.deepseek.com/v1",
        "models": {
          "deepseek-chat": "deepseek-chat",
          "deepseek-coder": "deepseek-coder"
        },
        "default_model": "deepseek-chat"
      }
    },
    "fallback_chain": ["openai", "kimi", "deepseek"],
    "timeout": 30,
    "retry_times": 3
  },
    "plugins": {
      "wechat": {
        "enabled": true,
        "appId": "your-app-id",
        "appSecret": "your-app-secret",
        "token": "your-wechat-token",
        "encodingAESKey": "your-aes-key",
        "webhook_url": "/webhook/wechat",
        "auto_reply": true,
        "default_response": "您好,我是AI助手,正在处理您的请求..."
      },
      "qq_bot": {
        "enabled": false,
        "appId": "your-qq-app-id",
        "clientSecret": "your-qq-client-secret",
        "token": "your-qq-token",
        "ws_url": "wss://api.sgroup.qq.com/websocket",
        "intents": ["GUILDS", "GUILD_MESSAGES", "DIRECT_MESSAGE"],
        "sandbox": false
      },
      "discord": {
        "enabled": false,
        "bot_token": "your-discord-bot-token",
        "client_id": "your-client-id",
        "client_secret": "your-client-secret",
        "command_prefix": "!"
      },
      "telegram": {
        "enabled": false,
        "bot_token": "your-telegram-bot-token",
        "webhook_url": "https://your-domain.com/webhook/telegram",
        "allowed_chats": []
      }
    }
  }
}

8.3 环境变量配置(可选)

# 创建 .env 文件
cat > .env << 'EOF'
NODE_ENV=production
PORT=8080
DATABASE_URL=sqlite:./data/openclaw.db
JWT_SECRET=your-super-secret-key

# AI 模型配置
OPENAI_API_KEY=sk-your-openai-api-key
OPENAI_BASE_URL=https://api.openai.com/v1
OPENAI_DEFAULT_MODEL=gpt-3.5-turbo

KIMI_API_KEY=your-kimi-api-key
KIMI_BASE_URL=https://api.moonshot.cn/v1

DEEPSEEK_API_KEY=your-deepseek-api-key
DEEPSEEK_BASE_URL=https://api.deepseek.com/v1

ANTHROPIC_API_KEY=sk-ant-your-anthropic-key
AZURE_OPENAI_API_KEY=your-azure-api-key

WECHAT_APP_ID=your-app-id
WECHAT_APP_SECRET=your-app-secret
EOF

8.4 AI 模型配置详解

支持的 AI 提供商
提供商 配置键 适用场景 国内访问
OpenAI openai 通用能力最强 ⚠️ 需代理
Anthropic anthropic 长文本、代码 ⚠️ 需代理
Azure OpenAI azure_openai 企业合规 ✅ 国内可用
Kimi (月之暗面) kimi 中文理解优秀 ✅ 国内直连
DeepSeek deepseek 性价比高 ✅ 国内直连
通义千问 qwen 阿里生态 ✅ 国内直连
文心一言 ernie 百度生态 ✅ 国内直连
配置参数说明
{
  "ai_models": {
    "default_provider": "kimi",        // 默认使用的 AI 提供商
    "providers": {
      "kimi": {
        "enabled": true,               // 是否启用
        "api_key": "your-api-key",     // API 密钥
        "base_url": "https://api.moonshot.cn/v1",  // API 基础地址
        "models": {                     // 模型别名映射
          "kimi-latest": "moonshot-v1-8k",
          "kimi-128k": "moonshot-v1-128k"
        },
        "default_model": "moonshot-v1-8k",  // 默认模型
        "max_tokens": 4096,             // 最大输出 token 数
        "temperature": 0.7              // 随机性 (0-2)
      }
    },
    "fallback_chain": ["kimi", "deepseek", "openai"],  // 故障时自动切换顺序
    "timeout": 30,                     // 请求超时(秒)
    "retry_times": 3                   // 失败重试次数
  }
}
获取 API Key
提供商 申请地址 备注
OpenAI https://platform.openai.com/api-keys 需海外信用卡
Kimi https://platform.moonshot.cn 国内手机号即可
DeepSeek https://platform.deepseek.com 国内手机号即可
通义千问 https://dashscope.aliyun.com 阿里云账号
文心一言 https://console.bce.baidu.com 百度云账号
Azure OpenAI https://azure.microsoft.com 需企业申请
国内直连配置示例
{
  "ai_models": {
    "default_provider": "kimi",
    "providers": {
      "kimi": {
        "enabled": true,
        "api_key": "sk-your-kimi-key",
        "base_url": "https://api.moonshot.cn/v1",
        "models": {
          "kimi-latest": "moonshot-v1-8k",
          "kimi-128k": "moonshot-v1-128k",
          "kimi-32k": "moonshot-v1-32k"
        },
        "default_model": "moonshot-v1-8k",
        "max_tokens": 4096
      },
      "deepseek": {
        "enabled": true,
        "api_key": "sk-your-deepseek-key",
        "base_url": "https://api.deepseek.com/v1",
        "models": {
          "deepseek-chat": "deepseek-chat",
          "deepseek-coder": "deepseek-coder"
        },
        "default_model": "deepseek-chat"
      }
    },
    "fallback_chain": ["kimi", "deepseek"]
  }
}
使用代理访问 OpenAI(国内服务器)
{
  "ai_models": {
    "providers": {
      "openai": {
        "enabled": true,
        "api_key": "sk-your-openai-key",
        "base_url": "https://api.openai.com/v1",
        "proxy": "http://127.0.0.1:7890"   // Clash/V2Ray 本地代理端口
      }
    }
  }
}

或使用第三方中转服务:

{
  "ai_models": {
    "providers": {
      "openai": {
        "enabled": true,
        "api_key": "sk-your-key",
        "base_url": "https://api.your-proxy-service.com/v1"  // 第三方中转
      }
    }
  }
}
模型选择建议
场景 推荐模型 理由
日常对话 Kimi / GPT-3.5 速度快、成本低
长文档处理 Kimi-128k / Claude-3 上下文窗口大
代码生成 DeepSeek-Coder / GPT-4 代码能力强
复杂推理 GPT-4 / Claude-3-Opus 逻辑推理强
中文内容 Kimi / 通义千问 中文理解好
预算敏感 DeepSeek / GPT-3.5 价格低

8.5 验证 AI 配置

# 启动后测试 AI 接口
curl -X POST http://localhost:8080/api/v1/chat \
  -H "Content-Type: application/json" \
  -d '{
    "message": "你好,请介绍一下自己",
    "model": "kimi-latest"
  }'

# 查看 AI 提供商状态
curl http://localhost:8080/api/v1/ai/status

# 查看日志确认 AI 调用
pm2 logs | grep -i "ai\|model\|chat"

九、机器人配置详解

9.1 支持的机器人平台

平台 配置键 接入方式 适用场景
微信公众号 wechat Webhook 国内用户、企业服务
QQ 机器人 qq_bot WebSocket 年轻用户、社群运营
Discord discord WebSocket 海外用户、开发者社区
Telegram telegram Webhook/Bot API 海外用户、隐私敏感

9.2 微信公众号配置

9.2.1 申请公众号
  1. 访问 微信公众平台
  2. 注册账号(订阅号/服务号/企业微信)
  3. 完成认证(服务号需 300 元/年认证费)
  4. 获取 AppID 和 AppSecret(开发 → 基本配置)
9.2.2 配置服务器 URL
# 在公众号后台设置
服务器 URL: https://your-domain.com/webhook/wechat
Token: your-wechat-token(自定义,需与配置一致)
EncodingAESKey: 随机生成或自定义
消息加解密方式: 明文模式(测试)/ 兼容模式 / 安全模式(推荐)
9.2.3 OpenClaw 配置
{
  "plugins": {
    "wechat": {
      "enabled": true,
      "appId": "wx1234567890abcdef",
      "appSecret": "1234567890abcdef1234567890abcdef",
      "token": "your-custom-token",
      "encodingAESKey": "your-43-character-aes-key-here",
      "webhook_url": "/webhook/wechat",
      "auto_reply": true,
      "default_response": "您好,我是AI助手,正在处理您的请求...",
      "menu_config": {
        "button": [
          {
            "type": "click",
            "name": "AI对话",
            "key": "START_CHAT"
          },
          {
            "type": "view",
            "name": "打开网页",
            "url": "https://your-domain.com"
          }
        ]
      }
    }
  }
}
9.2.4 验证配置
# 查看微信接入日志
pm2 logs | grep -i "wechat\|webhook"

# 测试消息推送
curl -X POST https://your-domain.com/webhook/wechat \
  -H "Content-Type: text/xml" \
  -d '<xml><ToUserName><![CDATA[test]]></ToUserName><FromUserName><![CDATA[user]]></FromUserName><CreateTime>123456789</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[你好]]></Content></xml>'

9.3 QQ 机器人配置

9.3.1 申请 QQ 机器人
  1. 访问 QQ 开放平台
  2. 注册开发者账号
  3. 创建机器人应用
  4. 获取 AppID、AppSecret、Token
9.3.2 配置 intents(订阅事件)
{
  "plugins": {
    "qq_bot": {
      "enabled": true,
      "appId": "1234567890",
      "clientSecret": "your-client-secret",
      "token": "your-qq-token",
      "ws_url": "wss://api.sgroup.qq.com/websocket",
      "intents": [
        "GUILDS",           // 频道相关
        "GUILD_MESSAGES",   // 频道消息
        "DIRECT_MESSAGE",   // 私信
        "GROUP_MESSAGES",   // 群消息(需申请)
        "C2C_MESSAGE"       // 好友消息(需申请)
      ],
      "sandbox": false
    }
  }
}
9.3.3 验证连接
# 查看 QQ 机器人日志
pm2 logs | grep -i "qq\|websocket"

# 检查连接状态
curl http://localhost:8080/api/v1/bots/qq/status

9.4 Discord 机器人配置

9.4.1 创建 Discord Bot
  1. 访问 Discord Developer Portal
  2. New Application → Bot → Add Bot
  3. 获取 Bot Token(注意保密!)
  4. OAuth2 → URL Generator → 勾选 bot 权限
  5. 邀请 Bot 加入服务器
9.4.2 OpenClaw 配置
{
  "plugins": {
    "discord": {
      "enabled": true,
      "bot_token": "MTAxMjM0NTY3ODkw.abcdefghijklmnopqrstuvwxyz",
      "client_id": "1012345678901234567",
      "client_secret": "your-client-secret",
      "command_prefix": "!",
      "default_guild_id": "your-server-id",
      "allowed_channels": ["general", "ai-chat"],
      "admin_roles": ["Admin", "Moderator"]
    }
  }
}

9.5 Telegram 机器人配置

9.5.1 创建 Telegram Bot
  1. 在 Telegram 搜索 @BotFather
  2. 发送 /newbot 命令
  3. 按提示设置名称和用户名
  4. 获取 Bot Token(如:123456789:ABCdefGHIjklMNOpqrsTUVwxyz
9.5.2 配置 Webhook
# 设置 Webhook(替换为你的域名和 token)
curl -X POST "https://api.telegram.org/bot<YOUR_BOT_TOKEN>/setWebhook" \
  -d "url=https://your-domain.com/webhook/telegram"

# 验证 Webhook 设置
curl "https://api.telegram.org/bot<YOUR_BOT_TOKEN>/getWebhookInfo"
9.5.3 OpenClaw 配置
{
  "plugins": {
    "telegram": {
      "enabled": true,
      "bot_token": "123456789:ABCdefGHIjklMNOpqrsTUVwxyz",
      "webhook_url": "https://your-domain.com/webhook/telegram",
      "allowed_chats": [],
      "admin_users": ["your_telegram_username"],
      "commands": {
        "start": "欢迎使用 AI 助手!发送消息即可开始对话。",
        "help": "可用命令:\n/start - 开始\n/clear - 清空对话\n/model - 切换模型",
        "clear": "对话历史已清空",
        "model": "可用模型:gpt-3.5, gpt-4, kimi, deepseek"
      }
    }
  }
}

9.6 多平台同时接入

{
  "plugins": {
    "wechat": {
      "enabled": true,
      "appId": "wx-xxx",
      "appSecret": "xxx"
    },
    "qq_bot": {
      "enabled": true,
      "appId": "1234567890",
      "clientSecret": "xxx"
    },
    "telegram": {
      "enabled": true,
      "bot_token": "123456789:xxx"
    }
  }
}

启动后各平台独立运行,共享同一个 AI 后端。

9.7 钉钉机器人配置

9.7.1 创建钉钉机器人
  1. 打开钉钉群 → 群设置 → 智能群助手
  2. 点击「添加机器人」→ 选择「自定义」
  3. 填写机器人名称(如:AI助手)
  4. 安全设置(三选一):
    • 自定义关键词(如:AI、助手)
    • 加签(推荐,生成签名密钥)
    • IP 地址段
  5. 复制 Webhook 地址加签密钥
9.7.2 OpenClaw 配置
{
  "plugins": {
    "dingtalk": {
      "enabled": true,
      "webhook_url": "https://oapi.dingtalk.com/robot/send?access_token=your-token",
      "secret": "your-sign-secret",
      "at_all": false,
      "at_phones": ["13800138000"],
      "keywords": ["AI", "助手"],
      "reply_mode": "stream",
      "default_response": "收到,正在思考..."
    }
  }
}
9.7.3 验证配置
# 查看钉钉接入日志
pm2 logs | grep -i "dingtalk\|钉钉"

# 测试发送消息
curl -X POST https://your-domain.com/webhook/dingtalk \
  -H "Content-Type: application/json" \
  -d '{
    "msgtype": "text",
    "text": {"content": "测试消息"}
  }'

9.8 飞书机器人配置

9.8.1 创建飞书机器人
  1. 打开 飞书开放平台
  2. 创建企业自建应用
  3. 进入「添加应用能力」→ 添加「机器人」
  4. 获取 App IDApp Secret
  5. 配置事件订阅:
    • 请求地址:https://your-domain.com/webhook/feishu
    • 加密密钥:随机生成
    • 验证令牌:自定义
  6. 订阅事件:
    • im.message.receive_v1(接收消息)
    • im.message.message_read_v1(消息已读)
  7. 发布应用到企业
9.8.2 OpenClaw 配置
{
  "plugins": {
    "feishu": {
      "enabled": true,
      "app_id": "cli_xxxxxxxxxxxx",
      "app_secret": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
      "encrypt_key": "your-encrypt-key",
      "verification_token": "your-verification-token",
      "webhook_url": "/webhook/feishu",
      "bot_name": "AI助手",
      "reply_mode": "stream",
      "card_message": true,
      "default_response": "收到,正在处理...",
      "help_text": "我是AI助手,可以回答问题、生成内容。直接@我即可对话。"
    }
  }
}
9.8.3 飞书消息卡片格式
{
  "config": {
    "wide_screen_mode": true
  },
  "header": {
    "title": {
      "tag": "plain_text",
      "content": "AI回复"
    },
    "template": "blue"
  },
  "elements": [
    {
      "tag": "div",
      "text": {
        "tag": "lark_md",
        "content": "这是AI生成的回复内容..."
      }
    },
    {
      "tag": "note",
      "elements": [
        {
          "tag": "plain_text",
          "content": "由 OpenClaw AI 生成"
        }
      ]
    }
  ]
}
9.8.4 验证配置
# 查看飞书接入日志
pm2 logs | grep -i "feishu\|飞书"

# 检查事件订阅状态
curl https://your-domain.com/webhook/feishu/health

9.9 企业微信配置

9.9.1 企业微信应用(内部应用)
  1. 登录 企业微信管理后台
  2. 应用管理 → 创建应用
  3. 填写应用名称、上传 Logo
  4. 获取 AgentIdSecret
  5. 设置接收消息:
    • URL:https://your-domain.com/webhook/wecom
    • Token:随机生成
    • EncodingAESKey:随机生成
  6. 配置可信域名:your-domain.com
9.9.2 企业微信机器人(群机器人)
  1. 进入企业微信群 → 群设置 → 添加群机器人
  2. 填写机器人名称
  3. 复制 Webhook 地址
9.9.3 OpenClaw 配置(应用方式)
{
  "plugins": {
    "wecom_app": {
      "enabled": true,
      "corp_id": "wwxxxxxxxxxxxxxxxx",
      "agent_id": "1000002",
      "secret": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
      "token": "your-verification-token",
      "encoding_aes_key": "your-43-character-aes-key",
      "webhook_url": "/webhook/wecom",
      "reply_mode": "stream",
      "default_response": "收到,正在处理..."
    }
  }
}
9.9.4 OpenClaw 配置(群机器人方式)
{
  "plugins": {
    "wecom_webhook": {
      "enabled": true,
      "webhooks": [
        {
          "name": "研发群",
          "url": "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=your-key-1"
        },
        {
          "name": "运营群",
          "url": "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=your-key-2"
        }
      ],
      "default_response": "收到,正在处理..."
    }
  }
}
9.9.5 验证配置
# 查看企业微信接入日志
pm2 logs | grep -i "wecom\|企业微信"

# 测试发送消息
curl -X POST https://your-domain.com/webhook/wecom \
  -H "Content-Type: application/json" \
  -d '{
    "msgtype": "text",
    "text": {"content": "测试消息"}
  }'

9.10 六大平台对比

平台 接入方式 消息格式 国内访问 适用场景
微信公众号 Webhook XML ✅ 直连 对外服务、客户咨询
QQ 机器人 WebSocket JSON ✅ 直连 年轻用户、兴趣社群
Discord WebSocket JSON ⚠️ 需代理 海外用户、开发者
Telegram Webhook JSON ⚠️ 需代理 海外用户、隐私敏感
钉钉 Webhook JSON ✅ 直连 企业内部、办公协同
飞书 Webhook + 事件 JSON ✅ 直连 企业内部、知识管理
企业微信 Webhook / 应用 JSON/XML ✅ 直连 企业办公、内部通讯

9.11 多平台统一配置示例

{
  "plugins": {
    "wechat": {
      "enabled": true,
      "appId": "wx-xxx",
      "appSecret": "xxx",
      "webhook_url": "/webhook/wechat"
    },
    "qq_bot": {
      "enabled": true,
      "appId": "1234567890",
      "clientSecret": "xxx",
      "ws_url": "wss://api.sgroup.qq.com/websocket"
    },
    "telegram": {
      "enabled": true,
      "bot_token": "123456789:xxx",
      "webhook_url": "https://your-domain.com/webhook/telegram"
    },
    "dingtalk": {
      "enabled": true,
      "webhook_url": "https://oapi.dingtalk.com/robot/send?access_token=xxx",
      "secret": "xxx"
    },
    "feishu": {
      "enabled": true,
      "app_id": "cli_xxx",
      "app_secret": "xxx",
      "webhook_url": "/webhook/feishu"
    },
    "wecom_app": {
      "enabled": true,
      "corp_id": "wwxxx",
      "agent_id": "1000002",
      "secret": "xxx",
      "webhook_url": "/webhook/wecom"
    }
  }
}

9.12 平台特性与最佳实践

钉钉最佳实践
{
  "dingtalk": {
    "reply_mode": "stream",
    "markdown_support": true,
    "action_cards": {
      "single_title": "查看详情",
      "single_url": "https://your-domain.com/chat/{conversation_id}"
    }
  }
}
飞书最佳实践
{
  "feishu": {
    "card_message": true,
    "interactive_components": true,
    "thread_reply": true,
    "mention_reply": true
  }
}
企业微信最佳实践
{
  "wecom_app": {
    "reply_mode": "stream",
    "markdown_support": false,
    "voice_reply": false,
    "file_upload": true
  }
}

9.13 故障排查通用命令

问题 排查命令
所有平台无响应 pm2 logs 查看服务是否运行
单个平台无响应 pm2 logs | grep 平台名
Webhook 无法访问 curl -I https://your-domain.com/webhook/xxx
签名验证失败 检查 secret/token 是否一致
消息发送失败 检查 API 密钥是否过期
# 查看所有机器人状态
curl http://localhost:8080/api/v1/bots/status

# 查看单个平台状态
curl http://localhost:8080/api/v1/bots/dingtalk/status
curl http://localhost:8080/api/v1/bots/feishu/status
curl http://localhost:8080/api/v1/bots/wecom/status

# 测试发送消息到指定平台
curl -X POST http://localhost:8080/api/v1/bots/dingtalk/send \
  -H "Content-Type: application/json" \
  -d '{"message": "测试消息"}'
问题 排查方法
微信收不到消息 检查 Webhook URL 是否可访问、Token 是否一致
QQ 断开连接 检查 intents 配置、Token 是否过期
Discord 无响应 检查 Bot Token、权限是否足够
Telegram 无响应 检查 Webhook 设置、URL 是否正确
钉钉无响应 检查加签密钥、关键词匹配
飞书无响应 检查事件订阅、加密密钥
企业微信无响应 检查可信域名、AgentId/Secret
# 通用排查命令
pm2 logs | grep -i "bot\|webhook\|websocket"
curl http://localhost:8080/api/v1/bots/status
curl http://localhost:8080/api/v1/health

十、打开 OpenClaw Web 界面

10.1 本地访问

# 浏览器打开
http://localhost:8080

# 或服务器 IP
http://your-server-ip:8080

10.2 通过 Nginx 域名访问

# 配置域名后访问
http://your-domain.com
https://your-domain.com  # 如已配置 HTTPS

10.3 默认页面说明

路径 功能
/ 首页 / 控制台
/login 登录页面
/chat AI 对话界面
/admin 管理后台
/api/docs API 文档(Swagger)
/health 健康检查接口

10.4 首次登录

# 默认管理员账号(首次启动时自动生成)
用户名: admin
密码: (查看启动日志或配置文件)

# 查看默认密码
cat ~/workspace/openclaw/logs/init.log | grep "password"
pm2 logs | grep -i "admin\|password"

10.5 修改管理员密码

# 方式1:Web 界面
# 登录后 → 个人设置 → 修改密码

# 方式2:命令行
cd ~/workspace/openclaw
node scripts/reset-password.js admin your-new-password

# 方式3:数据库直接修改(SQLite)
sqlite3 data/openclaw.db "UPDATE users SET password_hash = 'new-hash' WHERE username = 'admin';"

10.6 界面功能导航

┌─────────────────────────────────────────────┐
│  OpenClaw 控制台                             │
├─────────────────────────────────────────────┤
│                                             │
│  📊 仪表盘                                    │
│    ├── 今日消息统计                            │
│    ├── 活跃用户数量                            │
│    ├── AI 调用次数                             │
│    └── 系统状态                                │
│                                             │
│  💬 对话管理                                   │
│    ├── 实时对话监控                            │
│    ├── 历史对话查询                            │
│    └── 对话质量分析                            │
│                                             │
│  🤖 机器人管理                                  │
│    ├── 微信配置                                │
│    ├── QQ 配置                                 │
│    ├── Telegram 配置                           │
│    └── Discord 配置                            │
│                                             │
│  ⚙️ 系统设置                                   │
│    ├── AI 模型配置                             │
│    ├── 插件管理                                │
│    ├── 用户管理                                │
│    └── 日志查看                                │
│                                             │
└─────────────────────────────────────────────┘

10.7 常用操作

操作 路径 说明
查看实时对话 /chat/monitor 监控所有平台消息
切换 AI 模型 /admin/ai-models 动态切换默认模型
查看日志 /admin/logs 按级别筛选日志
管理用户 /admin/users 添加/禁用用户
配置 Webhook /admin/webhooks 查看各平台回调状态

10.8 移动端访问

OpenClaw 支持响应式设计,可直接手机浏览器访问:

https://your-domain.com

或通过各平台机器人交互(微信/QQ/Telegram)。

10.9 API 接口测试

# 查看 API 文档(Swagger UI)
https://your-domain.com/api/docs

# 测试健康检查
curl https://your-domain.com/health

# 测试 AI 对话(需 API Key)
curl -X POST https://your-domain.com/api/v1/chat \
  -H "Authorization: Bearer your-api-key" \
  -H "Content-Type: application/json" \
  -d '{"message": "你好"}'

# 获取机器人状态
curl https://your-domain.com/api/v1/bots/status

十一、启动服务

11.1 使用 PM2 启动

# 创建 PM2 配置文件
cat > ecosystem.config.js << 'EOF'
module.exports = {
  apps: [
    {
      name: 'openclaw-api',
      script: './server.js',
      instances: 1,
      exec_mode: 'fork',
      env: {
        NODE_ENV: 'production',
        PORT: 8080
      },
      log_file: './logs/combined.log',
      out_file: './logs/out.log',
      error_file: './logs/error.log',
      log_date_format: 'YYYY-MM-DD HH:mm:ss Z',
      merge_logs: true,
      max_memory_restart: '1G',
      restart_delay: 3000,
      max_restarts: 5,
      min_uptime: '10s',
      watch: false,
      autorestart: true
    },
    {
      name: 'openclaw-cron',
      script: './cron-worker.js',
      instances: 1,
      exec_mode: 'fork',
      env: {
        NODE_ENV: 'production'
      },
      log_file: './logs/cron.log',
      merge_logs: true
    }
  ]
};
EOF

# 启动服务
pm2 start ecosystem.config.js

# 查看状态
pm2 status
pm2 logs

# 保存 PM2 配置
pm2 save

11.2 验证服务

# 本地测试
curl http://localhost:8080/health

# 查看进程
ps aux | grep openclaw

# 查看端口
ss -tlnp | grep 8080

十二、配置 Nginx 反向代理

12.1 安装 Nginx

# 安装 Nginx
sudo yum install -y nginx

# 启动并设置开机自启
sudo systemctl start nginx
sudo systemctl enable nginx

# 验证
nginx -v

12.2 配置反向代理

# 创建配置文件
sudo vim /etc/nginx/conf.d/openclaw.conf
server {
    listen 80;
    server_name your-domain.com www.your-domain.com;
    
    # 日志
    access_log /var/log/nginx/openclaw.access.log;
    error_log /var/log/nginx/openclaw.error.log;
    
    # 静态文件
    location /static/ {
        alias /home/admin/workspace/openclaw/static/;
        expires 30d;
    }
    
    # API 代理
    location /api/ {
        proxy_pass http://127.0.0.1:8080/api/;
        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_cache_bypass $http_upgrade;
        proxy_read_timeout 86400;
    }
    
    # WebSocket 支持(如有)
    location /ws/ {
        proxy_pass http://127.0.0.1:8080/ws/;
        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;
    }
    
    # 根路径
    location / {
        proxy_pass http://127.0.0.1:8080/;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

12.3 测试并重载 Nginx

# 测试配置
sudo nginx -t

# 重载配置
sudo systemctl reload nginx

# 查看状态
sudo systemctl status nginx

12.4 配置 HTTPS(Let’s Encrypt)

# 安装 Certbot
sudo yum install -y certbot python3-certbot-nginx

# 申请证书
sudo certbot --nginx -d your-domain.com -d www.your-domain.com

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

十三、配置防火墙

13.1 使用 firewalld

# 安装 firewalld(如未安装)
sudo yum install -y firewalld

# 启动
sudo systemctl start firewalld
sudo systemctl enable firewalld

# 开放必要端口
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --permanent --add-port=8080/tcp
sudo firewall-cmd --permanent --add-port=9000-9005/tcp  # 根据项目需求

# 重载
sudo firewall-cmd --reload

# 查看状态
sudo firewall-cmd --list-all

13.2 使用 iptables(备选)

# 开放端口
sudo iptables -I INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -I INPUT -p tcp --dport 443 -j ACCEPT
sudo iptables -I INPUT -p tcp --dport 8080 -j ACCEPT
sudo iptables -I INPUT -p tcp --dport 9000:9005 -j ACCEPT

# 保存规则
sudo service iptables save

十四、设置开机自启

14.1 PM2 开机自启(已配置)

# 确认 PM2 已配置开机自启
pm2 startup systemd

# 保存当前进程列表
pm2 save

# 查看 PM2 系统服务状态
sudo systemctl status pm2-admin

14.2 创建系统服务(备选)

如需更精细控制,可创建 systemd 服务:

# 创建服务文件
sudo vim /etc/systemd/system/openclaw.service
[Unit]
Description=OpenClaw Application
After=network.target

[Service]
Type=forking
User=admin
Group=admin
WorkingDirectory=/home/admin/workspace/openclaw
ExecStart=/home/admin/.npm-global/bin/pm2 start ecosystem.config.js
ExecReload=/home/admin/.npm-global/bin/pm2 reload ecosystem.config.js
ExecStop=/home/admin/.npm-global/bin/pm2 stop ecosystem.config.js
Restart=always
RestartSec=3
Environment=NODE_ENV=production

[Install]
WantedBy=multi-user.target
# 重载 systemd
sudo systemctl daemon-reload

# 启动服务
sudo systemctl start openclaw
sudo systemctl enable openclaw

# 查看状态
sudo systemctl status openclaw

十五、常见问题

Q1: 安装 Node.js 时提示 “No package nodejs available”

原因:默认源中没有 Node.js 包。

解决

# 使用 NodeSource 源
curl -fsSL https://rpm.nodesource.com/setup_18.x | sudo bash -
sudo yum install -y nodejs

Q2: npm install 报错 “gyp ERR! build error”

原因:缺少 Python 或编译工具。

解决

# 安装 Python 和编译工具
sudo yum install -y python39 gcc-c++ make

# 配置 npm 使用 Python 3
npm config set python /usr/bin/python3

Q3: PM2 启动后服务无法访问

排查步骤

# 1. 检查服务状态
pm2 status
pm2 logs

# 2. 检查端口监听
ss -tlnp | grep 8080

# 3. 检查防火墙
sudo firewall-cmd --list-all

# 4. 本地测试
curl http://localhost:8080/health

# 5. 检查 SELinux(可能阻止连接)
getenforce
sudo setenforce 0  # 临时关闭测试

Q4: Nginx 反向代理 502 错误

原因:OpenClaw 服务未启动或端口不对。

解决

# 检查 OpenClaw 是否运行
pm2 status

# 检查端口
ss -tlnp | grep 8080

# 检查 Nginx 错误日志
sudo tail -f /var/log/nginx/error.log

Q5: 如何更新 OpenClaw?

cd ~/workspace/openclaw

# 拉取最新代码
git pull origin main

# 更新依赖
npm install

# 重启服务
pm2 reload all

# 或
pm2 restart ecosystem.config.js

Q6: 如何备份数据?

# 备份数据库
cp ~/workspace/openclaw/data/openclaw.db ~/backup/openclaw-$(date +%Y%m%d).db

# 备份配置
cp ~/workspace/openclaw/config.json ~/backup/config-$(date +%Y%m%d).json

# 备份 PM2 配置
pm2 save

Q7: 内存不足导致服务崩溃

解决

# 增加 PM2 内存限制
pm2 reload openclaw-api --max-memory-restart 2G

# 或添加交换分区
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

十四、附录

14.1 常用命令速查

命令 说明
pm2 status 查看服务状态
pm2 logs 查看实时日志
pm2 reload all 平滑重启所有服务
pm2 restart all 强制重启所有服务
pm2 stop all 停止所有服务
pm2 delete all 删除所有服务
pm2 monit 打开监控面板
pm2 save 保存当前进程列表

14.2 目录结构

/home/admin/
├── workspace/
│   └── openclaw/           # OpenClaw 主目录
│       ├── config.json     # 配置文件
│       ├── ecosystem.config.js  # PM2 配置
│       ├── server.js       # 主入口
│       ├── node_modules/   # Node.js 依赖
│       ├── venv/           # Python 虚拟环境
│       ├── data/           # 数据文件
│       ├── logs/           # 日志文件
│       └── static/         # 静态资源
├── .npm-global/            # npm 全局包
├── .nvm/                   # Node.js 版本管理
└── .pm2/                   # PM2 配置和日志

14.3 相关资源

资源 链接
Node.js 官网 https://nodejs.org
PM2 文档 https://pm2.keymetrics.io
Nginx 文档 https://nginx.org/en/docs
Certbot https://certbot.eff.org
NVM https://github.com/nvm-sh/nvm

十七、Docker 部署方案(补充)

17.1 为什么使用 Docker?

优势 说明
环境隔离 避免与系统其他服务冲突
快速部署 一条命令启动完整环境
版本可控 明确 Node.js/Python 版本
易于迁移 打包镜像,任意服务器运行
自动重启 Docker 自带进程守护

17.2 安装 Docker

# 卸载旧版本(如有)
sudo yum remove -y docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine

# 安装 Docker 依赖
sudo yum install -y yum-utils device-mapper-persistent-data lvm2

# 添加 Docker 官方源
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# 或使用中科大镜像源(国内更快)
sudo yum-config-manager --add-repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo

# 安装 Docker CE
sudo yum install -y docker-ce docker-ce-cli containerd.io

# 启动并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker

# 验证安装
docker --version
docker-compose --version

# 将当前用户加入 docker 组(免 sudo)
sudo usermod -aG docker $USER
newgrp docker  # 立即生效

17.3 安装 Docker Compose

# 方式1:通过 pip 安装
pip3 install --user docker-compose

# 方式2:下载二进制(推荐)
# 查看最新版本:https://github.com/docker/compose/releases
sudo curl -L "https://github.com/docker/compose/releases/download/v2.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

# 验证
docker-compose --version

17.4 编写 Dockerfile

cd ~/workspace/openclaw

创建 Dockerfile

# 使用官方 Node.js 18 镜像作为基础
FROM node:18-alpine AS builder

# 设置工作目录
WORKDIR /app

# 复制依赖文件
COPY package*.json ./
COPY pnpm-lock.yaml* ./

# 安装依赖(使用国内镜像加速)
RUN npm config set registry https://registry.npmmirror.com && \
    npm install -g pnpm && \
    pnpm install --frozen-lockfile

# 复制源代码
COPY . .

# 构建(如有前端构建步骤)
RUN pnpm run build 2>/dev/null || true

# 生产阶段
FROM node:18-alpine AS production

# 安装系统依赖
RUN apk add --no-cache \
    python3 \
    py3-pip \
    tzdata \
    curl \
    && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
    && echo "Asia/Shanghai" > /etc/timezone

# 创建非 root 用户
RUN addgroup -g 1001 -S openclaw && \
    adduser -S openclaw -u 1001 -G openclaw

# 设置工作目录
WORKDIR /app

# 复制依赖文件
COPY --from=builder /app/package*.json ./
COPY --from=builder /app/pnpm-lock.yaml* ./

# 只安装生产依赖
RUN npm config set registry https://registry.npmmirror.com && \
    npm install -g pnpm && \
    pnpm install --prod --frozen-lockfile && \
    pnpm store prune

# 复制构建产物和源代码
COPY --from=builder /app/dist ./dist 2>/dev/null || true
COPY --from=builder /app/static ./static 2>/dev/null || true
COPY --from=builder /app/server.js ./
COPY --from=builder /app/src ./src
COPY --from=builder /app/config*.json ./ 2>/dev/null || true
COPY --from=builder /app/.env* ./ 2>/dev/null || true

# 创建数据目录
RUN mkdir -p /app/data /app/logs && \
    chown -R openclaw:openclaw /app

# 切换用户
USER openclaw

# 暴露端口
EXPOSE 8080

# 健康检查
HEALTHCHECK --interval=30s --timeout=3s --start-period=10s --retries=3 \
    CMD curl -f http://localhost:8080/health || exit 1

# 启动命令
CMD ["node", "server.js"]

17.5 编写 docker-compose.yml

cat > docker-compose.yml << 'EOF'
version: '3.8'

services:
  # OpenClaw 主服务
  openclaw:
    build:
      context: .
      dockerfile: Dockerfile
      target: production
    image: openclaw:latest
    container_name: openclaw-app
    restart: unless-stopped
    ports:
      - "8080:8080"
    environment:
      - NODE_ENV=production
      - PORT=8080
      - TZ=Asia/Shanghai
    volumes:
      - ./data:/app/data          # 数据持久化
      - ./logs:/app/logs          # 日志持久化
      - ./config.json:/app/config.json:ro  # 配置文件
      - ./.env:/app/.env:ro       # 环境变量
    networks:
      - openclaw-network
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s

  # Nginx 反向代理
  nginx:
    image: nginx:alpine
    container_name: openclaw-nginx
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
      - ./nginx/conf.d:/etc/nginx/conf.d:ro
      - ./nginx/ssl:/etc/nginx/ssl:ro
      - ./static:/var/www/static:ro
    depends_on:
      - openclaw
    networks:
      - openclaw-network

  # Redis(可选,用于缓存/队列)
  redis:
    image: redis:7-alpine
    container_name: openclaw-redis
    restart: unless-stopped
    ports:
      - "127.0.0.1:6379:6379"  # 仅本地访问
    volumes:
      - redis-data:/data
    networks:
      - openclaw-network
    command: redis-server --appendonly yes --maxmemory 256mb --maxmemory-policy allkeys-lru

  # 定时任务服务(可选)
  cron:
    build:
      context: .
      dockerfile: Dockerfile.cron  # 单独的 Dockerfile
    container_name: openclaw-cron
    restart: unless-stopped
    environment:
      - NODE_ENV=production
      - TZ=Asia/Shanghai
    volumes:
      - ./data:/app/data
      - ./logs:/app/logs
      - ./config.json:/app/config.json:ro
    depends_on:
      - openclaw
      - redis
    networks:
      - openclaw-network

networks:
  openclaw-network:
    driver: bridge

volumes:
  redis-data:
    driver: local
EOF

17.6 编写 Nginx Docker 配置

创建目录结构:

mkdir -p nginx/conf.d nginx/ssl

创建 nginx/nginx.conf

cat > nginx/nginx.conf << 'EOF'
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;

events {
    worker_connections 1024;
    use epoll;
    multi_accept on;
}

http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    # 日志格式
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';

    access_log /var/log/nginx/access.log main;

    # 性能优化
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;

    # Gzip 压缩
    gzip on;
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_types text/plain text/css text/xml application/json application/javascript application/rss+xml application/atom+xml image/svg+xml;

    # 包含站点配置
    include /etc/nginx/conf.d/*.conf;
}
EOF

创建 nginx/conf.d/openclaw.conf

cat > nginx/conf.d/openclaw.conf << 'EOF'
server {
    listen 80;
    server_name your-domain.com www.your-domain.com;
    
    # 安全头
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-XSS-Protection "1; mode=block" always;
    add_header Referrer-Policy "strict-origin-when-cross-origin" always;

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

    # 静态文件
    location /static/ {
        alias /var/www/static/;
        expires 30d;
        add_header Cache-Control "public, immutable";
    }

    # 反向代理到 OpenClaw
    location / {
        proxy_pass http://openclaw:8080;
        proxy_http_version 1.1;
        
        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_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Port $server_port;
        
        # WebSocket 支持
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        
        # 超时设置
        proxy_connect_timeout 60s;
        proxy_send_timeout 60s;
        proxy_read_timeout 60s;
    }

    # 健康检查
    location /nginx-health {
        access_log off;
        return 200 "healthy\n";
        add_header Content-Type text/plain;
    }
}
EOF

17.7 构建并启动

cd ~/workspace/openclaw

# 构建镜像
docker-compose build

# 启动服务(后台)
docker-compose up -d

# 查看状态
docker-compose ps

# 查看日志
docker-compose logs -f openclaw

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

17.8 常用 Docker 命令

命令 说明
docker-compose up -d 后台启动所有服务
docker-compose down 停止并移除容器
docker-compose ps 查看运行状态
docker-compose logs -f 查看实时日志
docker-compose logs -f openclaw 查看指定服务日志
docker-compose restart 重启所有服务
docker-compose restart openclaw 重启指定服务
docker-compose pull 拉取最新镜像
docker-compose build --no-cache 重新构建镜像
docker exec -it openclaw-app sh 进入容器内部
docker stats 查看资源占用

17.9 更新部署

cd ~/workspace/openclaw

# 拉取最新代码
git pull origin main

# 重新构建镜像
docker-compose build --no-cache

# 平滑重启(零停机)
docker-compose up -d

# 清理旧镜像
docker image prune -f

17.10 数据备份

# 备份数据卷
docker run --rm -v openclaw_data:/data -v $(pwd)/backup:/backup alpine tar czf /backup/openclaw-data-$(date +%Y%m%d).tar.gz -C /data .

# 备份数据库(如有)
docker exec openclaw-app sqlite3 /app/data/openclaw.db ".backup /app/data/backup.db"
docker cp openclaw-app:/app/data/backup.db ./backup/openclaw-$(date +%Y%m%d).db

# 自动备份脚本
cat > backup.sh << 'EOF'
#!/bin/bash
BACKUP_DIR="/home/admin/backup/openclaw"
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p $BACKUP_DIR

# 备份数据卷
docker run --rm -v openclaw_data:/data -v $BACKUP_DIR:/backup alpine \
    tar czf /backup/openclaw-data-$DATE.tar.gz -C /data .

# 保留最近 7 天的备份
find $BACKUP_DIR -name "openclaw-data-*.tar.gz" -mtime +7 -delete

echo "Backup completed: $BACKUP_DIR/openclaw-data-$DATE.tar.gz"
EOF
chmod +x backup.sh

# 添加到 crontab(每天凌晨 2 点备份)
echo "0 2 * * * /home/admin/backup.sh >> /home/admin/backup/backup.log 2>&1" | crontab -

17.11 监控与告警

# 安装 cAdvisor(容器监控)
docker run -d \
  --name=cadvisor \
  --restart=unless-stopped \
  -p 8081:8080 \
  -v /:/rootfs:ro \
  -v /var/run:/var/run:ro \
  -v /sys:/sys:ro \
  -v /var/lib/docker/:/var/lib/docker:ro \
  gcr.io/cadvisor/cadvisor:latest

# 查看容器资源使用
docker stats --no-stream

17.12 多环境配置

# 开发环境
docker-compose -f docker-compose.yml -f docker-compose.dev.yml up -d

# 测试环境
docker-compose -f docker-compose.yml -f docker-compose.test.yml up -d

# 生产环境
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d

创建 docker-compose.prod.yml

version: '3.8'

services:
  openclaw:
    restart: always
    deploy:
      resources:
        limits:
          cpus: '2'
          memory: 2G
        reservations:
          cpus: '1'
          memory: 512M
    logging:
      driver: "json-file"
      options:
        max-size: "100m"
        max-file: "5"

17.13 Docker vs 原生部署对比

对比项 原生部署 Docker 部署
安装复杂度 中(需手动装依赖) 低(一键启动)
环境隔离
资源占用 较低 稍高(容器开销)
启动速度 中等(需拉镜像)
迁移难度 低(打包镜像)
版本管理 易(镜像标签)
适合场景 单服务器、资源紧张 多服务器、快速扩展

17.14 故障排查

# 容器无法启动
docker-compose logs openclaw

# 进入容器排查
docker exec -it openclaw-app sh

# 检查网络连通性
docker exec openclaw-nginx ping openclaw

# 查看容器资源限制
docker inspect openclaw-app | grep -A 10 "Resources"

# 重置容器状态
docker-compose down
docker-compose up -d

# 清理无用资源
docker system prune -a --volumes

十八、选择部署方式

场景 推荐方案
个人测试/开发 Docker Compose
小型生产环境 原生部署 + PM2
中型生产环境 Docker + Compose
大型集群 Docker + Kubernetes
快速迁移/多云 Docker 镜像

14.4 卸载 OpenClaw

# 停止服务
pm2 stop all
pm2 delete all

# 移除 PM2 开机自启
pm2 unstartup systemd

# 删除目录
cd ~
rm -rf ~/workspace/openclaw

# 可选:删除 Node.js
nvm uninstall 18
rm -rf ~/.nvm

# 可选:删除 Nginx
sudo yum remove -y nginx
sudo rm -rf /etc/nginx

14.5 卸载 Docker 版 OpenClaw

cd ~/workspace/openclaw

# 停止并移除容器
docker-compose down -v

# 删除镜像
docker rmi openclaw:latest

# 清理数据卷(谨慎!)
docker volume rm openclaw_data openclaw_logs redis-data

# 清理网络
docker network rm openclaw-network

# 删除目录
rm -rf ~/workspace/openclaw

结语

按照本教程,你应该已经成功在 CentOS 服务器上部署了 OpenClaw。如遇到问题,请检查日志文件(~/workspace/openclaw/logs//var/log/nginx/),或参考常见问题章节。

祝使用愉快!


文档版本:v1.0
最后更新:2026-05-07
适用 OpenClaw 版本:latest

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐