CentOS安装OpenClaw教程
按照本教程,你应该已经成功在 CentOS 服务器上部署了 OpenClaw。如遇到问题,请检查日志文件(
CentOS 服务器安装 OpenClaw 完整教程
适用系统:CentOS 7/8、Alibaba Cloud Linux 3、Rocky Linux、AlmaLinux
更新时间:2026-05-07
作者:AI 助手
目录
- 系统要求
- 环境准备
- 安装依赖
- 安装 Node.js
- 安装 Python
- 安装 PM2
- 安装 OpenClaw
- 配置 OpenClaw
- 启动服务
- 配置 Nginx 反向代理
- 配置防火墙
- 设置开机自启
- 常见问题
- 附录
一、系统要求
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 申请公众号
- 访问 微信公众平台
- 注册账号(订阅号/服务号/企业微信)
- 完成认证(服务号需 300 元/年认证费)
- 获取 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 机器人
- 访问 QQ 开放平台
- 注册开发者账号
- 创建机器人应用
- 获取 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
- 访问 Discord Developer Portal
- New Application → Bot → Add Bot
- 获取 Bot Token(注意保密!)
- OAuth2 → URL Generator → 勾选
bot权限 - 邀请 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
- 在 Telegram 搜索
@BotFather - 发送
/newbot命令 - 按提示设置名称和用户名
- 获取 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 创建钉钉机器人
- 打开钉钉群 → 群设置 → 智能群助手
- 点击「添加机器人」→ 选择「自定义」
- 填写机器人名称(如:AI助手)
- 安全设置(三选一):
- 自定义关键词(如:AI、助手)
- 加签(推荐,生成签名密钥)
- IP 地址段
- 复制 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 创建飞书机器人
- 打开 飞书开放平台
- 创建企业自建应用
- 进入「添加应用能力」→ 添加「机器人」
- 获取 App ID 和 App Secret
- 配置事件订阅:
- 请求地址:
https://your-domain.com/webhook/feishu - 加密密钥:随机生成
- 验证令牌:自定义
- 请求地址:
- 订阅事件:
im.message.receive_v1(接收消息)im.message.message_read_v1(消息已读)
- 发布应用到企业
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 企业微信应用(内部应用)
- 登录 企业微信管理后台
- 应用管理 → 创建应用
- 填写应用名称、上传 Logo
- 获取 AgentId、Secret
- 设置接收消息:
- URL:
https://your-domain.com/webhook/wecom - Token:随机生成
- EncodingAESKey:随机生成
- URL:
- 配置可信域名:
your-domain.com
9.9.2 企业微信机器人(群机器人)
- 进入企业微信群 → 群设置 → 添加群机器人
- 填写机器人名称
- 复制 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
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐



所有评论(0)