- 从服务器拉取完整代码 - 按框架规范整理项目结构 - 配置 Drone CI 测试环境部署 - 包含后端(FastAPI)、前端(Vue3)、管理端 技术栈: Vue3 + TypeScript + FastAPI + MySQL
703 lines
25 KiB
Markdown
703 lines
25 KiB
Markdown
# 考培练系统 - 部署架构(统一版)
|
||
|
||
> 更新日期:2026-01-18(新增 SaaS 超级管理后台,统一租户配置管理)
|
||
>
|
||
> 本文档描述了考培练系统的统一部署架构,实现代码热重载和快速更新。
|
||
>
|
||
> **核心特性**:
|
||
> - 前后端均采用共享代码方案,一次构建/修改,全部租户同步更新
|
||
> - **新增**:SaaS 超级管理后台,统一管理所有租户配置、AI提示词、功能开关
|
||
|
||
## 一、架构概览
|
||
|
||
```
|
||
┌─────────────────────────────────────┐
|
||
│ kaopeilian-nginx │
|
||
│ (入口反向代理服务器) │
|
||
│ 80/443 端口 │
|
||
└───────────────┬─────────────────────┘
|
||
│
|
||
┌───────────────────────────────┼───────────────────────────────┐
|
||
│ │ │ │ │
|
||
▼ ▼ ▼ ▼ ▼
|
||
┌─────────┐ ┌───────────┐ ┌───────────┐ ┌───────────┐ ┌───────────┐
|
||
│管理后台 │ │ 演示版 │ │ 多客户版 │ │ 瑞小美 │ │陪练试用版 │
|
||
│admin.* │ │ aiedu.* │ │yy/hl/xy.. │ │ kpl.* │ │ pl.* │
|
||
└─────────┘ └───────────┘ └───────────┘ └───────────┘ └───────────┘
|
||
│
|
||
▼
|
||
┌─────────────┐
|
||
│kaopeilian_ │
|
||
│admin (管理库)│
|
||
└─────────────┘
|
||
```
|
||
|
||
## 二、容器清单
|
||
|
||
### 2.1 基础设施层
|
||
|
||
| 容器名称 | 镜像 | 端口 | 说明 |
|
||
|---------|------|------|------|
|
||
| kaopeilian-nginx | nginx:1.25-alpine | 80, 443 | 入口反向代理 |
|
||
| kaopeilian-mysql | mysql:8.0.43 | 3307 | 演示版数据库 |
|
||
| kaopeilian-redis | redis:7.2-alpine | 6379 | 演示版 Redis |
|
||
| kpl-mysql-dev | mysql:8.0.43 | 3308 | 瑞小美数据库 |
|
||
| kpl-redis-dev | redis:7.2-alpine | 6380 | 瑞小美 Redis |
|
||
| prod-mysql | mysql:8.0.43 | 3309 | 多客户共享数据库 |
|
||
| peilian-mysql | mysql:8.0.43 | 3310 | 陪练试用版数据库 |
|
||
| peilian-redis | redis:7.2-alpine | 6382 | 陪练试用版 Redis |
|
||
|
||
### 2.2 前端层(共享 dist 方案)
|
||
|
||
所有前端容器使用同一个 `kaopeilian-frontend:shared` 镜像,挂载共享的 dist 目录:
|
||
|
||
| 容器名称 | 对应域名 | 端口 | 说明 |
|
||
|---------|---------|------|------|
|
||
| kaopeilian-frontend | aiedu.ireborn.com.cn | - | 演示版(无外部端口映射) |
|
||
| kpl-frontend-dev | kpl.ireborn.com.cn | 3002:80 | 瑞小美 |
|
||
| hua-frontend | hua.ireborn.com.cn | 3010:80 | 华尔倍丽 |
|
||
| yy-frontend | yy.ireborn.com.cn | 3011:80 | 杨扬宠物 |
|
||
| hl-frontend | hl.ireborn.com.cn | 3012:80 | 武汉禾丽 |
|
||
| xy-frontend | xy.ireborn.com.cn | 3013:80 | 芯颜定制 |
|
||
| fw-frontend | fw.ireborn.com.cn | 3014:80 | 飞沃 |
|
||
| ex-frontend | ex.ireborn.com.cn | 3015:80 | 恩喜成都总院 |
|
||
|
||
#### 独立部署前端
|
||
|
||
| 容器名称 | 对应域名 | 端口 | 说明 |
|
||
|---------|---------|------|------|
|
||
| peilian-frontend | pl.ireborn.com.cn | 3020:3000 | 陪练试用版(独立代码库) |
|
||
|
||
**共享前端配置说明:**
|
||
- 镜像:`kaopeilian-frontend:shared`(仅含 nginx,不含代码)
|
||
- 挂载:`/root/aiedu/kaopeilian-frontend/dist:/usr/share/nginx/html:ro`
|
||
- 原理:前端代码使用 `window.location.origin` 动态获取 API 地址,支持多域名部署
|
||
- 优势:一次 `npm run build`(约3分钟),8 个租户同时更新
|
||
- 配置文件:`/root/aiedu/docker-compose.prod-multi.yml`(所有租户前端配置已统一)
|
||
|
||
### 2.3 后端层(代码热重载)
|
||
|
||
所有后端容器挂载同一个代码目录,实现统一代码管理:
|
||
|
||
| 容器名称 | 对应域名 | 端口 | 数据库 |
|
||
|---------|---------|------|--------|
|
||
| kaopeilian-backend | aiedu.ireborn.com.cn | 8000 | kaopeilian-mysql |
|
||
| kpl-backend-dev | kpl.ireborn.com.cn | 8001 | kpl-mysql-dev |
|
||
| hua-backend | hua.ireborn.com.cn | 8010 | prod-mysql |
|
||
| yy-backend | yy.ireborn.com.cn | 8011 | prod-mysql |
|
||
| hl-backend | hl.ireborn.com.cn | 8012 | prod-mysql |
|
||
| xy-backend | xy.ireborn.com.cn | 8013 | prod-mysql |
|
||
| fw-backend | fw.ireborn.com.cn | 8014 | prod-mysql |
|
||
| ex-backend | ex.ireborn.com.cn | 8015 | prod-mysql |
|
||
| peilian-backend | pl.ireborn.com.cn | 8020 | peilian-mysql |
|
||
|
||
**共享配置:**
|
||
- 代码目录:`/root/aiedu/kaopeilian-backend/app:/app/app`
|
||
- 启动命令:`uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload`
|
||
|
||
### 2.4 Redis 缓存层
|
||
|
||
| 容器名称 | 端口 | 对应租户 |
|
||
|---------|------|---------|
|
||
| kaopeilian-redis | 6379 | 演示版 |
|
||
| kpl-redis-dev | 6380 | 瑞小美 |
|
||
| peilian-redis | 6382 | 陪练试用版 |
|
||
| hua-redis | 6390 | 华尔倍丽 |
|
||
| yy-redis | 6391 | 杨扬宠物 |
|
||
| hl-redis | 6392 | 武汉禾丽 |
|
||
| xy-redis | 6393 | 芯颜定制 |
|
||
| fw-redis | 6394 | 飞沃 |
|
||
| ex-redis | 6395 | 恩喜成都总院 |
|
||
|
||
## 三、代码更新方式
|
||
|
||
### 3.1 后端代码更新
|
||
|
||
**方式:自动热重载**
|
||
|
||
直接修改 `/root/aiedu/kaopeilian-backend/app/` 下的文件,所有后端容器会自动检测变更并重载。
|
||
|
||
```bash
|
||
# 示例:修改 admin.py
|
||
vim /root/aiedu/kaopeilian-backend/app/api/v1/admin.py
|
||
# 保存后自动生效,无需任何操作
|
||
```
|
||
|
||
### 3.2 前端代码更新
|
||
|
||
**方式:一次构建,全部更新**
|
||
|
||
```bash
|
||
cd /root/aiedu/kaopeilian-frontend && npm run build
|
||
```
|
||
|
||
构建完成后,所有共享前端容器自动提供最新的静态文件,无需重启。
|
||
|
||
## 四、配置文件位置
|
||
|
||
### 4.1 Docker Compose 文件
|
||
|
||
| 文件 | 说明 |
|
||
|------|------|
|
||
| `/root/aiedu/docker-compose.yml` | 演示版(含 Nginx) |
|
||
| `/root/aiedu/docker-compose.kpl.yml` | 瑞小美后端 |
|
||
| `/root/aiedu/docker-compose.prod-multi.yml` | **多客户前端 + 后端 + Redis(已统一,推荐)** |
|
||
|
||
> **重要**:2026-01-17 已将所有租户前端配置统一到 `docker-compose.prod-multi.yml`,使用共享 dist 挂载方式。
|
||
|
||
### 4.2 Nginx 配置
|
||
|
||
| 文件 | 对应域名 |
|
||
|------|---------|
|
||
| `/root/aiedu/nginx/conf.d/kaopeilian.conf` | aiedu.ireborn.com.cn |
|
||
| `/root/aiedu/nginx/conf.d/kpl.conf` | kpl.ireborn.com.cn |
|
||
| `/root/aiedu/nginx/conf.d/pl.conf` | pl.ireborn.com.cn |
|
||
| `/root/aiedu/nginx/conf.d/yy.conf` | yy.ireborn.com.cn |
|
||
| `/root/aiedu/nginx/conf.d/hl.conf` | hl.ireborn.com.cn |
|
||
| `/root/aiedu/nginx/conf.d/xy.conf` | xy.ireborn.com.cn |
|
||
| `/root/aiedu/nginx/conf.d/fw.conf` | fw.ireborn.com.cn |
|
||
| `/root/aiedu/nginx/conf.d/hua.conf` | hua.ireborn.com.cn |
|
||
| `/root/aiedu/nginx/conf.d/ex.conf` | ex.ireborn.com.cn |
|
||
|
||
### 4.3 环境变量文件
|
||
|
||
| 文件 | 说明 |
|
||
|------|------|
|
||
| `/root/aiedu/kaopeilian-backend/.env.production` | 演示版 |
|
||
| `/data/prod-envs/kaopeilian-backend/.env.yy` | 杨扬宠物 |
|
||
| `/data/prod-envs/kaopeilian-backend/.env.hl` | 武汉禾丽 |
|
||
| `/data/prod-envs/kaopeilian-backend/.env.xy` | 芯颜定制 |
|
||
| `/data/prod-envs/kaopeilian-backend/.env.fw` | 飞沃 |
|
||
| `/data/prod-envs/kaopeilian-backend/.env.hua` | 华尔倍丽 |
|
||
| `/data/prod-envs/kaopeilian-backend/.env.ex` | 恩喜成都总院 |
|
||
|
||
## 五、常用运维命令
|
||
|
||
### 5.1 查看容器状态
|
||
```bash
|
||
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" | sort
|
||
```
|
||
|
||
### 5.2 重启后端(热重载失效时)
|
||
```bash
|
||
# 重启所有后端
|
||
docker restart kaopeilian-backend kpl-backend-dev yy-backend hl-backend xy-backend fw-backend hua-backend peilian-backend
|
||
```
|
||
|
||
### 5.3 更新前端(共享 dist 方案)
|
||
```bash
|
||
# 一次构建,所有 8 个租户自动更新
|
||
cd /root/aiedu/kaopeilian-frontend && npm run build
|
||
|
||
# 如需强制刷新,可重启前端容器(通常不需要)
|
||
cd /root/aiedu && docker compose -f docker-compose.prod-multi.yml restart hua-frontend yy-frontend hl-frontend xy-frontend fw-frontend
|
||
```
|
||
|
||
### 5.4 重新加载 Nginx
|
||
```bash
|
||
docker exec kaopeilian-nginx nginx -s reload
|
||
```
|
||
|
||
### 5.5 查看后端日志
|
||
```bash
|
||
# 指定租户
|
||
docker logs -f yy-backend --tail 100
|
||
|
||
# 所有后端
|
||
for c in kaopeilian-backend kpl-backend-dev yy-backend hl-backend xy-backend fw-backend hua-backend peilian-backend; do
|
||
echo "=== $c ===" && docker logs $c --tail 5
|
||
done
|
||
```
|
||
|
||
### 5.6 启动多客户服务(前端+后端+Redis)
|
||
```bash
|
||
cd /root/aiedu && docker compose -f docker-compose.prod-multi.yml up -d
|
||
```
|
||
|
||
### 5.7 验证前端统一部署状态
|
||
```bash
|
||
# 检查所有前端容器是否使用共享 dist 目录
|
||
for c in ex-frontend kpl-frontend-dev kaopeilian-frontend hl-frontend xy-frontend hua-frontend yy-frontend fw-frontend; do
|
||
mount=$(docker inspect $c --format='{{range .Mounts}}{{if eq .Destination "/usr/share/nginx/html"}}{{.Source}}{{end}}{{end}}' 2>/dev/null)
|
||
status=$(docker inspect $c --format='{{.State.Health.Status}}' 2>/dev/null)
|
||
echo "$c: $mount ($status)"
|
||
done
|
||
```
|
||
|
||
## 六、数据库连接信息
|
||
|
||
### 6.1 演示版数据库
|
||
- 主机:kaopeilian-mysql(内部)/ 120.79.247.16:3307(外部)
|
||
- 数据库:kaopeilian
|
||
- 用户:root
|
||
- 密码:nj861021
|
||
|
||
### 6.2 瑞小美数据库
|
||
- 主机:kpl-mysql-dev(内部)/ 120.79.247.16:3308(外部)
|
||
- 数据库:kaopeilian
|
||
- 用户:root
|
||
- 密码:nj861021
|
||
|
||
### 6.3 多客户共享数据库
|
||
- 主机:prod-mysql(内部)/ 120.79.247.16:3309(外部)
|
||
- 各租户独立数据库:kaopeilian_yy, kaopeilian_hl, kaopeilian_xy, kaopeilian_fw, kaopeilian_hua, kaopeilian_ex
|
||
- 用户:root
|
||
- 密码:ProdMySQL2025!@#
|
||
|
||
### 6.4 陪练试用版数据库
|
||
- 主机:peilian-mysql(内部)/ 120.79.247.16:3310(外部)
|
||
- 数据库:peilian
|
||
- 用户:root
|
||
- 密码:nj861021
|
||
|
||
## 七、架构优势
|
||
|
||
| 特性 | 说明 |
|
||
|------|------|
|
||
| **代码统一** | 所有租户共享同一份前端和后端代码 |
|
||
| **后端热重载** | 修改代码自动生效,无需重启 |
|
||
| **前端快速更新** | 一次构建(约3分钟),8 个租户同时更新 |
|
||
| **配置隔离** | 各租户通过独立的 .env 文件和数据库隔离 |
|
||
| **版本一致性** | 所有租户始终使用相同版本,避免版本不一致问题 |
|
||
| **磁盘节省** | 共享 1 份 dist(~30MB),而非 8 个独立镜像(~800MB) |
|
||
| **易于维护** | 统一的代码库,便于问题排查和功能迭代 |
|
||
|
||
### 共享前端方案注意事项
|
||
|
||
1. **更新流程**:修改代码 → `pnpm run build` → 自动生效
|
||
2. **回滚方法**:备份 dist 目录 `cp -r dist dist.backup`,回滚时恢复即可
|
||
3. **无需重启**:构建完成后,nginx 自动提供新文件,用户刷新页面即可
|
||
4. **浏览器缓存**:HTML 文件设置为不缓存,JS/CSS 带 hash 可长期缓存
|
||
|
||
## 7.5 Docker Compose 部署规范
|
||
|
||
> 参考:《瑞小美系统技术栈标准与字符标准.md》
|
||
|
||
### 镜像版本
|
||
|
||
**禁用 latest 标签**,必须使用具体版本号:
|
||
|
||
```yaml
|
||
# ❌ 错误
|
||
image: kaopeilian-admin-frontend:latest
|
||
|
||
# ✅ 正确
|
||
image: kaopeilian-admin-frontend:1.0.0
|
||
```
|
||
|
||
### 日志配置(必须)
|
||
|
||
所有容器必须配置日志轮转:
|
||
|
||
```yaml
|
||
logging:
|
||
driver: "json-file"
|
||
options:
|
||
max-size: "10m"
|
||
max-file: "3"
|
||
```
|
||
|
||
### 资源限制(必须)
|
||
|
||
| 容器类型 | 内存限制 | 说明 |
|
||
|---------|---------|------|
|
||
| 前端容器 | 256M-512M | Nginx 静态文件服务 |
|
||
| 后端容器 | 512M-1G | FastAPI 业务服务 |
|
||
|
||
```yaml
|
||
deploy:
|
||
resources:
|
||
limits:
|
||
cpus: '1'
|
||
memory: 512M
|
||
reservations:
|
||
cpus: '0.25'
|
||
memory: 128M
|
||
```
|
||
|
||
### 敏感信息管理
|
||
|
||
**禁止硬编码密码**,使用 `env_file` 方式:
|
||
|
||
```yaml
|
||
# ❌ 错误
|
||
environment:
|
||
- ADMIN_DB_PASSWORD=xxxxx
|
||
|
||
# ✅ 正确
|
||
env_file:
|
||
- .env.admin
|
||
```
|
||
|
||
`.env` 文件权限必须设置为 600:
|
||
```bash
|
||
chmod 600 .env.admin
|
||
```
|
||
|
||
## 八、数据存储架构
|
||
|
||
### 8.1 磁盘规划
|
||
|
||
| 磁盘 | 挂载点 | 容量 | 已用 | 可用 | 用途 |
|
||
|------|--------|------|------|------|------|
|
||
| 系统盘 /dev/vda3 | / | 79G | 35G | 41G | 系统 + Docker 镜像 |
|
||
| 数据盘 /dev/vdb1 | /data | 60G | 1.6G | 55G | 持久化数据(上传文件、数据库、备份) |
|
||
|
||
### 8.2 数据盘目录结构
|
||
|
||
```
|
||
/data/
|
||
├── kaopeilian/ # 考培练系统数据根目录
|
||
│ ├── uploads/ # 统一上传文件存储(按租户隔离)
|
||
│ │ ├── demo/ # 演示版 (aiedu.ireborn.com.cn)
|
||
│ │ ├── kpl/ # 瑞小美 (kpl.ireborn.com.cn)
|
||
│ │ ├── yy/ # 杨扬宠物
|
||
│ │ ├── hl/ # 武汉禾丽
|
||
│ │ ├── xy/ # 芯颜定制
|
||
│ │ ├── fw/ # 飞沃
|
||
│ │ ├── hua/ # 华尔倍丽
|
||
│ │ ├── ex/ # 恩喜成都总院
|
||
│ │ └── peilian/ # 陪练试用版
|
||
│ ├── backups/ # 数据库备份
|
||
│ │ ├── daily/ # 每日备份(保留7天)
|
||
│ │ └── weekly/ # 每周备份(保留4周)
|
||
│ └── logs/ # 应用日志归档
|
||
├── mysql-data/ # MySQL 数据目录
|
||
├── redis-data/ # Redis 数据目录
|
||
└── prod-envs/ # 生产环境配置
|
||
```
|
||
|
||
### 8.3 自动备份
|
||
|
||
- **备份脚本**:`/data/kaopeilian/backup.sh`
|
||
- **执行时间**:每天凌晨 2:00
|
||
- **备份内容**:所有租户的上传文件和数据库
|
||
- **保留策略**:日备份保留 7 天,周备份保留 4 周
|
||
|
||
## 九、网络架构
|
||
|
||
### Docker 网络
|
||
|
||
| 网络名称 | 说明 |
|
||
|---------|------|
|
||
| kaopeilian-network | 演示版容器网络 |
|
||
| kpl-dev-network | 瑞小美开发网络 |
|
||
| prod-network | 多客户生产网络 |
|
||
|
||
## 十、SSL 证书管理
|
||
|
||
### 10.1 证书概览
|
||
|
||
所有域名使用 Let's Encrypt 免费证书,有效期 90 天,自动续期。
|
||
|
||
| 域名 | 证书路径 | 续期方式 |
|
||
|------|---------|---------|
|
||
| aiedu.ireborn.com.cn | /etc/letsencrypt/live/aiedu.ireborn.com.cn/ | webroot |
|
||
| hua.ireborn.com.cn | /etc/letsencrypt/live/hua.ireborn.com.cn/ | webroot |
|
||
| yy.ireborn.com.cn | /etc/letsencrypt/live/yy.ireborn.com.cn/ | webroot |
|
||
| hl.ireborn.com.cn | /etc/letsencrypt/live/hl.ireborn.com.cn/ | webroot |
|
||
| xy.ireborn.com.cn | /etc/letsencrypt/live/xy.ireborn.com.cn/ | webroot |
|
||
| fw.ireborn.com.cn | /etc/letsencrypt/live/fw.ireborn.com.cn/ | webroot |
|
||
| kpl.ireborn.com.cn | /etc/letsencrypt/live/kpl.ireborn.com.cn/ | webroot |
|
||
| pl.ireborn.com.cn | /etc/letsencrypt/live/pl.ireborn.com.cn/ | webroot |
|
||
| ex.ireborn.com.cn | /etc/letsencrypt/live/ex.ireborn.com.cn/ | webroot |
|
||
|
||
### 10.2 自动续期机制
|
||
|
||
系统已配置三重保障,确保证书不会过期:
|
||
|
||
**1. Certbot 定时器(主力)**
|
||
- 服务:`certbot-renew.timer`
|
||
- 频率:每 12 小时检查一次
|
||
- 策略:证书到期前 30 天自动续期
|
||
|
||
```bash
|
||
# 查看定时器状态
|
||
systemctl status certbot-renew.timer
|
||
|
||
# 手动测试续期(不会真正续期)
|
||
certbot renew --dry-run
|
||
```
|
||
|
||
**2. 续期后自动重载 Nginx**
|
||
- Hook 脚本:`/etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh`
|
||
- 作用:证书续期成功后自动重载 Docker nginx,使新证书生效
|
||
|
||
**3. 证书到期监控**
|
||
- 脚本:`/root/scripts/check-ssl-expiry.sh`
|
||
- 频率:每周一上午 9 点(cron)
|
||
- 日志:`/var/log/ssl-check.log`
|
||
- 预警:证书有效期不足 30 天时输出警告
|
||
|
||
### 10.3 常用命令
|
||
|
||
```bash
|
||
# 查看所有证书状态
|
||
certbot certificates
|
||
|
||
# 手动续期所有证书
|
||
certbot renew
|
||
|
||
# 强制续期指定证书
|
||
certbot renew --cert-name aiedu.ireborn.com.cn --force-renewal
|
||
|
||
# 手动重载 nginx
|
||
docker exec kaopeilian-nginx nginx -s reload
|
||
|
||
# 查看证书到期日期
|
||
for cert in /etc/letsencrypt/live/*/fullchain.pem; do
|
||
domain=$(basename $(dirname $cert))
|
||
expiry=$(openssl x509 -enddate -noout -in "$cert" | cut -d= -f2)
|
||
echo "$domain: $expiry"
|
||
done
|
||
```
|
||
|
||
### 10.4 故障排查
|
||
|
||
**问题:证书续期失败**
|
||
1. 检查 webroot 目录:`ls -la /var/www/certbot/.well-known/acme-challenge/`
|
||
2. 检查 nginx 配置是否有 acme-challenge 路由
|
||
3. 查看日志:`tail -100 /var/log/letsencrypt/letsencrypt.log`
|
||
|
||
**问题:续期成功但 HTTPS 仍显示过期**
|
||
1. 重载 nginx:`docker exec kaopeilian-nginx nginx -s reload`
|
||
2. 检查 hook 脚本权限:`ls -la /etc/letsencrypt/renewal-hooks/deploy/`
|
||
|
||
## 十一、AI 服务配置(Python 原生实现)
|
||
|
||
> 更新日期:2026-01-21(AI 配置从管理库加载)
|
||
|
||
### 11.1 概述
|
||
|
||
所有 AI 功能均使用 **Python 原生实现**,直接调用 AI API,无外部平台依赖。
|
||
|
||
**特点**:
|
||
- 双服务商自动降级(4sapi.com → OpenRouter)
|
||
- JSON 解析多层兜底,成功率 99%+
|
||
- 无外部平台依赖,100% 可控
|
||
- 统一的提示词管理
|
||
- **AI 配置从管理库(kaopeilian_admin)统一加载**
|
||
|
||
### 11.2 配置加载架构
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────┐
|
||
│ kaopeilian_admin 数据库(prod-mysql:3309) │
|
||
│ ├── tenants 表(租户信息) │
|
||
│ │ └── id, code, name, status │
|
||
│ └── tenant_configs 表(租户配置) │
|
||
│ └── tenant_id, config_group='ai', config_key, config_value │
|
||
└──────────────────────────────────────────────────────────────┘
|
||
│
|
||
▼ AIService 启动时同步查询
|
||
┌──────────────────────────────────────────────────────────────┐
|
||
│ 后端容器(需配置以下环境变量) │
|
||
│ - TENANT_CODE=ex │
|
||
│ - ADMIN_DB_HOST=prod-mysql │
|
||
│ - ADMIN_DB_PASSWORD=ProdMySQL2025!@# │
|
||
│ - ADMIN_DB_NAME=kaopeilian_admin │
|
||
└──────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
**配置加载优先级**:
|
||
1. 管理库 `tenant_configs` 表(按 TENANT_CODE 查询)
|
||
2. 环境变量 `.env` 文件(fallback)
|
||
3. 代码默认值
|
||
|
||
### 11.3 管理库中的 AI 配置项
|
||
|
||
| config_key | 说明 |
|
||
|------------|------|
|
||
| AI_PRIMARY_API_KEY | 首选服务商 Key (4sapi.com) |
|
||
| AI_ANTHROPIC_API_KEY | Claude 专属 Key |
|
||
| AI_PRIMARY_BASE_URL | 首选服务商地址 |
|
||
| AI_FALLBACK_API_KEY | 备选服务商 Key (OpenRouter) |
|
||
| AI_FALLBACK_BASE_URL | 备选服务商地址 |
|
||
| AI_DEFAULT_MODEL | 默认模型 |
|
||
| AI_TIMEOUT | 请求超时(秒) |
|
||
|
||
### 11.4 容器环境变量配置(必须!)
|
||
|
||
每个后端容器的 `.env` 文件必须包含管理库连接信息:
|
||
|
||
```env
|
||
# 租户标识(用于从管理库查询配置)
|
||
TENANT_CODE=ex
|
||
|
||
# 管理库连接配置
|
||
ADMIN_DB_HOST=prod-mysql
|
||
ADMIN_DB_PORT=3306
|
||
ADMIN_DB_USER=root
|
||
ADMIN_DB_PASSWORD=ProdMySQL2025!@#
|
||
ADMIN_DB_NAME=kaopeilian_admin
|
||
```
|
||
|
||
> ⚠️ **重要**:修改 `.env` 文件后必须重启容器:`docker compose up -d --force-recreate`
|
||
|
||
### 11.3 已支持的 AI 功能
|
||
|
||
| 功能 | API 端点 | 服务文件 |
|
||
|-----|---------|---------|
|
||
| 知识点分析 | `/api/v1/courses/{id}/materials/{mid}/analyze` | `knowledge_analysis_v2.py` |
|
||
| 试题生成 | `/api/v1/exams/generate` | `exam_generator_service.py` |
|
||
| 答案判断 | `/api/v1/exams/judge-answer` | `answer_judge_service.py` |
|
||
| 陪练场景提取 | `/api/v1/practice/extract-scene` | `practice_scene_service.py` |
|
||
| 陪练分析报告 | `/api/v1/practice/sessions/{id}/analyze` | `practice_analysis_service.py` |
|
||
| 能力评估 | `/api/v1/ability/analyze-yanji` | `ability_analysis_service.py` |
|
||
| 课程对话 | `/api/v1/course/chat` | `course_chat_service.py` |
|
||
|
||
### 11.4 相关代码文件
|
||
|
||
| 文件 | 说明 |
|
||
|------|------|
|
||
| `app/services/ai/ai_service.py` | AI 服务(双服务商降级) |
|
||
| `app/services/ai/llm_json_parser.py` | LLM JSON 输出解析器 |
|
||
| `app/services/ai/knowledge_analysis_v2.py` | 知识点分析服务 |
|
||
| `app/services/ai/exam_generator_service.py` | 试题生成服务 |
|
||
| `app/services/ai/ability_analysis_service.py` | 智能工牌能力分析服务 |
|
||
| `app/services/ai/course_chat_service.py` | 课程对话服务 |
|
||
| `app/services/ai/answer_judge_service.py` | 答案判断服务 |
|
||
| `app/services/ai/practice_analysis_service.py` | 陪练分析报告服务 |
|
||
| `app/services/ai/practice_scene_service.py` | 陪练场景提取服务 |
|
||
| `app/services/ai/prompts/` | 提示词模板目录 |
|
||
|
||
### 11.5 依赖包
|
||
|
||
在 `requirements.txt` 中已添加:
|
||
|
||
```
|
||
json-repair>=0.25.0
|
||
jsonschema>=4.0.0
|
||
PyPDF2>=3.0.0
|
||
python-docx>=1.0.0
|
||
```
|
||
|
||
## 十二、课程对话会话管理
|
||
|
||
### 12.1 会话存储
|
||
|
||
课程对话使用 Redis 存储会话历史和会话索引:
|
||
|
||
| 配置 | 值 | 说明 |
|
||
|------|-----|------|
|
||
| 会话数据 Key | `course_chat:conversation:{id}` | Redis 存储 key |
|
||
| 会话索引 Key | `course_chat:user:{user_id}:conversations` | Sorted Set,按时间排序 |
|
||
| 会话元数据 Key | `course_chat:meta:{id}` | 会话课程ID等元信息 |
|
||
| ID 格式 | `conv_{user_id}_{course_id}_{uuid}` | 会话 ID 格式 |
|
||
| 窗口大小 | 10 轮 | 保留最近对话数 |
|
||
| TTL | 30 分钟 | 会话过期时间 |
|
||
|
||
### 12.2 API 端点
|
||
|
||
| 端点 | 说明 |
|
||
|------|------|
|
||
| `POST /api/v1/course/chat` | 课程对话(流式响应) |
|
||
| `GET /api/v1/course/messages` | 获取会话历史消息 |
|
||
| `GET /api/v1/course/conversations` | 获取会话列表 |
|
||
|
||
### 12.3 使用说明
|
||
|
||
**请求示例**:
|
||
|
||
```bash
|
||
# 流式对话(SSE)
|
||
curl -X POST "https://aiedu.ireborn.com.cn/api/v1/course/chat" \
|
||
-H "Authorization: Bearer <token>" \
|
||
-H "Content-Type: application/json" \
|
||
-d '{"course_id": 1, "query": "什么是玻尿酸?"}'
|
||
```
|
||
|
||
**响应事件**:
|
||
- `conversation_started`: 会话开始,返回 conversation_id
|
||
- `message_chunk`: 文本块(逐字返回,打字机效果)
|
||
- `message_end`: 消息结束
|
||
- `error`: 错误信息
|
||
|
||
## 十四、SaaS 超级管理后台
|
||
|
||
> 2026-01-18 新增
|
||
|
||
### 14.1 概述
|
||
|
||
SaaS 超级管理后台用于统一管理所有租户的配置,替代原来分散在各 `.env` 文件中的配置方式。
|
||
|
||
**核心功能**:
|
||
- 租户管理:创建、编辑、启用/禁用租户
|
||
- 配置管理:统一管理各租户的 AI Key、数据库、Redis 等配置
|
||
- 提示词管理:查看和编辑 AI 提示词,支持版本控制
|
||
- 功能开关:按租户控制功能模块的启用/禁用
|
||
|
||
### 14.2 部署信息
|
||
|
||
| 项目 | 值 |
|
||
|------|-----|
|
||
| 域名 | admin.ireborn.com.cn |
|
||
| 前端容器 | kaopeilian-admin-frontend |
|
||
| 前端端口 | 3030 |
|
||
| 后端容器 | kaopeilian-admin-backend |
|
||
| 后端端口 | 8030 |
|
||
| 管理数据库 | kaopeilian_admin (prod-mysql:3309) |
|
||
|
||
### 14.3 数据库表结构
|
||
|
||
| 表名 | 说明 |
|
||
|------|------|
|
||
| admin_users | 平台管理员账户 |
|
||
| tenants | 租户基本信息 |
|
||
| tenant_configs | 租户配置(Key-Value) |
|
||
| ai_prompts | AI 提示词模板 |
|
||
| ai_prompt_versions | 提示词版本历史 |
|
||
| tenant_prompts | 租户自定义提示词 |
|
||
| feature_switches | 功能开关 |
|
||
| config_templates | 配置模板(元数据) |
|
||
| operation_logs | 操作审计日志 |
|
||
|
||
### 14.4 API 端点
|
||
|
||
| 端点 | 说明 |
|
||
|------|------|
|
||
| `POST /api/v1/admin/auth/login` | 管理员登录 |
|
||
| `GET /api/v1/admin/tenants` | 获取租户列表 |
|
||
| `POST /api/v1/admin/tenants` | 创建租户 |
|
||
| `PUT /api/v1/admin/tenants/{id}` | 更新租户 |
|
||
| `GET /api/v1/admin/configs/tenants/{id}` | 获取租户配置 |
|
||
| `PUT /api/v1/admin/configs/tenants/{id}/batch` | 批量更新配置 |
|
||
| `GET /api/v1/admin/prompts` | 获取提示词列表 |
|
||
| `PUT /api/v1/admin/prompts/{id}` | 更新提示词 |
|
||
| `GET /api/v1/admin/features/tenants/{id}` | 获取租户功能开关 |
|
||
|
||
### 14.5 默认账户
|
||
|
||
| 用户名 | 密码 | 角色 |
|
||
|--------|------|------|
|
||
| superadmin | Superadmin123! | 超级管理员 |
|
||
|
||
### 14.6 启动命令
|
||
|
||
```bash
|
||
# 启动管理后台
|
||
cd /root/aiedu && docker compose -f docker-compose.admin.yml up -d
|
||
|
||
# 查看日志
|
||
docker logs -f kaopeilian-admin-backend
|
||
docker logs -f kaopeilian-admin-frontend
|
||
```
|
||
|
||
### 14.7 相关文件
|
||
|
||
| 文件 | 说明 |
|
||
|------|------|
|
||
| `/root/aiedu/docker-compose.admin.yml` | Docker Compose 配置 |
|
||
| `/root/aiedu/nginx/conf.d/admin.conf` | Nginx 反向代理配置 |
|
||
| `/root/aiedu/kaopeilian-admin-frontend/` | 前端代码目录 |
|
||
| `/root/aiedu/kaopeilian-backend/app/api/v1/admin_portal/` | 后端 API 目录 |
|
||
| `/root/aiedu/kaopeilian-backend/app/core/tenant_config.py` | 租户配置加载器 |
|
||
| `/root/aiedu/kaopeilian-backend/migrations/admin_platform_schema.sql` | 数据库架构 |
|
||
|
||
### 14.8 配置优先级
|
||
|
||
租户配置加载优先级(从高到低):
|
||
1. 数据库 `tenant_configs` 表
|
||
2. 环境变量 `.env` 文件(向后兼容)
|
||
3. 代码默认值
|