Skip to content

配置参考与故障排除(钉钉)

本文档提供 Docker Compose + 钉钉部署的完整配置参考和故障排除指南。这是 Docker Compose + 钉钉部署指南 的配套文档。


openclaw.json 完整示例

json5
{
  // Agent 配置
  "agents": {
    "defaults": {
      "workspace": "/home/node/.openclaw/workspace",
      // 使用下方自定义模型提供商的别名
      "model": { "primary": "custom-claude/claude-sonnet-4-5-20250929" }
    }
  },

  // 自定义模型提供商
  "models": {
    "providers": {
      "custom-claude": {
        "baseUrl": "${ANTHROPIC_BASE_URL}",
        "apiKey": "${ANTHROPIC_AUTH_TOKEN}",
        "api": "anthropic-messages",
        "models": [
          {
            "id": "claude-sonnet-4-5-20250929",
            "name": "Claude Sonnet 4.5",
            "contextWindow": 200000,
            "maxTokens": 4096
          }
        ]
      }
    }
  },

  // 钉钉通道配置
  "channels": {
    "dingtalk": {
      "enabled": true,
      "clientId": "${DINGTALK_CLIENT_ID}",
      "clientSecret": "${DINGTALK_CLIENT_SECRET}",
      "robotCode": "${DINGTALK_ROBOT_CODE}",
      "corpId": "${DINGTALK_CORP_ID}",
      "agentId": "${DINGTALK_AGENT_ID}",
      "dmPolicy": "open",
      "groupPolicy": "open",
      "messageType": "markdown",
      "debug": false
    }
  },

  // 网关配置
  "gateway": {
    "mode": "local",
    "port": 18789,
    "auth": { "token": "${OPENCLAW_GATEWAY_TOKEN}" }
  }
}

配置参考

Agents 配置

配置项说明默认值
agents.defaults.workspaceAgent 工作区路径~/.openclaw/workspace
agents.defaults.model.primary主模型,格式 provider/model-id

模型提供商配置

配置项说明默认值
models.providers.<name>.baseUrlAPI 基地址
models.providers.<name>.apiKeyAPI 密钥
models.providers.<name>.apiAPI 协议(anthropic-messagesopenai 等)
models.providers.<name>.models可用模型列表。模型 id 应使用完整的带日期后缀的 ID(如 claude-sonnet-4-5-20250929),短别名可能导致 422 错误

钉钉通道配置

配置项类型说明默认值
channels.dingtalk.enabledboolean启用/禁用钉钉通道true
channels.dingtalk.clientIdstring应用的 AppKey(必填
channels.dingtalk.clientSecretstring应用的 AppSecret(必填
channels.dingtalk.robotCodestring机器人代码(用于下载媒体和发送卡片)
channels.dingtalk.corpIdstring企业 ID
channels.dingtalk.agentIdstring应用 ID
channels.dingtalk.dmPolicystring私聊策略:open / pairing / allowlist"open"
channels.dingtalk.groupPolicystring群聊策略:open / allowlist"open"
channels.dingtalk.allowFromstring[]允许的发送者 ID 列表[]
channels.dingtalk.messageTypestring消息类型:markdown / card"markdown"
channels.dingtalk.cardTemplateIdstringAI 互动卡片模板 ID(仅 messageType=card 时使用)
channels.dingtalk.cardTemplateKeystring卡片模板内容字段键(仅 messageType=card 时使用)"content"
channels.dingtalk.debugboolean是否开启调试日志false
channels.dingtalk.maxConnectionAttemptsnumber最大连接尝试次数10
channels.dingtalk.initialReconnectDelaynumber初始重连延迟(毫秒)1000
channels.dingtalk.maxReconnectDelaynumber最大重连延迟(毫秒)60000
channels.dingtalk.reconnectJitternumber重连延迟抖动因子(0-1)0.3

AI 互动卡片配置

如果使用 messageType: "card",需要先在 钉钉卡片平台 创建卡片模板:

  1. 进入「我的模板」→「创建模板」
  2. 卡片模板场景选择 「AI 卡片」
  3. 按需设计卡片排版,保存并发布
  4. 复制模板 ID(格式如 xxxxx-xxxxx-xxxxx.schema
  5. 将模板 ID 配置到 cardTemplateId 字段
json5
{
  "channels": {
    "dingtalk": {
      "messageType": "card",
      "cardTemplateId": "你的模板ID"
    }
  }
}

提示:使用钉钉官方 AI 卡片模板时,cardTemplateKey 默认为 "msgContent",无需修改。如果使用自定义模板,需将 cardTemplateKey 配置为模板中定义的内容字段名称。

网关配置

配置项说明默认值
gateway.mode网关运行模式("local""remote")。需设为 "local" 才能启动网关(Docker 镜像通过 --allow-unconfigured 可绕过此限制,但建议显式设置)未设置
gateway.port网关监听端口18789
gateway.auth.token网关认证令牌

更多配置项请参阅 网关配置网关配置示例


Docker Compose 详解

完整的 docker-compose.yml

yaml
services:
  openclaw:
    image: ghcr.io/openclaw/openclaw:latest
    container_name: openclaw_dingtalk
    restart: unless-stopped
    network_mode: host
    env_file:
      - .env
    volumes:
      # 整个 .openclaw 目录(配置文件 + 持久化数据)
      - ./openclaw-data:/home/node/.openclaw

为什么使用 network_mode: host 网关绑定到容器内的 127.0.0.1,标准 Docker 端口映射(ports:)通过桥接网络转发流量,网关会拒绝非 localhost 来源的连接。使用 network_mode: host 让容器直接共享宿主机网络栈。macOS 用户需要在 Docker Desktop 设置中启用 "Enable host networking"

macOS 替代方案:macOS Docker Desktop 的 network_mode: host 通过 VM 实现,行为与 Linux 不同,可能导致端口冲突或异常。钉钉插件使用 Stream 模式(客户端主动外连),不依赖宿主机接收入站连接,因此也可以使用桥接模式加端口映射:

yaml
# 替换 network_mode: host 为:
ports:
  - "18789:18789"

为什么挂载整个目录而非单独文件? 网关运行时需要在 .openclaw 目录下创建多个子目录(identity/credentials/canvas/ 等)并写入临时文件。单独挂载 openclaw.json 文件会导致该文件成为独立挂载点,无法被原子重命名覆盖(报 EBUSY 错误),同时容器也无法在父目录创建新文件(报 EACCES 错误)。

卷挂载说明

挂载容器路径说明
./openclaw-data//home/node/.openclaw整个 OpenClaw 数据目录,包含配置文件(openclaw.json)、Agent 工作区(workspace/)、网关状态(state/)、Agent 会话数据(agents/)、身份信息(identity/)、凭据(credentials/)等

权限说明

Docker 镜像默认以 node 用户(uid 1000)运行。挂载目录必须对该用户可读写。

在 Linux 上创建并设置目录权限:

bash
mkdir -p ./openclaw-data
sudo chown -R 1000:1000 ./openclaw-data

环境变量

通过 .env 文件传递的环境变量:

变量说明
OPENCLAW_GATEWAY_TOKEN网关认证令牌
DINGTALK_CLIENT_ID钉钉应用 Client ID(AppKey)
DINGTALK_CLIENT_SECRET钉钉应用 Client Secret(AppSecret)
DINGTALK_ROBOT_CODE机器人代码(与 Client ID 相同)
DINGTALK_CORP_ID企业 ID
DINGTALK_AGENT_ID应用 ID
ANTHROPIC_AUTH_TOKEN模型 API Token
ANTHROPIC_BASE_URL模型 API 基地址

openclaw.json 中通过 ${VAR_NAME} 语法引用环境变量。这些变量由 OpenClaw 在运行时从容器的进程环境中读取(由 Docker Compose 的 env_file 注入),而非 Docker Compose 自身的变量替换。

端口配置

默认端口为 18789。由于使用 network_mode: host,容器直接监听宿主机端口,无需 ports: 映射。如需修改端口:

  1. 更新 openclaw-data/openclaw.json 中的 gateway.port
  2. 如果使用桥接模式(ports:),同步更新 docker-compose.yml 中的端口映射
  3. 重启容器:docker compose up -d

多实例部署:如果同一台机器上已运行其他 OpenClaw 实例(如飞书、企微),必须为每个实例分配不同的端口(如 187891879018791),否则会因端口冲突导致容器启动失败。


故障排除

容器启动失败

症状docker compose up -d 后容器立即退出或反复重启。

排查步骤:

  1. 检查容器日志:docker compose logs
  2. 检查 .env 文件中的变量是否正确填写
  3. 检查 openclaw.json 语法是否正确(JSON5 格式允许注释和尾逗号)
  4. 检查端口是否被占用:lsof -i :18789
  5. 如果日志显示 unknown channel id: dingtalk,说明钉钉插件未安装。需先安装插件再启动容器(参阅第 1 步)
  6. 如果日志显示 Gateway failed to start: another gateway instance is already listening,说明端口已被其他 OpenClaw 实例占用。修改 openclaw.json 中的 gateway.port 为其他值(如 18791),并同步更新 docker-compose.yml

openclaw.json 中的 ${VAR_NAME} 被替换为实际值

症状openclaw.json 中的 ${ANTHROPIC_BASE_URL} 等环境变量引用被替换为实际值(如 https://api.anthropic.com)。

原因openclaw plugins installopenclaw doctor 在运行时可能自动修改配置文件,将 ${VAR_NAME} 展开为当前环境变量的实际值。

解决方案:安装插件后检查 openclaw.json,将被展开的值恢复为 ${VAR_NAME} 格式。建议在安装插件前备份配置文件:

bash
cp openclaw-data/openclaw.json openclaw-data/openclaw.json.bak

钉钉机器人无响应

症状:在钉钉中向机器人发消息,无任何回复。

排查步骤:

  1. 确认应用已发布并获管理员批准
  2. 确认机器人能力已启用(应用功能机器人
  3. 确认消息接收模式已正确配置(Stream 模式或 HTTP 回调模式)
  4. 确认应用权限完整(参阅 权限配置
  5. 确认网关正在运行:docker compose logs -f,检查相关连接日志
  6. 确认应用的可见范围包含当前用户(参阅 可见范围
  7. 检查钉钉插件是否已安装:openclaw plugins list,确认 dingtalk 在列表中

权限错误(EACCES / EBUSY)

症状:日志中出现 EACCES: permission deniedEBUSY: resource busy or locked 错误。

EACCES:Docker 镜像以 node(uid 1000)运行。确保挂载目录权限正确:

bash
sudo chown -R 1000:1000 ./openclaw-data

EBUSY:如果您将 openclaw.json 作为单独文件挂载(而非挂载整个目录),容器无法原子替换该文件。解决方案:改为挂载整个 openclaw-data 目录(参见上方 Docker Compose 详解)。

群聊中机器人无响应

症状:机器人在私聊中正常,但在群组中无响应。

排查步骤:

  1. 确认机器人已添加到群组
  2. 默认需要 @提及机器人才会响应(钉钉群聊中需要先输入 @ 然后选择机器人名称)
  3. 确认 groupPolicy 未设置为 "disabled"
  4. 检查日志中是否有群组消息的记录
  5. 确认群组中的 群机器人 设置允许该机器人发言

注意:钉钉群聊中 @提及机器人的行为与飞书略有不同。在钉钉中,用户必须在消息开头或中间使用 @提及,且消息文本中会包含 @机器人名称 的文字。

插件未找到

症状:日志中出现钉钉通道加载失败的错误。

钉钉是 OpenClaw 的社区插件,需要单独安装:

bash
openclaw plugins install https://github.com/soimy/openclaw-channel-dingtalk.git

确认插件已安装:openclaw plugins list,检查 dingtalk 是否在列表中。

如果使用 Docker,确保镜像中已包含该插件。

控制面板无法访问(ERR_EMPTY_RESPONSE)

症状:浏览器打开 http://127.0.0.1:18789/ 时显示 ERR_EMPTY_RESPONSE 或 "didn't send any data",但容器日志显示 [gateway] listening

原因:网关绑定到容器内的 127.0.0.1,标准 Docker 端口映射通过桥接网络转发流量(来源 IP 不是 localhost),网关拒绝连接。

解决方案:

  1. docker-compose.yml 中使用 network_mode: host(并移除 ports: 配置)
  2. macOS 用户需在 Docker Desktop 设置中启用 "Enable host networking"(设置 → 资源 → 网络)
  3. 重新创建容器:docker compose down && docker compose up -d

控制面板显示 "unauthorized: gateway token missing"

症状:控制面板页面加载成功,但显示 WebSocket 断开连接,提示 "unauthorized: gateway token missing"。

解决方案:通过 URL 传递令牌访问控制面板:

http://127.0.0.1:18789/?token=<your-gateway-token>

<your-gateway-token> 替换为 .env 中的 OPENCLAW_GATEWAY_TOKEN 值。

模型 422 错误(model not found)

症状:发送消息时返回 HTTP 422: model not found

原因:自定义端点不识别短模型别名。大多数自定义/代理端点需要完整的带日期后缀的模型 ID。

解决方案:在 openclaw-data/openclaw.json 中将模型 ID 更新为完整格式(如 claude-sonnet-4-5-20250929 而非 claude-3-5-sonnet),同时更新 agents.defaults.model.primarymodels.providers.<name>.models[].id

API 频率限制(Rate Limit)

症状:日志中出现 429 Too Many Requestsexceeded the frequency limit 错误。

原因:钉钉开放平台对 API 调用有频率限制,且限制比飞书更为严格。不同 API 的限制不同。

排查步骤:

  1. 检查日志中的具体错误信息,确认是哪个 API 被限流
  2. 常见限制:
    • 机器人发送消息:单聊 20 条/秒,群聊 20 条/秒
    • 通讯录查询:150 次/秒
    • 文件上传:50 次/秒
  3. 如果频繁触发限流,考虑在消息发送间添加延迟
  4. 检查是否有重复消息或循环调用导致请求量异常

提示:钉钉的频率限制因 API 不同而异,具体限制请参阅 钉钉开放平台文档 — 频率限制

Stream 连接断开

症状:使用 Stream 模式时,连接频繁断开或无法建立连接。

排查步骤:

  1. 检查网络连接是否稳定
  2. 确认 clientId 和 clientSecret 正确无误
  3. 检查服务器出口 IP 是否在白名单中(如果配置了 IP 白名单)
  4. 查看容器日志中是否有连接错误的详细信息:docker compose logs -f
  5. 确认应用已发布且处于启用状态
  6. 检查是否有防火墙或代理拦截 WebSocket 连接(Stream 模式使用长连接)

提示:Stream 模式的连接由客户端主动发起,因此不受 NAT 限制。如果连接持续断开,通常是凭据错误或网络不稳定导致。可以尝试重启容器:docker compose restart


返回

相关文档