158 lines
6.1 KiB
Markdown
158 lines
6.1 KiB
Markdown
# DobotAI Docker部署(阿里云RDS)
|
||
|
||
## 定位
|
||
|
||
DobotAI是钉钉渠道编排与交付服务。Docker只运行应用容器`dobotai-dingtalk`;数据库唯一使用已有的阿里云RDS PostgreSQL。
|
||
|
||
```text
|
||
钉钉 Stream
|
||
↓
|
||
dobotai-dingtalk 容器
|
||
├─ 阿里云RDS PostgreSQL:Turn、会话、反馈、管理员、覆盖判定
|
||
└─ 既有WeKnora:Agent、检索、知识、模型
|
||
```
|
||
|
||
禁止创建或使用:
|
||
|
||
```text
|
||
dobotai-postgres 容器
|
||
dobotai-postgres-data 数据卷
|
||
本地PostgreSQL作为DobotAI目标数据库
|
||
```
|
||
|
||
## 架构与目录
|
||
|
||
```text
|
||
宿主机
|
||
├── dobotai-dingtalk 唯一应用容器,host网络
|
||
├── /opt/dobotai/container/ Compose、RDS检查器、SQL迁移、启动脚本
|
||
├── /opt/dobotai/config/dobotai.env 0600,RDS/WeKnora/钉钉配置
|
||
├── /opt/dobotai/secrets/ 0700,DobotAI SecretStore
|
||
└── /opt/dobotai/backups/ 发布前RDS备份记录,不保存Docker数据库卷
|
||
|
||
阿里云RDS
|
||
└── DobotAI专用PostgreSQL数据库
|
||
```
|
||
|
||
应用使用`network_mode: host`,因此通过RDS私网地址访问云数据库、通过`127.0.0.1:8080`访问宿主机现有WeKnora。不会开放新的数据库端口;应用HTTP仍由`DOBOTAI_LISTEN_ADDR=127.0.0.1:8090`约束。
|
||
|
||
## 安装
|
||
|
||
克隆完整仓库后,只执行:
|
||
|
||
```bash
|
||
sudo bash ./install-docker.sh
|
||
```
|
||
|
||
根脚本自动:
|
||
|
||
```text
|
||
检查或安装Docker Engine和Docker Compose v2(APT系统)
|
||
以当前Git提交构建 dobotai-dingtalk:local-<Git短SHA>
|
||
创建 /opt/dobotai/{container,config,secrets,backups}
|
||
复制应用Compose、RDS检查器和21个SQL迁移
|
||
生成权限0600的应用环境模板
|
||
安装三条短命令
|
||
```
|
||
|
||
它不会连接、创建或修改RDS,也不会启动未配置的钉钉应用。
|
||
|
||
## 配置、RDS检查与启动
|
||
|
||
安装后执行:
|
||
|
||
```bash
|
||
sudo dobotai-dingtalk-configure
|
||
```
|
||
|
||
配置器分字段录入阿里云RDS(主机、端口、数据库名、账号、密码),自动组装连接串;WeKnora和钉钉凭证密钥不回显,环境文件原子写入且权限0600。
|
||
|
||
`DOBOTAI_TENANT_KEY`不是WeKnora Agent租户键。它是DobotAI内部数据隔离键,首次安装时自动生成并固定保存;配置器不会要求填写或改动它。WeKnora侧只需要填写实际的两个Agent ID。
|
||
|
||
配置器会要求两个不同的WeKnora Agent ID,并自动生成`DOBOTAI_AGENT_BINDINGS={"dingtalk:*":"快速问答Agent ID"}`。`DOBOTAI_INGRESS_TOKEN`是保护本机`POST /v1/qa`内部接口的Bearer Token,不用于钉钉或WeKnora;同样由安装器自动生成。
|
||
|
||
| 配置 | 示例 | 作用 |
|
||
| --- | --- | --- |
|
||
| `DATABASE_URL` | `postgres://USER:***@rds-endpoint:5432/dobotai?sslmode=require` | DobotAI专用阿里云RDS PostgreSQL |
|
||
| `WEKNORA_BASE_URL` | `http://127.0.0.1:8080` | 宿主机既有WeKnora |
|
||
| `WEKNORA_API_KEY` | `<你的WeKnora API Key>` | DobotAI专用Key |
|
||
| `DOBOTAI_QUICK_AGENT_ID` | `<快速问答Agent ID>` | 默认快速问答实际调用的Agent |
|
||
| `DOBOTAI_REASONING_AGENT_ID` | `<智能推理Agent ID>` | `/think`和持续智能推理实际调用的Agent |
|
||
| `DINGTALK_CLIENT_ID` | `dingxxxxxxxx` | 钉钉AppKey |
|
||
| `DINGTALK_CLIENT_SECRET` | `<你的钉钉 AppSecret>` | 钉钉AppSecret |
|
||
|
||
回答图片外发OSS同为分字段录入的可选整组(紧随RDS之后、WeKnora/钉钉凭证之前):
|
||
|
||
| 配置 | 示例 | 作用 |
|
||
| --- | --- | --- |
|
||
| `DOBOTAI_OUTBOUND_IMAGE_OSS_ENDPOINT` | `https://oss-cn-shenzhen.aliyuncs.com` | 私有Bucket接入地址 |
|
||
| `DOBOTAI_OUTBOUND_IMAGE_OSS_REGION` | `cn-shenzhen` | Bucket所在地域 |
|
||
| `DOBOTAI_OUTBOUND_IMAGE_OSS_BUCKET` | `dobot-xxx` | 外发图片专用私有Bucket |
|
||
| `DOBOTAI_OUTBOUND_IMAGE_OSS_ACCESS_KEY_ID` | `<AK ID>` | 仅授权该Bucket的AK |
|
||
| `DOBOTAI_OUTBOUND_IMAGE_OSS_ACCESS_KEY_SECRET` | `<AK Secret>` | 仅授权该Bucket的SK(不回显) |
|
||
| `DOBOTAI_OUTBOUND_IMAGE_PUBLIC_BASE_URL` | `https://host/dingtalk/i` | 钉钉可见的稳定HTTPS入口,不含凭据 |
|
||
|
||
OSS规则:六项全部留空即整组禁用图片外发(答案含`resource://`图片时按无图降级);填写任一项则六项必填,缺项拒绝保存。运行时仅改写WeKnora `resource://`引用为短签HTTPS,私有Bucket由稳定基础地址代理,`<img>`外链与`data:`剥除。禁止把OSS凭据写入Git或命令行。
|
||
|
||
保存后脚本自动执行以下RDS门禁:
|
||
|
||
```text
|
||
1. 使用RDS连接串执行 pg_isready
|
||
2. 检查DobotAI核心表
|
||
3. 数据库没有任何public表:按000001~000021初始化
|
||
4. 所有核心表存在:判定正常,不执行任何DDL
|
||
5. 部分表、缺表或非空异常库:拒绝初始化和启动
|
||
6. RDS通过后才启动 dobotai-dingtalk 并检查 /healthz
|
||
```
|
||
|
||
这保证不会把已有RDS表误当成空库重建,也不会把半成品或错误库静默升级。
|
||
|
||
## 日常命令
|
||
|
||
```bash
|
||
# 重新检查RDS并启动/升级应用
|
||
sudo dobotai-dingtalk-start
|
||
|
||
# 交互更新RDS、WeKnora、钉钉配置后启动
|
||
sudo dobotai-dingtalk-configure
|
||
|
||
# 仅首位管理员且无有效管理员时使用
|
||
sudo dobotai-dingtalk-bind-admin
|
||
|
||
# 健康与版本
|
||
curl --noproxy '*' -fsS http://127.0.0.1:8090/healthz
|
||
curl --noproxy '*' -fsS http://127.0.0.1:8090/version
|
||
```
|
||
|
||
## 升级与回滚
|
||
|
||
应用升级仅替换`dobotai-dingtalk`镜像。启动前再次检查RDS;健康失败时恢复上一应用镜像(如存在)。RDS不是容器资产,不能被`docker compose down`、镜像替换或本机卷操作影响。
|
||
|
||
RDS有实际数据时,数据库备份、SQL变更与恢复应在阿里云RDS发布流程中完成并验证;不要把应用镜像回滚误当成数据库回滚。
|
||
|
||
## 首位管理员
|
||
|
||
应用和钉钉Stream运行后:
|
||
|
||
```bash
|
||
sudo dobotai-dingtalk-bind-admin
|
||
```
|
||
|
||
终端会显示10分钟有效的六码;候选管理员私聊机器人:
|
||
|
||
```text
|
||
/setting <六码绑定码>
|
||
```
|
||
|
||
已有有效管理员时绑定命令会拒绝,避免提权。
|
||
|
||
## 不执行的操作
|
||
|
||
```text
|
||
不创建本地PostgreSQL容器或数据卷
|
||
不迁移、删除或覆盖现有本地 dobotai-test-postgres
|
||
不创建、删除或重置阿里云RDS数据库
|
||
不把RDS连接串、Token、钉钉凭据写入Git、命令行或日志
|
||
不重建WeKnora、Neo4j、Redis、Elasticsearch
|
||
```
|