Major Changes: - Database: Install pg_bigm/pgvector plugins, create test database - Python service: v1.0 -> v1.1, add pymupdf4llm/openpyxl/pypandoc - Node.js backend: v1.3 -> v1.7, fix pino-pretty and ES Module imports - Frontend: v1.2 -> v1.3, skip TypeScript check for deployment - Code recovery: Restore empty files from local backup Technical Fixes: - Fix pino-pretty error in production (conditional loading) - Fix ES Module import paths (add .js extensions) - Fix OSSAdapter TypeScript errors - Update Prisma Schema (63 models, 16 schemas) - Update environment variables (DATABASE_URL, EXTRACTION_SERVICE_URL, OSS) - Remove deprecated variables (REDIS_URL, DIFY_API_URL, DIFY_API_KEY) Documentation: - Create 0126 deployment folder with 8 documents - Update database development standards v2.0 - Update SAE deployment status records Deployment Status: - PostgreSQL: ai_clinical_research_test with plugins - Python: v1.1 @ 172.17.173.84:8000 - Backend: v1.7 @ 172.17.173.89:3001 - Frontend: v1.3 @ 172.17.173.90:80 Tested: All services running successfully on SAE
423 lines
10 KiB
Markdown
423 lines
10 KiB
Markdown
# ⚙️ Node.js后端服务部署方案
|
||
|
||
> **文档版本**:v1.0
|
||
> **创建日期**:2026-01-26
|
||
> **适用范围**:backend Node.js服务
|
||
> **变更类型**:代码更新 + Schema同步 + 环境变量更新
|
||
|
||
---
|
||
|
||
## 📋 一、变更概述
|
||
|
||
### 1.1 变更内容
|
||
|
||
| 变更项 | 描述 | 优先级 |
|
||
|--------|------|--------|
|
||
| **IIT Manager Agent模块** | 完整AI对话、REDCap集成、企业微信推送 | 🔴 高 |
|
||
| **ASL文献筛选模块** | 功能完善和Bug修复 | 🟡 中 |
|
||
| **DC数据清洗模块** | 功能更新 | 🟡 中 |
|
||
| **Prisma Schema更新** | 添加iit_schema | 🔴 高 |
|
||
| **OSS环境变量** | 新增OSS_BUCKET_STATIC等 | 🔴 高 |
|
||
|
||
### 1.2 当前状态
|
||
|
||
```yaml
|
||
服务名称: nodejs-backend-test
|
||
当前版本: v1.3
|
||
镜像大小: 838MB
|
||
内网地址: http://172.17.173.73:3001
|
||
技术栈:
|
||
- Node.js: 22.x
|
||
- Prisma: 6.17.0
|
||
- Fastify: 4.x
|
||
- pg-boss: Postgres队列
|
||
```
|
||
|
||
### 1.3 目标状态
|
||
|
||
```yaml
|
||
目标版本: v1.4
|
||
预计镜像大小: ~850MB
|
||
主要更新:
|
||
- IIT模块完整功能
|
||
- Prisma Schema包含iit_schema
|
||
- OSS环境变量更新
|
||
```
|
||
|
||
---
|
||
|
||
## 🔧 二、Prisma Schema更新
|
||
|
||
### 2.1 修改datasource配置
|
||
|
||
编辑 `backend/prisma/schema.prisma`:
|
||
|
||
```prisma
|
||
datasource db {
|
||
provider = "postgresql"
|
||
url = env("DATABASE_URL")
|
||
schemas = ["platform_schema", "aia_schema", "pkb_schema", "asl_schema", "common_schema", "dc_schema", "rvw_schema", "admin_schema", "ssa_schema", "st_schema", "iit_schema", "public"]
|
||
}
|
||
```
|
||
|
||
**注意**:添加了 `iit_schema` 到schemas数组。
|
||
|
||
### 2.2 验证IIT模块表已存在
|
||
|
||
当前IIT模块的表是通过原生SQL创建的,需要确认表结构:
|
||
|
||
```sql
|
||
-- 检查iit_schema的表
|
||
SELECT table_name FROM information_schema.tables
|
||
WHERE table_schema = 'iit_schema';
|
||
|
||
-- 预期结果:
|
||
-- projects
|
||
-- pending_actions
|
||
-- task_runs
|
||
-- user_mappings
|
||
-- audit_logs
|
||
```
|
||
|
||
### 2.3 执行Prisma操作
|
||
|
||
```bash
|
||
cd backend
|
||
|
||
# 1. 生成Prisma Client(必须)
|
||
npx prisma generate
|
||
|
||
# 2. 验证Schema(可选,查看差异)
|
||
npx prisma db pull --schema=./prisma/schema.prisma
|
||
|
||
# 3. 推送Schema变更(谨慎,可能有破坏性变更)
|
||
# npx prisma db push
|
||
|
||
# 4. 验证
|
||
npx prisma studio
|
||
```
|
||
|
||
---
|
||
|
||
## ⚙️ 三、环境变量更新
|
||
|
||
### 3.1 需要更新的环境变量
|
||
|
||
| 变量名 | 当前值 | 新值 | 说明 |
|
||
|--------|--------|------|------|
|
||
| `OSS_BUCKET` | ai-clinical-research | ai-clinical-data | 数据Bucket |
|
||
| `OSS_BUCKET_STATIC` | (新增) | ai-clinical-static | 静态资源Bucket |
|
||
| `OSS_INTERNAL` | (新增) | true | 使用内网Endpoint |
|
||
|
||
### 3.2 完整环境变量清单(SAE生产)
|
||
|
||
```bash
|
||
# 基础配置
|
||
NODE_ENV=production
|
||
PORT=3001
|
||
|
||
# 数据库
|
||
DATABASE_URL=postgresql://airesearch:Xibahe%40fengzhibo117@pgm-2zex1m2y3r23hdn5.pg.rds.aliyuncs.com:5432/ai_clinical_research?connection_limit=18&pool_timeout=10
|
||
|
||
# Python微服务地址
|
||
EXTRACTION_SERVICE_URL=http://172.17.173.66:8000
|
||
|
||
# OSS配置(更新)
|
||
STORAGE_TYPE=oss
|
||
OSS_REGION=oss-cn-beijing
|
||
OSS_BUCKET=ai-clinical-data
|
||
OSS_BUCKET_STATIC=ai-clinical-static
|
||
OSS_ACCESS_KEY_ID=LTAI5tB2Dt3NdvBL3G7nYGv7
|
||
OSS_ACCESS_KEY_SECRET=1iSN9k39RkApP93QjUhC1DcPIeMG4V
|
||
OSS_INTERNAL=true
|
||
|
||
# JWT密钥
|
||
JWT_SECRET=8a3f9e7c2d1b5a4e6f8c9d0a3b5e7f1c2a4b6c8d0e2f4a6b8c0d2e4f6a8b0c2d4
|
||
JWT_EXPIRES_IN=7d
|
||
|
||
# LLM API Keys
|
||
DEEPSEEK_API_KEY=sk-7f8cc37a79fa4799860b38fc7ba2e150
|
||
DASHSCOPE_API_KEY=sk-75b4ff29a14a49e79667a331034f3298
|
||
|
||
# CloseAI配置
|
||
CLOSEAI_API_KEY=sk-cu0iepbXYGGx2jc7BqP6ogtSWmP6fk918qV3RUdtGC3Ed1po
|
||
CLOSEAI_OPENAI_BASE_URL=https://api.openai-proxy.org/v1
|
||
CLOSEAI_CLAUDE_BASE_URL=https://api.openai-proxy.org/anthropic
|
||
|
||
# Dify配置
|
||
DIFY_API_URL=http://localhost/v1
|
||
DIFY_API_KEY=dataset-mfvdiKvQ213NvxWm7RoYMN3c
|
||
|
||
# Postgres-Only架构
|
||
QUEUE_TYPE=pgboss
|
||
CACHE_TYPE=postgres
|
||
|
||
# 企业微信配置
|
||
WECHAT_CORP_ID=ww6ab493470ab4f377
|
||
WECHAT_AGENT_ID=1000002
|
||
WECHAT_CORP_SECRET=AZIVxMtoLb0rEszXS81e4dBRl-I9kgTjygIS0cFfENU
|
||
WECHAT_TOKEN=oXlRBm1YnvMy2SbDLbvAdDd5Gq3oBGq
|
||
WECHAT_ENCODING_AES_KEY=v88eT3O9bMW897h4btr7v7qvQImlMf31edTQCmuhOhO
|
||
```
|
||
|
||
---
|
||
|
||
## 🚀 四、构建与部署步骤
|
||
|
||
### Step 1:更新Prisma Schema
|
||
|
||
```bash
|
||
cd D:\MyCursor\AIclinicalresearch\backend
|
||
|
||
# 编辑prisma/schema.prisma
|
||
# 1. 在schemas数组中添加 "iit_schema"
|
||
# 2. 确保IIT模块的模型定义存在
|
||
```
|
||
|
||
### Step 2:生成Prisma Client
|
||
|
||
```bash
|
||
npx prisma generate
|
||
|
||
# 预期输出:
|
||
# ✔ Generated Prisma Client
|
||
```
|
||
|
||
### Step 3:编译TypeScript
|
||
|
||
```bash
|
||
npm run build
|
||
|
||
# 验证编译结果
|
||
dir dist
|
||
# 应该看到:index.js, common/, modules/ 等
|
||
```
|
||
|
||
### Step 4:构建Docker镜像
|
||
|
||
```powershell
|
||
docker build -t backend-service:v1.4 .
|
||
|
||
# 预计时间:5分钟
|
||
# 预计大小:约850MB
|
||
```
|
||
|
||
### Step 5:本地验证镜像(可选)
|
||
|
||
```powershell
|
||
# 设置环境变量文件进行本地测试
|
||
docker run --rm -p 3001:3001 `
|
||
-e NODE_ENV=production `
|
||
-e PORT=3001 `
|
||
-e DATABASE_URL="postgresql://..." `
|
||
backend-service:v1.4
|
||
```
|
||
|
||
### Step 6:登录ACR
|
||
|
||
```powershell
|
||
docker login --username=gofeng117@163.com `
|
||
--password=fengzhibo117 `
|
||
crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com
|
||
```
|
||
|
||
### Step 7:打标签
|
||
|
||
```powershell
|
||
docker tag backend-service:v1.4 `
|
||
crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:v1.4
|
||
```
|
||
|
||
### Step 8:推送到ACR
|
||
|
||
```powershell
|
||
docker push `
|
||
crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:v1.4
|
||
|
||
# 预计时间:10分钟(镜像约850MB)
|
||
# 成功标志:看到 "digest: sha256:..."
|
||
```
|
||
|
||
### Step 9:更新SAE环境变量
|
||
|
||
1. 登录SAE:https://sae.console.aliyun.com/
|
||
2. 进入应用:`nodejs-backend-test`
|
||
3. 点击【应用配置】→【环境变量】
|
||
4. 添加/修改以下变量:
|
||
```
|
||
OSS_BUCKET=ai-clinical-data
|
||
OSS_BUCKET_STATIC=ai-clinical-static
|
||
OSS_INTERNAL=true
|
||
```
|
||
5. 点击【保存】
|
||
|
||
### Step 10:SAE部署新版本
|
||
|
||
1. 点击【部署应用】
|
||
2. 配置:
|
||
- **镜像地址**:选择 `backend-service`
|
||
- **镜像版本**:选择 `v1.4`
|
||
3. 点击【确认】
|
||
4. 等待部署完成(约5-8分钟)
|
||
|
||
### Step 11:验证部署
|
||
|
||
```bash
|
||
# 健康检查
|
||
curl http://172.17.173.73:3001/health
|
||
|
||
# 通过公网测试
|
||
curl http://8.140.53.236/api/v1/health
|
||
|
||
# 查看日志
|
||
# SAE控制台 → 日志查询
|
||
# 应该看到:"🚀 AI临床研究平台 - 后端服务器启动成功!"
|
||
```
|
||
|
||
---
|
||
|
||
## 📋 五、一键部署脚本
|
||
|
||
### PowerShell脚本
|
||
|
||
`backend/update-and-deploy.ps1`:
|
||
|
||
```powershell
|
||
# Node.js后端一键更新脚本
|
||
# 使用方法: .\update-and-deploy.ps1 v1.4
|
||
|
||
param(
|
||
[Parameter(Mandatory=$true)]
|
||
[string]$Version
|
||
)
|
||
|
||
$ErrorActionPreference = "Stop"
|
||
|
||
Write-Host "========================================" -ForegroundColor Green
|
||
Write-Host "开始更新Node.js后端到版本: $Version" -ForegroundColor Green
|
||
Write-Host "========================================" -ForegroundColor Green
|
||
|
||
# 1. 生成Prisma Client
|
||
Write-Host "`n[1/5] 生成Prisma Client..." -ForegroundColor Cyan
|
||
npx prisma generate
|
||
if ($LASTEXITCODE -ne 0) {
|
||
Write-Host "❌ Prisma生成失败!" -ForegroundColor Red
|
||
exit 1
|
||
}
|
||
Write-Host "✅ Prisma Client生成成功!" -ForegroundColor Green
|
||
|
||
# 2. 编译TypeScript
|
||
Write-Host "`n[2/5] 编译TypeScript..." -ForegroundColor Cyan
|
||
npm run build
|
||
if ($LASTEXITCODE -ne 0) {
|
||
Write-Host "❌ 编译失败!" -ForegroundColor Red
|
||
exit 1
|
||
}
|
||
Write-Host "✅ 编译成功!" -ForegroundColor Green
|
||
|
||
# 3. 构建Docker镜像
|
||
Write-Host "`n[3/5] 构建Docker镜像..." -ForegroundColor Cyan
|
||
docker build -t backend-service:$Version .
|
||
if ($LASTEXITCODE -ne 0) {
|
||
Write-Host "❌ 构建失败!" -ForegroundColor Red
|
||
exit 1
|
||
}
|
||
Write-Host "✅ 镜像构建成功!" -ForegroundColor Green
|
||
|
||
# 4. 打标签
|
||
Write-Host "`n[4/5] 打标签..." -ForegroundColor Cyan
|
||
$ImageUrl = "crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:$Version"
|
||
docker tag backend-service:$Version $ImageUrl
|
||
Write-Host "✅ 标签已打!" -ForegroundColor Green
|
||
|
||
# 5. 推送到ACR
|
||
Write-Host "`n[5/5] 推送到ACR..." -ForegroundColor Cyan
|
||
Write-Host "推送地址: $ImageUrl" -ForegroundColor Yellow
|
||
docker push $ImageUrl
|
||
if ($LASTEXITCODE -ne 0) {
|
||
Write-Host "❌ 推送失败!" -ForegroundColor Red
|
||
exit 1
|
||
}
|
||
|
||
Write-Host "`n========================================" -ForegroundColor Green
|
||
Write-Host "✅ 镜像已推送成功!" -ForegroundColor Green
|
||
Write-Host "========================================" -ForegroundColor Green
|
||
Write-Host "`n下一步操作:" -ForegroundColor Yellow
|
||
Write-Host "1. 登录SAE控制台: https://sae.console.aliyun.com/" -ForegroundColor Yellow
|
||
Write-Host "2. 进入应用: nodejs-backend-test" -ForegroundColor Yellow
|
||
Write-Host "3. 【重要】先更新环境变量(如有变化)" -ForegroundColor Red
|
||
Write-Host "4. 点击【部署应用】" -ForegroundColor Yellow
|
||
Write-Host "5. 选择镜像版本: $Version" -ForegroundColor Yellow
|
||
Write-Host "6. 确认部署" -ForegroundColor Yellow
|
||
Write-Host "`n镜像地址(VPC):" -ForegroundColor Cyan
|
||
Write-Host "crpi-cd5ij4pjt65mweeo-vpc.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:$Version" -ForegroundColor Cyan
|
||
```
|
||
|
||
---
|
||
|
||
## ⚠️ 六、注意事项
|
||
|
||
### 6.1 部署前检查
|
||
|
||
- [ ] Prisma Schema已更新(包含iit_schema)
|
||
- [ ] `npx prisma generate` 成功
|
||
- [ ] `npm run build` 无错误
|
||
- [ ] 环境变量已确认
|
||
|
||
### 6.2 部署后检查
|
||
|
||
- [ ] 健康检查通过
|
||
- [ ] IIT模块API可访问
|
||
- [ ] ASL模块功能正常
|
||
- [ ] OSS上传下载正常
|
||
|
||
### 6.3 可能的问题
|
||
|
||
1. **IP地址变更**:
|
||
- SAE部署后内网IP可能变化
|
||
- 需要更新前端Nginx的环境变量
|
||
|
||
2. **数据库连接**:
|
||
- 确保DATABASE_URL正确
|
||
- 检查connection_limit设置
|
||
|
||
3. **Prisma迁移冲突**:
|
||
- 如果Schema不匹配,可能需要手动调整
|
||
|
||
---
|
||
|
||
## 🔄 七、回滚方案
|
||
|
||
如果v1.4出现问题,回滚到v1.3:
|
||
|
||
1. 登录SAE控制台
|
||
2. 进入应用:`nodejs-backend-test`
|
||
3. 点击【部署应用】
|
||
4. 选择镜像版本:`v1.3`
|
||
5. 确认部署
|
||
|
||
---
|
||
|
||
## 📊 八、时间估算
|
||
|
||
| 步骤 | 预计时间 |
|
||
|------|---------|
|
||
| 更新Prisma Schema | 5分钟 |
|
||
| 生成Prisma Client | 2分钟 |
|
||
| 编译TypeScript | 5分钟 |
|
||
| 构建Docker镜像 | 5分钟 |
|
||
| 推送到ACR | 10分钟 |
|
||
| 更新SAE环境变量 | 5分钟 |
|
||
| SAE部署 | 10分钟 |
|
||
| 验证测试 | 10分钟 |
|
||
| **总计** | **52分钟** |
|
||
|
||
---
|
||
|
||
> **最后更新**:2026-01-26
|
||
> **维护人员**:开发团队
|
||
|
||
|
||
|
||
|