1. 为什么在阿里云 ECS 上部署 OpenClaw 会卡在模型鉴权
OpenClaw(前身 Clawdbot)是一套可以跑在服务器上的 AI 任务执行框架,它能接聊天入口、能调工具、能跑自动化流程,适合想自己搭一套「发指令、AI 干活」环境的开发者和小团队。很多人第一次部署会选阿里云 ECS,因为弹性算力、公网 IP、快照备份都现成,装完 Docker 就能起服务。但真正让人卡住的往往不是安装,而是模型鉴权:OpenClaw 要调大模型,你得给它一个能用的 API 通道,而不同模型厂商的 Key、Base URL、请求格式都不一样,配一个能跑,配三个就开始乱。
我自己在 ECS 上从零跑 OpenClaw 时,最先踩的坑就是 Key 分散。对话用一个 Key,工具调用想换另一个模型又得改配置,日志里时不时冒出 401,排查半天发现是某个环境变量没生效。后来我把所有模型请求统一指向 TaoToken 的 API 通道,用一套 Key 管住对话和工具调用,配置量直接降下来。这篇就按「阿里云 ECS 从零部署 + TaoToken 统一 Key 接入 + curl 验证连通」的顺序写,命令和配置都能直接复制。
先说清楚适合谁:如果你只是想在本地玩一下,Docker Desktop 就够了;但如果你要 7×24 小时跑、要公网访问、要接聊天入口,那 ECS 是更稳的选择。OpenClaw 本身是轻量服务,2 核 4G 起步就能跑,重点是网络和鉴权要配通。下面所有操作基于 CentOS 8.x,其他发行版把 yum 换成对应包管理器即可。
核心检索词先点明:OpenClaw(Clawdbot)在阿里云服务器上的搭建,本质是「装 Docker → 起服务 → 配模型通道 → 验证请求」四步,其中模型通道用 TaoToken 统一接入,能省掉多 Key 来回切换的麻烦。TaoToken 官网是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 入口是 https://taotoken.net/api ,后面配置里会反复用到。
2. TaoToken 前置准备:一套 Key 管住对话与工具调用
在动 ECS 之前,先把模型通道准备好,否则服务起来了也没法验证。TaoToken 的作用是提供一个统一的 API 入口,你把请求发到 https://taotoken.net/api ,用同一个 Key 就能调不同模型,OpenClaw 里不用为每个模型单独写一套鉴权。对部署来说,这意味着环境变量和配置文件都能收敛成一份,排障时也只需要盯一个 Base URL。
第一步是拿 Key。进入控制台的 API Keys 页面创建,地址是 https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。创建后复制出来,形如sk-xxxx,这个值只显示一次,丢了就重新建。建议按用途分 Key,比如一个给 OpenClaw 主服务,一个给测试脚本,方便后面按 Key 看调用量。
第二步是确认模型 ID。OpenClaw 的配置里要填 Model ID,这个 ID 必须和 TaoToken 支持的模型名一致,不能自己编。你可以在模型对话页面先试跑一次,确认模型可用,地址是 https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。选一个你常用的对话模型,记下它的准确名称,后面写进配置文件。
第三步是理解接入方式。TaoToken 兼容常见的 OpenAI 风格请求,所以 OpenClaw 里凡是需要填base_url或api_base的地方,统一写https://taotoken.net/api,Key 填刚创建的那串。注意 API 地址不要加 UTM 参数,保持干净,否则某些客户端会把查询串带进签名导致鉴权失败。
这里有个容易忽略的点:OpenClaw 的工具调用(function calling)和普通对话走的是同一个通道,但请求体里会多 tools 字段。如果你用的模型不支持工具调用,日志里会出现解析错误。所以选模型时优先选支持 function calling 的,先在模型对话页面确认它能正常返回结构化结果,再写进 OpenClaw。
前置准备做完,你手里应该有三样东西:TaoToken 的 API Key、一个确认可用的 Model ID、统一的 Base URLhttps://taotoken.net/api。这三样就是后面所有配置的核心,缺一个都会在验证阶段报错。如果你还想跑长期编码或 Agent 任务,可以顺带看下 Coding Plan 页面 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,按套餐选更划算,但本文的验证流程用按量 Key 就够。
3. 阿里云 ECS 环境与 OpenClaw 可复制配置
这一节是全文技术重心,从 ECS 登录到 OpenClaw 起服务,再到把模型请求指向 TaoToken,全部给可复制的片段。先登录 ECS,替换成你的公网 IP:
ssh root@你的ECS公网IP更新系统并装 Docker:
yum update -y yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo yum install -y docker-ce docker-ce-cli containerd.io systemctl start docker systemctl enable docker docker --version装 Docker Compose:
curl -L "https://github.com/docker/compose/releases/download/v2.24.6/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose docker-compose --version创建 OpenClaw 工作目录,写docker-compose.yml。注意这里把模型通道的环境变量直接写进 compose,OpenClaw 启动时就能读到:
mkdir -p /opt/openclaw && cd /opt/openclawversion: '3.8' services: openclaw: image: openclaw/openclaw:2026-latest container_name: openclaw-core restart: unless-stopped ports: - "3000:3000" environment: - NODE_ENV=production - PORT=3000 - LOG_LEVEL=info - OPENAI_API_BASE=https://taotoken.net/api - OPENAI_API_KEY=sk-你的TaoTokenKey - DEFAULT_MODEL=你的ModelID volumes: - ./data:/app/data networks: - openclaw-network networks: openclaw-network: driver: bridge如果你更习惯用.env文件管理密钥,可以改成引用方式,避免 Key 写进 compose 被提交到仓库:
cat > /opt/openclaw/.env <<'EOF' OPENAI_API_BASE=https://taotoken.net/api OPENAI_API_KEY=sk-你的TaoTokenKey DEFAULT_MODEL=你的ModelID EOF然后在 compose 里把 environment 换成env_file: - .env。两种方式效果一样,按你的密钥管理习惯选。
启动服务并看日志:
cd /opt/openclaw docker-compose up -d docker-compose logs curl http://localhost:3000/healthhealth返回{"status":"ok"}说明服务本身起来了,但这还不代表模型通道通了。接下来单独验证 TaoToken 通道,用 curl 直接打 API,确认 Key 和 Base URL 没问题:
curl https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer sk-你的TaoTokenKey" \ -H "Content-Type: application/json" \ -d '{ "model": "你的ModelID", "messages": [{"role": "user", "content": "只回复两个字:通了"}] }'如果返回里有choices字段和正常内容,说明通道 OK。这一步很关键,它把「服务问题」和「鉴权问题」分开了:curl 通、OpenClaw 不通,就是 OpenClaw 配置没读到;curl 就不通,先解决 Key 或模型 ID。
再回到 OpenClaw 侧验证工具调用。进容器发一条带工具的请求,或者直接在管理后台的对话页发一句会触发工具的消息,然后看日志:
docker exec -it openclaw-core tail -f /app/logs/app.log日志里出现请求发出、模型返回、工具解析成功的记录,就说明对话和工具调用都跑通了。如果只看到对话成功、工具调用报错,多半是模型不支持 function calling,换一个支持工具调用的 Model ID 再试。
4. 验证请求与成功结果:curl 与日志双确认
配置写完不算完,得看到真实返回才算跑通。这一节把验证拆成三层:通道层、服务层、业务层,每层都有明确的成功标志,避免「看起来起了其实没通」。
通道层就是上面那条 curl。成功返回长这样,重点看choices[0].message.content有内容:
{ "id": "chatcmpl-xxx", "object": "chat.completion", "choices": [ { "index": 0, "message": {"role": "assistant", "content": "通了"}, "finish_reason": "stop" } ] }如果返回 401,说明 Key 不对或没带上;返回 404,多半是路径写错,注意是/api/v1/chat/completions;返回模型不存在,就是 Model ID 和平台不一致。这三种错误在下一节会逐个对照。
服务层看 OpenClaw 的 health 和启动日志。curl http://localhost:3000/health返回 ok,docker-compose logs里没有 ERROR,说明服务进程正常。这时候如果对话还是失败,问题一定在模型通道配置,不在服务本身。
业务层就是实际发一条会触发工具调用的指令。比如让 OpenClaw 查个时间或做个简单计算,观察日志里是否出现工具调用的往返记录。成功时你会看到类似「tool_call 请求 → 模型返回 tool_calls → 执行工具 → 结果回传 → 模型总结」的完整链路。这条链路跑通,才叫「对话与工具调用一次性跑通」。
我实测下来,最容易出问题的是环境变量没被容器读到。比如你在宿主机export了 Key,但 compose 里没写 environment,容器里就是空的。验证方法是进容器打印环境变量:
docker exec -it openclaw-core env | grep -i openai能看到OPENAI_API_BASE和OPENAI_API_KEY就说明注入成功。看不到就回去检查 compose 的 environment 或 env_file 配置,改完docker-compose up -d重建容器。
还有一个细节:改完配置一定要docker-compose up -d而不是restart,因为 environment 变更需要重建容器才生效,restart只是重启进程,读的还是旧环境。这个坑我踩过,改了 Key 半天不生效,最后发现是重启方式不对。
5. 本篇常见报错排查:401、local proxy failed、reading choices
部署过程中会遇到的报错其实就那么几类,逐个对照能省很多时间。下面按真实报错信息来,每条都给定位思路和修法。
401 Unauthorized。这是最常见的鉴权失败。先确认 curl 里Authorization: Bearer sk-xxx的 Key 有没有多余空格,再确认 Key 没被截断。如果 curl 通但 OpenClaw 报 401,就是容器里环境变量没读到,用上面env | grep的方法检查。还有一种情况是 Key 被禁用或额度用完,去控制台 API Keys 页面看状态。
local proxy failed / connection refused。这类报错说明请求根本没发出去,通常是 Base URL 写错或网络不通。确认OPENAI_API_BASE是https://taotoken.net/api,不要多写/v1也不要少写。然后在 ECS 上直接curl -I https://taotoken.net/api看能不能通,通不了就是 ECS 出网有问题,检查安全组出方向规则。
Error reading choices / choices 字段为空。这个报错说明请求发出去了、也返回了,但返回体里没有choices,常见原因是模型 ID 写错,平台返回了一个错误结构,客户端却按成功解析。解决办法是先用 curl 单独打一次,看原始返回里到底是choices还是error。如果是error,里面通常有明确原因,比如模型不存在或参数不合法。
OAuth / token 相关报错。如果你在 OpenClaw 里配了需要 OAuth 的入口,报错可能来自入口侧而不是模型侧。先确认模型通道 curl 是通的,把问题范围缩小到入口配置。模型通道本身用 API Key 就够,不需要 OAuth,别把两套鉴权混在一起排查。
工具调用解析失败。日志里出现 tool_calls 解析错误,基本是模型不支持 function calling,或者请求体里 tools 格式和模型预期不一致。换一个支持工具调用的 Model ID,并确认 OpenClaw 版本是最新的,旧版本对工具调用的兼容性差一些。
排查顺序建议固定成:先 curl 通道 → 再查容器环境变量 → 再看 OpenClaw 日志 → 最后看业务链路。按这个顺序走,基本不会绕圈。如果你在配置过程中需要对照最新的接入参数,接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,里面有 Base URL、鉴权头和模型列表的说明。
6. 把 Key 统一之后,OpenClaw 的日常维护怎么做
跑通只是开始,后面要让它稳定跑下去。统一 Key 之后,维护成本其实降了不少,因为模型通道只有一个入口,出问题只需要查一处。日常我主要盯三件事:服务状态、日志、Key 额度。
服务状态用docker-compose ps看容器是否 Up,配合阿里云云监控设个 CPU 和内存告警。OpenClaw 本身不重,但工具调用密集时内存会涨,2 核 4G 的机器建议把容器内存限制写上,避免拖垮整机:
deploy: resources: limits: cpus: '2' memory: 2G日志用docker exec -it openclaw-core tail -f /app/logs/app.log实时看,重点过滤 ERROR 和 401。建议配个简单的日志轮转,不然日志文件会把磁盘吃满。数据目录/opt/openclaw/data定期备份,用tar打包存到 OSS 或另一台机器,ECS 快照也开着,双保险。
Key 额度在控制台看,按量 Key 建议设个预算提醒,避免工具调用跑飞了产生意外消耗。如果你要跑长期编码或 Agent 类任务,按量可能不如套餐划算,可以看下 Coding Plan https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,按任务量选。需要新建或轮换 Key 时,还是去 API Keys 页面 https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 操作,轮换后记得同步更新 compose 里的环境变量并重建容器。
最后说个实用技巧:把 OpenClaw 的模型配置抽成单独的环境变量文件,和业务配置分开。这样换模型、换 Key 只动一个文件,不用翻整个 compose。我现在的做法是.env只放模型通道相关变量,compose 里用env_file引入,改完docker-compose up -d一条命令生效。这套流程跑顺之后,再换模型或加工具调用,基本就是改一行配置的事。