1. 为什么要在 RockyLinux 上用 Docker 跑 OpenClaw 并接入飞书
OpenClaw 是一个可以执行 Shell 命令、读写服务器文件、对接大模型完成自动化运维任务的 AI Agent 框架。它本身不是一个聊天工具,而是一个“能动手干活”的机器人内核——你给它发一条消息,它可以帮你查日志、跑脚本、分析报错,甚至根据你的描述生成一段 Nginx 配置。适合谁用?运维工程师、后端开发、个人站长,以及任何想让 AI 帮自己盯着服务器的人。
但 OpenClaw 原生自带的 Web UI 体验比较简陋,而且默认只允许本机访问,远程调试还得配 SSH 隧道,日常用起来并不顺手。飞书机器人恰好补上了这块短板:手机、电脑、平板都能直接对话,消息卡片展示清晰,企业内网也能稳定长连接。所以这套组合的核心思路就是——OpenClaw 在 RockyLinux 上以 Docker 方式常驻运行,飞书作为前端交互入口,模型请求统一走 TaoToken 的 Key,省去多平台反复配置的麻烦。
我试过在 RockyLinux 9 上从零走一遍完整链路,踩过的坑主要集中在三块:Node.js 版本不够导致 npm 安装失败、GitHub 拉取插件超时、飞书事件订阅没配对导致机器人“已读不回”。下面把每一步都拆开写清楚,命令可以直接复制,配置片段按路径对应改就行。整篇围绕 RockyLinux Docker 部署 OpenClaw 接入飞书机器人这条主线,把环境准备、容器编排、回调验证、模型 Key 统一配置全部串起来。
2. 前置准备:TaoToken 统一 Key 与飞书应用创建
2.1 为什么用 TaoToken 统一管理模型 Key
OpenClaw 支持多种模型供应商,但如果你同时用 Claude 写方案、用 Qwen 跑脚本、用 DeepSeek 做日志分析,每个平台都要单独申请 Key、单独配 endpoint,配置文件会变得很乱。TaoToken 提供统一的 API 入口,一个 Key 就能调用多个主流模型,Base URL 固定为https://taotoken.net/api,OpenClaw 的 settings 里只需要改一处 endpoint 和一处 Key,切换模型时只改 Model ID 即可。
具体操作:访问官网 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 注册后,进入控制台 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console 创建 API Key。建议给 OpenClaw 单独建一个 Key,方便后续按项目排查用量。创建完成后,在 API Keys 页面 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys 复制 Key 字符串,格式通常是sk-开头的一长串。
注意:Key 只显示一次,复制后先存到密码管理器或临时文件,后面写进 OpenClaw 配置时要用。
2.2 飞书自建应用创建与权限开通
登录飞书开放平台,进入开发者后台,点击“创建企业自建应用”,名称填OpenClaw_Bot,上传图标后确认。创建完成后,在左侧“凭证与基础信息”里拿到App ID和App Secret,这两个值后面配置 OpenClaw 飞书插件时要用。
权限管理是重点。在“权限管理”搜索并勾选以下权限:
| 权限标识 | 用途 |
|---|---|
| im:message | 接收与发送单聊消息 |
| im:chat | 读取群组信息、发送群聊消息 |
| contact:user.base:readonly | 获取用户基本信息 |
| im:message:send_as_bot | 以机器人身份发送消息 |
| im:chat:readonly | 读取群聊信息 |
| im:chat:read | 查看群信息 |
| contact:user.employee_id:readonly | 获取用户 ID |
| im:resource | 处理图片/文件(建议开启) |
im:message.p2p_msg:readonly这个权限在应用未发布前可能无法勾选,提示“此权限暂时不添加”,先跳过,等 OpenClaw 配置成功后再回来补。
接着在“应用能力”里添加“机器人”能力,否则应用无法在对话框里聊天。然后进入“版本管理与发布”,创建版本,详情描述填“初始版本”,可用范围选“所有人”或仅自己,保存后申请线上发布。企业管理员直接通过,普通员工需等审批。
最后配置事件订阅:左侧“事件与回调” → “事件配置”,订阅方式选“使用长连接接收事件”,保存后添加事件im.message.receive_v1,确认开通权限。添加事件后需要再次创建版本并发布,否则事件不生效。
3. RockyLinux Docker 部署 OpenClaw 可复制配置
3.1 系统基础配置与 Node.js 环境
RockyLinux 默认的软件源在国内访问较慢,先换成阿里云镜像:
sed -e 's|^mirrorlist=|#mirrorlist=|g' \ -e 's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.aliyun.com/rockylinux|g' \ -i.bak /etc/yum.repos.d/rocky*.repo dnf makecacheSELinux 和防火墙按需处理。如果是内网测试环境,可以临时关闭:
grubby --update-kernel ALL --args selinux=0 systemctl stop firewalld.service systemctl disable firewalld.service rebootNode.js 版本必须 ≥ 22。官方 rpm 源在国内可能超时,直接用阿里云二进制包:
cd /usr/local/src wget https://mirrors.aliyun.com/nodejs-release/v24.1.0/node-v24.1.0-linux-x64.tar.xz tar -xJvf node-v24.1.0-linux-x64.tar.xz -C /usr/local --strip-components=1 node -v # 应输出 v24.1.0 npm -v # 应输出 10.x 以上--strip-components=1的作用是去掉最外层目录,把bin、lib直接放到/usr/local下,这样node命令全局可用。
3.2 Docker 与 docker-compose 安装
dnf install -y dnf-plugins-core dnf config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo dnf install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin systemctl enable --now docker docker --version docker compose version3.3 获取 OpenClaw 初始化配置
先创建目录结构,再从临时容器里拷贝默认配置:
mkdir -p ~/openclaw/nginx/{conf,cert} cd ~/openclaw docker run -itd --name openclaw-temp ghcr.nju.edu.cn/openclaw/openclaw:latest docker cp openclaw-temp:/home/node/.openclaw ./ chmod 777 -R .openclaw/ docker stop openclaw-temp docker rm openclaw-temp3.4 自签 HTTPS 证书与 Nginx 配置
OpenClaw UI 要求 HTTPS,先生成自签证书:
cd ~/openclaw/nginx/cert openssl req -x509 -newkey rsa:2048 \ -keyout example.key -out example.crt \ -days 365 -nodes -subj "/CN=example.com"创建~/openclaw/nginx/conf/nginx.conf:
worker_processes auto; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; client_max_body_size 1024m; server_tokens off; server { listen 443 ssl http2; server_name localhost; ssl_certificate /etc/nginx/cert/example.crt; ssl_certificate_key /etc/nginx/cert/example.key; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; location / { proxy_pass http://openclaw-gateway:18789; 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 7d; proxy_send_timeout 7d; proxy_read_timeout 7d; } } }3.5 docker-compose.yaml 完整片段
创建~/openclaw/docker-compose.yaml:
services: openclaw-gateway: image: ghcr.nju.edu.cn/openclaw/openclaw:latest container_name: openclaw restart: unless-stopped volumes: - ./.openclaw:/home/node/.openclaw environment: - TZ=Asia/Shanghai mem_limit: 6g logging: driver: json-file options: max-size: "10m" max-file: "3" openclaw-nginx: image: nginx:1.23.4 container_name: openclaw-nginx restart: always ports: - 443:443 volumes: - ./nginx/conf/nginx.conf:/etc/nginx/nginx.conf - ./nginx/cert:/etc/nginx/cert privileged: true depends_on: - openclaw-gateway启动:
cd ~/openclaw docker compose up -d3.6 初始化 OpenClaw 并修改 settings 指向 TaoToken
进入容器执行 onboard:
docker exec -it openclaw /bin/bash openclaw onboard按提示选择 QuickStart,模型供应商先随便选一个(后面手动改配置),API Key 随便填,渠道选 Skip for now,搜索选 Skip,技能选 No,Hooks 选 Skip,最后选 Do this later。退出容器。
编辑~/openclaw/.openclaw/openclaw.json,找到 gateway 部分,把 bind 改为lan,并添加 allowedOrigins:
"gateway": { "port": 18789, "mode": "local", "bind": "lan", "controlUi": { "allowedOrigins": [ "http://localhost:18789", "http://127.0.0.1:18789", "https://你的宿主机IP" ] }, "auth": { "mode": "token", "token": "你的token" } }然后把模型 endpoint 和 Key 改成 TaoToken。在openclaw.json的 models 或 providers 段(不同版本字段名略有差异,以实际文件为准)写入:
"providers": { "taotoken": { "baseUrl": "https://taotoken.net/api", "apiKey": "sk-你的TaoTokenKey", "api": "openai-completions", "models": [ { "id": "claude-3-5-sonnet-latest", "name": "Claude 3.5 Sonnet" }, { "id": "deepseek-chat", "name": "DeepSeek Chat" } ] } }重启容器:
docker compose restart3.7 设备授权与 Web UI 登录
浏览器访问https://宿主机IP,输入 token,如果提示pairing required,进入容器执行:
docker exec -it openclaw /bin/bash openclaw devices list openclaw devices approve <Request ID>再次点击连接即可进入 Web UI。
4. 飞书机器人接入与消息收发验证
4.1 在 OpenClaw 中配置飞书渠道
进入容器执行:
docker exec -it openclaw /bin/bash openclaw channels add选择 Feishu/Lark,插件安装方式选Use local plugin path,然后依次输入:
- App ID:飞书后台“凭证与基础信息”里的 App ID
- App Secret:同上
- Verification Token:飞书后台“事件与回调”里的 Verification Token
- 连接模式:选WebSocket(内网服务器无需公网 IP)
- 域名:选国内版
feishu.cn - 群聊响应策略:选
Open - respond in all groups (requires mention) - 搜索插件:Skip for now
- 技能:选 Yes,安装 clawhub
- 包管理器:选 npm
- 其他 API Key:全部选 No
- Hooks:空格选中
command-logger和session-memory,回车确认
完成后会提示Configuration saved to /root/.openclaw/openclaw.json。
4.2 飞书后台事件订阅与权限补全
回到飞书开放平台,进入应用后台:
- “事件与回调” → “事件配置”,订阅方式选“使用长连接接收事件”,添加事件
im.message.receive_v1。 - “权限管理”里补上
im:message.p2p_msg:readonly。 - “版本管理与发布”创建新版本并发布。
4.3 配对码授权与消息联调
打开飞书电脑端,搜索应用名称,进入对话窗口,发送一条消息。此时机器人不会直接回复,而是返回一个配对码,例如Pairing code: 9MMEH7Y8。
回到服务器终端执行:
openclaw pairing approve feishu 9MMEH7Y8显示配置保存成功后,再次在飞书发送消息,机器人正常回复即表示链路打通。
查看当前模型:
/model status输出示例:
Current: taotoken/claude-3-5-sonnet-latest Default: taotoken/claude-3-5-sonnet-latest Auth file: ~/.openclaw/agents/main/agent/auth-profiles.json [taotoken] endpoint: https://taotoken.net/api api: openai-completions4.4 验证请求是否走通 TaoToken
在飞书里发一条需要调用模型的消息,比如“帮我写一个查看磁盘占用的 shell 命令”。如果机器人返回了合理内容,说明模型请求已经通过 TaoToken 的 endpoint 发出并成功返回。你也可以在 TaoToken 控制台的用量页面看到对应的调用记录,确认 Key 和 endpoint 配置正确。
5. 常见报错排查:401、local proxy failed、reading choices、OAuth
5.1 401 Unauthorized
现象:飞书机器人回复“模型请求失败”,容器日志出现401 Unauthorized。
原因:TaoToken Key 填错、Key 已过期、或者openclaw.json里apiKey字段没写对。
排查:
docker exec -it openclaw /bin/bash cat /home/node/.openclaw/openclaw.json | grep -A5 taotoken确认baseUrl是https://taotoken.net/api,apiKey是sk-开头的完整字符串。如果 Key 没问题,去 TaoToken 控制台检查该 Key 是否被禁用或额度耗尽。
5.2 local proxy failed
现象:容器日志出现local proxy failed或connection refused。
原因:OpenClaw 容器内无法访问外部网络,或者 DNS 解析失败。
排查:
docker exec -it openclaw /bin/bash curl -I https://taotoken.net/api如果 curl 不通,检查宿主机 DNS:
cat /etc/resolv.conf建议改成223.5.5.5或119.29.29.29,然后重启 Docker:
systemctl restart docker docker compose restart5.3 reading choices 报错
现象:日志出现error reading choices或invalid response format。
原因:模型返回格式与 OpenClaw 预期不一致,通常是api字段配置错误。TaoToken 兼容 OpenAI 格式,所以api应设为openai-completions。
排查:检查openclaw.json中 provider 的api字段,确保不是anthropic-messages或其他格式。如果用的是 Claude 模型,TaoToken 已经做了格式转换,统一用openai-completions即可。
5.4 OAuth 相关报错
现象:日志出现OAuth token expired或refresh failed。
原因:如果你之前配置过 Qwen 的 OAuth 登录,auth-profiles.json 里可能残留了过期的 OAuth 凭证,OpenClaw 优先读取了旧配置。
排查:
docker exec -it openclaw /bin/bash cat /home/node/.openclaw/agents/main/agent/auth-profiles.json如果里面有qwen-portal的 OAuth 记录,手动删除该段,或者直接清空文件后重新用 TaoToken 的 Key 配置:
echo '{}' > /home/node/.openclaw/agents/main/agent/auth-profiles.json然后重启容器,重新在飞书发消息测试。
5.5 飞书机器人无响应
现象:飞书发消息后机器人完全没反应,也没有配对码返回。
原因:事件订阅没配好,或者应用版本没发布。
排查:
- 确认飞书后台“事件与回调”里订阅方式是“使用长连接接收事件”。
- 确认
im.message.receive_v1已添加。 - 确认应用版本已发布且可用范围包含你。
- 查看容器日志:
docker logs -f openclaw如果日志里没有飞书相关输出,说明 WebSocket 没连上,检查 App ID 和 App Secret 是否填错。
6. 接入文档与模型验证入口
整套链路跑通后,日常使用中最常做的两件事:一是验证模型是否正常返回,二是排查 Key 和 endpoint 配置。模型对话入口可以直接在浏览器里测试 TaoToken 的连通性:https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=chat ,输入一段 prompt,看是否正常返回内容。如果这里不通,OpenClaw 里肯定也不通,先解决这一层。
接入文档里对 Base URL、Key 格式、Model ID 列表有详细说明:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc 。遇到reading choices或401时,对照文档检查api字段和 Key 权限。
如果你打算长期跑编码类任务或 Agent 自动化,Coding Plan 提供了更稳定的调用配额:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan 。OpenClaw 的command-logger和session-memory两个 Hook 开启后,对话上下文会保留较长时间,配合 Coding Plan 的额度更适合持续运维场景。
最后提醒一点:飞书机器人的配对码机制是保护服务器安全的第一道门。任何未授权的用户发消息只会拿到配对码,不会执行任何命令。如果机器人被拉进群,只有 @ 它才会响应,且群聊响应策略可以在openclaw.json里改成白名单模式,只允许特定群使用。这些配置在openclaw channels add时已经设好,后续需要调整可以直接编辑配置文件后重启容器。