ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

OpenClaw 多实例部署完整配置初级指南:用 Docker Compose 与 OPENCLAW_HOME 隔离多套 TaoToken 通道

OpenClaw 多实例部署完整配置初级指南:用 Docker Compose 与 OPENCLAW_HOME 隔离多套 TaoToken 通道 1. 单机跑多套 OpenClaw 到底难在哪如果你正在搜 OpenClaw 多实例部署、Docker Compose 配置或者 OPENCLAW_HOME 隔离大概率已经踩过这样一个坑一台机器上装了两套 OpenClaw一套跑测试、一套跑生产结果两边的会话、凭据、日志全串在一起测试实例里发的一条消息生产实例的会话列表里居然也能看到。OpenClaw 是一个可自托管的 Agent 网关能把模型通道、会话、技能、频道统一管起来适合需要长期跑 Agent 的开发者。它默认把配置和数据都放在同一个 home 目录下所以只要你不做隔离多开就等于互相污染。我试过最省事的做法是直接复制两份二进制、改两个端口但很快发现凭据文件还是共享的一个实例刷新了 token另一个实例的请求就 401 了。真正干净的方案只有两条路要么用 Docker Compose 把每个实例关进独立容器要么用 OPENCLAW_HOME 给每个进程指定独立的 home 目录。这篇就把这两条路都走一遍重点放在目录隔离、端口分配以及把每个实例的 API 通道统一改到 TaoToken最后用两次真实请求验证它们互不串数据。适合谁看手上有一台 2C4G 以上的机器想同时跑测试实例和生产实例又不想维护两台服务器的开发者。全程命令可复制配置片段可直接落盘。2. 部署前先把 TaoToken 通道准备好多实例部署里最容易被忽略的一步是每个实例的模型通道从哪来。如果你让三个实例各自去连不同的上游密钥管理会立刻变成噩梦。更稳的做法是让所有实例统一走同一个兼容 Anthropic/OpenAI 协议的网关TaoToken 就是干这个的它对外暴露标准的 API 地址你只需要在 OpenClaw 的 provider 配置里把 baseURL 指过去模型 ID 保持不变即可。先拿到访问凭据。打开 https://taotoken.net/api-keys 创建一个 API Key复制出来形如sk-开头的一串。这个 Key 会被三个实例共享所以别写死在某个实例的配置里统一放进根目录的.env由 Compose 注入。接着确认你要用的模型 ID。进 https://taotoken.net/models 看一眼当前可用的模型列表把你要的模型名记下来比如claude-sonnet-4-20250514这类。OpenClaw 的openclaw.json里models.default.model填的就是这个 IDprovider 的 baseURL 填 TaoToken 的接口地址。这里有个关键点TaoToken 的 API 地址是https://taotoken.net/api注意不要带任何查询参数配置里写干净的这个就行。三个实例共用同一个 baseURL 和同一个 Key隔离靠的是各自的 home 目录和端口而不是各自的密钥。这样你换 Key 的时候只改一处三个实例重启即生效。如果你还没决定用哪种接入方式可以先到 https://taotoken.net/doc 看接口文档确认 Anthropic 兼容端点和 OpenAI 兼容端点分别是什么路径。OpenClaw 的 provider 配置里anthropic 类型走/v1/messages风格openai 类型走/v1/chat/completions风格文档里都有对照。3. 可复制的 docker-compose.yml 与 .env 模板这一节是全文的核心配置直接抄。先建目录结构三个实例的配置和数据各自独立mkdir -p /opt/openclaw/{config/instance{1,2,3},data/instance{1,2,3}} cd /opt/openclaw然后是.env放在/opt/openclaw/.env。三个实例共享同一个 TaoToken Key但 Gateway 的认证 token 每个实例必须不同否则外部调用会串# TaoToken 统一通道 TAOTOKEN_API_KEYsk-你的TaoToken密钥 TAOTOKEN_BASE_URLhttps://taotoken.net/api # 每个实例独立的 Gateway Token GATEWAY_TOKEN_1work-token-请改成随机串 GATEWAY_TOKEN_2personal-token-请改成随机串 GATEWAY_TOKEN_3dev-token-请改成随机串 # 时区与日志 TZAsia/Shanghai接着是docker-compose.yml放在/opt/openclaw/docker-compose.yml。注意每个实例的端口映射容器内都监听 18790宿主机分别映射到 18790、18791、18792这样从外面访问不会撞车version: 3.8 services: openclaw-instance1: image: openclaw/server:2026.2.2 container_name: openclaw-work restart: unless-stopped ports: - 18790:18790 volumes: - ./config/instance1:/app/.openclaw - ./data/instance1:/app/data environment: - OPENCLAW_HOME/app/.openclaw - OPENCLAW_GATEWAY_TOKEN${GATEWAY_TOKEN_1} - TAOTOKEN_API_KEY${TAOTOKEN_API_KEY} - TAOTOKEN_BASE_URL${TAOTOKEN_BASE_URL} - TZ${TZ} networks: - openclaw-network healthcheck: test: [CMD, curl, -f, http://localhost:18790/health] interval: 30s timeout: 10s retries: 3 openclaw-instance2: image: openclaw/server:2026.2.2 container_name: openclaw-personal restart: unless-stopped ports: - 18791:18790 volumes: - ./config/instance2:/app/.openclaw - ./data/instance2:/app/data environment: - OPENCLAW_HOME/app/.openclaw - OPENCLAW_GATEWAY_TOKEN${GATEWAY_TOKEN_2} - TAOTOKEN_API_KEY${TAOTOKEN_API_KEY} - TAOTOKEN_BASE_URL${TAOTOKEN_BASE_URL} - TZ${TZ} networks: - openclaw-network healthcheck: test: [CMD, curl, -f, http://localhost:18790/health] interval: 30s timeout: 10s retries: 3 openclaw-instance3: image: openclaw/server:2026.2.2 container_name: openclaw-dev restart: unless-stopped ports: - 18792:18790 volumes: - ./config/instance3:/app/.openclaw - ./data/instance3:/app/data environment: - OPENCLAW_HOME/app/.openclaw - OPENCLAW_GATEWAY_TOKEN${GATEWAY_TOKEN_3} - TAOTOKEN_API_KEY${TAOTOKEN_API_KEY} - TAOTOKEN_BASE_URL${TAOTOKEN_BASE_URL} - OPENCLAW_LOG_LEVELdebug - TZ${TZ} networks: - openclaw-network healthcheck: test: [CMD, curl, -f, http://localhost:18790/health] interval: 30s timeout: 10s retries: 3 networks: openclaw-network: driver: bridge关键在OPENCLAW_HOME/app/.openclaw这一行。容器内 OpenClaw 会把配置、凭据、会话全部写到这个目录而我们把宿主机的./config/instanceN挂载到它于是三个实例的 home 目录在宿主机上就是三个完全独立的文件夹。数据目录/app/data同理各自挂各自的。每个实例的openclaw.json放在对应的config/instanceN/下。以 instance1 为例/opt/openclaw/config/instance1/openclaw.json{ gateway: { port: 18790, bind: 0.0.0.0, token: ${OPENCLAW_GATEWAY_TOKEN} }, models: { default: { provider: anthropic, model: claude-sonnet-4-20250514 }, providers: { anthropic: { apiKey: ${TAOTOKEN_API_KEY}, baseURL: ${TAOTOKEN_BASE_URL} } } }, logging: { level: info } }instance2 和 instance3 的配置结构一样只改logging.levelinstance3 用debug和默认模型即可。注意baseURL用的是环境变量${TAOTOKEN_BASE_URL}值就是https://taotoken.net/api三个实例共用改一处全生效。启动docker compose up -d docker compose ps看到三个容器都是healthy就说明 Gateway 起来了。如果某个实例一直starting先看它的日志docker compose logs -f openclaw-instance3。4. 验证请求确认三个实例互不串数据配置写完不算完得用真实请求证明隔离生效。验证分两步先确认每个实例的 Gateway 能通再确认它们的数据目录确实分开。第一步用各自的 Gateway Token 调健康检查。三个端口分别打一遍curl -s http://localhost:18790/health -H Authorization: Bearer work-token-请改成随机串 curl -s http://localhost:18791/health -H Authorization: Bearer personal-token-请改成随机串 curl -s http://localhost:18792/health -H Authorization: Bearer dev-token-请改成随机串三个都返回{status:ok}才算通。如果某个返回 401说明你用的 token 和.env里那个实例的GATEWAY_TOKEN_N对不上回去核对。第二步往 instance1 发一条会话请求然后去 instance2 查会话列表看能不能查到。先给 instance1 发curl -s http://localhost:18790/v1/chat/completions \ -H Authorization: Bearer work-token-请改成随机串 \ -H Content-Type: application/json \ -d { model: claude-sonnet-4-20250514, messages: [{role: user, content: 只回复两个字收到}] }正常会返回一段 JSONchoices[0].message.content里是「收到」。这条请求走的是 TaoToken 通道说明 baseURL 和 Key 都生效了。然后去 instance2 查会话curl -s http://localhost:18791/sessions \ -H Authorization: Bearer personal-token-请改成随机串返回的会话列表应该是空的或者只有 instance2 自己的会话绝不该出现 instance1 刚才那条。如果出现了说明两个实例的OPENCLAW_HOME指向了同一个目录回去检查 Compose 里的 volume 挂载路径是不是写重了。再补一个更直观的验证直接看宿主机的数据目录。ls -la /opt/openclaw/data/instance1/ ls -la /opt/openclaw/data/instance2/instance1 的目录里应该有刚才那条会话产生的文件instance2 的目录里没有。这一步比接口验证更硬因为它直接证明文件系统层面就是隔离的。最后确认三个实例的模型通道都指向 TaoToken。进任意一个实例的容器看环境变量docker exec -it openclaw-work env | grep TAOTOKEN应该输出TAOTOKEN_BASE_URLhttps://taotoken.net/api和你的 Key。三个实例都查一遍确认没有哪个漏配。5. 常见报错排查401、local proxy failed 与 OAuth多实例部署最容易撞的报错就那么几个逐个说。401 Unauthorized。两种可能一是 Gateway Token 用错了比如你拿 instance1 的 token 去调 18791 端口必然 401因为每个实例的 token 是独立的二是 TaoToken 的 Key 没注入成功容器里TAOTOKEN_API_KEY是空的。排查命令docker exec -it openclaw-work env | grep TAOTOKEN_API_KEY如果为空检查.env文件是不是放在docker-compose.yml同级目录Compose 默认只读同级的.env。local proxy failed / connection refused。这个通常出现在实例启动时连不上 TaoToken 的地址。先确认容器内能解析并访问taotoken.netdocker exec -it openclaw-work curl -I https://taotoken.net/api。如果超时检查宿主机的 DNS 和出站规则。注意 baseURL 不要写成带路径的https://taotoken.net/api/v1OpenClaw 的 provider 会自己拼端点多写一层会 404。reading choices 报错。返回体里没有choices字段多半是模型 ID 写错了或者 provider 类型和端点不匹配。比如你把provider写成anthropic但模型 ID 填的是 OpenAI 的gpt-4o上游会返回错误结构。去 https://taotoken.net/models 核对模型 ID确保 provider 和模型对得上。OAuth 相关报错。如果你之前用 OAuth 方式登录过某个实例凭据会存在该实例的 home 目录里。多实例场景下OAuth 凭据不会自动共享每个实例要各自授权。但既然我们统一走 TaoToken 的 API Key就不需要 OAuth 了把openclaw.json里的auth.profiles清掉只保留 provider 的 apiKey 配置即可。端口冲突。三个实例容器内都是 18790宿主机映射必须不同。如果你看到port is already allocated检查docker-compose.yml里有没有两个实例映射到同一个宿主机端口。改完执行docker compose down docker compose up -d。配置改了不生效。OpenClaw 的openclaw.json支持热重载但环境变量改动需要重启容器。改完.env后执行docker compose up -dCompose 会重建有变化的容器。6. 长期跑多实例通道和密钥这样管三个实例跑起来之后日常维护其实就两件事看日志和换密钥。日志用docker compose logs -f openclaw-instance3单独跟别三个一起刷屏。密钥方面因为三个实例共用同一个 TaoToken Key你只需要在.env里改TAOTOKEN_API_KEY然后docker compose up -d三个实例一起生效不用逐个进容器改配置。如果你后面要把这套多实例接到 Coding Plan 或者更长期的 Agent 任务上建议把测试实例和生产实例的模型分开生产用稳定的模型 ID测试用你正在评估的新模型反正它们走的是同一个 TaoToken 通道切换成本只是改一行openclaw.json。需要看当前通道支持哪些模型直接到 https://taotoken.net/models 查接入细节和端点对照在 https://taotoken.net/doc 里都有。密钥管理入口在 https://taotoken.net/api-keys换 Key、加额度都在那操作。最后提醒一句OPENCLAW_HOME这个环境变量是隔离的核心容器里一定要显式设成/app/.openclaw并且和 volume 挂载路径严格对应。我见过有人挂载写了./config/instance1:/app/.openclaw但环境变量没设结果 OpenClaw 用了默认 home三个实例又串回去了。配置落盘后用第 4 节的两次请求验证一遍确认数据目录真的分开这套多实例才算真正跑通。
返回列表