1. 为什么要在 Linux 服务器上跑 OpenClaw,以及多 Key 管理到底痛在哪
OpenClaw 是一个可以常驻在服务器上的 AI 助手网关,它把模型调用、消息渠道、会话管理这些能力打包成一个本地服务,你可以通过 Web UI、命令行或者飞书这类 IM 渠道跟它交互。适合谁用?适合手里有一台 Linux 服务器、想让 AI 助手 7×24 小时在线、又不想每次换模型都去改一堆环境变量的开发者。
但真正部署过的人都知道,最烦的不是装 OpenClaw 本身,而是模型 Key 的管理。你可能会同时用 Claude 做代码、用 Gemini 做多模态、用某个便宜模型做日常问答,每个供应商一套 baseUrl、一套 apiKey、一套模型 ID。时间一长,配置文件里散落着七八个 Key,换一个就要全局搜一遍,还容易把测试 Key 和生产 Key 搞混。
这篇教程要解决的就是这个问题:用 TaoToken 的统一 Key 接入 OpenClaw,把多供应商的配置收敛成一份可复制的config.toml骨架。你跟着走完,能拿到一个跑在 systemd 里的 OpenClaw 服务,并且用一条 curl 命令验证 API 通道是通的。
我试过在 Ubuntu 22.04 和 Debian 12 上各部署一遍,下面这套流程两边都跑通了。开始之前先确认你的服务器满足基本条件:Node.js 22.x 或更高、至少 2GB 内存、5GB 可用磁盘、能正常访问外网。内存这条别省,OpenClaw 启动时会加载模型元数据,1GB 的机器大概率会在启动阶段被 OOM Killer 干掉。
2. TaoToken 前置准备:拿到统一 Key 和接入地址
TaoToken 在这里扮演的角色是「统一入口」——你不需要在 OpenClaw 里为每个模型供应商单独配 baseUrl 和 apiKey,而是把请求都指向 TaoToken 的 API 地址,用同一个 Key 去调用不同模型。对 OpenClaw 来说,它只看到一个 provider,配置量直接砍半。
第一步,打开 TaoToken 官网注册并登录:
https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=登录之后进控制台,创建 API Key。建议按用途分 Key,比如openclaw-prod、openclaw-test,这样后面排查问题时能快速定位是哪个 Key 出的问题。创建完把 Key 复制下来,格式通常是sk-开头的一串字符,只显示一次,丢了就得重建。
https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=consoleKey 管理页面在这里,后面如果要轮换或者禁用某个 Key 也在这个入口操作:
https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys接入地址这块要记清楚:TaoToken 的 API 根地址是https://taotoken.net/api,注意这个地址不带任何查询参数。OpenClaw 配置里的baseUrl填这个就行,具体到某个接口路径由 OpenClaw 自己拼接。
注意:不要把 Key 直接写进会提交到 Git 的文件里。下面配置骨架里我用环境变量占位,实际部署时通过 systemd 的
Environment=注入,这样配置文件可以安全地放进版本管理。
如果你后面想先验证模型能不能正常对话,可以先用模型对话页面测一下,确认 Key 有效再往下走:
https://taotoken.net/model-chat?utm_source=taotoken_aicg_blog_end&utm_content=model-chat3. 可复制的 config.toml 配置骨架
OpenClaw 支持 TOML 格式的配置文件,默认路径是~/.openclaw/config.toml。下面这份骨架是我实际在用的,你可以直接复制,只需要替换api_key那一行的环境变量引用方式。
先创建配置目录:
mkdir -p ~/.openclaw touch ~/.openclaw/config.toml然后写入以下内容:
# ~/.openclaw/config.toml # OpenClaw 主配置骨架 —— TaoToken 统一 Key 接入 [gateway] mode = "local" port = 18789 bind = "loopback" # token 建议用 openclaw dashboard --no-open 生成后回填 auth_token = "${OPENCLAW_GATEWAY_TOKEN}" [providers.taotoken] # TaoToken 统一接入地址,不带查询参数 base_url = "https://taotoken.net/api" api_key = "${TAOTOKEN_API_KEY}" auth = "api-key" api = "anthropic-messages" # 模型清单:按需增删,id 必须与 TaoToken 侧支持的模型名一致 [[providers.taotoken.models]] id = "claude-sonnet-4-5-20250929" name = "Claude Sonnet 4.5" input = ["text"] context_window = 200000 max_tokens = 8192 [[providers.taotoken.models]] id = "claude-haiku-4-5-20251001" name = "Claude Haiku 4.5" input = ["text"] context_window = 200000 max_tokens = 8192 [[providers.taotoken.models]] id = "gemini-3-pro" name = "Gemini 3 Pro" input = ["text", "image"] context_window = 1000000 max_tokens = 8192 [agents.defaults.model] primary = "taotoken/claude-sonnet-4-5-20250929" fallback = "taotoken/claude-haiku-4-5-20251001" [channels.feishu] enabled = false app_id = "${FEISHU_APP_ID}" app_secret = "${FEISHU_APP_SECRET}" [logging] level = "info" format = "json"几个关键点解释一下。base_url必须是https://taotoken.net/api,不要自作主张加/v1之类的后缀,OpenClaw 会按api字段声明的协议自己去拼路径。api = "anthropic-messages"表示走 Anthropic Messages 协议,这是目前兼容性最好的选择;如果你要调 Gemini 的原生协议,把对应 provider 的api改成google-genai即可,但同一个 provider 块里只能声明一种协议,混用要拆成两个 provider。
primary和fallback的写法是provider名/模型id,中间用斜杠分隔。这个格式写错了 OpenClaw 不会报错,但会在调用时静默失败,所以配完一定要用openclaw models list确认。
环境变量通过 systemd 注入,先创建 env 文件:
sudo mkdir -p /etc/openclaw sudo tee /etc/openclaw/env > /dev/null <<'EOF' TAOTOKEN_API_KEY=sk-你的实际Key OPENCLAW_GATEWAY_TOKEN=你的网关Token FEISHU_APP_ID=cli_xxx FEISHU_APP_SECRET=xxx EOF sudo chmod 600 /etc/openclaw/env权限设成 600 很重要,这个文件里有明文 Key,不能让其他用户读到。
4. 安装 OpenClaw 并接入 systemd
Node.js 22 的安装我用 nvm,比直接 apt 装省心,版本切换也方便:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash source ~/.bashrc nvm install 22 nvm use 22 node -vnode -v应该输出v22.x.x。然后全局装 OpenClaw:
npm install -g openclaw openclaw --version版本号能正常打印就说明装好了。接下来创建 systemd 用户级服务,这样不用 root 也能管理:
mkdir -p ~/.config/systemd/user nano ~/.config/systemd/user/openclaw-gateway.service写入以下内容:
[Unit] Description=OpenClaw Gateway After=network.target [Service] Type=simple EnvironmentFile=/etc/openclaw/env ExecStart=/usr/bin/openclaw gateway run --bind loopback --port 18789 --force Restart=always RestartSec=10 StandardOutput=journal StandardError=journal [Install] WantedBy=default.target注意ExecStart里的路径要跟你which openclaw的输出一致,nvm 装的可能是/home/你的用户名/.nvm/versions/node/v22.x.x/bin/openclaw,写错了服务起不来。
启用并启动:
systemctl --user daemon-reload systemctl --user enable openclaw-gateway.service systemctl --user start openclaw-gateway.service systemctl --user status openclaw-gateway.service状态里看到active (running)就对了。如果服务器重启后想让服务自动起来,还要开 lingering:
sudo loginctl enable-linger $USER5. 验证 API 通道连通性:具体命令与预期输出
服务起来不代表模型通道就通了,这一步必须单独验证。先确认模型列表能正确加载:
openclaw models list预期输出里应该能看到taotoken/claude-sonnet-4-5-20250929和taotoken/claude-haiku-4-5-20251001,如果只显示默认模型,说明config.toml没被读到,检查文件路径和 TOML 语法。
然后用 curl 直接打 TaoToken 的接口,验证 Key 和网络都正常:
curl -sS -X POST https://taotoken.net/api/v1/messages \ -H "x-api-key: $TAOTOKEN_API_KEY" \ -H "anthropic-version: 2023-06-01" \ -H "content-type: application/json" \ -d '{ "model": "claude-haiku-4-5-20251001", "max_tokens": 64, "messages": [{"role": "user", "content": "reply with OK only"}] }'预期返回是一段 JSON,content数组里能看到模型回复的文本。如果返回 401,说明 Key 不对;返回 404,检查 URL 路径;连接超时则是服务器出网有问题。
最后通过 OpenClaw 自身发一条测试消息,确认整条链路打通:
openclaw chat --model taotoken/claude-haiku-4-5-20251001 --message "ping"预期输出里会带上模型返回的内容。到这一步,你的 OpenClaw 就已经能通过 TaoToken 统一 Key 正常调模型了。
如果你打算长期跑编码类任务或者接 Agent,建议看一下 Coding Plan,额度模型和按量计费不太一样,长期用更划算:
https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan6. 本篇常见错误排查
报错一:openclaw models list只显示默认模型
九成是config.toml路径不对或者 TOML 语法有误。先确认文件在~/.openclaw/config.toml,然后用openclaw config validate检查语法。如果报unknown field,多半是字段名拼错了,比如把base_url写成baseUrl。
报错二:服务启动后立刻退出,journalctl 里看到EnvironmentFile not found
systemd 的EnvironmentFile路径写错了,或者文件权限不对导致服务用户读不到。确认/etc/openclaw/env存在且chmod 600后属主是当前用户。
报错三:curl 返回 401 Unauthorized
Key 无效或者没被正确注入。先在 shell 里echo $TAOTOKEN_API_KEY确认变量有值,如果为空说明EnvironmentFile没生效。注意 systemd 的EnvironmentFile不会自动 export 到你的交互 shell,手动测试时要先source /etc/openclaw/env。
报错四:调用模型时返回model not found
config.toml里声明的模型 id 跟 TaoToken 侧实际支持的名字不一致。去模型对话页面确认一下可用模型列表,把 id 改成完全一致的值。这个错误 OpenClaw 不会在启动时报,只在调用时暴露,所以配完一定要跑一次实际请求。
报错五:端口 18789 被占用
lsof -i :18789找到占用进程后要么 kill 掉,要么改config.toml里的port和 systemd 服务里的--port参数,两处必须一致。
排查时最有用的一条命令是实时看日志:
journalctl --user -u openclaw-gateway.service -f大部分配置问题都会在这里打出具体的错误行号,比盲猜快得多。接入相关的完整参数说明可以对照文档:
https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc整套流程跑下来,最花时间的其实是环境变量注入和 systemd 路径这两块,配置骨架本身复制粘贴就能用。建议第一次部署时把openclaw config validate和 curl 验证这两步当成固定动作,能省掉后面大量的返工。