多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

云服务器 OpenClaw + 飞书 + DeepSeek 部署实战:把 endpoint 改到 TaoToken 的完整配置

云服务器 OpenClaw + 飞书 + DeepSeek 部署实战:把 endpoint 改到 TaoToken 的完整配置 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 GatewayDocker 容器→ TaoToken 统一通道 → DeepSeek 模型 → 返回结果。Web UI 和飞书共用同一个 Gateway配置只写一份。下面我会按实际部署顺序把 docker-compose 片段、环境变量清单、飞书回调验证步骤、连通性自检命令全部给出来。你跟着做一次跑通的概率会高很多。2. TaoToken 前置准备拿 Key、选通道、确认 Base URL在动 Docker 之前先把 TaoToken 这边的准备工作做完。这一步不复杂但顺序不能乱。首先访问官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_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/apiEndpoint 兼容模式选 “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_PORT18789 OPENCLAW_BRIDGE_PORT18790 OPENCLAW_GATEWAY_BIND0.0.0.0 OPENCLAW_IMAGEopenclaw:local OPENCLAW_GATEWAY_TOKENplaceholder_will_be_replaced HOME/home/node TERMxterm-256color # TaoToken 统一通道配置 TAOTOKEN_BASE_URLhttps://taotoken.net/api TAOTOKEN_API_KEYsk-你的TaoTokenKey TAOTOKEN_MODEL_IDdeepseek-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_REGISTRYhttps://registry.npmmirror.com \ -t openclaw:local -f Dockerfile .构建完成后先跑 Onboarding 向导。这一步会生成真实的 Gateway Token并写入模型配置。注意向导里 API Base URL 填 https://taotoken.net/apiAPI Key 填你的 TaoToken KeyModel ID 填 deepseek-chatdocker 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), indent2) print(context window fixed) EOF到这里TaoToken 的 endpoint 和鉴权配置就全部落到 OpenClaw 的配置文件里了。启动 Gatewaycd /opt/openclaw docker compose up -d4. 验证请求连通性自检与飞书回调确认容器起来之后不要急着去飞书发消息先做三层自检。第一层是容器状态第二层是 Gateway HTTP 响应第三层是模型通道连通性。容器状态检查docker ps --filter nameopenclaw-gateway \ --format table {{.Names}}\t{{.Status}}\t{{.Ports}}预期输出里 STATUS 应该是 UpPORTS 显示 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/apiModel 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 IDOpenClaw 本身不用动。
返回列表