1. 先把场景说清楚OpenClaw 在 Docker 里到底要解决什么OpenClaw 是一个可以跑在容器里的智能体网关它把大模型能力、工具调用、文件操作和消息通道整合在一起对外暴露一个控制台和一套 WebSocket/HTTP 接口。你可以把它理解成一个“住在 Docker 里的机器人管家”模型负责思考OpenClaw 负责把思考结果通过企业微信、钉钉、飞书这些渠道发出去同时把用户发来的消息转成模型能理解的输入。适合谁第一次在 Docker 里部署 OpenClaw、并且希望把企业微信/钉钉/飞书机器人一次性打通的开发者。痛点也很集中模型 API Key 要统一管理不能每个渠道各配一套容器启动后网关令牌、设备配对、插件安装、渠道回调这几步容易卡住企业微信和飞书的长连接模式配置项多少一个就收不到消息。这篇按“统一 Key/API 通道”的思路来写所有模型请求都走同一个兼容 OpenAI 协议的入口渠道侧只负责收发消息。这样你换模型、加渠道、调参数都只改一处。下面给出可复制的docker-compose.yml、.env、config.toml和settings.json骨架再逐项验证消息收发。2. TaoToken 前置统一 Key 与 API 通道怎么准备OpenClaw 的模型配置支持openai-completions和anthropic-messages两种协议。为了让企业微信、钉钉、飞书三个渠道共用同一套模型出口建议把BASE_URL指向统一的 API 网关而不是每个渠道单独填厂商地址。TaoToken 在这里扮演的就是统一入口官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 地址是 https://taotoken.net/api 。你需要在控制台创建一个 Key后面.env里的API_KEY就填它。操作路径打开控制台 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 登录后进入 API Keys 页面。新建一个 Key命名建议带用途比如openclaw-docker方便后面按渠道排查。复制 Key注意只显示一次先存到密码管理器。如果你要接 Claude 系列模型做编码类任务可以看 Coding Plan 页面 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 它更适合长期跑 Agent 的场景。想先验证模型通不通用模型对话页 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 发一条测试消息确认 Key 有效再往下走。注意.env里的API_KEY不要提交到 Git。建议在专用目录下加.gitignore把.env和data/都排除掉。3. 可复制配置docker-compose、.env、config.toml、settings.json3.1 目录结构与 docker-compose.yml先在宿主机建一个专用目录比如~/openclaw里面放data/、files/、.env、docker-compose.yml。data/存 OpenClaw 的配置和工作空间files/是允许它读写的文件区这样能避免模型幻觉误删宿主机文件。x-openclaw-common-env: openclaw-common-env TZ: Asia/Shanghai HOME: /home/node TERM: xterm-256color SYNC_MODEL_CONFIG: ${SYNC_MODEL_CONFIG} MODEL_ID: ${MODEL_ID} IMAGE_MODEL_ID: ${IMAGE_MODEL_ID} BASE_URL: ${BASE_URL} API_KEY: ${API_KEY} API_PROTOCOL: ${API_PROTOCOL} CONTEXT_WINDOW: ${CONTEXT_WINDOW} MAX_TOKENS: ${MAX_TOKENS} FEISHU_APP_ID: ${FEISHU_APP_ID} FEISHU_APP_SECRET: ${FEISHU_APP_SECRET} DINGTALK_CLIENT_ID: ${DINGTALK_CLIENT_ID} DINGTALK_CLIENT_SECRET: ${DINGTALK_CLIENT_SECRET} DINGTALK_ROBOT_CODE: ${DINGTALK_ROBOT_CODE} DINGTALK_CORP_ID: ${DINGTALK_CORP_ID} DINGTALK_AGENT_ID: ${DINGTALK_AGENT_ID} WECOM_TOKEN: ${WECOM_TOKEN} WECOM_ENCODING_AES_KEY: ${WECOM_ENCODING_AES_KEY} WECOM_BOTS_JSON: ${WECOM_BOTS_JSON} WORKSPACE: ${WORKSPACE} OPENCLAW_GATEWAY_TOKEN: ${OPENCLAW_GATEWAY_TOKEN} OPENCLAW_GATEWAY_BIND: ${OPENCLAW_GATEWAY_BIND} OPENCLAW_GATEWAY_PORT: ${OPENCLAW_GATEWAY_PORT} OPENCLAW_BRIDGE_PORT: ${OPENCLAW_BRIDGE_PORT} OPENCLAW_GATEWAY_MODE: ${OPENCLAW_GATEWAY_MODE} OPENCLAW_GATEWAY_ALLOWED_ORIGINS: ${OPENCLAW_GATEWAY_ALLOWED_ORIGINS} OPENCLAW_GATEWAY_ALLOW_INSECURE_AUTH: ${OPENCLAW_GATEWAY_ALLOW_INSECURE_AUTH} OPENCLAW_GATEWAY_DANGEROUSLY_DISABLE_DEVICE_AUTH: ${OPENCLAW_GATEWAY_DANGEROUSLY_DISABLE_DEVICE_AUTH} OPENCLAW_PLUGINS_ENABLED: ${OPENCLAW_PLUGINS_ENABLED} FEISHU_OFFICIAL_PLUGIN_ENABLED: ${FEISHU_OFFICIAL_PLUGIN_ENABLED} services: openclaw-gateway: container_name: openclaw image: ${OPENCLAW_IMAGE} cap_add: - CHOWN - SETUID - SETGID - DAC_OVERRIDE user: ${OPENCLAW_RUN_USER:-0:0} environment: *openclaw-common-env volumes: - ${OPENCLAW_DATA_DIR}:/home/node/.openclaw - openclaw-extensions:/home/node/.openclaw/extensions - ${OPENCLAW_FILES_DIR}:/home/openclaw:rw ports: - ${OPENCLAW_GATEWAY_PORT}:18789 - ${OPENCLAW_BRIDGE_PORT}:18790 init: true restart: unless-stopped volumes: openclaw-extensions:3.2 .env 关键项OPENCLAW_IMAGEjustlikemaki/openclaw-docker-cn-im:latest SYNC_MODEL_CONFIGtrue MODEL_IDqwen3.5-35b-a3b IMAGE_MODEL_IDqwen-image-2.0 BASE_URLhttps://taotoken.net/api API_KEYsk-你的TaoTokenKey API_PROTOCOLopenai-completions CONTEXT_WINDOW64000 MAX_TOKENS4096 FEISHU_APP_ID FEISHU_APP_SECRET FEISHU_OFFICIAL_PLUGIN_ENABLEDfalse DINGTALK_CLIENT_ID DINGTALK_CLIENT_SECRET DINGTALK_ROBOT_CODE DINGTALK_CORP_ID DINGTALK_AGENT_ID WECOM_TOKEN WECOM_ENCODING_AES_KEY WECOM_BOTS_JSON WORKSPACE/home/node/.openclaw/workspace OPENCLAW_DATA_DIR./data OPENCLAW_FILES_DIR./files OPENCLAW_RUN_USER0:0 OPENCLAW_GATEWAY_TOKEN123456 OPENCLAW_GATEWAY_BINDlan OPENCLAW_GATEWAY_PORT18789 OPENCLAW_BRIDGE_PORT18790 OPENCLAW_GATEWAY_MODElocal OPENCLAW_GATEWAY_ALLOWED_ORIGINShttp://localhost,https://your.domain.com OPENCLAW_GATEWAY_ALLOW_INSECURE_AUTHtrue OPENCLAW_GATEWAY_DANGEROUSLY_DISABLE_DEVICE_AUTHfalse OPENCLAW_PLUGINS_ENABLEDtrue3.3 config.toml 骨架OpenClaw 的模型配置在data/下的openclaw.json里但很多团队习惯用config.toml做版本管理。下面这份骨架对应上面的.env重点是base_url和api_key只写一处。[model] id qwen3.5-35b-a3b image_id qwen-image-2.0 base_url https://taotoken.net/api api_key sk-你的TaoTokenKey protocol openai-completions context_window 64000 max_tokens 4096 [gateway] token 123456 bind lan port 18789 bridge_port 18790 mode local allow_insecure_auth true [workspace] path /home/node/.openclaw/workspace [plugins] enabled true feishu_official false3.4 settings.json 渠道骨架如果你不想用.env注入渠道参数也可以在data/settings.json里写。下面这份是飞书 钉钉 企业微信的最小骨架allowFrom控制哪些用户能触发机器人。{ channels: { feishu: { appId: cli_xxx, appSecret: xxx, allowFrom: [*] }, dingtalk: { clientId: dingxxx, clientSecret: xxx, robotCode: dingxxx, corpId: dingxxx, agentId: 1000001 }, wecom: { default: { token: xxx, encodingAesKey: xxx, agent: { corpId: wwxxx, corpSecret: xxx, agentId: 1000001 } } } } }3.5 CC Switch / Cline 侧参数示例如果你在本地用 CC Switch 或 Cline 连同一个模型出口参数保持一致即可避免“控制台能回、编辑器不能回”的割裂。{ provider: openai-compatible, baseUrl: https://taotoken.net/api, apiKey: sk-你的TaoTokenKey, model: qwen3.5-35b-a3b, maxTokens: 4096 }Cline 的settings.json里对应字段是openAiBaseUrl、openAiApiKey、openAiModelId填法同上。这样 OpenClaw 容器、CC Switch、Cline 三处共用同一个 Key排查时只需要看一个出口。4. 启动与验证从容器起来到消息收发4.1 启动容器cd ~/openclaw docker compose up -d docker compose logs -f openclaw-gateway日志里看到gateway listening on 18789就说明网关起来了。浏览器打开http://localhost:18789在概览页填入OPENCLAW_GATEWAY_TOKEN点连接。4.2 设备配对docker exec -it openclaw bash su node openclaw devices list openclaw devices approve RequestID看到Approved后控制台状态会从离线变正常。这一步不做后面渠道消息会被网关拒绝。4.3 验证模型通道在控制台聊天页发一句“你好报一下当前模型 ID”。如果返回内容里模型 ID 和.env一致说明 TaoToken 通道通了。想单独验证模型用模型对话页 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 发同样的消息两边结果一致就排除 Key 问题。4.4 验证钉钉钉钉开发者后台创建机器人应用后拿到 Client ID、Client Secret、Robot Code、Corp ID、Agent ID填进.env然后docker restart openclaw控制台频道页看到钉钉 Running 为 Yes在钉钉群里 机器人发消息能回就通了。4.5 验证飞书飞书这边除了 App ID / App Secret还要在开发者后台把订阅方式改成“使用长连接接收事件”并添加“接收消息”事件。.env填好后重启容器频道页飞书 Running 为 Yes再在settings.json的channels.feishu下加allowFrom: [*]保存后私聊机器人测试。4.6 验证企业微信企业微信走插件模式docker exec -it openclaw bash su node openclaw plugins install wecom/wecom-openclaw-plugin openclaw channels add选择企业微信填入 Bot ID 和 Secret配对方式选 Pairing。手机企业微信里给机器人发消息会收到配对码把最后一行命令复制回容器执行看到approved就通了。5. 本篇常见错排查5.1 容器起来但控制台连不上先看端口映射docker compose ps确认18789和18790都映射了。再看OPENCLAW_GATEWAY_BIND本地测试用lan如果只写localhost容器外访问不到。最后检查OPENCLAW_GATEWAY_ALLOW_INSECURE_AUTH用 http 访问时必须为true。5.2 模型返回 401 或 403九成是API_KEY没生效。SYNC_MODEL_CONFIGtrue时容器启动会把.env同步到openclaw.json如果你手动改过openclaw.json要把它设为false否则重启会被覆盖。另外确认BASE_URL结尾没有多余斜杠https://taotoken.net/api即可。5.3 钉钉频道 Running 为 No检查DINGTALK_ROBOT_CODE和DINGTALK_AGENT_ID是否填反。Robot Code 在机器人配置页Agent ID 在凭证页。另外钉钉应用要发布版本未发布的应用 Stream 模式连不上。5.4 飞书收不到消息最常见是订阅方式没改成“使用长连接接收事件”或者没添加“接收消息”事件。改完后要在版本管理与发布里创建新版本并发布否则配置不生效。allowFrom没加*也会导致消息被过滤。5.5 企业微信配对码无效配对码有时效复制后要尽快在容器里执行。如果提示approved但消息还是不通检查插件是否安装成功openclaw plugins list能看到wecom/wecom-openclaw-plugin才算装好。安装插件后容器会自动重启等状态正常再配对。5.6 容器内文件权限报错OPENCLAW_RUN_USER0:0时init.sh会先以 root 修复挂载卷权限再降权。如果你改成1000:1000要确保宿主机data/和files/的属主也是 1000否则写不进去。6. 后续怎么走按场景选入口如果你已经跑通上面流程接下来大概率是两类需求一类是继续加渠道、调模型参数另一类是把它接到编码工作流里长期跑 Agent。加渠道和调参直接看接入文档 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 里面有各协议的字段说明。需要新建或轮换 Key去 API Keys 页面 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。想先验证某个模型再决定要不要换用模型对话页 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 最快。如果你打算让 OpenClaw 长期跑编码类 Agent比如自动改代码、跑测试、提 PR建议看 Coding Plan https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 它的额度模型更适合高频调用。接 Claude 系列做代码任务的话ClaudeCodeAnthropic 入口 https://taotoken.net/claude-code-anthropic?utm_sourcetaotoken_aicg_blog_endutm_contentclaudecodeutm_campaignrewrite 有对应的协议配置说明。最后留一个我踩过的坑企业微信插件安装后容器自动重启如果你在重启过程中执行openclaw channels add会提示网关未就绪。等控制台状态变正常再操作能省掉一轮排查。
