Files
012-kaopeilian/docs/规划/部署架构-统一版.md
111 998211c483 feat: 初始化考培练系统项目
- 从服务器拉取完整代码
- 按框架规范整理项目结构
- 配置 Drone CI 测试环境部署
- 包含后端(FastAPI)、前端(Vue3)、管理端

技术栈: Vue3 + TypeScript + FastAPI + MySQL
2026-01-24 19:33:28 +08:00

703 lines
25 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 考培练系统 - 部署架构(统一版)
> 更新日期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-21AI 配置从管理库加载)
### 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. 代码默认值