6.1 KiB
DobotAI Docker部署(阿里云RDS)
定位
DobotAI是钉钉渠道编排与交付服务。Docker只运行应用容器dobotai-dingtalk;数据库唯一使用已有的阿里云RDS PostgreSQL。
钉钉 Stream
↓
dobotai-dingtalk 容器
├─ 阿里云RDS PostgreSQL:Turn、会话、反馈、管理员、覆盖判定
└─ 既有WeKnora:Agent、检索、知识、模型
禁止创建或使用:
dobotai-postgres 容器
dobotai-postgres-data 数据卷
本地PostgreSQL作为DobotAI目标数据库
架构与目录
宿主机
├── 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约束。
安装
克隆完整仓库后,只执行:
sudo bash ./install-docker.sh
根脚本自动:
检查或安装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检查与启动
安装后执行:
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门禁:
1. 使用RDS连接串执行 pg_isready
2. 检查DobotAI核心表
3. 数据库没有任何public表:按000001~000021初始化
4. 所有核心表存在:判定正常,不执行任何DDL
5. 部分表、缺表或非空异常库:拒绝初始化和启动
6. RDS通过后才启动 dobotai-dingtalk 并检查 /healthz
这保证不会把已有RDS表误当成空库重建,也不会把半成品或错误库静默升级。
日常命令
# 重新检查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运行后:
sudo dobotai-dingtalk-bind-admin
终端会显示10分钟有效的六码;候选管理员私聊机器人:
/setting <六码绑定码>
已有有效管理员时绑定命令会拒绝,避免提权。
不执行的操作
不创建本地PostgreSQL容器或数据卷
不迁移、删除或覆盖现有本地 dobotai-test-postgres
不创建、删除或重置阿里云RDS数据库
不把RDS连接串、Token、钉钉凭据写入Git、命令行或日志
不重建WeKnora、Neo4j、Redis、Elasticsearch