Skip to content

用 Claude Code 一键部署 OpenClaw + 钉钉

将下方的完整指令复制给 claude --dangerously-skip-permissions,即可让 Claude Code 自动完成大部分部署工作。你只需提前准备好几项信息。


使用方法

  1. 提前准备好下方 准备清单 中的所有信息
  2. 复制下方 完整指令 的全部内容(无需修改,直接复制)
  3. 在终端运行:
bash
claude --dangerously-skip-permissions
  1. 将复制的指令粘贴给 Claude
  2. Claude 会自动创建目录、生成配置文件骨架、启动容器
  3. Claude 会在适当时机暂停并提醒你手动编辑 .env 文件填入凭据
  4. 按提示完成钉钉开放平台上的手动步骤

准备清单

Claude Code 会自动生成所有配置文件,但以下信息需要你提前准备好,在 Claude 暂停时手动填入:

1. Docker 环境

  • [ ] 已安装 Docker 和 Docker Compose v2(Docker Desktop 或 Docker Engine)
  • [ ] macOS 用户:已在 Docker Desktop 中启用 "Enable host networking"(设置 → 资源 → 网络)

2. 钉钉应用凭据

你需要先在 钉钉开放平台 创建企业内部应用,获取:

  • [ ] Client ID(即 AppKey,从应用的"凭证与基础信息"页获取)
  • [ ] Client Secret(即 AppSecret)
  • [ ] Robot Code(机器人代码,与 Client ID 相同)
  • [ ] Corp ID(企业 ID)
  • [ ] Agent ID(应用 ID)

创建应用的详细步骤见 钉钉应用配置详解。你也可以先让 Claude 生成所有配置文件,再去创建钉钉应用,然后填入凭据。

3. AI 模型 API 凭据

  • [ ] API Token(如 Anthropic API Key)
  • [ ] API Base URL(如 https://api.anthropic.com,或你的自定义代理端点)

如果你使用的模型 ID 不是默认的 claude-sonnet-4-5-20250929,在 Claude 暂停时告诉它修改即可。

4. 钉钉开放平台手动操作(Claude 无法自动完成)

以下步骤需要你在钉钉开放平台的网页控制台中手动完成,Claude 会在对应时机提醒你:

  • [ ] 配置应用权限(需开启 Card.Instance.WriteCard.Streaming.Write,参阅 钉钉应用配置详解
  • [ ] 启用机器人能力
  • [ ] 配置消息接收模式(推荐 Stream 模式)— 必须在容器启动后进行
  • [ ] 发布应用(需组织管理员审批)

完整指令

将以下内容直接复制,粘贴给 claude --dangerously-skip-permissions(无需修改任何内容):

markdown
请帮我部署 OpenClaw + 钉钉机器人。按照以下步骤操作,在需要我手动操作的步骤**停下来等我确认**

## 操作步骤

### 1. 创建项目目录

```bash
mkdir -p ~/openclaw-dingtalk/openclaw-data
cd ~/openclaw-dingtalk
```

### 2. 生成网关令牌并创建 .env 模板

生成一个安全的随机令牌:
```bash
openssl rand -base64 32
```

用生成的令牌创建 `.env` 文件,其中网关令牌填入生成的值,其余凭据留空让我手动填写:
```
OPENCLAW_GATEWAY_TOKEN=<填入上面生成的令牌>
DINGTALK_CLIENT_ID=
DINGTALK_CLIENT_SECRET=
DINGTALK_ROBOT_CODE=
DINGTALK_CORP_ID=
DINGTALK_AGENT_ID=
ANTHROPIC_AUTH_TOKEN=
ANTHROPIC_BASE_URL=
```

### 3. 停下来,提醒我手动编辑 .env

告诉我 `.env` 文件已创建在 `~/openclaw-dingtalk/.env`,请我用编辑器打开并填入以下值:

- `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` — AI 模型 API Token
- `ANTHROPIC_BASE_URL` — AI 模型 API 地址(如 `https://api.anthropic.com`

并确认 `OPENCLAW_GATEWAY_TOKEN` 已自动填入。

**等我说"已填好"或"done"后再继续下一步。**

### 4. 安装钉钉插件

先创建一个不包含 `channels.dingtalk` 的最小 `openclaw-data/openclaw.json`(仅包含 models 和 gateway 配置),然后通过 Docker 安装插件:

```bash
docker run --rm --env-file .env \
  -v ./openclaw-data:/home/node/.openclaw \
  ghcr.io/openclaw/openclaw:latest \
  sh -c "node /app/openclaw.mjs plugins install https://github.com/soimy/openclaw-channel-dingtalk.git"
```

如果本地已安装 `openclaw` CLI,也可以直接运行:

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

安装完成后,检查 `openclaw-data/openclaw.json` 中的 `${VAR_NAME}` 是否被展开为实际值,如果是则恢复为 `${VAR_NAME}` 格式。

### 5. 创建 openclaw-data/openclaw.json

```json5
{
  "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}" }
  }
}
```

注意:配置文件中的 `${VAR_NAME}` 是 OpenClaw 运行时变量替换语法,不要展开它们,保持原样写入文件。

### 6. 创建 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-data:/home/node/.openclaw
```

### 7. 创建 .gitignore

```
.env
```

### 8. 启动容器

```bash
docker compose up -d
docker compose logs -f
```

等待日志中出现 `[gateway] listening`,然后告诉我。

### 9. 停下来,提醒我完成钉钉手动步骤

容器启动后,提醒我去钉钉开放平台完成以下操作:

1. 进入 **应用功能****机器人** → 启用机器人能力
2. 消息接收模式选择 **Stream 模式**(插件仅支持 Stream 模式)
3. 配置应用权限(开启 `Card.Instance.Write``Card.Streaming.Write`
4. 创建版本并发布应用
5. 等待管理员审批通过

等待日志中出现钉钉通道连接成功的日志。

**等我说"已完成"或"done"后再继续下一步。**

### 10. 配对机器人(仅 dmPolicy=pairing 时)

默认配置 `dmPolicy``"open"`,所有用户可直接使用,无需配对。如需配对流程,请将 `dmPolicy` 改为 `"pairing"`

当我在钉钉中向机器人发消息并收到配对码后,帮我执行:

```bash
docker compose exec openclaw openclaw pairing approve dingtalk <配对>
```

如果 `openclaw` 命令未找到,使用:

```bash
docker compose exec openclaw node dist/index.js pairing approve dingtalk <配对>
```

## 注意事项

- .env 文件包含敏感信息,绝不要读取、打印或提交到 Git
- 如果遇到权限问题(Linux),运行:`sudo chown -R 1000:1000 ./openclaw-data`
- 配置文件中的 `${VAR_NAME}` 是 OpenClaw 运行时变量替换语法,不要展开它们
- 安装插件后 `openclaw doctor` 可能会将 `${VAR_NAME}` 展开为实际值,需检查并恢复
- 钉钉插件使用 Stream 模式,无需公网地址
- 如果同一台机器上已运行其他 OpenClaw 实例(飞书、企微等),需修改 `gateway.port` 为不同端口(如 18791),并同步更新 `docker-compose.yml` 的端口映射
- macOS 上 `network_mode: host` 可能不稳定,可改用 `ports: ["18789:18789"]` 桥接模式

试玩一下

部署完成后,向机器人发送以下消息来验证是否正常工作:

访问 https://xialiao.ai/skill.md 并按照说明加入「虾聊社区」

机器人会自动回复结果,一步验证部署状态。


后续操作

部署完成后,你可能还需要:


相关文档