# OpenClaw 集成方案设计

> 状态: 讨论中，尚未开始实现
> 日期: 2026-03-07

---

## 一、OpenClaw 是什么

- **GitHub**: https://github.com/openclaw/openclaw
- **定性**: 开源自主 AI Agent，2026年初爆火，前身为 Clawdbot/Moltbot
- **完全开源**: 有完整源码 + Dockerfile，可以 fork 定制
- **核心架构**:

```
Gateway 进程 (ws://127.0.0.1:18789)
  ├── CLI 客户端          ← WebSocket RPC
  ├── Web UI             ← WebSocket RPC
  ├── channel 插件        ← WebSocket RPC (WhatsApp/Telegram/Slack/Discord 等)
  ├── native 节点         ← WebSocket RPC (macOS/iOS/Android)
  └── HTTP POST /tools/invoke  ← 直接调用工具
```

Gateway 是唯一的控制平面，所有子系统通过它通信，没有子系统直接互相通信。

- **卷挂载**:
  - `~/.openclaw` → `/home/node/.openclaw` (配置目录)
  - `~/openclaw/workspace` → `/home/node/.openclaw/workspace` (工作区/用户数据)
- **关键环境变量**:
  - `OPENCLAW_GATEWAY_TOKEN` — 内部 API 认证 token
  - `CLAUDE_AI_SESSION_KEY` / Anthropic API Key

---

## 二、集成目标

用户在 IT0 App 里对话，iAgent 帮用户：
1. 在指定服务器上部署一个属于用户自己的真实 OpenClaw 实例
2. iAgent 可以管理（启动/停止/监控）用户的 OpenClaw 实例
3. 用户可以通过 IT0 App 直接向自己的 OpenClaw 下发任务，看到结果
4. 计费、用量、状态监控全部打通到 IT0 平台

---

## 三、技术方案

### 3.1 自定义 Docker 镜像 (openclaw-bridge)

基于 OpenClaw 官方源码 (`openclaw/openclaw`) 构建我们自己的镜像，**单容器，两进程共存**（不用 sidecar，便于多租户在同一物理服务器上并发部署）：

```
容器内进程：
  ├── openclaw gateway (原生，端口 18789 内部，不对外暴露)
  └── it0-bridge (新增 Node/NestJS 服务，端口 3000 对外)
        ├── 连接 OpenClaw Gateway WebSocket RPC (ws://127.0.0.1:18789)
        ├── 对外暴露 IT0 标准 REST API
        ├── 接收 iAgent 下发的任务 → 转发给 OpenClaw
        ├── 订阅 OpenClaw 输出 → 回传给 IT0 agent-service
        └── 上报健康状态 / 用量统计
```

镜像名: `it0hub/openclaw-bridge:latest`

多租户并发部署示例（同一台物理服务器）：
```bash
docker run -d --name openclaw-{userId1} -p 3101:3000 -v /data/openclaw/{userId1}:/home/node/.openclaw ...
docker run -d --name openclaw-{userId2} -p 3102:3000 -v /data/openclaw/{userId2}:/home/node/.openclaw ...
```
每个实例端口独立、数据目录隔离，iAgent 通过容器名管理生命周期。

### 3.2 部署流程

iAgent（我们的 Claude Code 智能体）通过已有的 SSH 工具执行：

```bash
docker run -d \
  --name openclaw-{userId} \
  -p {port}:3000 \
  -v /data/openclaw/{userId}:/home/node/.openclaw \
  -e OPENCLAW_GATEWAY_TOKEN={token} \
  -e IT0_AGENT_SERVICE_URL=https://it0api.szaiai.com \
  -e IT0_TENANT_ID={tenantId} \
  -e IT0_INSTANCE_ID={instanceId} \
  -e IT0_AUTH_TOKEN={authToken} \
  -e CLAUDE_API_KEY={claudeKey} \
  it0/openclaw-bridge:latest
```

### 3.3 IT0 后台记录 (agent_instances 表)

```sql
-- 记录每个用户的 OpenClaw 实例
agent_instances (
  id, tenant_id, user_id,
  server_host,       -- 部署在哪台服务器
  container_name,    -- docker 容器名
  port,              -- 对外暴露端口
  status,            -- running/stopped/error
  gateway_token,     -- OpenClaw gateway token (加密存储)
  claude_api_key,    -- 用户的 Anthropic key (加密存储)
  config,            -- JSONB，OpenClaw 配置
  created_at, updated_at
)
```

### 3.4 iAgent 可执行的管理操作

通过 SSH 工具调用：
- `docker start/stop/restart openclaw-{userId}`
- `docker logs openclaw-{userId}`
- `docker stats openclaw-{userId}`

通过 IT0 Bridge REST API 调用：
- `POST /task` — 向 OpenClaw 提交任务
- `GET /status` — 查询实例运行状态
- `GET /sessions` — 查询对话历史
- `GET /metrics` — 获取用量数据

---

## 四、已确认决策

1. **目标服务器来源** ✅
   - 两种都支持：
     - IT0 公司提供统一服务器池（用户购买套餐，自动分配实例）
     - 用户自带服务器（用户在 IT0 中录入 SSH 凭证，iAgent 登录部署）

2. **用户访问 OpenClaw 的方式** ✅
   - OpenClaw 自身支持多 channel（Telegram、WhatsApp、Line 等），用户直接用这些 channel 与自己的 OpenClaw 实例交互
   - IT0 的职责是**管理层**：部署、启停、监控、保障稳定运行，而不是成为主要对话入口
   - IT0 App 展示实例状态、日志、用量，并提供各 channel 的接入配置引导

3. **Claude API Key 归属** ✅
   - 用户购买 IT0 套餐，IT0 统一承担 Anthropic API 费用
   - IT0 的 `CLAUDE_API_KEY` 注入到每个 OpenClaw 容器，用量计入对应 tenant 的配额

4. **openclaw-bridge 镜像托管** ✅
   - 同时支持两种：
     - Docker Hub 公开仓库（`it0hub/openclaw-bridge:latest`）——方便外部服务器拉取
     - 我们自己的私有 Registry——内网/自有服务器池使用
   - 镜像本身不含任何密钥，所有凭证通过环境变量运行时注入

5. **OpenClaw 版本更新策略** ✅
   - 不存在复杂的版本跟踪问题：OpenClaw 发布新版时，我们拉取最新源码重新 build 一个包含 IT0 Bridge 的新镜像即可
   - CI/CD: 监听 openclaw/openclaw 上游 release → 自动触发我们的镜像 build → 推送到 Docker Hub + 私有 Registry

---

## 五、架构补充：服务器池

### 5.1 归属
- **inventory-service** 新增 `PoolServer` 实体（平台级，public schema，仅 platform_admin 可管理）

### 5.2 数据结构
```sql
-- public schema（非租户隔离）
CREATE TABLE pool_servers (
  id          UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  name        VARCHAR(100) NOT NULL,          -- 别名，如"训练服务器"
  host        VARCHAR(255) NOT NULL,          -- IP 或域名
  ssh_port    INT NOT NULL DEFAULT 22,
  ssh_user    VARCHAR(100) NOT NULL,
  ssh_key     TEXT NOT NULL,                  -- 加密存储的私钥内容
  max_instances INT NOT NULL DEFAULT 10,      -- 管理员手动设置上限
  status      VARCHAR(20) DEFAULT 'active',   -- active / maintenance / offline
  region      VARCHAR(100),                   -- 可选，地区标注
  notes       TEXT,
  created_at  TIMESTAMPTZ DEFAULT NOW(),
  updated_at  TIMESTAMPTZ DEFAULT NOW()
);
```

### 5.3 SSH 凭证存储
- SSH 私钥加密后存入 `pool_servers.ssh_key`（AES-256，密钥来自 agent-service 环境变量）
- agent-service 在部署时解密私钥，写入临时文件，SSH 连接后立即删除临时文件

### 5.4 容量分配逻辑
```
iAgent 部署新实例时：
  1. 查询 inventory-service: GET /api/v1/inventory/pool-servers?available=true
  2. 返回 current_instances < max_instances 的服务器列表
  3. 选用量最少的那台（最优分布）
  4. SSH 连接 → docker run → 成功后 current_instances + 1
```

---

## 六、实现阶段规划（已确认）

### Phase 1: 服务器池 + 基础部署能力

**inventory-service**
- [ ] DB 迁移: `pool_servers` 表（public schema）
- [ ] PoolServer 实体 + Repository + CRUD REST 接口
- [ ] Kong 路由: `/api/v1/inventory/pool-servers`（platform_admin only）

**agent-service**
- [ ] DB 迁移: `agent_instances` 表（tenant schema）
- [ ] AgentInstance 实体 + Repository + CRUD REST 接口
- [ ] SSH 私钥加解密工具（AES-256）
- [ ] 部署工具: 查询服务器池 → SSH → docker run → 记录实例

**openclaw-bridge 镜像**
- [ ] 基于 openclaw/openclaw 源码，新建 `packages/openclaw-bridge/` 目录
- [ ] 编写 it0-bridge 进程（Node.js，连接 OpenClaw Gateway WS 18789，对外 REST 3000）
- [ ] 编写 Dockerfile（两进程，supervisord 管理）
- [ ] 推送到 Docker Hub: `it0hub/openclaw-bridge:latest`

**Web Admin**
- [ ] 服务器池管理页面 `/server-pool`（列表 + 添加 + 删除 + 容量编辑）
- [ ] OpenClaw 实例列表页 `/openclaw-instances`（跨租户，platform_admin 视角）

### Phase 2: App 集成
- [ ] my_agents_page 展示真实实例列表 + 状态
- [ ] 实例详情页: 状态 / 日志 / channel 配置引导（Telegram/WhatsApp/Line 接入）
- [ ] iAgent 对话支持部署指令识别（"帮我创建一个 OpenClaw"）

### Phase 3: 计费与监控
- [ ] 用量上报到 billing-service（每个实例的 token 用量）
- [ ] 套餐限制（免费版: 0个实例，Pro: 1个，Enterprise: N个）
- [ ] 实例健康监控 + 自动重启（心跳检测）
