1. 云服务器 OpenClaw 部署前,先把模型通道这件事想清楚
OpenClaw 是一个可以跑在云服务器上的开源 AI Agent 网关,它能通过飞书、Web UI 等渠道接收消息,再调用底层大模型完成对话、云文档操作、联网搜索等任务。适合谁?适合手里有一台 2 核 4G 小机器、想给自己或小团队搭一个私有 AI 助手的开发者。你不需要公网 IP,飞书走 WebSocket 长连接就能接入。
但真正跑起来之前,有一个容易被忽略的环节:模型 endpoint 和鉴权配置。OpenClaw 的 Onboarding 向导默认让你填一个 OpenAI 兼容的 API Base URL,很多人直接填了模型厂商的官方地址。这样做本身没问题,但当你后续想换模型、想统一管理多个渠道的 Key、想看调用量的时候,就会发现自己被绑死在单一入口上。
我这次部署的目标很明确:用 Docker 在云服务器上跑 OpenClaw Gateway,接入飞书机器人,底层模型走 DeepSeek,但 endpoint 和鉴权统一改到 TaoToken 通道。这样做的直接好处是,以后换模型只需要改一个 Base URL 和 Model ID,不用动 OpenClaw 本身的配置结构;同时所有渠道的调用都从一个入口出去,排查问题的时候链路清晰。
整条链路是这样的:飞书消息 → OpenClaw Gateway(Docker 容器)→ TaoToken 统一通道 → DeepSeek 模型 → 返回结果。Web UI 和飞书共用同一个 Gateway,配置只写一份。
下面我会按实际部署顺序,把 docker-compose 片段、环境变量清单、飞书回调验证步骤、连通性自检命令全部给出来。你跟着做,一次跑通的概率会高很多。
2. TaoToken 前置准备:拿 Key、选通道、确认 Base URL
在动 Docker 之前,先把 TaoToken 这边的准备工作做完。这一步不复杂,但顺序不能乱。
首先访问官网 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 注册账号。注册完成后进入控制台,找到 API Keys 管理页面。这里你可以创建多个 Key,建议按用途分开:一个给 OpenClaw 的 Gateway 用,一个留着做测试。创建时把 Key 复制下来,格式通常是 sk- 开头的一长串,后面配置环境变量要用。
然后是选通道。TaoToken 提供多种接入方式,对于 OpenClaw 这种走 OpenAI 兼容协议的场景,你只需要确认两件事:Base URL 和 Model ID。Base URL 统一用 https://taotoken.net/api,注意这个地址后面不加任何 UTM 参数,直接写就行。Model ID 根据你实际要调的模型来填,比如 deepseek-chat 对应 DeepSeek 的对话模型。
如果你后续打算长期跑编码类 Agent 任务,可以了解一下 Coding Plan,它在调用额度和通道稳定性上有针对性优化。如果只是先验证模型能不能通,可以直接用模型对话页面发一条测试消息,确认 Key 有效、通道正常,再回到服务器上配置。接入文档在 doc 页面有完整的参数说明,遇到不确定的字段先去那里查。
这里有个细节要注意:OpenClaw 的 Onboarding 向导里,LLM 提供商要选 “Custom Provider (Any OpenAI or Anthropic compatible endpoint)”,然后 API Base URL 填 https://taotoken.net/api,Endpoint 兼容模式选 “OpenAI-compatible (Uses /chat/completions)”。这样 OpenClaw 就会把所有模型请求发到 TaoToken 的统一入口,由 TaoToken 再转发到 DeepSeek。
Key 的管理建议:不要把 Key 直接写进 docker-compose.yml 或者 Dockerfile,统一放在 .env 文件里,通过 --env-file 加载。这样镜像可以复用,Key 泄露的风险也小。如果你用 git 管理部署脚本,记得把 .env 加进 .gitignore。
3. 可复制配置:docker-compose 片段与环境变量清单
这一节是全文的核心,所有配置都可以直接复制。我先把目录结构定下来,后面所有路径都基于这个结构。
/opt/openclaw/ # 项目根目录 /opt/openclaw/.env # 环境变量文件 /opt/openclaw-data/config/ # 持久化配置,挂载到容器 /home/node/.openclaw /opt/openclaw-data/workspace/ # Agent 工作区,挂载到容器 workspace先写 .env 文件。这里把 TaoToken 的 Base URL、Key、Model ID 全部集中管理:
# /opt/openclaw/.env OPENCLAW_CONFIG_DIR=/opt/openclaw-data/config OPENCLAW_WORKSPACE_DIR=/opt/openclaw-data/workspace OPENCLAW_GATEWAY_PORT=18789 OPENCLAW_BRIDGE_PORT=18790 OPENCLAW_GATEWAY_BIND=0.0.0.0 OPENCLAW_IMAGE=openclaw:local OPENCLAW_GATEWAY_TOKEN=placeholder_will_be_replaced HOME=/home/node TERM=xterm-256color # TaoToken 统一通道配置 TAOTOKEN_BASE_URL=https://taotoken.net/api TAOTOKEN_API_KEY=sk-你的TaoTokenKey TAOTOKEN_MODEL_ID=deepseek-chat注意 OPENCLAW_GATEWAY_TOKEN 这里先写占位值,Onboarding 跑完后再替换成真实 Token。TAOTOKEN_API_KEY 换成你控制台里创建的那个 Key。
接下来是 docker-compose.yml。我用 compose 而不是纯 docker run,是因为后面加 Tavily 环境变量、改资源限制的时候,compose 改起来更清晰:
# /opt/openclaw/docker-compose.yml version: "3.8" services: openclaw-gateway: image: openclaw:local container_name: openclaw-gateway restart: unless-stopped init: true networks: - openclaw-net env_file: - /opt/openclaw/.env ports: - "18789:18789" - "18790:18790" volumes: - /opt/openclaw-data/config:/home/node/.openclaw - /opt/openclaw-data/workspace:/home/node/.openclaw/workspace deploy: resources: limits: cpus: "1.5" memory: 2500M command: node /app/openclaw.mjs gateway --port 18789 --verbose networks: openclaw-net: driver: bridge ipam: config: - subnet: 172.30.0.0/24 gateway: 172.30.0.1这里有几个关键点。第一,env_file 指向 .env,所有环境变量自动注入容器。第二,volumes 把 config 和 workspace 挂到宿主机,容器删了数据还在。第三,deploy.resources.limits 限制 CPU 1.5 核、内存 2500M,防止小机器被吃光。第四,command 里用 node /app/openclaw.mjs 而不是 openclaw 命令,因为项目用 pnpm 管理依赖,入口文件是 .mjs。
构建镜像的命令:
cd /opt/openclaw docker build \ --build-arg NPM_CONFIG_REGISTRY=https://registry.npmmirror.com \ -t openclaw:local -f Dockerfile .构建完成后,先跑 Onboarding 向导。这一步会生成真实的 Gateway Token,并写入模型配置。注意向导里 API Base URL 填 https://taotoken.net/api,API Key 填你的 TaoToken Key,Model ID 填 deepseek-chat:
docker run --rm -it \ --name openclaw-onboard \ --network openclaw-net \ --env-file /opt/openclaw/.env \ -v /opt/openclaw-data/config:/home/node/.openclaw \ -v /opt/openclaw-data/workspace:/home/node/.openclaw/workspace \ openclaw:local \ node /app/openclaw.mjs onboard向导跑完后,配置文件在 /opt/openclaw-data/config/openclaw.json。你需要做三处修正:把 bind 从 loopback 改成 lan,把 .env 里的 Token 替换成真实值,把模型上下文窗口从默认的 4096 改成 131072。前两步用 sed 和 grep 组合完成:
sed -i 's/"bind": "loopback"/"bind": "lan"/' /opt/openclaw-data/config/openclaw.json T=$(grep -oP '"token":\s*"\K[^"]+' /opt/openclaw-data/config/openclaw.json) sed -i "s/^OPENCLAW_GATEWAY_TOKEN=.*/OPENCLAW_GATEWAY_TOKEN=$T/" /opt/openclaw/.env上下文窗口的修正用 Python 脚本处理,因为 JSON 嵌套比较深:
python3 - <<'EOF' import json p = '/opt/openclaw-data/config/openclaw.json' c = json.load(open(p)) m = c['models']['providers']['deepseek']['models'][0] m['contextWindow'] = 131072 m['maxTokens'] = 8192 json.dump(c, open(p, 'w'), indent=2) print('context window fixed') EOF到这里,TaoToken 的 endpoint 和鉴权配置就全部落到 OpenClaw 的配置文件里了。启动 Gateway:
cd /opt/openclaw docker compose up -d4. 验证请求:连通性自检与飞书回调确认
容器起来之后,不要急着去飞书发消息,先做三层自检。第一层是容器状态,第二层是 Gateway HTTP 响应,第三层是模型通道连通性。
容器状态检查:
docker ps --filter "name=openclaw-gateway" \ --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"预期输出里 STATUS 应该是 Up,PORTS 显示 0.0.0.0:18789-18790->18789-18790/tcp。如果容器反复重启,用 docker logs openclaw-gateway --tail 50 看日志。
Gateway HTTP 响应检查:
curl -s -o /dev/null -w "HTTP状态码: %{http_code}\n" http://localhost:18789/返回 200 说明 Gateway 在监听。如果返回 000,检查安全组和 ufw 是否放行了 18789 端口。
模型通道连通性检查,这一步直接验证 TaoToken 的 endpoint 是否配对了:
docker exec openclaw-gateway node /app/openclaw.mjs models test \ --provider deepseek --model deepseek-chat如果输出里出现 Verification successful 或者类似的成功标识,说明 OpenClaw 已经能通过 TaoToken 的 Base URL 调到 DeepSeek 模型。如果报 401,说明 Key 不对;如果报 connection refused,说明 Base URL 写错了。
飞书回调验证要等飞书应用配置完之后做。先在飞书开放平台把事件订阅配好,选择“使用长连接接收事件”,添加 im.message.receive_v1 事件。然后在服务器上确认飞书通道状态:
docker exec openclaw-gateway node /app/openclaw.mjs channels status预期输出里 Feishu 那一行应该是 enabled, configured, running。如果 configured 是 false,说明 App ID 或 App Secret 没写进去,重新执行 config set 命令。
最后在飞书里给机器人发一条消息,比如“你好”。机器人会先回复配对码,你在服务器上批准:
docker exec openclaw-gateway node /app/openclaw.mjs pairing approve feishu <配对码>批准后再发一条消息,如果 AI 正常回复,整条链路就通了。首条消息有几秒延迟是正常的,因为 Agent 要加载 workspace 里的 SOUL.md 和 USER.md。
5. 本篇常见错排查:401、local proxy failed、reading choices、OAuth
部署过程中最容易卡住的几个报错,我按实际遇到的频率排个序,每个都给出定位方法和修复命令。
401 Unauthorized。这个通常出现在模型调用阶段,日志里会写 “invalid api key” 或者 “authentication failed”。原因一般是 .env 里的 TAOTOKEN_API_KEY 没填对,或者 Onboarding 时填的 Key 和 .env 里的不一致。排查方法:
docker exec openclaw-gateway env | grep TAOTOKEN_API_KEY确认输出的 Key 和你控制台里的一致。如果不一致,改 .env 后必须删容器重建,docker restart 不会重新读 env 文件:
docker compose down && docker compose up -dlocal proxy failed。这个报错说明 OpenClaw 尝试走本地代理但失败了。常见原因是环境变量里残留了 HTTP_PROXY 或 HTTPS_PROXY,或者 Base URL 写成了 localhost 但容器内没有对应服务。检查:
docker exec openclaw-gateway env | grep -i proxy如果有输出,在 .env 里把这些变量清空,然后重建容器。另外确认 TAOTOKEN_BASE_URL 是 https://taotoken.net/api,不是 http,也不是带路径的地址。
reading choices。这个报错一般出现在模型返回格式不符合预期的时候,日志里会写 “cannot read property choices of undefined”。根因通常是 Base URL 指向了一个不兼容 OpenAI 协议的端点,或者 Model ID 填错了。确认两件事:Base URL 是 https://taotoken.net/api,Model ID 是 deepseek-chat。如果用的是其他模型,去 doc 页面查对应的 Model ID。
OAuth 相关报错。如果你在飞书配置阶段看到 OAuth 字样,通常是飞书应用的权限没开全,或者事件订阅没配。回到飞书开放平台,确认 im:message、im:message:send_as_bot、im:message.p2p_msg:readonly 这三个权限已开通,事件订阅里 im.message.receive_v1 已添加。改完权限后必须发布新版本才生效。
还有一个隐蔽的坑:模型上下文窗口太小。报错信息是 “Model context window too small (4096 tokens). Minimum is 16000.”。这是 Onboarding 默认值导致的,按第 3 节的 Python 脚本改成 131072 就行。
6. 后续维护与 CTA
日常维护主要做三件事:看日志、备份数据、更新镜像。看日志用 docker logs openclaw-gateway --tail 100 -f,重点看有没有 401 或 timeout。备份就是把 /opt/openclaw-data/ 打包:
tar -czf /root/openclaw-backup-$(date +%Y%m%d).tar.gz /opt/openclaw-data/更新镜像的流程是 git pull、docker build、docker compose down、docker compose up -d。因为数据都在宿主机挂载目录里,重建容器不会丢配置。
如果你在排障过程中需要重新生成 Key 或者查接入参数,直接去 API Keys 页面操作,接入文档在 doc 页面。想先验证模型通道是否正常,可以用模型对话页面发一条测试消息,不用动服务器。长期跑编码类 Agent 任务的话,Coding Plan 在调用额度上更适合持续使用。
整条链路跑通之后,你手里就有了一个能通过飞书对话、能操作云文档、能联网搜索的私有 AI 助手,而底层模型通道是统一管理的。以后换模型、加渠道,只需要改 .env 里的 Base URL 和 Model ID,OpenClaw 本身不用动。