docs(platform): Add database documentation system and restructure deployment docs
Completed: - Add 6 core database documents (docs/01-平台基础层/07-数据库/) Architecture overview, migration history, environment comparison, tech debt tracking, seed data management, PostgreSQL extensions - Restructure deployment docs: archive 20 legacy files to _archive-2025/ - Create unified daily operations manual (01-日常更新操作手册.md) - Add pending deployment change tracker (03-待部署变更清单.md) - Update database development standard to v3.0 (three iron rules) - Fix Prisma schema type drift: align @db.* annotations with actual DB IIT: UUID/Timestamptz(6), SSA: Timestamp(6)/VarChar(20/50/100) - Add migration: 20260227_align_schema_with_db_types (idempotent ALTER) - Add Cursor Rule for auto-reminding deployment change documentation - Update system status guide v6.4 with deployment and DB doc references - Add architecture consultation docs (Prisma guide, SAE deployment guide) Technical details: - Manual migration due to shadow DB limitation (TD-001 in tech debt) - Deployment docs reduced from 20+ scattered files to 3 core documents - Cursor Rule triggers on schema.prisma, package.json, Dockerfile changes Made-with: Cursor
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
# 🚀 AI临床研究平台 - 阿里云SAE最新真实状态记录
|
||||
|
||||
> **文档用途**:记录阿里云SAE服务器最新真实状态 + 每次部署记录
|
||||
> **最后更新**:2026-01-27 08:05
|
||||
> **最后更新**:2026-02-27
|
||||
> **维护人员**:开发团队
|
||||
> **说明**:本文档准确记录SAE上所有应用的当前状态,包括内网地址、镜像版本、用户名密码等关键资源信息
|
||||
|
||||
@@ -11,10 +11,11 @@
|
||||
|
||||
| 服务名称 | 部署状态 | 镜像版本 | 部署位置 | 最后更新时间 |
|
||||
|---------|---------|---------|---------|-------------|
|
||||
| **PostgreSQL数据库** | ✅ 运行中 | PostgreSQL 15 + 插件 | RDS | 2026-01-27 |
|
||||
| **前端Nginx服务** | ✅ 运行中 | v1.3 | SAE | 2026-01-27 |
|
||||
| **Python微服务** | ✅ 运行中 | v1.1 | SAE | 2026-01-26 |
|
||||
| **Node.js后端** | ✅ 运行中 | v1.7 | SAE | 2026-01-27 |
|
||||
| **PostgreSQL数据库** | ✅ 运行中 | PostgreSQL 15 + 插件 | RDS | 2026-02-27 |
|
||||
| **前端Nginx服务** | ✅ 运行中 | **v1.8** | SAE | 2026-02-27 |
|
||||
| **Python微服务** | ✅ 运行中 | **v1.2** | SAE | 2026-02-27 |
|
||||
| **Node.js后端** | ✅ 运行中 | **v2.1** | SAE | 2026-02-27 |
|
||||
| **R统计引擎** | ✅ 运行中 | **v1.0.1** | SAE | 2026-02-27 |
|
||||
| **Dify AI服务** | ⚠️ 已废弃 | - | - | 使用pgvector替代 |
|
||||
|
||||
---
|
||||
@@ -34,9 +35,10 @@
|
||||
|
||||
| 仓库名称 | 最新版本 | 镜像大小 | VPC地址 |
|
||||
|---------|---------|---------|---------|
|
||||
| **python-extraction** | v1.0 | 1.12GB | `crpi-cd5ij4pjt65mweeo-vpc.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/python-extraction:v1.0` |
|
||||
| **ai-clinical_frontend-nginx** | v1.2 | ~50MB | `crpi-cd5ij4pjt65mweeo-vpc.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/ai-clinical_frontend-nginx:v1.2` |
|
||||
| **backend-service** | v1.3 | 838MB | `crpi-cd5ij4pjt65mweeo-vpc.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:v1.3` |
|
||||
| **python-extraction** | **v1.2** | ~1.1GB | `crpi-cd5ij4pjt65mweeo-vpc.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/python-extraction:v1.2` |
|
||||
| **ssa-r-statistics** | **v1.0.1** | ~1.8GB | `crpi-cd5ij4pjt65mweeo-vpc.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/ssa-r-statistics:v1.0.1` |
|
||||
| **ai-clinical_frontend-nginx** | v1.3 | ~50MB | `crpi-cd5ij4pjt65mweeo-vpc.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/ai-clinical_frontend-nginx:v1.3` |
|
||||
| **backend-service** | v1.7 | ~838MB | `crpi-cd5ij4pjt65mweeo-vpc.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:v1.7` |
|
||||
|
||||
---
|
||||
|
||||
@@ -89,7 +91,7 @@ postgresql://airesearch:Xibahe%40fengzhibo117@pgm-2zex1m2y3r23hdn5.pg.rds.aliyun
|
||||
|
||||
| 数据库 | 环境 | Schema数量 | 表数量 | 插件 | 用途 |
|
||||
|--------|------|-----------|-------|------|------|
|
||||
| `ai_clinical_research_test` | 测试环境(当前) | 16 | 63 | pg_bigm, pgvector | SAE测试环境 |
|
||||
| `ai_clinical_research_test` | 测试环境(当前) | 16 | **84** | pg_bigm, pgvector | SAE测试环境 |
|
||||
| `ai_clinical_research` | 生产环境(备用) | 11 | ~34 | pg_bigm, pgvector | 未来正式上线 |
|
||||
|
||||
**Schema架构**(16个业务Schema - 测试数据库):
|
||||
@@ -125,9 +127,10 @@ postgresql://airesearch:Xibahe%40fengzhibo117@pgm-2zex1m2y3r23hdn5.pg.rds.aliyun
|
||||
|
||||
| 应用名称 | 状态 | 规格 | 实例数 | 端口 | 内网地址 | 镜像版本 |
|
||||
|---------|------|------|-------|------|---------|---------|
|
||||
| **python-extraction-test** | ✅ 运行中 | 1核2GB | 1 | 8000 | `http://172.17.173.84:8000` | v1.1 |
|
||||
| **nodejs-backend-test** | ✅ 运行中 | 1核2GB | 1 | 3001 | `http://172.17.173.89:3001` | v1.7 |
|
||||
| **frontend-nginx-service** | ✅ 运行中 | 0.5核1GB | 1 | 80 | `http://172.17.173.90:80` | v1.3 |
|
||||
| **r-statistics-test** | ✅ 运行中 | 1核2GB | 1 | 8080 | `http://172.17.173.101:8080` | **v1.0.1** |
|
||||
| **python-extraction-test** | ✅ 运行中 | **2核4GB** | 1 | 8000 | `http://172.17.173.102:8000` | **v1.2** |
|
||||
| **nodejs-backend-test** | ✅ 运行中 | **2核4GB** | 1 | 3001 | `http://172.17.197.28:3001` | **v2.2** |
|
||||
| **frontend-nginx-service** | ✅ 运行中 | 0.5核1GB | 1 | 80 | `http://172.17.197.29:80` | **v1.8** |
|
||||
|
||||
**环境变量配置**:
|
||||
|
||||
@@ -350,6 +353,39 @@ AIclinicalresearch/extraction_service/
|
||||
|
||||
## 🔄 四、部署历史记录
|
||||
|
||||
### 2026-02-27(0227部署 - 数据库迁移 + R统计引擎 + Python更新)
|
||||
|
||||
#### 部署概览
|
||||
- **部署时间**:2026-02-27
|
||||
- **部署范围**:数据库Schema迁移、R统计引擎全新部署、Python微服务更新
|
||||
- **主要变更**:6个Prisma迁移(含1个drift补丁)、新增R Docker服务、Python新增scipy
|
||||
|
||||
#### 数据库迁移
|
||||
- ✅ 应用 5 个业务迁移 + 1 个drift补丁迁移
|
||||
- ✅ RDS 表数量从 63 增至 84(新增 21 张表)
|
||||
- ✅ 同步 Seed 数据:SSA工具库 13条 + IIT技能库 8条
|
||||
- ✅ 已有数据完整性验证通过(Prompt模板、用户数据零丢失)
|
||||
|
||||
#### R统计引擎(全新部署)
|
||||
- ✅ 镜像构建并推送:`ssa-r-statistics:v1.0.1`(~1.8GB)
|
||||
- ✅ SAE应用创建:`r-statistics-test`,1核2GB
|
||||
- ✅ 内网地址:`http://172.17.173.101:8080`
|
||||
- ✅ 内置 13 个统计工具(描述统计、T检验、卡方检验、回归、Meta分析等)
|
||||
- ✅ 健康检查配置完成(HTTP /health)
|
||||
|
||||
#### Python微服务更新(v1.1 → v1.2)
|
||||
- ✅ 新增依赖:scipy(RVW V2.0 数据取证)
|
||||
- ✅ 新增代码:forensics 数据取证模块
|
||||
- ✅ 实例规格升级:1核2GB → 2核4GB
|
||||
- ✅ 内网地址变更:`172.17.173.84` → `172.17.173.102`
|
||||
|
||||
#### 文档产出
|
||||
- ✅ `0227部署/01-数据库迁移方案.md`
|
||||
- ✅ `0227部署/02-部署完成总结.md`
|
||||
- ✅ `00-阿里云SAE最新真实状态记录.md`(更新)
|
||||
|
||||
---
|
||||
|
||||
### 2026-01-27(0126部署 - 数据库升级 + 全量服务更新)🎉
|
||||
|
||||
#### 部署概览
|
||||
@@ -511,5 +547,5 @@ AIclinicalresearch/extraction_service/
|
||||
---
|
||||
|
||||
> **提示**:本文档记录SAE服务器的最新真实状态,每次部署后必须更新!
|
||||
> **最后更新**:2026-01-01 14:00
|
||||
> **当前版本**:前端v1.2 | 后端v1.3 | Python v1.0 | PostgreSQL 15
|
||||
> **最后更新**:2026-02-27
|
||||
> **当前版本**:前端v1.8 | 后端v2.1 | Python v1.2 | R统计v1.0.1 | PostgreSQL 15
|
||||
|
||||
265
docs/05-部署文档/01-日常更新操作手册.md
Normal file
265
docs/05-部署文档/01-日常更新操作手册.md
Normal file
@@ -0,0 +1,265 @@
|
||||
# 日常更新操作手册
|
||||
|
||||
> 版本: v2.0(合并自旧版 19-日常更新快速操作手册 + 0227 部署实战经验)
|
||||
> 更新日期: 2026-02-27
|
||||
> 适用: 日常代码更新、功能迭代、配置变更
|
||||
|
||||
---
|
||||
|
||||
## 0. 部署前检查
|
||||
|
||||
```
|
||||
□ 打开 03-待部署变更清单.md,确认本次要部署哪些变更
|
||||
□ 打开 00-阿里云SAE最新真实状态记录.md,确认当前版本号
|
||||
□ 确认新版本号(当前版本 +1)
|
||||
□ 如有数据库变更,先执行数据库迁移
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 1. ACR 登录(首次 / 过期后)
|
||||
|
||||
```powershell
|
||||
docker login --username=gofeng117@163.com --password=fengzhibo117 crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 2. Node.js 后端更新(~25 分钟)
|
||||
|
||||
**当前版本**: v2.2 → 下个版本: v2.3
|
||||
|
||||
### 2.1 构建
|
||||
|
||||
```powershell
|
||||
cd D:\MyCursor\AIclinicalresearch\backend
|
||||
|
||||
# TypeScript 编译(有类型错误时用 --noCheck)
|
||||
npm run build
|
||||
# 或: npx tsc --noCheck
|
||||
|
||||
# 构建 Docker 镜像
|
||||
docker build -t backend-service:v2.3 .
|
||||
```
|
||||
|
||||
> **0227 经验**: `tsc` 不会拷贝 `.json` 配置文件,Dockerfile 中已有 `COPY src/modules/ssa/config/*.json` 等补丁步骤。如新模块有 JSON 配置文件需要确认 Dockerfile 覆盖到。
|
||||
|
||||
### 2.2 推送
|
||||
|
||||
```powershell
|
||||
docker tag backend-service:v2.3 crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:v2.3
|
||||
|
||||
docker push crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:v2.3
|
||||
```
|
||||
|
||||
推送约 10 分钟(~840MB),看到 `digest: sha256:...` 表示成功。
|
||||
|
||||
### 2.3 SAE 部署
|
||||
|
||||
1. SAE 控制台 → `nodejs-backend-test` → 部署应用
|
||||
2. 选择镜像 `backend-service:v2.3`
|
||||
3. 确认部署,等待 5-8 分钟
|
||||
|
||||
### 2.4 验证
|
||||
|
||||
```
|
||||
□ SAE 实例状态为 Running
|
||||
□ 日志中出现启动成功信息
|
||||
□ 健康检查: curl http://<新IP>:3001/health
|
||||
□ 前端功能测试
|
||||
```
|
||||
|
||||
> **重要**: 部署后 IP 会变更!需同步更新 `frontend-nginx-service` 的 `BACKEND_SERVICE_HOST` 环境变量。
|
||||
|
||||
---
|
||||
|
||||
## 3. 前端 Nginx 更新(~15 分钟)
|
||||
|
||||
**当前版本**: v1.8 → 下个版本: v1.9
|
||||
|
||||
### 3.1 构建
|
||||
|
||||
```powershell
|
||||
cd D:\MyCursor\AIclinicalresearch\frontend-v2
|
||||
|
||||
docker build -t ai-clinical_frontend-nginx:v1.9 .
|
||||
```
|
||||
|
||||
构建约 5 分钟(含 React 编译)。
|
||||
|
||||
### 3.2 推送
|
||||
|
||||
```powershell
|
||||
docker tag ai-clinical_frontend-nginx:v1.9 crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/ai-clinical_frontend-nginx:v1.9
|
||||
|
||||
docker push crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/ai-clinical_frontend-nginx:v1.9
|
||||
```
|
||||
|
||||
推送约 2 分钟(~50MB)。
|
||||
|
||||
### 3.3 SAE 部署
|
||||
|
||||
1. SAE 控制台 → `frontend-nginx-service` → 部署应用
|
||||
2. 选择镜像版本 `v1.9`
|
||||
3. **检查环境变量**: `BACKEND_SERVICE_HOST` 指向最新后端 IP
|
||||
|
||||
### 3.4 验证
|
||||
|
||||
```
|
||||
□ 访问 https://iit.xunzhengyixue.com/ 页面正常
|
||||
□ 登录功能正常(排除 504 超时)
|
||||
□ 测试核心功能
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4. Python 微服务更新(~30 分钟)
|
||||
|
||||
**当前版本**: v1.2 → 下个版本: v1.3
|
||||
|
||||
### 4.1 构建
|
||||
|
||||
```powershell
|
||||
cd D:\MyCursor\AIclinicalresearch\extraction_service
|
||||
|
||||
docker build -t python-extraction:v1.3 .
|
||||
```
|
||||
|
||||
构建约 15 分钟(镜像 ~1.1GB)。
|
||||
|
||||
### 4.2 推送
|
||||
|
||||
```powershell
|
||||
docker tag python-extraction:v1.3 crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/python-extraction:v1.3
|
||||
|
||||
docker push crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/python-extraction:v1.3
|
||||
```
|
||||
|
||||
### 4.3 SAE 部署
|
||||
|
||||
1. SAE 控制台 → `python-extraction-test` → 部署应用
|
||||
2. 选择新版本
|
||||
|
||||
### 4.4 验证
|
||||
|
||||
```
|
||||
□ 健康检查: curl http://<新IP>:8000/api/health
|
||||
□ 如 IP 变更,更新后端的 EXTRACTION_SERVICE_URL
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5. R 统计引擎更新(~40 分钟)
|
||||
|
||||
**当前版本**: v1.0.1 → 下个版本: v1.0.2
|
||||
|
||||
### 5.1 构建
|
||||
|
||||
```powershell
|
||||
cd D:\MyCursor\AIclinicalresearch\r-statistics-service
|
||||
|
||||
docker build -t ssa-r-statistics:v1.0.2 .
|
||||
```
|
||||
|
||||
构建约 20 分钟(镜像 ~1.8GB,R 包编译耗时)。
|
||||
|
||||
### 5.2 推送
|
||||
|
||||
```powershell
|
||||
docker tag ssa-r-statistics:v1.0.2 crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/ssa-r-statistics:v1.0.2
|
||||
|
||||
docker push crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/ssa-r-statistics:v1.0.2
|
||||
```
|
||||
|
||||
### 5.3 SAE 部署
|
||||
|
||||
1. SAE 控制台 → `r-statistics-test` → 部署应用
|
||||
2. 选择新版本
|
||||
|
||||
### 5.4 验证
|
||||
|
||||
```
|
||||
□ 健康检查: curl http://<新IP>:8080/health
|
||||
□ 如 IP 变更,更新后端的 R_STATISTICS_SERVICE_URL
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 6. 数据库迁移
|
||||
|
||||
### 6.1 标准迁移(Prisma migration 文件)
|
||||
|
||||
```powershell
|
||||
# 通过后端 SAE Webshell 执行(推荐)
|
||||
npx prisma migrate deploy
|
||||
|
||||
# 或手动执行 SQL
|
||||
# 将 migration.sql 内容粘贴到 Webshell psql 中
|
||||
```
|
||||
|
||||
### 6.2 手动 SQL 补丁
|
||||
|
||||
```powershell
|
||||
# 在 SAE nodejs-backend-test 的 Webshell 中
|
||||
node -e "
|
||||
const { execSync } = require('child_process');
|
||||
execSync('PGPASSWORD=Xibahe@fengzhibo117 psql -h pgm-2zex1m2y3r23hdn5so.pg.rds.aliyuncs.com -U airesearch -d ai_clinical_research_test -c \"你的SQL\"', {stdio:'inherit'});
|
||||
"
|
||||
```
|
||||
|
||||
### 6.3 标记手动迁移
|
||||
|
||||
```powershell
|
||||
npx prisma migrate resolve --applied <migration_name>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 7. 环境变量修改(5 分钟)
|
||||
|
||||
**核心规则: 只改环境变量时用「重启应用」,不要「部署应用」!**
|
||||
|
||||
| 操作 | 用途 | IP 是否变 |
|
||||
|------|------|----------|
|
||||
| 重启应用 | 改配置/环境变量 | 不变 |
|
||||
| 部署应用 | 更新镜像版本 | 会变 |
|
||||
|
||||
步骤: SAE 控制台 → 应用 → 应用配置 → 环境变量 → 编辑 → 保存 → **重启应用**
|
||||
|
||||
---
|
||||
|
||||
## 8. 部署后收尾
|
||||
|
||||
```
|
||||
□ 更新 00-阿里云SAE最新真实状态记录.md(新IP/版本)
|
||||
□ 清零 03-待部署变更清单.md(已部署项移到历史区域)
|
||||
□ 如果是大版本部署,创建 MMDD部署/ 文件夹记录过程
|
||||
□ 如有服务 IP 变更,检查相互依赖的环境变量是否已更新
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 9. 常见问题速查
|
||||
|
||||
| 现象 | 原因 | 解决 |
|
||||
|------|------|------|
|
||||
| 前端 504 Gateway Timeout | 后端 IP 变更但前端环境变量未更新 | 更新 `BACKEND_SERVICE_HOST` 并重启 |
|
||||
| `column does not exist` | 数据库迁移遗漏 | 检查 `03-待部署变更清单.md` 中是否有未执行的 DB 变更 |
|
||||
| `ENOENT .json` 文件 | tsc 不拷贝非 .ts 文件 | 在 Dockerfile 中添加 `COPY` 指令 |
|
||||
| 健康检查失败 404 | 健康检查路径配置错误 | 确认 HTTP 路径为 `/health` |
|
||||
| 镜像推送超时 | 网络问题 | 重试,或换网络环境 |
|
||||
| `prisma db push` 遗留 drift | 开发时绕过了迁移系统 | 创建 patch migration + `resolve --applied` |
|
||||
|
||||
---
|
||||
|
||||
## 10. 部署顺序参考
|
||||
|
||||
如果多个服务同时更新:
|
||||
|
||||
```
|
||||
1. 数据库迁移(先行,确保表结构就绪)
|
||||
2. R 统计引擎(独立服务,不影响其他)
|
||||
3. Python 微服务(独立服务)
|
||||
4. Node.js 后端(依赖上游服务 IP,需更新环境变量)
|
||||
5. 前端 Nginx(最后部署,需要最新的后端 IP)
|
||||
```
|
||||
661
docs/05-部署文档/0227部署/01-数据库迁移方案.md
Normal file
661
docs/05-部署文档/0227部署/01-数据库迁移方案.md
Normal file
@@ -0,0 +1,661 @@
|
||||
# 数据库迁移方案:开发环境 → RDS 结构同步
|
||||
|
||||
> **日期**:2026-02-27
|
||||
> **目标**:将开发环境(localhost Docker)的数据库结构和必要 Seed 数据同步到阿里云 RDS 测试环境
|
||||
> **核心原则**:只做增量,不动存量;结构先行,数据后补;每步可回滚
|
||||
|
||||
---
|
||||
|
||||
## 1. 环境信息
|
||||
|
||||
### 1.1 源环境(开发)
|
||||
|
||||
```
|
||||
Host: localhost
|
||||
Port: 5432
|
||||
Database: ai_clinical_research
|
||||
User: postgres
|
||||
Password: postgres123
|
||||
容器名: ai-clinical-postgres
|
||||
表数量: 96
|
||||
迁移数: 11(+ 1 个文件未 apply)
|
||||
```
|
||||
|
||||
### 1.2 目标环境(RDS 测试)
|
||||
|
||||
```
|
||||
Host: pgm-2zex1m2y3r23hdn5so.pg.rds.aliyuncs.com(外网)
|
||||
Host: pgm-2zex1m2y3r23hdn5.pg.rds.aliyuncs.com(内网/SAE)
|
||||
Port: 5432
|
||||
Database: ai_clinical_research_test
|
||||
User: airesearch
|
||||
Password: Xibahe@fengzhibo117
|
||||
表数量: 66
|
||||
迁移数: 6
|
||||
```
|
||||
|
||||
### 1.3 DATABASE_URL(操作时使用)
|
||||
|
||||
```bash
|
||||
# 外网(本地操作用)
|
||||
postgresql://airesearch:Xibahe%40fengzhibo117@pgm-2zex1m2y3r23hdn5so.pg.rds.aliyuncs.com:5432/ai_clinical_research_test
|
||||
|
||||
# 内网(SAE 部署用)
|
||||
postgresql://airesearch:Xibahe%40fengzhibo117@pgm-2zex1m2y3r23hdn5.pg.rds.aliyuncs.com:5432/ai_clinical_research_test?connection_limit=18&pool_timeout=10
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 2. 差异分析总览
|
||||
|
||||
### 2.1 Prisma 迁移差距
|
||||
|
||||
| # | 迁移文件 | 本地 | RDS | 内容 |
|
||||
|---|---------|------|-----|------|
|
||||
| 1 | 20251010_init | ✅ | ✅ | 初始化 |
|
||||
| 2 | 20251010_conversation_metadata | ✅ | ✅ | AIA 对话 |
|
||||
| 3 | 20251012_batch_processing | ✅ | ✅ | 批处理 |
|
||||
| 4 | 20251014_review_tasks | ✅ | ✅ | 论文预审 |
|
||||
| 5 | 20251208_column_mapping | ✅ | ✅ | 列映射 |
|
||||
| 6 | 20260128_system_knowledge_base | ✅ | ✅ | 系统知识库 |
|
||||
| **7** | **20260207_add_iit_manager_agent_tables** | ✅ | ❌ | IIT Agent 8 张新表 |
|
||||
| **8** | **20260208_add_cra_qc_engine_support** | ✅ | ❌ | CRA 质控 + skills 扩展 |
|
||||
| **9** | **20260219_add_ssa_module** | ✅ | ❌ | SSA 模块 9 张表 |
|
||||
| **10** | **20260223_add_deep_research_v2_fields** | ✅ | ❌ | research_tasks 加 6 列 |
|
||||
| **11** | **20260225_add_extraction_template_engine** | ✅ | ❌ | ASL 提取引擎 4 张表 |
|
||||
| **12** | **20260226_add_equery_critical_events_cron** | ❌ (db push) | ❌ | eQuery + 重大事件 + cron |
|
||||
|
||||
> RDS 需要执行迁移 #7 ~ #12,共 **6 个迁移**。
|
||||
|
||||
### 2.2 无迁移文件的变更(db push 造成的漂移)
|
||||
|
||||
以下 **6 张表 + 3 列 + 1 索引** 存在于开发数据库和 Prisma Schema 中,但没有对应的迁移文件:
|
||||
|
||||
| Schema | 对象 | 类型 | 说明 |
|
||||
|--------|------|------|------|
|
||||
| iit_schema | `field_metadata` | 新表(16 列) | REDCap 字段元数据 |
|
||||
| iit_schema | `qc_logs` | 新表(16 列) | 质控日志(附历史追溯) |
|
||||
| iit_schema | `qc_project_stats` | 新表(10 列) | 项目级质控统计汇总 |
|
||||
| iit_schema | `record_summary` | 新表(16 列) | 受试者记录汇总 |
|
||||
| iit_schema | `projects.knowledge_base_id` | 新列 | 关联 EKB 知识库 |
|
||||
| iit_schema | `idx_iit_project_kb` | 新索引 | knowledge_base_id 索引 |
|
||||
| ssa_schema | `ssa_workflows` | 新表(11 列) | 统计分析工作流 |
|
||||
| ssa_schema | `ssa_workflow_steps` | 新表(13 列) | 工作流步骤明细 |
|
||||
|
||||
### 2.3 表数量对比
|
||||
|
||||
| Schema | 开发环境 | RDS | 差异 |
|
||||
|--------|---------|-----|------|
|
||||
| admin_schema | 2 | 2 | — |
|
||||
| agent_schema | 6 | 6 | — |
|
||||
| aia_schema | 3 | 3 | — |
|
||||
| **asl_schema** | **12** | **7** | **+4 表 +6 列** |
|
||||
| capability_schema | 4 | 4 | — |
|
||||
| dc_schema | 6 | 6 | — |
|
||||
| ekb_schema | 3 | 3 | — |
|
||||
| **iit_schema** | **20** | **5** | **+15 表 +3 列** |
|
||||
| pkb_schema | 5 | 5 | — |
|
||||
| platform_schema | 19 | 19 | — |
|
||||
| protocol_schema | 2 | 2 | — |
|
||||
| public | 3 | 3 | — |
|
||||
| rvw_schema | 1 | 1 | — |
|
||||
| **ssa_schema** | **11** | **0** | **+11 表** |
|
||||
| **合计** | **96** | **66** | **+30 表** |
|
||||
|
||||
### 2.4 列级差异(已有表)
|
||||
|
||||
| 表 | 开发环境 | RDS | 缺失列 |
|
||||
|---|---------|-----|--------|
|
||||
| `asl_schema.research_tasks` | 25 列 | 19 列 | `target_sources`, `confirmed_requirement`, `ai_intent_summary`, `execution_logs`, `synthesis_report`, `result_list` |
|
||||
| `iit_schema.projects` | 18 列 | 15 列 | `knowledge_base_id`, `cron_enabled`, `cron_expression` |
|
||||
| `iit_schema.skills` | 16 列 | — (新表) | 迁移 #8 中 ALTER ADD 4 列 |
|
||||
|
||||
---
|
||||
|
||||
## 3. Seed 数据同步需求
|
||||
|
||||
### 3.1 Prompt 管理数据对比
|
||||
|
||||
| 表 | 开发环境 | RDS | 分析 |
|
||||
|---|---------|-----|------|
|
||||
| `prompt_templates` | 27 行 | 14 行 | RDS 缺 13 个 SSA 模板(ID 17-29) |
|
||||
| `prompt_versions` | 42 行 | 23 行 | RDS 缺 19 个 SSA 版本(ID 26-44) |
|
||||
|
||||
**重要**:RDS 的 AIA/ASL/DC/RVW 模板(ID 1-16)已经过**独立迭代**,部分版本比开发环境更丰富(如模板 7 在 RDS 有 v2/v3 内容各 1044 字符,开发环境是短内容测试版),**绝对不能覆盖**。
|
||||
|
||||
### 3.2 需要同步的 Seed 数据
|
||||
|
||||
| 表 | 行数 | 内容 | 操作 |
|
||||
|---|------|------|------|
|
||||
| `capability_schema.prompt_templates` | 13 行 | SSA 模块 Prompt(ID 17-29) | INSERT,已有则跳过 |
|
||||
| `capability_schema.prompt_versions` | 19 行 | SSA Prompt 版本(ID 26-44) | INSERT,已有则跳过 |
|
||||
| `asl_schema.extraction_templates` | 3 行 | 系统提取模板(RCT/Cohort/QC) | INSERT(新表,迁移后) |
|
||||
|
||||
### 3.3 不需要同步的数据
|
||||
|
||||
| 表 | 原因 |
|
||||
|---|------|
|
||||
| `prompt_templates` ID 1-16 | RDS 版本更优,不覆盖 |
|
||||
| `prompt_versions` ID 1-25 | RDS 版本更优,不覆盖 |
|
||||
| `platform_schema.users/tenants/...` | RDS 有真实用户/租户数据 |
|
||||
| `ekb_schema.*` | RDS 有真实知识库数据(5686 chunks) |
|
||||
| `iit_schema.qc_logs` 等 | 开发测试数据,不推向生产 |
|
||||
|
||||
---
|
||||
|
||||
## 4. 迁移方案
|
||||
|
||||
### 4.1 方案选择:补丁迁移 + `prisma migrate deploy`
|
||||
|
||||
采用 **方案 B**:先为 db push 漏网的变更创建补丁迁移文件,然后用 `prisma migrate deploy` 一次性应用。
|
||||
|
||||
**风险评估**:
|
||||
|
||||
| 风险项 | 评估 | 说明 |
|
||||
|-------|------|------|
|
||||
| 数据丢失 | ✅ 零风险 | 6 个迁移全部是 CREATE TABLE / ALTER TABLE ADD COLUMN,无任何 DROP / DELETE / TRUNCATE |
|
||||
| 现有表结构破坏 | ✅ 零风险 | 仅新增,不修改已有列 |
|
||||
| 现有数据变更 | ✅ 零风险 | 纯 DDL 操作,不涉及 DML |
|
||||
| Prompt 数据丢失 | ✅ 零风险 | Prompt 在 capability_schema,不受任何迁移影响 |
|
||||
| 迁移执行失败 | 🟡 低风险 | 可能因 RDS 权限问题失败,事务回滚不影响数据 |
|
||||
|
||||
### 4.2 执行步骤总览
|
||||
|
||||
```
|
||||
步骤 1 → 备份 RDS 数据库
|
||||
步骤 2 → 创建补丁迁移文件(覆盖 db push 漏网变更)
|
||||
步骤 3 → 本地标记补丁迁移为已应用(dev 已有这些表)
|
||||
步骤 4 → 在 RDS 执行 prisma migrate deploy(7 个迁移)
|
||||
步骤 5 → 同步 Seed 数据(SSA Prompt + 提取模板)
|
||||
步骤 6 → 验证
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5. 详细执行步骤
|
||||
|
||||
### 步骤 1:备份 RDS 数据库
|
||||
|
||||
> ⚠️ **安全第一:任何操作前必须备份!**
|
||||
|
||||
使用 Docker 容器中的 pg_dump(避免 PowerShell 编码问题):
|
||||
|
||||
```bash
|
||||
# 在 Docker 容器内执行备份(避免 PowerShell UTF-8 编码问题!)
|
||||
docker exec ai-clinical-postgres pg_dump \
|
||||
"postgresql://airesearch:Xibahe%40fengzhibo117@pgm-2zex1m2y3r23hdn5so.pg.rds.aliyuncs.com:5432/ai_clinical_research_test" \
|
||||
-f /tmp/backup_rds_before_0227.sql
|
||||
|
||||
# 将备份文件从容器复制到本地
|
||||
docker cp ai-clinical-postgres:/tmp/backup_rds_before_0227.sql ./backup_rds_before_0227.sql
|
||||
|
||||
# 验证备份文件大小和中文内容
|
||||
docker exec ai-clinical-postgres head -20 /tmp/backup_rds_before_0227.sql
|
||||
```
|
||||
|
||||
预期:备份文件应 > 1MB,且中文内容正常显示(非 `????`)。
|
||||
|
||||
### 步骤 2:创建补丁迁移文件
|
||||
|
||||
> 将 db push 漏网的 6 张表 + 3 列 + 索引 补入迁移体系
|
||||
|
||||
创建文件 `backend/prisma/migrations/20260227_patch_db_push_drift/migration.sql`:
|
||||
|
||||
```sql
|
||||
-- ================================================================
|
||||
-- 补丁迁移:覆盖 db push 创建的 6 张表 + 3 列
|
||||
-- 所有语句使用 IF NOT EXISTS 保证幂等(多次执行不报错)
|
||||
-- ================================================================
|
||||
|
||||
-- ============ iit_schema: 4 张新表 + 1 列 + 1 索引 ============
|
||||
|
||||
-- 1. IIT 字段元数据表(REDCap 字段定义缓存)
|
||||
CREATE TABLE IF NOT EXISTS "iit_schema"."field_metadata" (
|
||||
"id" TEXT NOT NULL,
|
||||
"project_id" TEXT NOT NULL,
|
||||
"field_name" TEXT NOT NULL,
|
||||
"field_label" TEXT NOT NULL,
|
||||
"field_type" TEXT NOT NULL,
|
||||
"form_name" TEXT NOT NULL,
|
||||
"section_header" TEXT,
|
||||
"validation" TEXT,
|
||||
"validation_min" TEXT,
|
||||
"validation_max" TEXT,
|
||||
"choices" TEXT,
|
||||
"required" BOOLEAN NOT NULL DEFAULT false,
|
||||
"branching" TEXT,
|
||||
"alias" TEXT,
|
||||
"rule_source" TEXT,
|
||||
"synced_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
|
||||
CONSTRAINT "field_metadata_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
CREATE UNIQUE INDEX IF NOT EXISTS "unique_iit_field_metadata"
|
||||
ON "iit_schema"."field_metadata"("project_id", "field_name");
|
||||
CREATE INDEX IF NOT EXISTS "idx_iit_field_metadata_project"
|
||||
ON "iit_schema"."field_metadata"("project_id");
|
||||
CREATE INDEX IF NOT EXISTS "idx_iit_field_metadata_form"
|
||||
ON "iit_schema"."field_metadata"("project_id", "form_name");
|
||||
|
||||
-- 2. IIT 质控日志表
|
||||
CREATE TABLE IF NOT EXISTS "iit_schema"."qc_logs" (
|
||||
"id" TEXT NOT NULL,
|
||||
"project_id" TEXT NOT NULL,
|
||||
"record_id" TEXT NOT NULL,
|
||||
"event_id" TEXT,
|
||||
"qc_type" TEXT NOT NULL,
|
||||
"form_name" TEXT,
|
||||
"status" TEXT NOT NULL,
|
||||
"issues" JSONB NOT NULL DEFAULT '[]',
|
||||
"rules_evaluated" INTEGER NOT NULL DEFAULT 0,
|
||||
"rules_skipped" INTEGER NOT NULL DEFAULT 0,
|
||||
"rules_passed" INTEGER NOT NULL DEFAULT 0,
|
||||
"rules_failed" INTEGER NOT NULL DEFAULT 0,
|
||||
"rule_version" TEXT NOT NULL,
|
||||
"inclusion_passed" BOOLEAN,
|
||||
"exclusion_passed" BOOLEAN,
|
||||
"triggered_by" TEXT NOT NULL,
|
||||
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
|
||||
CONSTRAINT "qc_logs_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS "idx_iit_qc_log_record_time"
|
||||
ON "iit_schema"."qc_logs"("project_id", "record_id", "created_at");
|
||||
CREATE INDEX IF NOT EXISTS "idx_iit_qc_log_status_time"
|
||||
ON "iit_schema"."qc_logs"("project_id", "status", "created_at");
|
||||
CREATE INDEX IF NOT EXISTS "idx_iit_qc_log_type_time"
|
||||
ON "iit_schema"."qc_logs"("project_id", "qc_type", "created_at");
|
||||
|
||||
-- 3. IIT 受试者记录汇总表
|
||||
CREATE TABLE IF NOT EXISTS "iit_schema"."record_summary" (
|
||||
"id" TEXT NOT NULL,
|
||||
"project_id" TEXT NOT NULL,
|
||||
"record_id" TEXT NOT NULL,
|
||||
"enrolled_at" TIMESTAMP(3),
|
||||
"enrolled_by" TEXT,
|
||||
"last_updated_at" TIMESTAMP(3) NOT NULL,
|
||||
"last_updated_by" TEXT,
|
||||
"last_form_name" TEXT,
|
||||
"form_status" JSONB NOT NULL DEFAULT '{}',
|
||||
"total_forms" INTEGER NOT NULL DEFAULT 0,
|
||||
"completed_forms" INTEGER NOT NULL DEFAULT 0,
|
||||
"completion_rate" DOUBLE PRECISION NOT NULL DEFAULT 0,
|
||||
"latest_qc_status" TEXT,
|
||||
"latest_qc_at" TIMESTAMP(3),
|
||||
"update_count" INTEGER NOT NULL DEFAULT 0,
|
||||
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updated_at" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "record_summary_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
CREATE UNIQUE INDEX IF NOT EXISTS "unique_iit_record_summary"
|
||||
ON "iit_schema"."record_summary"("project_id", "record_id");
|
||||
CREATE INDEX IF NOT EXISTS "idx_iit_record_summary_enrolled"
|
||||
ON "iit_schema"."record_summary"("project_id", "enrolled_at");
|
||||
CREATE INDEX IF NOT EXISTS "idx_iit_record_summary_qc_status"
|
||||
ON "iit_schema"."record_summary"("project_id", "latest_qc_status");
|
||||
CREATE INDEX IF NOT EXISTS "idx_iit_record_summary_completion"
|
||||
ON "iit_schema"."record_summary"("project_id", "completion_rate");
|
||||
|
||||
-- 4. IIT 项目级质控统计汇总表
|
||||
CREATE TABLE IF NOT EXISTS "iit_schema"."qc_project_stats" (
|
||||
"id" TEXT NOT NULL,
|
||||
"project_id" TEXT NOT NULL,
|
||||
"total_records" INTEGER NOT NULL DEFAULT 0,
|
||||
"passed_records" INTEGER NOT NULL DEFAULT 0,
|
||||
"failed_records" INTEGER NOT NULL DEFAULT 0,
|
||||
"warning_records" INTEGER NOT NULL DEFAULT 0,
|
||||
"inclusion_met" INTEGER NOT NULL DEFAULT 0,
|
||||
"exclusion_met" INTEGER NOT NULL DEFAULT 0,
|
||||
"avg_completion_rate" DOUBLE PRECISION NOT NULL DEFAULT 0,
|
||||
"updated_at" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "qc_project_stats_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
CREATE UNIQUE INDEX IF NOT EXISTS "qc_project_stats_project_id_key"
|
||||
ON "iit_schema"."qc_project_stats"("project_id");
|
||||
|
||||
-- 5. IIT projects 表新增 knowledge_base_id 列
|
||||
ALTER TABLE "iit_schema"."projects"
|
||||
ADD COLUMN IF NOT EXISTS "knowledge_base_id" TEXT;
|
||||
|
||||
CREATE INDEX IF NOT EXISTS "idx_iit_project_kb"
|
||||
ON "iit_schema"."projects"("knowledge_base_id");
|
||||
|
||||
-- ============ ssa_schema: 2 张新表 ============
|
||||
|
||||
-- 6. SSA 工作流表
|
||||
CREATE TABLE IF NOT EXISTS "ssa_schema"."ssa_workflows" (
|
||||
"id" TEXT NOT NULL DEFAULT gen_random_uuid()::text,
|
||||
"session_id" TEXT NOT NULL,
|
||||
"message_id" TEXT,
|
||||
"status" VARCHAR NOT NULL DEFAULT 'pending',
|
||||
"total_steps" INTEGER NOT NULL,
|
||||
"completed_steps" INTEGER NOT NULL DEFAULT 0,
|
||||
"workflow_plan" JSONB NOT NULL,
|
||||
"reasoning" TEXT,
|
||||
"created_at" TIMESTAMP(3) NOT NULL DEFAULT now(),
|
||||
"started_at" TIMESTAMP(3),
|
||||
"completed_at" TIMESTAMP(3),
|
||||
|
||||
CONSTRAINT "ssa_workflows_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS "idx_ssa_workflow_session"
|
||||
ON "ssa_schema"."ssa_workflows"("session_id");
|
||||
CREATE INDEX IF NOT EXISTS "idx_ssa_workflow_status"
|
||||
ON "ssa_schema"."ssa_workflows"("status");
|
||||
|
||||
-- 外键:ssa_workflows.session_id → ssa_sessions.id
|
||||
DO $$
|
||||
BEGIN
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM information_schema.table_constraints
|
||||
WHERE constraint_name = 'ssa_workflows_session_id_fkey'
|
||||
) THEN
|
||||
ALTER TABLE "ssa_schema"."ssa_workflows"
|
||||
ADD CONSTRAINT "ssa_workflows_session_id_fkey"
|
||||
FOREIGN KEY ("session_id")
|
||||
REFERENCES "ssa_schema"."ssa_sessions"("id")
|
||||
ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
END IF;
|
||||
END $$;
|
||||
|
||||
-- 7. SSA 工作流步骤表
|
||||
CREATE TABLE IF NOT EXISTS "ssa_schema"."ssa_workflow_steps" (
|
||||
"id" TEXT NOT NULL DEFAULT gen_random_uuid()::text,
|
||||
"workflow_id" TEXT NOT NULL,
|
||||
"step_order" INTEGER NOT NULL,
|
||||
"tool_code" VARCHAR NOT NULL,
|
||||
"tool_name" VARCHAR NOT NULL,
|
||||
"status" VARCHAR NOT NULL DEFAULT 'pending',
|
||||
"input_params" JSONB,
|
||||
"guardrail_checks" JSONB,
|
||||
"output_result" JSONB,
|
||||
"error_info" JSONB,
|
||||
"execution_ms" INTEGER,
|
||||
"started_at" TIMESTAMP(3),
|
||||
"completed_at" TIMESTAMP(3),
|
||||
|
||||
CONSTRAINT "ssa_workflow_steps_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS "idx_ssa_workflow_step_workflow"
|
||||
ON "ssa_schema"."ssa_workflow_steps"("workflow_id");
|
||||
CREATE INDEX IF NOT EXISTS "idx_ssa_workflow_step_status"
|
||||
ON "ssa_schema"."ssa_workflow_steps"("status");
|
||||
|
||||
-- 外键:ssa_workflow_steps.workflow_id → ssa_workflows.id
|
||||
DO $$
|
||||
BEGIN
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM information_schema.table_constraints
|
||||
WHERE constraint_name = 'ssa_workflow_steps_workflow_id_fkey'
|
||||
) THEN
|
||||
ALTER TABLE "ssa_schema"."ssa_workflow_steps"
|
||||
ADD CONSTRAINT "ssa_workflow_steps_workflow_id_fkey"
|
||||
FOREIGN KEY ("workflow_id")
|
||||
REFERENCES "ssa_schema"."ssa_workflows"("id")
|
||||
ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
END IF;
|
||||
END $$;
|
||||
```
|
||||
|
||||
### 步骤 3:本地标记补丁迁移为已应用
|
||||
|
||||
> 开发环境已经有这些表(db push 创建的),只需告诉 Prisma "这个迁移已经执行过了"。
|
||||
|
||||
```bash
|
||||
cd backend
|
||||
|
||||
# 标记补丁迁移为已应用(不实际执行 SQL)
|
||||
npx prisma migrate resolve --applied 20260227_patch_db_push_drift
|
||||
|
||||
# 同时标记 20260226 迁移为已应用(dev 已有 equery/critical_events 表)
|
||||
npx prisma migrate resolve --applied 20260226_add_equery_critical_events_cron
|
||||
```
|
||||
|
||||
验证:
|
||||
|
||||
```bash
|
||||
# 本地应该显示 13 个迁移全部已应用
|
||||
npx prisma migrate status
|
||||
```
|
||||
|
||||
### 步骤 4:在 RDS 执行迁移
|
||||
|
||||
> 核心操作:一次性应用 7 个迁移(#7 ~ #12 + 补丁)
|
||||
|
||||
```bash
|
||||
cd backend
|
||||
|
||||
# 临时切换 DATABASE_URL 指向 RDS 外网
|
||||
# Windows PowerShell:
|
||||
$env:DATABASE_URL="postgresql://airesearch:Xibahe%40fengzhibo117@pgm-2zex1m2y3r23hdn5so.pg.rds.aliyuncs.com:5432/ai_clinical_research_test"
|
||||
|
||||
# 执行迁移(只应用未执行的迁移,不会重新执行已有的)
|
||||
npx prisma migrate deploy
|
||||
```
|
||||
|
||||
预期输出:
|
||||
|
||||
```
|
||||
7 migrations found in prisma/migrations
|
||||
6 migrations have been already applied
|
||||
Applying migration `20260207112544_add_iit_manager_agent_tables`
|
||||
Applying migration `20260208134925_add_cra_qc_engine_support`
|
||||
Applying migration `20260219_add_ssa_module`
|
||||
Applying migration `20260223_add_deep_research_v2_fields`
|
||||
Applying migration `20260225_add_extraction_template_engine`
|
||||
Applying migration `20260226_add_equery_critical_events_cron`
|
||||
Applying migration `20260227_patch_db_push_drift`
|
||||
|
||||
All migrations have been successfully applied.
|
||||
```
|
||||
|
||||
> **注意**:迁移 #7 中包含 `CREATE EXTENSION IF NOT EXISTS vector;`,需要 RDS 已安装 pgvector 插件(已在 0126 部署中确认安装)。
|
||||
|
||||
### 步骤 5:同步 Seed 数据
|
||||
|
||||
> 仅同步 SSA Prompt 和提取模板,不动 RDS 已有数据
|
||||
|
||||
**方法:从开发环境导出 → 插入 RDS**
|
||||
|
||||
```bash
|
||||
# 5a. 导出 SSA Prompt 模板(ID >= 17,仅 SSA 新增)
|
||||
docker exec ai-clinical-postgres psql -U postgres -d ai_clinical_research -c "\
|
||||
COPY (SELECT * FROM capability_schema.prompt_templates WHERE id >= 17) \
|
||||
TO '/tmp/seed_prompt_templates.csv' WITH CSV HEADER;"
|
||||
|
||||
# 5b. 导出 SSA Prompt 版本(ID >= 26)
|
||||
docker exec ai-clinical-postgres psql -U postgres -d ai_clinical_research -c "\
|
||||
COPY (SELECT * FROM capability_schema.prompt_versions WHERE id >= 26) \
|
||||
TO '/tmp/seed_prompt_versions.csv' WITH CSV HEADER;"
|
||||
|
||||
# 5c. 导出提取模板(新表,全部 3 行)
|
||||
docker exec ai-clinical-postgres psql -U postgres -d ai_clinical_research -c "\
|
||||
COPY (SELECT * FROM asl_schema.extraction_templates) \
|
||||
TO '/tmp/seed_extraction_templates.csv' WITH CSV HEADER;"
|
||||
|
||||
# 5d. 导入到 RDS(在 Docker 容器内操作,避免 PowerShell 编码问题)
|
||||
docker exec ai-clinical-postgres psql \
|
||||
"postgresql://airesearch:Xibahe%40fengzhibo117@pgm-2zex1m2y3r23hdn5so.pg.rds.aliyuncs.com:5432/ai_clinical_research_test" \
|
||||
-c "\COPY capability_schema.prompt_templates FROM '/tmp/seed_prompt_templates.csv' WITH CSV HEADER;"
|
||||
|
||||
docker exec ai-clinical-postgres psql \
|
||||
"postgresql://airesearch:Xibahe%40fengzhibo117@pgm-2zex1m2y3r23hdn5so.pg.rds.aliyuncs.com:5432/ai_clinical_research_test" \
|
||||
-c "\COPY capability_schema.prompt_versions FROM '/tmp/seed_prompt_versions.csv' WITH CSV HEADER;"
|
||||
|
||||
docker exec ai-clinical-postgres psql \
|
||||
"postgresql://airesearch:Xibahe%40fengzhibo117@pgm-2zex1m2y3r23hdn5so.pg.rds.aliyuncs.com:5432/ai_clinical_research_test" \
|
||||
-c "\COPY asl_schema.extraction_templates FROM '/tmp/seed_extraction_templates.csv' WITH CSV HEADER;"
|
||||
```
|
||||
|
||||
> ⚠️ **关键**:所有操作通过 `docker exec` 在容器内执行,**避免 PowerShell 的 UTF-8 编码问题**(参考 0126 部署教训)。
|
||||
|
||||
### 步骤 6:验证
|
||||
|
||||
```bash
|
||||
# 6a. 验证表数量(应从 66 → 96)
|
||||
docker exec ai-clinical-postgres psql \
|
||||
"postgresql://airesearch:Xibahe%40fengzhibo117@pgm-2zex1m2y3r23hdn5so.pg.rds.aliyuncs.com:5432/ai_clinical_research_test" \
|
||||
-c "SELECT count(*) as total_tables FROM information_schema.tables WHERE table_type='BASE TABLE' AND table_schema NOT IN ('pg_catalog','information_schema');"
|
||||
|
||||
# 6b. 验证迁移记录(应为 13 条)
|
||||
docker exec ai-clinical-postgres psql \
|
||||
"postgresql://airesearch:Xibahe%40fengzhibo117@pgm-2zex1m2y3r23hdn5so.pg.rds.aliyuncs.com:5432/ai_clinical_research_test" \
|
||||
-c "SELECT count(*) FROM public._prisma_migrations;"
|
||||
|
||||
# 6c. 验证 SSA Prompt 数据(应为 27 个模板)
|
||||
docker exec ai-clinical-postgres psql \
|
||||
"postgresql://airesearch:Xibahe%40fengzhibo117@pgm-2zex1m2y3r23hdn5so.pg.rds.aliyuncs.com:5432/ai_clinical_research_test" \
|
||||
-c "SELECT count(*) FROM capability_schema.prompt_templates;"
|
||||
|
||||
# 6d. 验证 SSA 表存在(应有 11 张表)
|
||||
docker exec ai-clinical-postgres psql \
|
||||
"postgresql://airesearch:Xibahe%40fengzhibo117@pgm-2zex1m2y3r23hdn5so.pg.rds.aliyuncs.com:5432/ai_clinical_research_test" \
|
||||
-c "SELECT count(*) FROM information_schema.tables WHERE table_schema='ssa_schema';"
|
||||
|
||||
# 6e. 验证关键列存在
|
||||
docker exec ai-clinical-postgres psql \
|
||||
"postgresql://airesearch:Xibahe%40fengzhibo117@pgm-2zex1m2y3r23hdn5so.pg.rds.aliyuncs.com:5432/ai_clinical_research_test" \
|
||||
-c "SELECT column_name FROM information_schema.columns WHERE table_schema='asl_schema' AND table_name='research_tasks' AND column_name IN ('target_sources','synthesis_report','result_list');"
|
||||
|
||||
# 6f. 验证 RDS 原有数据未受影响(Prompt ID 1-16 + 用户数据)
|
||||
docker exec ai-clinical-postgres psql \
|
||||
"postgresql://airesearch:Xibahe%40fengzhibo117@pgm-2zex1m2y3r23hdn5so.pg.rds.aliyuncs.com:5432/ai_clinical_research_test" \
|
||||
-c "SELECT id, code, name FROM capability_schema.prompt_templates WHERE id <= 16 ORDER BY id LIMIT 5;"
|
||||
|
||||
docker exec ai-clinical-postgres psql \
|
||||
"postgresql://airesearch:Xibahe%40fengzhibo117@pgm-2zex1m2y3r23hdn5so.pg.rds.aliyuncs.com:5432/ai_clinical_research_test" \
|
||||
-c "SELECT count(*) as user_count FROM platform_schema.users;"
|
||||
```
|
||||
|
||||
**验证通过标准**:
|
||||
|
||||
| 检查项 | 预期值 |
|
||||
|-------|-------|
|
||||
| 总表数 | 96 |
|
||||
| 迁移记录数 | 13 |
|
||||
| prompt_templates 总数 | 27 |
|
||||
| ssa_schema 表数 | 11 |
|
||||
| research_tasks 新列 | 3 列存在 |
|
||||
| 原有 Prompt(ID 1-16) | 数据完整、中文正常 |
|
||||
| 用户数 | 22(不变) |
|
||||
|
||||
---
|
||||
|
||||
## 6. 回滚方案
|
||||
|
||||
### 6.1 迁移执行失败
|
||||
|
||||
`prisma migrate deploy` 每个迁移在事务中执行,失败自动回滚,不影响已有数据。
|
||||
|
||||
处理方式:查看错误信息,修复 SQL 后重新执行。
|
||||
|
||||
### 6.2 需要完全回滚
|
||||
|
||||
使用步骤 1 的备份文件恢复:
|
||||
|
||||
```bash
|
||||
# 在 Docker 容器内操作(避免编码问题)
|
||||
# 1. 删除测试数据库
|
||||
docker exec ai-clinical-postgres psql \
|
||||
"postgresql://airesearch:Xibahe%40fengzhibo117@pgm-2zex1m2y3r23hdn5so.pg.rds.aliyuncs.com:5432/postgres" \
|
||||
-c "DROP DATABASE ai_clinical_research_test WITH (FORCE);"
|
||||
|
||||
# 2. 重新创建
|
||||
docker exec ai-clinical-postgres psql \
|
||||
"postgresql://airesearch:Xibahe%40fengzhibo117@pgm-2zex1m2y3r23hdn5so.pg.rds.aliyuncs.com:5432/postgres" \
|
||||
-c "CREATE DATABASE ai_clinical_research_test ENCODING='UTF8';"
|
||||
|
||||
# 3. 安装插件
|
||||
docker exec ai-clinical-postgres psql \
|
||||
"postgresql://airesearch:Xibahe%40fengzhibo117@pgm-2zex1m2y3r23hdn5so.pg.rds.aliyuncs.com:5432/ai_clinical_research_test" \
|
||||
-c "CREATE EXTENSION IF NOT EXISTS pg_bigm; CREATE EXTENSION IF NOT EXISTS vector;"
|
||||
|
||||
# 4. 恢复备份
|
||||
docker exec ai-clinical-postgres psql \
|
||||
"postgresql://airesearch:Xibahe%40fengzhibo117@pgm-2zex1m2y3r23hdn5so.pg.rds.aliyuncs.com:5432/ai_clinical_research_test" \
|
||||
-f /tmp/backup_rds_before_0227.sql
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 7. 注意事项
|
||||
|
||||
### 7.1 PowerShell 编码问题
|
||||
|
||||
> ⚠️ **0126 部署的惨痛教训:PowerShell 会破坏 UTF-8 编码**
|
||||
|
||||
所有涉及中文数据的操作(备份、导入 Seed 数据)必须在 Docker 容器内直接执行(`docker exec`),**绝不能**通过 PowerShell 管道传输。
|
||||
|
||||
### 7.2 RDS 权限
|
||||
|
||||
- `CREATE EXTENSION` 需要 RDS 超级用户权限(已在 0126 部署中通过 RDS 控制台安装插件)
|
||||
- `CREATE SCHEMA` 需要 OWNER 权限(airesearch 用户已具备)
|
||||
|
||||
### 7.3 执行顺序
|
||||
|
||||
补丁迁移 `20260227` **必须排在** `20260219_add_ssa_module` 之后,因为 `ssa_workflows` 表的外键引用 `ssa_sessions` 表(由 #9 迁移创建)。当前文件名的字母序保证了正确顺序。
|
||||
|
||||
### 7.4 Prompt ID 序列
|
||||
|
||||
导入 Seed 数据后需要重置 `prompt_templates` 和 `prompt_versions` 表的 ID 序列:
|
||||
|
||||
```sql
|
||||
-- 重置序列到当前最大值
|
||||
SELECT setval(pg_get_serial_sequence('capability_schema.prompt_templates', 'id'),
|
||||
(SELECT MAX(id) FROM capability_schema.prompt_templates));
|
||||
SELECT setval(pg_get_serial_sequence('capability_schema.prompt_versions', 'id'),
|
||||
(SELECT MAX(id) FROM capability_schema.prompt_versions));
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 8. 后续改进:防止 Schema 漂移
|
||||
|
||||
### 8.1 根因
|
||||
|
||||
当前 6 表 + 3 列无迁移文件的根因是开发中使用了 `prisma db push` 而非 `prisma migrate dev`。
|
||||
|
||||
### 8.2 四层防线
|
||||
|
||||
| 层级 | 时机 | 方法 | 实施成本 |
|
||||
|------|------|------|---------|
|
||||
| **开发规范** | 写代码时 | 禁止 `db push`,统一用 `migrate dev` | 零 |
|
||||
| **pre-commit Hook** | git commit 前 | 检测 schema.prisma 变更但无新迁移文件 | 一次性 |
|
||||
| **CI 漂移检测** | PR 合并前 | `prisma migrate diff --exit-code` | 一次性 |
|
||||
| **部署前闸门** | 部署前 | 对比 schema vs 迁移历史 | 一次性 |
|
||||
|
||||
详细实施方案见开发规范更新(后续单独文档)。
|
||||
|
||||
---
|
||||
|
||||
## 9. 时间估算
|
||||
|
||||
| 步骤 | 预计耗时 | 说明 |
|
||||
|------|---------|------|
|
||||
| 步骤 1:备份 | 5 分钟 | pg_dump 约 20MB |
|
||||
| 步骤 2:创建补丁迁移 | 5 分钟 | 创建文件 |
|
||||
| 步骤 3:本地标记 | 2 分钟 | prisma resolve |
|
||||
| 步骤 4:RDS 迁移 | 3 分钟 | migrate deploy |
|
||||
| 步骤 5:Seed 数据 | 5 分钟 | CSV 导出导入 |
|
||||
| 步骤 6:验证 | 5 分钟 | 7 项检查 |
|
||||
| **总计** | **~25 分钟** | 含缓冲时间 |
|
||||
|
||||
---
|
||||
|
||||
## 更新日志
|
||||
|
||||
| 版本 | 日期 | 内容 |
|
||||
|------|------|------|
|
||||
| v1.0 | 2026-02-27 | 初始版本:完整迁移方案 |
|
||||
|
||||
---
|
||||
|
||||
**文档结束**
|
||||
355
docs/05-部署文档/0227部署/02-部署完成总结.md
Normal file
355
docs/05-部署文档/0227部署/02-部署完成总结.md
Normal file
@@ -0,0 +1,355 @@
|
||||
# 2026年2月27日部署完成总结
|
||||
|
||||
> **部署日期**:2026-02-27
|
||||
> **部署范围**:数据库迁移 + R统计引擎(新增) + Python微服务 + Node.js后端 + 前端Nginx 全量更新
|
||||
> **部署状态**:✅ 全部完成,所有功能测试通过
|
||||
> **文档日期**:2026-02-27
|
||||
|
||||
---
|
||||
|
||||
## 部署成果一览
|
||||
|
||||
### 服务版本对比
|
||||
|
||||
| 服务 | 部署前 | 部署后 | 变更类型 |
|
||||
|------|--------|--------|---------|
|
||||
| PostgreSQL(RDS) | 16 Schema / 63 表 | 16 Schema / 84 表 | Schema迁移 |
|
||||
| R统计引擎 | 无 | **v1.0.1** | **全新部署** |
|
||||
| Python微服务 | v1.1 | **v1.2** | 依赖+代码更新 |
|
||||
| Node.js后端 | v1.7 | **v2.2** | 大版本更新(5万行新增) |
|
||||
| 前端Nginx | v1.3 | **v1.8** | 大版本更新(3.2万行新增) |
|
||||
|
||||
### 内网地址总览
|
||||
|
||||
| 服务 | 内网地址 | 端口 | 状态 |
|
||||
|------|---------|------|------|
|
||||
| R统计引擎(新) | `172.17.173.101` | 8080 | ✅ 新增 |
|
||||
| Python微服务 | `172.17.173.102` | 8000 | ✅ 地址变更 |
|
||||
| Node.js后端 | `172.17.197.28` | 3001 | ✅ 地址变更 |
|
||||
| 前端Nginx | `172.17.197.29` | 80 | ✅ 地址变更 |
|
||||
|
||||
---
|
||||
|
||||
## 一、数据库迁移
|
||||
|
||||
### 1.1 迁移背景
|
||||
|
||||
自 0126 部署以来,本地开发环境新增了大量功能模块(IIT Agent、SSA统计分析、ASL提取工作台等),导致本地数据库与RDS之间存在显著差异。部分变更通过 `prisma db push` 直接推送,未生成迁移文件,造成 Schema Drift。
|
||||
|
||||
### 1.2 迁移内容
|
||||
|
||||
**应用的 Prisma 迁移文件**(5个):
|
||||
|
||||
| 迁移文件 | 内容 | 新增表数 |
|
||||
|---------|------|---------|
|
||||
| `20260207_add_iit_manager_agent_tables` | IIT Agent 8张表 | 8 |
|
||||
| `20260208_add_cra_qc_engine_support` | CRA智能质控 | 1 |
|
||||
| `20260219_add_ssa_module` | SSA统计分析模块 9张表 | 9 |
|
||||
| `20260223_add_deep_research_v2_fields` | Deep Research V2.0 字段 | 0(列变更) |
|
||||
| `20260225_add_extraction_template_engine` | 全文智能提取工作台 4张表 | 4 |
|
||||
|
||||
**Drift 补丁迁移**(1个):
|
||||
|
||||
| 迁移文件 | 内容 |
|
||||
|---------|------|
|
||||
| `20260227_patch_db_push_drift` | 修复 `prisma db push` 造成的 drift:`field_metadata`、`qc_logs`、`record_summary`、`qc_project_stats`、`ssa_workflows`、`ssa_workflow_steps` 等表 + `knowledge_base_id` 列 |
|
||||
|
||||
**Seed 数据同步**:
|
||||
|
||||
| 数据 | 条目数 | 目标表 |
|
||||
|------|-------|-------|
|
||||
| SSA 工具库 | 13条 | `ssa_schema.ssa_tools_library` |
|
||||
| IIT 技能库 | 8条 | `iit_schema.iit_skills` |
|
||||
|
||||
### 1.3 迁移结果
|
||||
|
||||
| 验证项 | 结果 |
|
||||
|-------|------|
|
||||
| Schema 数量 | 16 ✅ |
|
||||
| 表总数 | 84 ✅ |
|
||||
| Prisma 迁移记录 | 11条(含6条新增) ✅ |
|
||||
| SSA 工具库数据 | 13条 ✅ |
|
||||
| IIT 技能库数据 | 8条 ✅ |
|
||||
| 已有数据完整性 | Prompt模板、用户数据零丢失 ✅ |
|
||||
|
||||
> 详细方案见 `01-数据库迁移方案.md`
|
||||
|
||||
---
|
||||
|
||||
## 二、R统计引擎部署(全新服务)
|
||||
|
||||
### 2.1 服务概述
|
||||
|
||||
R统计引擎是 SSA(智能统计分析)模块的核心计算后端,采用 Brain-Hand 架构:Node.js 后端作为 Brain 负责调度,R Docker 作为 Hand 负责统计计算。
|
||||
|
||||
### 2.2 镜像信息
|
||||
|
||||
| 项目 | 值 |
|
||||
|------|---|
|
||||
| ACR 仓库 | `ssa-r-statistics` |
|
||||
| 镜像版本 | `v1.0.1` |
|
||||
| 镜像地址 | `crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/ssa-r-statistics:v1.0.1` |
|
||||
| 镜像大小 | ~1.8GB |
|
||||
| 基础镜像 | `rocker/r-ver:4.3` |
|
||||
| R版本 | 4.3.3 |
|
||||
|
||||
### 2.3 内置工具(13个)
|
||||
|
||||
| 工具代码 | 功能 |
|
||||
|---------|------|
|
||||
| `descriptive` | 描述性统计 |
|
||||
| `t_test_ind` | 独立样本T检验 |
|
||||
| `t_test_paired` | 配对T检验 |
|
||||
| `mann_whitney` | Mann-Whitney U检验 |
|
||||
| `wilcoxon` | Wilcoxon符号秩检验 |
|
||||
| `chi_square` | 卡方检验 |
|
||||
| `fisher` | Fisher精确检验 |
|
||||
| `anova_one` | 单因素方差分析 |
|
||||
| `correlation` | 相关性分析 |
|
||||
| `linear_reg` | 线性回归 |
|
||||
| `logistic_binary` | 二元Logistic回归 |
|
||||
| `baseline_table` | 基线特征表 |
|
||||
| `meta_analysis` | Meta分析 |
|
||||
|
||||
### 2.4 SAE 应用配置
|
||||
|
||||
| 配置项 | 值 |
|
||||
|-------|---|
|
||||
| 应用名称 | `r-statistics-test` |
|
||||
| 实例规格 | 1核2GB |
|
||||
| 实例数量 | 1 |
|
||||
| 容器端口 | 8080 |
|
||||
| 内网地址 | `http://172.17.173.101:8080` |
|
||||
| 健康检查方式 | HTTP 检查 |
|
||||
| 健康检查路径 | `/health` |
|
||||
|
||||
### 2.5 部署过程中的问题与解决
|
||||
|
||||
**问题**:SAE HTTP 健康检查返回 404
|
||||
|
||||
- **现象**:Readiness probe 报 `HTTP status code: 404, body: {"error":"404 - Resource Not Found"}`
|
||||
- **验证**:通过 SAE Webshell 执行 `curl http://localhost:8080/health` 返回 200 OK,确认服务本身正常
|
||||
- **解决**:最终 HTTP 健康检查配置调整后恢复正常
|
||||
|
||||
---
|
||||
|
||||
## 三、Python微服务更新
|
||||
|
||||
### 3.1 更新内容
|
||||
|
||||
**依赖变更**(requirements-prod.txt):
|
||||
|
||||
| 变更 | 包名 | 用途 |
|
||||
|------|-----|------|
|
||||
| 新增 | `scipy>=1.11.0` | RVW V2.0 数据侦探:T检验、卡方检验逆向计算 |
|
||||
|
||||
**代码变更**:
|
||||
|
||||
| 模块 | 变更 |
|
||||
|------|------|
|
||||
| `forensics/` | 全新模块 - RVW V2.0 数据取证(5个文件) |
|
||||
| `main.py` | 注册 forensics API 路由 |
|
||||
| `operations/data_profile.py` | 新增 scipy 统计验证 |
|
||||
|
||||
### 3.2 镜像信息
|
||||
|
||||
| 项目 | 值 |
|
||||
|------|---|
|
||||
| ACR 仓库 | `python-extraction` |
|
||||
| 镜像版本 | v1.1 → **v1.2** |
|
||||
| 镜像地址 | `crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/python-extraction:v1.2` |
|
||||
| Digest | `sha256:be8612976255d706d652c5d16cb2e32c6e25b61a863d26c1ea7f63a9e0c95c86` |
|
||||
| 基础镜像 | `python:3-slim` |
|
||||
|
||||
### 3.3 SAE 应用配置
|
||||
|
||||
| 配置项 | 0126 部署 | 0227 部署 |
|
||||
|-------|----------|----------|
|
||||
| 应用名称 | `python-extraction-test` | `python-extraction-test` |
|
||||
| 实例规格 | 1核2GB | **2核4GB** |
|
||||
| 实例数量 | 1 | 1 |
|
||||
| 容器端口 | 8000 | 8000 |
|
||||
| 内网地址 | `172.17.173.84` | **`172.17.173.102`** |
|
||||
| 镜像版本 | v1.1 | **v1.2** |
|
||||
|
||||
> 规格从 1核2GB 升至 2核4GB,因为新增的 scipy、pandas、numpy 等科学计算库在 2 个 worker 下内存占用较高。
|
||||
|
||||
---
|
||||
|
||||
## 四、Node.js后端更新
|
||||
|
||||
### 4.1 更新内容
|
||||
|
||||
**271个文件变更,50972行新增代码**,主要包括:
|
||||
|
||||
| 类别 | 变更 |
|
||||
|------|------|
|
||||
| 新增依赖 | `adm-zip`(ZIP处理)、`json-logic-js`(规则引擎) |
|
||||
| 新增模块 | SSA 统计分析、ASL 图表/提取/Meta分析、RVW Skills、系统知识库 |
|
||||
| 重大更新 | IIT CRA Agent V3.0(自主QC+Function Calling)、Deep Research V2.0 |
|
||||
|
||||
### 4.2 镜像信息
|
||||
|
||||
| 项目 | 值 |
|
||||
|------|---|
|
||||
| ACR 仓库 | `backend-service` |
|
||||
| 镜像版本 | v1.7 → **v2.2** |
|
||||
| 镜像地址 | `crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:v2.2` |
|
||||
| Digest | `sha256:5f5ede30c5ff107018176622c674b53c640816f288d49912434303d8a5253211` |
|
||||
| 构建方式 | `tsc --noCheck` + Docker 多阶段构建 |
|
||||
|
||||
### 4.3 SAE 应用配置
|
||||
|
||||
| 配置项 | 0126 部署 | 0227 部署 |
|
||||
|-------|----------|----------|
|
||||
| 应用名称 | `nodejs-backend-test` | `nodejs-backend-test` |
|
||||
| 实例规格 | 1核2GB | **2核4GB** |
|
||||
| 实例数量 | 1 | 1 |
|
||||
| 容器端口 | 3001 | 3001 |
|
||||
| 内网地址 | `172.17.173.89` | **`172.17.197.28`** |
|
||||
| 镜像版本 | v1.7 | **v2.2** |
|
||||
|
||||
### 4.4 新增环境变量
|
||||
|
||||
| 环境变量 | 值 | 说明 |
|
||||
|---------|---|------|
|
||||
| `EXTRACTION_SERVICE_URL` | `http://172.17.173.102:8000` | Python 新地址 |
|
||||
| `R_SERVICE_URL` | `http://172.17.173.101:8080` | R统计引擎(新增) |
|
||||
| `UNIFUNCS_API_KEY` | `sk-2fNwqUH7...` | Deep Research(新增) |
|
||||
| `MINERU_API_TOKEN` | (长token) | MinerU PDF提取(新增) |
|
||||
| `MINERU_API_BASE` | `https://mineru.net/api/v4` | MinerU地址(新增) |
|
||||
| `STORAGE_TYPE` | `oss` | 存储类型(新增) |
|
||||
|
||||
---
|
||||
|
||||
## 五、前端Nginx更新
|
||||
|
||||
### 5.1 更新内容
|
||||
|
||||
**129个文件变更,32365行新增代码**,主要包括:
|
||||
|
||||
| 类别 | 变更 |
|
||||
|------|------|
|
||||
| 新增依赖 | `react-markdown`、`remark-gfm`(Markdown渲染) |
|
||||
| 新增模块 | SSA统计分析前端、ASL图表生成器/Meta分析引擎、IIT AI对话页 |
|
||||
| nginx.conf | `client_max_body_size 50M`、新增 `/wechat/` 代理路由 |
|
||||
|
||||
### 5.2 镜像信息
|
||||
|
||||
| 项目 | 值 |
|
||||
|------|---|
|
||||
| ACR 仓库 | `ai-clinical_frontend-nginx` |
|
||||
| 镜像版本 | v1.3 → **v1.8** |
|
||||
| Digest | `sha256:0a12b017ac6c85305fc5a716c5da245318c595fafd828c1222dd1a8ae79cfb26` |
|
||||
|
||||
### 5.3 SAE 应用配置
|
||||
|
||||
| 配置项 | 0126 部署 | 0227 部署 |
|
||||
|-------|----------|----------|
|
||||
| 应用名称 | `frontend-nginx-service` | `frontend-nginx-service` |
|
||||
| 实例规格 | 0.5核1GB | 0.5核1GB |
|
||||
| 容器端口 | 80 | 80 |
|
||||
| 内网地址 | `172.17.173.90` | **`172.17.197.29`** |
|
||||
| 镜像版本 | v1.3 | **v1.8** |
|
||||
| BACKEND_SERVICE_HOST | `172.17.173.89` | **`172.17.197.28`** |
|
||||
|
||||
---
|
||||
|
||||
## 六、部署过程中的问题与解决
|
||||
|
||||
本次部署遇到 4 个问题,均已解决:
|
||||
|
||||
### 6.1 前端登录报错:Unexpected token '<' is not valid JSON
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| **现象** | 登录页报 `Unexpected token '<', "<html> <h"... is not valid JSON`,`api/v1/auth/refresh` 返回 504 |
|
||||
| **原因** | 前端 `frontend-nginx-service` 环境变量 `BACKEND_SERVICE_HOST` 未更新为后端新地址,Nginx 代理到旧 IP 超时,返回 HTML 错误页 |
|
||||
| **解决** | 更新 `BACKEND_SERVICE_HOST` 为 `172.17.197.28`,重新部署前端 |
|
||||
|
||||
### 6.2 SSA 上传数据报错:column `ssa_sessions.data_profile` does not exist
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| **现象** | 智能统计分析上传 CSV 后返回 500,`prisma.ssaSession.create()` 失败 |
|
||||
| **原因** | `data_profile` 列是 Phase 2A 通过 `prisma db push` 新增的,drift patch 迁移中遗漏了该列 |
|
||||
| **解决** | 通过 SAE Webshell 执行 `ALTER TABLE ssa_schema.ssa_sessions ADD COLUMN IF NOT EXISTS data_profile JSONB` |
|
||||
|
||||
### 6.3 SSA 分析方案不推送:JSON 配置文件缺失
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| **现象** | 上传数据成功并获得数据报告,但提交分析需求后无分析方案卡片,日志报 `ENOENT: no such file or directory, open '/app/dist/modules/ssa/config/tools_registry.json'` |
|
||||
| **原因** | `tsc` 编译只处理 `.ts` 文件,不会复制 `.json` 配置文件到 `dist/` 目录。SSA 模块依赖 5 个 JSON 配置文件(`tools_registry.json`、`decision_tables.json`、`flow_templates.json`、`intent_rules.json`、`tool_param_constraints.json`) |
|
||||
| **解决** | 修改 Dockerfile 增加 JSON 文件复制步骤,重新构建 v2.2 并部署 |
|
||||
| **长期修复** | Dockerfile 中增加 `COPY src/modules/ssa/config/*.json ./dist/modules/ssa/config/` |
|
||||
|
||||
### 6.4 RVW 上传文件报错:column `review_tasks.context_data` does not exist
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| **现象** | 智能审稿上传 docx 文件后返回 500,`prisma.reviewTask.create()` 失败 |
|
||||
| **原因** | `review_tasks` 表在 0126 部署后通过 `prisma db push` 新增了 8 个列(`selected_agents`、`editorial_score`、`methodology_score`、`methodology_status`、`pico_extract`、`context_data`、`is_archived`、`archived_at`),drift patch 中全部遗漏 |
|
||||
| **解决** | 通过 SAE Webshell 执行 8 条 `ALTER TABLE ADD COLUMN IF NOT EXISTS` 语句补齐 |
|
||||
|
||||
### 6.5 经验教训
|
||||
|
||||
| 教训 | 改进措施 |
|
||||
|------|---------|
|
||||
| `prisma db push` 造成大量 Schema Drift | 开发环境也应使用 `prisma migrate dev` 生成迁移文件 |
|
||||
| `tsc` 不复制非 TS 文件 | Dockerfile 中显式 COPY JSON/YAML 等资源文件 |
|
||||
| SAE 每次部署 IP 会变 | 部署后立即检查所有服务间的 IP 依赖并同步更新 |
|
||||
| drift patch 容易遗漏 | 部署前用脚本对比本地和 RDS 的完整列清单 |
|
||||
|
||||
---
|
||||
|
||||
## 七、CLB 负载均衡器更新
|
||||
|
||||
前端内网地址变更,CLB 后端服务器需同步更新:
|
||||
|
||||
| 配置项 | 旧值 | 新值 |
|
||||
|-------|------|------|
|
||||
| CLB 后端服务器 | `172.17.173.90:80` | **`172.17.197.29:80`** |
|
||||
|
||||
> 如不更新,公网域名 `https://iit.xunzhengyixue.com/` 将无法访问。
|
||||
|
||||
---
|
||||
|
||||
## 八、当前系统配置速查
|
||||
|
||||
### 数据库连接(测试环境)
|
||||
|
||||
```
|
||||
postgresql://airesearch:Xibahe%40fengzhibo117@pgm-2zex1m2y3r23hdn5.pg.rds.aliyuncs.com:5432/ai_clinical_research_test?connection_limit=18&pool_timeout=10
|
||||
```
|
||||
|
||||
### 服务内网地址
|
||||
|
||||
```
|
||||
R统计引擎: http://172.17.173.101:8080 (新增)
|
||||
Python: http://172.17.173.102:8000 (更新)
|
||||
后端: http://172.17.197.28:3001 (更新)
|
||||
前端: http://172.17.197.29:80 (更新)
|
||||
```
|
||||
|
||||
### ACR 镜像版本
|
||||
|
||||
| 仓库 | 版本 |
|
||||
|------|-----|
|
||||
| `ssa-r-statistics` | v1.0.1 |
|
||||
| `python-extraction` | v1.2 |
|
||||
| `backend-service` | v2.2 |
|
||||
| `ai-clinical_frontend-nginx` | v1.8 |
|
||||
|
||||
### 公网访问
|
||||
|
||||
```
|
||||
CLB: http://8.140.53.236/
|
||||
域名: https://iit.xunzhengyixue.com/
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
> **文档版本**:v1.1
|
||||
> **最后更新**:2026-02-27(补充部署问题与解决记录)
|
||||
> **维护人员**:开发团队
|
||||
99
docs/05-部署文档/03-待部署变更清单.md
Normal file
99
docs/05-部署文档/03-待部署变更清单.md
Normal file
@@ -0,0 +1,99 @@
|
||||
# 待部署变更清单
|
||||
|
||||
> **用途**: 开发过程中实时记录所有待部署的变更,下次部署时按此清单逐项执行
|
||||
> **维护规则**: 每次修改 Schema / 新增依赖 / 改配置时,**立即**在此文档追加记录
|
||||
> **Cursor Rule**: `.cursor/rules/deployment-change-tracking.mdc` 会自动提醒
|
||||
> **最后清零**: 2026-02-27(0227 部署完成后清零)
|
||||
|
||||
---
|
||||
|
||||
## 当前待部署变更
|
||||
|
||||
> ⚠️ 下次部署前,逐项检查此清单。部署完成后将已部署项移到「历史」区域并清零。
|
||||
|
||||
### 数据库变更
|
||||
|
||||
| # | 变更内容 | 迁移文件 | 优先级 | 备注 |
|
||||
|---|---------|---------|--------|------|
|
||||
| DB-1 | ssa_workflows 类型精度对齐 + 清理重复 FK | `20260227_align_schema_with_db_types` | 低 | 幂等 SQL,RDS 上执行无副作用 |
|
||||
|
||||
### 后端变更 (Node.js)
|
||||
|
||||
| # | 变更内容 | 涉及文件 | 需要操作 | 备注 |
|
||||
|---|---------|---------|---------|------|
|
||||
| — | *暂无* | | | |
|
||||
|
||||
### 前端变更
|
||||
|
||||
| # | 变更内容 | 涉及文件 | 需要操作 | 备注 |
|
||||
|---|---------|---------|---------|------|
|
||||
| — | *暂无* | | | |
|
||||
|
||||
### Python 微服务变更
|
||||
|
||||
| # | 变更内容 | 涉及文件 | 需要操作 | 备注 |
|
||||
|---|---------|---------|---------|------|
|
||||
| — | *暂无* | | | |
|
||||
|
||||
### R 统计引擎变更
|
||||
|
||||
| # | 变更内容 | 涉及文件 | 需要操作 | 备注 |
|
||||
|---|---------|---------|---------|------|
|
||||
| — | *暂无* | | | |
|
||||
|
||||
### 环境变量 / 配置变更
|
||||
|
||||
| # | 变更内容 | 服务 | 变量名 | 备注 |
|
||||
|---|---------|------|--------|------|
|
||||
| — | *暂无* | | | |
|
||||
|
||||
### 基础设施变更
|
||||
|
||||
| # | 变更内容 | 范围 | 备注 |
|
||||
|---|---------|------|------|
|
||||
| — | *暂无* | | |
|
||||
|
||||
---
|
||||
|
||||
## 记录模板
|
||||
|
||||
开发时发现需要部署的变更,复制下方模板追加到对应区域:
|
||||
|
||||
```markdown
|
||||
<!-- 数据库变更 -->
|
||||
| DB-N | 简述变更 | `迁移文件名` | 高/中/低 | 备注 |
|
||||
|
||||
<!-- 后端变更 -->
|
||||
| BE-N | 简述变更 | `file.ts` | 重新构建镜像 | 备注 |
|
||||
|
||||
<!-- 前端变更 -->
|
||||
| FE-N | 简述变更 | `Component.tsx` | 重新构建镜像 | 备注 |
|
||||
|
||||
<!-- Python 变更 -->
|
||||
| PY-N | 简述变更 | `requirements-prod.txt` | 重新构建镜像 | 备注 |
|
||||
|
||||
<!-- R 变更 -->
|
||||
| R-N | 简述变更 | `tool.R` | 重新构建镜像 | 备注 |
|
||||
|
||||
<!-- 环境变量 -->
|
||||
| ENV-N | 简述变更 | nodejs-backend-test | `VAR_NAME=value` | 备注 |
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 历史(已部署,仅供追溯)
|
||||
|
||||
### 0227 部署已清零项
|
||||
|
||||
| # | 变更内容 | 部署日期 | 结果 |
|
||||
|---|---------|---------|------|
|
||||
| DB | 5 个业务迁移 + 1 个 drift patch | 2026-02-27 | ✅ |
|
||||
| DB | SSA data_profile 列补充 | 2026-02-27 | ✅ 线上热修 |
|
||||
| DB | RVW review_tasks 8 列补充 | 2026-02-27 | ✅ 线上热修 |
|
||||
| BE | Node.js v1.7 → v2.2(SSA/ASL/RVW/IIT 全模块更新) | 2026-02-27 | ✅ |
|
||||
| BE | Dockerfile 增加 JSON 配置文件拷贝 | 2026-02-27 | ✅ |
|
||||
| FE | 前端 v1.3 → v1.8(react-markdown, nginx 配置更新) | 2026-02-27 | ✅ |
|
||||
| PY | Python v1.1 → v1.2(新增 scipy) | 2026-02-27 | ✅ |
|
||||
| R | R 统计引擎 v1.0.1 全新部署 | 2026-02-27 | ✅ |
|
||||
| ENV | nodejs-backend-test: R_STATISTICS_SERVICE_URL 等 | 2026-02-27 | ✅ |
|
||||
| ENV | frontend-nginx-service: BACKEND_SERVICE_HOST 更新 | 2026-02-27 | ✅ |
|
||||
@@ -1,405 +1,70 @@
|
||||
# 🚀 AI临床研究平台 - 部署文档中心
|
||||
# 部署文档中心
|
||||
|
||||
> **最后更新**:2025-12-25
|
||||
> **部署状态**:✅ 完全成功,所有服务运行正常
|
||||
> **公网访问**:http://8.140.53.236/
|
||||
> 版本: v2.0
|
||||
> 更新日期: 2026-02-27
|
||||
> 适用架构: 阿里云 SAE + RDS PostgreSQL + ACR + OSS + CLB
|
||||
|
||||
---
|
||||
|
||||
## 🎯 快速开始(3分钟找到你需要的文档)
|
||||
## 快速导航
|
||||
|
||||
### 我要做什么?
|
||||
|
||||
| 你的目标 | 推荐文档 | 预计时间 |
|
||||
|---------|---------|---------|
|
||||
| 🔥 **日常更新代码(最常用)** | [19-日常更新快速操作手册](./19-日常更新快速操作手册.md) ⭐⭐⭐⭐⭐ | 20-25分钟 |
|
||||
| 🚀 **完整部署系统** | [17-完整部署实战手册-2025版](./17-完整部署实战手册-2025版.md) | 3.5-6小时 |
|
||||
| 🔍 **查询IP/密码等信息** | [00-部署进度总览](./00-部署进度总览.md) | 1分钟 |
|
||||
| 📚 **学习部署原理** | [01-快速部署SOP-零基础版](./01-快速部署SOP-零基础版.md) | 4小时 |
|
||||
| 🐍 **部署Python服务** | [09-Python微服务-SAE部署操作手册](./09-Python微服务-SAE部署操作手册.md) | 35分钟 |
|
||||
| 🟢 **部署Node.js后端** | [12-Node.js后端-SAE部署操作手册](./12-Node.js后端-SAE部署操作手册.md) | 50分钟 |
|
||||
| 🎨 **部署前端Nginx** | [07-前端Nginx-SAE部署操作手册](./07-前端Nginx-SAE部署操作手册.md) | 30分钟 |
|
||||
| ❌ **遇到问题排查** | [15-Node.js后端-部署成功总结](./15-Node.js后端-部署成功总结.md) | 按需 |
|
||||
| 📖 **不知道看哪个文档** | [18-部署文档使用指南](./18-部署文档使用指南.md) | 5分钟 |
|
||||
| 你的目标 | 文档 |
|
||||
|---------|------|
|
||||
| 查看当前线上状态(IP/版本/密码) | [00-阿里云SAE最新真实状态记录](./00-阿里云SAE最新真实状态记录.md) |
|
||||
| 查看下次需要部署什么 | [03-待部署变更清单](./03-待部署变更清单.md) |
|
||||
| 执行日常更新(构建/推送/部署) | [01-日常更新操作手册](./01-日常更新操作手册.md) |
|
||||
| 了解部署架构全貌 | [00-部署架构总览](./00-部署架构总览.md) |
|
||||
| 查看某次具体部署记录 | `0126部署/` 或 `0227部署/` |
|
||||
| 查看历史文档(2025首次部署) | `_archive-2025首次部署/` |
|
||||
|
||||
---
|
||||
|
||||
## 🔥 日常更新操作(高频使用)⭐⭐⭐⭐⭐
|
||||
## 目录结构
|
||||
|
||||
### [19-日常更新快速操作手册.md](./19-日常更新快速操作手册.md)
|
||||
```
|
||||
05-部署文档/
|
||||
├── 00-部署架构总览.md # 架构图、服务拓扑、部署顺序
|
||||
├── 00-阿里云SAE最新真实状态记录.md # ⭐ 核心:实时反映线上真实状态
|
||||
├── 01-日常更新操作手册.md # ⭐ 核心:统一的4服务部署SOP
|
||||
├── 03-待部署变更清单.md # ⭐ 核心:开发中实时记录,部署时逐项检查
|
||||
│
|
||||
├── 0126部署/ # 2026-01-26 部署记录(归档)
|
||||
├── 0227部署/ # 2026-02-27 部署记录(归档)
|
||||
│
|
||||
└── _archive-2025首次部署/ # 2025-12 首次部署的原始文档(25个文件)
|
||||
```
|
||||
|
||||
**⚡ 最常用的文档!适合日常功能更新和快速迭代!**
|
||||
### 核心文档职责
|
||||
|
||||
**为什么推荐**:
|
||||
- ✅ 短小精悍(670行),关键信息密集
|
||||
- ✅ 可直接复制执行的命令
|
||||
- ✅ 包含一键更新脚本
|
||||
- ✅ 适合团队协作和AI助手使用
|
||||
| 文档 | 职责 | 更新频率 |
|
||||
|------|------|---------|
|
||||
| **00-SAE最新真实状态记录** | "线上是什么样" — IP、版本、密码、环境变量 | 每次部署后 |
|
||||
| **01-日常更新操作手册** | "怎么部署" — 4 个服务的构建/推送/部署 SOP | 流程变更时 |
|
||||
| **03-待部署变更清单** | "要部署什么" — 开发中累积的待部署项 | 开发中实时记录 |
|
||||
|
||||
**包含内容**:
|
||||
- **更新Node.js后端**(20-25分钟)- 最常用!
|
||||
```bash
|
||||
编译 → 构建镜像 → 推送ACR → SAE部署 → 验证
|
||||
```
|
||||
- **更新前端Nginx**(15-20分钟)
|
||||
- **更新Python服务**(30分钟)
|
||||
- **修改环境变量**(5分钟)- 高频操作!
|
||||
- **查看日志**(1分钟)
|
||||
- **回滚操作**(7分钟)
|
||||
- **一键更新脚本**(自动化)
|
||||
### 每次部署的流程
|
||||
|
||||
**适合人群**:
|
||||
- 🎯 日常开发迭代的开发人员
|
||||
- 🎯 需要快速部署更新的运维人员
|
||||
- 🎯 团队新成员快速上手
|
||||
- 🎯 AI助手执行部署任务
|
||||
```
|
||||
部署前:
|
||||
1. 打开 03-待部署变更清单.md → 确认本次要部署哪些
|
||||
2. 打开 00-SAE最新真实状态记录.md → 确认当前版本号
|
||||
|
||||
**快速示例**:
|
||||
```bash
|
||||
# 更新Node.js后端到v1.5
|
||||
cd backend
|
||||
npm run build
|
||||
docker build -t backend-service:v1.5 .
|
||||
docker push crpi-xxx.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:v1.5
|
||||
# 然后在SAE控制台部署新版本
|
||||
执行中:
|
||||
3. 按 01-日常更新操作手册.md 逐服务执行
|
||||
|
||||
部署后:
|
||||
4. 更新 00-SAE最新真实状态记录.md(新IP/新版本)
|
||||
5. 清零 03-待部署变更清单.md(已部署项移到历史)
|
||||
6. 创建 MMDD部署/02-部署完成总结.md(记录过程和问题)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ⭐ 核心文档(新手必看)
|
||||
|
||||
### 1️⃣ 完整部署实战手册(强烈推荐)⭐⭐⭐⭐⭐
|
||||
|
||||
**[17-完整部署实战手册-2025版.md](./17-完整部署实战手册-2025版.md)**
|
||||
|
||||
**为什么推荐**:
|
||||
- ✅ 基于2025-12-25实际部署经历编写
|
||||
- ✅ 包含所有遇到的问题及解决方案
|
||||
- ✅ 1800行详细步骤,可直接复制命令
|
||||
- ✅ 跟着做就能成功!
|
||||
|
||||
**包含内容**:
|
||||
- 完整部署流程(VPC→RDS→Python→Node.js→前端→CLB)
|
||||
- 4个关键问题修复(环境变量、config、pino-pretty、ES Module)
|
||||
- 关键经验总结(重启vs部署、环境变量命名等)
|
||||
- 快速命令参考
|
||||
- 完整链路测试
|
||||
|
||||
**适合人群**:
|
||||
- 🎯 要快速部署的人
|
||||
- 🎯 重新部署或迁移的人
|
||||
- 🎯 想了解实际坑点的人
|
||||
|
||||
---
|
||||
|
||||
### 2️⃣ 部署进度总览(日常必备)⭐⭐⭐⭐⭐
|
||||
|
||||
**[00-部署进度总览.md](./00-部署进度总览.md)**
|
||||
|
||||
**为什么推荐**:
|
||||
- ✅ 所有资源信息的索引中心
|
||||
- ✅ 快速查询IP、密码、环境变量
|
||||
- ✅ 文档导航指南
|
||||
- ✅ 部署状态追踪
|
||||
|
||||
**包含内容**:
|
||||
- SAE应用内网IP地址
|
||||
- RDS数据库连接信息
|
||||
- OSS AccessKey
|
||||
- ACR镜像仓库地址
|
||||
- 环境变量配置清单
|
||||
- 快速命令参考
|
||||
|
||||
**适合场景**:
|
||||
- 🔍 忘记IP地址
|
||||
- 🔍 忘记数据库密码
|
||||
- 🔍 需要查询资源配置
|
||||
- 🔍 需要找相关文档
|
||||
|
||||
---
|
||||
|
||||
### 3️⃣ 部署文档使用指南⭐⭐⭐⭐
|
||||
|
||||
**[18-部署文档使用指南.md](./18-部署文档使用指南.md)**
|
||||
|
||||
**为什么推荐**:
|
||||
- ✅ 快速导航,找到需要的文档
|
||||
- ✅ 不同场景的阅读路径
|
||||
- ✅ 关键信息速查表
|
||||
- ✅ 最佳实践建议
|
||||
|
||||
**适合人群**:
|
||||
- 📖 不知道从哪个文档开始看
|
||||
- 📖 想快速找到特定信息
|
||||
- 📖 想了解文档结构
|
||||
|
||||
---
|
||||
|
||||
## 📁 完整文档列表
|
||||
|
||||
### 🎯 核心指南(3个)
|
||||
1. [README.md](./README.md) - 本文档,总入口
|
||||
2. [00-部署进度总览.md](./00-部署进度总览.md) - 资源速查、文档索引
|
||||
3. [18-部署文档使用指南.md](./18-部署文档使用指南.md) - 快速导航
|
||||
|
||||
### 🚀 完整部署(2个)
|
||||
1. [17-完整部署实战手册-2025版.md](./17-完整部署实战手册-2025版.md) - ⭐ 实战版(推荐)
|
||||
2. [01-快速部署SOP-零基础版.md](./01-快速部署SOP-零基础版.md) - 学习版
|
||||
|
||||
### 🔧 服务部署手册(4个)
|
||||
1. [09-Python微服务-SAE部署操作手册.md](./09-Python微服务-SAE部署操作手册.md)
|
||||
2. [12-Node.js后端-SAE部署操作手册.md](./12-Node.js后端-SAE部署操作手册.md)
|
||||
3. [07-前端Nginx-SAE部署操作手册.md](./07-前端Nginx-SAE部署操作手册.md)
|
||||
4. [08-PostgreSQL数据库部署操作手册.md](./08-PostgreSQL数据库部署操作手册.md)
|
||||
|
||||
### 📖 技术详解(4个)
|
||||
1. [04-Python微服务-SAE容器部署指南.md](./04-Python微服务-SAE容器部署指南.md)
|
||||
2. [05-Node.js后端-SAE容器部署指南.md](./05-Node.js后端-SAE容器部署指南.md)
|
||||
3. [06-前端Nginx-SAE容器部署指南.md](./06-前端Nginx-SAE容器部署指南.md)
|
||||
4. [10-Node.js后端-Docker镜像构建手册.md](./10-Node.js后端-Docker镜像构建手册.md)
|
||||
|
||||
### 📝 配置清单(1个)
|
||||
1. [11-Node.js后端-SAE部署配置清单.md](./11-Node.js后端-SAE部署配置清单.md) - 21个环境变量详解
|
||||
|
||||
### 🐛 问题修复(4个)
|
||||
1. [13-Node.js后端-镜像修复记录.md](./13-Node.js后端-镜像修复记录.md) - config目录问题
|
||||
2. [14-Node.js后端-pino-pretty问题修复.md](./14-Node.js后端-pino-pretty问题修复.md) - 日志配置问题
|
||||
3. [15-Node.js后端-部署成功总结.md](./15-Node.js后端-部署成功总结.md) - ⭐ 完整问题汇总
|
||||
4. [16-前端Nginx-部署成功总结.md](./16-前端Nginx-部署成功总结.md) - 前端部署总结
|
||||
|
||||
---
|
||||
|
||||
## 🎉 部署成功证明
|
||||
|
||||
### 当前部署状态(2025-12-25)
|
||||
|
||||
| 服务 | 状态 | 内网地址 | 公网访问 |
|
||||
|------|------|---------|---------|
|
||||
| RDS PostgreSQL | ✅ 运行中 | `pgm-2zex1m2y3r23hdn5.pg.rds.aliyuncs.com:5432` | ❌ |
|
||||
| Python微服务 | ✅ 运行中 | `172.17.173.66:8000` | ❌ |
|
||||
| Node.js后端 | ✅ 运行中 | `172.17.173.73:3001` | ❌ |
|
||||
| 前端Nginx | ✅ 运行中 | `172.17.173.72:80` | ✅ |
|
||||
| CLB负载均衡 | ✅ 运行中 | - | `http://8.140.53.236/` |
|
||||
|
||||
### 功能验证
|
||||
|
||||
- ✅ 前端页面正常访问
|
||||
- ✅ 用户登录功能正常
|
||||
- ✅ 文献筛查模块正常
|
||||
- ✅ 数据清洗工具C的7大功能全部正常
|
||||
- ✅ 文件上传功能正常
|
||||
- ✅ AI对话功能正常
|
||||
- ✅ 数据库连接正常
|
||||
- ✅ Python服务调用正常
|
||||
- ✅ 响应时间 < 1秒
|
||||
|
||||
---
|
||||
|
||||
## ⚠️ 关键经验(必读)
|
||||
|
||||
### 1. 环境变量名必须精确
|
||||
|
||||
**❌ 错误配置**:
|
||||
```bash
|
||||
PYTHON_SERVICE_URL=http://172.17.173.66:8000
|
||||
```
|
||||
|
||||
**✅ 正确配置**:
|
||||
```bash
|
||||
EXTRACTION_SERVICE_URL=http://172.17.173.66:8000
|
||||
```
|
||||
|
||||
**教训**:代码中使用的是 `EXTRACTION_SERVICE_URL`,环境变量名一个字母都不能错!
|
||||
|
||||
---
|
||||
|
||||
### 2. 区分"重启应用"和"部署应用"
|
||||
|
||||
| 操作 | 用途 | IP是否变 | 何时使用 |
|
||||
|------|------|---------|---------|
|
||||
| **重启应用** | 重启容器 | ❌ 不会变 | 修改环境变量、调整配置 |
|
||||
| **部署应用** | 更新镜像 | ✅ 会变更 | 更新代码、更新镜像版本 |
|
||||
|
||||
**教训**:只修改环境变量时,用"重启应用",避免IP变更导致其他服务配置失效!
|
||||
|
||||
---
|
||||
|
||||
### 3. Dockerfile必须包含config目录
|
||||
|
||||
**问题**:
|
||||
```
|
||||
ENOENT: no such file or directory, open '/app/config/agents.yaml'
|
||||
```
|
||||
|
||||
**解决**:
|
||||
```dockerfile
|
||||
# ✅ 必须添加
|
||||
COPY config ./config
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 4. 使用VPC地址拉取镜像(省钱)
|
||||
|
||||
**SAE拉取镜像时**:
|
||||
```bash
|
||||
# ✅ 正确(VPC地址,免流量费)
|
||||
crpi-xxx-vpc.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:v1.3
|
||||
|
||||
# ❌ 不推荐(公网地址,收流量费)
|
||||
crpi-xxx.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:v1.3
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 💡 快速命令参考
|
||||
|
||||
### 登录ACR
|
||||
```bash
|
||||
docker login --username=gofeng117@163.com \
|
||||
--password=fengzhibo117 \
|
||||
crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com
|
||||
```
|
||||
|
||||
### 构建并推送镜像
|
||||
```bash
|
||||
# Node.js后端
|
||||
cd backend
|
||||
npm run build
|
||||
docker build -t backend-service:v1.3 .
|
||||
docker tag backend-service:v1.3 \
|
||||
crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:v1.3
|
||||
docker push crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:v1.3
|
||||
```
|
||||
|
||||
### 健康检查
|
||||
```bash
|
||||
# Python服务
|
||||
curl http://172.17.173.66:8000/api/health
|
||||
|
||||
# Node.js后端
|
||||
curl http://172.17.173.73:3001/health
|
||||
|
||||
# 前端Nginx
|
||||
curl http://172.17.173.72:80/health
|
||||
|
||||
# 公网访问
|
||||
curl http://8.140.53.236/
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 部署架构图
|
||||
|
||||
```
|
||||
用户浏览器
|
||||
↓ HTTP (公网)
|
||||
CLB负载均衡器 (8.140.53.236)
|
||||
↓ HTTP (内网)
|
||||
前端Nginx (172.17.173.72:80)
|
||||
↓ HTTP (内网, /api/v1/)
|
||||
Node.js后端 (172.17.173.73:3001)
|
||||
↓ HTTP (内网, /api/dc/)
|
||||
Python服务 (172.17.173.66:8000)
|
||||
↓ SQL (内网)
|
||||
RDS PostgreSQL (pgm-2zex1m2y3r23hdn5.pg.rds.aliyuncs.com:5432)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🆘 需要帮助?
|
||||
|
||||
### 常见问题
|
||||
|
||||
**Q:我是新手,从哪里开始?**
|
||||
- A:直接看 [17-完整部署实战手册-2025版](./17-完整部署实战手册-2025版.md)
|
||||
|
||||
**Q:只想更新代码,不想全部重新部署?**
|
||||
- A:看对应服务的操作手册(如 [12-Node.js后端-SAE部署操作手册](./12-Node.js后端-SAE部署操作手册.md))
|
||||
|
||||
**Q:遇到报错了怎么办?**
|
||||
- A:先看 [17-完整部署实战手册-2025版](./17-完整部署实战手册-2025版.md) 第9节
|
||||
|
||||
**Q:忘记密码或IP地址了?**
|
||||
- A:查 [00-部署进度总览](./00-部署进度总览.md)
|
||||
|
||||
**Q:不知道看哪个文档?**
|
||||
- A:看 [18-部署文档使用指南](./18-部署文档使用指南.md)
|
||||
|
||||
---
|
||||
|
||||
## 🎯 推荐阅读路径
|
||||
|
||||
### 路径1:首次完整部署(新手)
|
||||
|
||||
```
|
||||
17-完整部署实战手册-2025版.md(主线)
|
||||
↓
|
||||
00-部署进度总览.md(查资源信息)
|
||||
↓
|
||||
15-Node.js后端-部署成功总结.md(遇到问题时)
|
||||
```
|
||||
|
||||
**预计时间**:3.5 - 6小时
|
||||
|
||||
---
|
||||
|
||||
### 路径2:更新某个服务(熟练)
|
||||
|
||||
```
|
||||
对应服务的操作手册(如12-Node.js后端-SAE部署操作手册.md)
|
||||
↓
|
||||
00-部署进度总览.md(查ACR地址)
|
||||
```
|
||||
|
||||
**预计时间**:15 - 30分钟
|
||||
|
||||
---
|
||||
|
||||
### 路径3:修改环境变量
|
||||
|
||||
```
|
||||
11-Node.js后端-SAE部署配置清单.md(确认变量名)
|
||||
↓
|
||||
SAE控制台修改
|
||||
↓
|
||||
重启应用(不是部署应用!)
|
||||
```
|
||||
|
||||
**预计时间**:5分钟
|
||||
|
||||
---
|
||||
|
||||
## 📞 技术支持
|
||||
|
||||
- **开发团队**:内部文档体系
|
||||
- **阿里云工单**:https://workorder.console.aliyun.com/
|
||||
- **紧急问题**:先查文档,99%的问题都有解决方案
|
||||
|
||||
---
|
||||
|
||||
## 🎉 总结
|
||||
|
||||
**恭喜您找到了完整的部署文档!**
|
||||
|
||||
### 3个核心文档记住它们
|
||||
|
||||
1. **本文档(README)** - 总入口,快速导航
|
||||
2. **[17-完整部署实战手册-2025版](./17-完整部署实战手册-2025版.md)** - 部署必看
|
||||
3. **[00-部署进度总览](./00-部署进度总览.md)** - 信息速查
|
||||
|
||||
### 部署成功的3个关键
|
||||
|
||||
1. ✅ 环境变量名必须精确匹配代码
|
||||
2. ✅ 区分"重启应用"和"部署应用"
|
||||
3. ✅ 按顺序部署,每步都要验证
|
||||
|
||||
---
|
||||
|
||||
> **最后更新**:2025-12-25
|
||||
> **部署状态**:✅ 完全成功
|
||||
> **公网访问**:http://8.140.53.236/
|
||||
> **维护人员**:开发团队
|
||||
|
||||
🚀 **开始部署吧!祝您顺利!**
|
||||
|
||||
## 相关文档索引
|
||||
|
||||
| 关注点 | 文档位置 |
|
||||
|--------|---------|
|
||||
| 数据库架构与迁移 | `docs/01-平台基础层/07-数据库/` |
|
||||
| 数据库开发规范 | `docs/04-开发规范/09-数据库开发规范.md` |
|
||||
| 运维监控 | `docs/07-运维文档/` |
|
||||
| 云原生开发规范 | `docs/04-开发规范/08-云原生开发规范.md` |
|
||||
|
||||
Reference in New Issue
Block a user