deploy: Complete 0126-27 deployment - database upgrade, services update, code recovery

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
This commit is contained in:
2026-01-27 08:13:27 +08:00
parent 01a17f1e6f
commit 2481b786d8
318 changed files with 5290 additions and 3216 deletions

View File

@@ -0,0 +1,247 @@
# ================================================
# AI临床研究平台 - 数据库迁移脚本
# 日期: 2026-01-26
# 功能:
# 1. RDS数据库重命名 (ai_clinical_research -> ai_clinical_research_test)
# 2. 安装pg_bigm和pgvector插件
# 3. 本地数据库导出
# 4. 导入到RDS测试数据库
# ================================================
Write-Host "========================================" -ForegroundColor Green
Write-Host " AI临床研究平台 - 数据库迁移脚本" -ForegroundColor Green
Write-Host " 执行时间: $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')" -ForegroundColor Green
Write-Host "========================================" -ForegroundColor Green
# ============ 配置区域 ============
$RDS_HOST_EXTERNAL = "pgm-2zex1m2y3r23hdn5ko.pg.rds.aliyuncs.com" # RDS外网地址需要先开启
$RDS_HOST_INTERNAL = "pgm-2zex1m2y3r23hdn5.pg.rds.aliyuncs.com" # RDS内网地址
$RDS_PORT = "5432"
$RDS_USER = "airesearch"
$RDS_PASSWORD = "Xibahe@fengzhibo117"
$OLD_DB_NAME = "ai_clinical_research"
$NEW_DB_NAME = "ai_clinical_research_test"
$LOCAL_CONTAINER = "ai-clinical-postgres"
$LOCAL_USER = "postgres"
$LOCAL_DB = "ai_clinical_research"
$BACKUP_FILE = "local_db_export_$(Get-Date -Format 'yyyyMMdd_HHmmss').sql"
# ============ Step 0: 前置检查 ============
Write-Host "`n[Step 0] 前置检查..." -ForegroundColor Cyan
# 检查Docker容器
$containerStatus = docker ps --filter "name=$LOCAL_CONTAINER" --format "{{.Status}}"
if (-not $containerStatus) {
Write-Host "❌ 本地Docker容器 $LOCAL_CONTAINER 未运行!" -ForegroundColor Red
exit 1
}
Write-Host "✅ 本地Docker容器运行中: $containerStatus" -ForegroundColor Green
# ============ Step 1: 导出本地数据库 ============
Write-Host "`n[Step 1] 导出本地数据库..." -ForegroundColor Cyan
Write-Host " 文件: $BACKUP_FILE" -ForegroundColor Yellow
docker exec $LOCAL_CONTAINER pg_dump `
-U $LOCAL_USER `
-d $LOCAL_DB `
--format=plain `
--no-owner `
--no-acl `
--encoding=UTF8 `
> $BACKUP_FILE
if ($LASTEXITCODE -ne 0) {
Write-Host "❌ 数据库导出失败!" -ForegroundColor Red
exit 1
}
$fileSize = (Get-Item $BACKUP_FILE).Length / 1MB
Write-Host "✅ 数据库导出成功!文件大小: $([math]::Round($fileSize, 2)) MB" -ForegroundColor Green
# ============ Step 2: 连接RDS并重命名数据库 ============
Write-Host "`n[Step 2] 连接RDS并重命名数据库..." -ForegroundColor Cyan
Write-Host " 注意: 需要先在阿里云控制台开启RDS外网访问" -ForegroundColor Yellow
Write-Host " 外网地址: $RDS_HOST_EXTERNAL" -ForegroundColor Yellow
$env:PGPASSWORD = $RDS_PASSWORD
# 2.1 检查RDS连接
Write-Host "`n 2.1 测试RDS连接..." -ForegroundColor Yellow
$testResult = docker exec -e PGPASSWORD=$RDS_PASSWORD $LOCAL_CONTAINER psql `
-h $RDS_HOST_EXTERNAL `
-p $RDS_PORT `
-U $RDS_USER `
-d postgres `
-c "SELECT version();" 2>&1
if ($LASTEXITCODE -ne 0) {
Write-Host "❌ 无法连接RDS请确保" -ForegroundColor Red
Write-Host " 1. RDS外网地址已开启" -ForegroundColor Red
Write-Host " 2. 白名单已配置 0.0.0.0/0临时" -ForegroundColor Red
Write-Host " 错误信息: $testResult" -ForegroundColor Red
exit 1
}
Write-Host "✅ RDS连接成功" -ForegroundColor Green
# 2.2 检查旧数据库是否存在
Write-Host "`n 2.2 检查数据库 $OLD_DB_NAME 是否存在..." -ForegroundColor Yellow
$dbExists = docker exec -e PGPASSWORD=$RDS_PASSWORD $LOCAL_CONTAINER psql `
-h $RDS_HOST_EXTERNAL `
-p $RDS_PORT `
-U $RDS_USER `
-d postgres `
-t -c "SELECT 1 FROM pg_database WHERE datname = '$OLD_DB_NAME';"
if ($dbExists.Trim() -eq "1") {
Write-Host "✅ 数据库 $OLD_DB_NAME 存在,准备重命名..." -ForegroundColor Green
# 2.3 断开所有连接
Write-Host "`n 2.3 断开所有活动连接..." -ForegroundColor Yellow
docker exec -e PGPASSWORD=$RDS_PASSWORD $LOCAL_CONTAINER psql `
-h $RDS_HOST_EXTERNAL `
-p $RDS_PORT `
-U $RDS_USER `
-d postgres `
-c "SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = '$OLD_DB_NAME' AND pid <> pg_backend_pid();"
# 2.4 重命名数据库
Write-Host "`n 2.4 重命名数据库 $OLD_DB_NAME -> $NEW_DB_NAME ..." -ForegroundColor Yellow
docker exec -e PGPASSWORD=$RDS_PASSWORD $LOCAL_CONTAINER psql `
-h $RDS_HOST_EXTERNAL `
-p $RDS_PORT `
-U $RDS_USER `
-d postgres `
-c "ALTER DATABASE $OLD_DB_NAME RENAME TO $NEW_DB_NAME;"
if ($LASTEXITCODE -eq 0) {
Write-Host "✅ 数据库重命名成功!" -ForegroundColor Green
} else {
Write-Host "❌ 数据库重命名失败!" -ForegroundColor Red
exit 1
}
} else {
Write-Host "⚠️ 数据库 $OLD_DB_NAME 不存在,将直接创建 $NEW_DB_NAME" -ForegroundColor Yellow
}
# ============ Step 3: 创建/重建测试数据库 ============
Write-Host "`n[Step 3] 准备测试数据库 $NEW_DB_NAME ..." -ForegroundColor Cyan
# 3.1 检查测试数据库是否存在
$testDbExists = docker exec -e PGPASSWORD=$RDS_PASSWORD $LOCAL_CONTAINER psql `
-h $RDS_HOST_EXTERNAL `
-p $RDS_PORT `
-U $RDS_USER `
-d postgres `
-t -c "SELECT 1 FROM pg_database WHERE datname = '$NEW_DB_NAME';"
if ($testDbExists.Trim() -eq "1") {
Write-Host " 数据库 $NEW_DB_NAME 已存在" -ForegroundColor Yellow
# 询问是否清空重建
$confirm = Read-Host " 是否删除现有数据并重新导入? (y/n)"
if ($confirm -eq "y") {
Write-Host " 断开连接并删除数据库..." -ForegroundColor Yellow
docker exec -e PGPASSWORD=$RDS_PASSWORD $LOCAL_CONTAINER psql `
-h $RDS_HOST_EXTERNAL -p $RDS_PORT -U $RDS_USER -d postgres `
-c "SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = '$NEW_DB_NAME';"
docker exec -e PGPASSWORD=$RDS_PASSWORD $LOCAL_CONTAINER psql `
-h $RDS_HOST_EXTERNAL -p $RDS_PORT -U $RDS_USER -d postgres `
-c "DROP DATABASE $NEW_DB_NAME;"
# 重新创建
Write-Host " 创建数据库 $NEW_DB_NAME ..." -ForegroundColor Yellow
docker exec -e PGPASSWORD=$RDS_PASSWORD $LOCAL_CONTAINER psql `
-h $RDS_HOST_EXTERNAL -p $RDS_PORT -U $RDS_USER -d postgres `
-c "CREATE DATABASE $NEW_DB_NAME WITH ENCODING='UTF8' LC_COLLATE='en_US.utf8' LC_CTYPE='en_US.utf8' TEMPLATE=template0;"
}
} else {
Write-Host " 创建数据库 $NEW_DB_NAME ..." -ForegroundColor Yellow
docker exec -e PGPASSWORD=$RDS_PASSWORD $LOCAL_CONTAINER psql `
-h $RDS_HOST_EXTERNAL -p $RDS_PORT -U $RDS_USER -d postgres `
-c "CREATE DATABASE $NEW_DB_NAME WITH ENCODING='UTF8' LC_COLLATE='en_US.utf8' LC_CTYPE='en_US.utf8' TEMPLATE=template0;"
}
Write-Host "✅ 测试数据库准备完成!" -ForegroundColor Green
# ============ Step 4: 安装PostgreSQL插件 ============
Write-Host "`n[Step 4] 安装PostgreSQL插件..." -ForegroundColor Cyan
# 4.1 安装pg_bigm
Write-Host " 4.1 安装 pg_bigm 插件..." -ForegroundColor Yellow
docker exec -e PGPASSWORD=$RDS_PASSWORD $LOCAL_CONTAINER psql `
-h $RDS_HOST_EXTERNAL -p $RDS_PORT -U $RDS_USER -d $NEW_DB_NAME `
-c "CREATE EXTENSION IF NOT EXISTS pg_bigm;"
# 4.2 安装pgvector
Write-Host " 4.2 安装 pgvector 插件..." -ForegroundColor Yellow
docker exec -e PGPASSWORD=$RDS_PASSWORD $LOCAL_CONTAINER psql `
-h $RDS_HOST_EXTERNAL -p $RDS_PORT -U $RDS_USER -d $NEW_DB_NAME `
-c "CREATE EXTENSION IF NOT EXISTS vector;"
# 4.3 验证插件安装
Write-Host "`n 4.3 验证插件安装..." -ForegroundColor Yellow
docker exec -e PGPASSWORD=$RDS_PASSWORD $LOCAL_CONTAINER psql `
-h $RDS_HOST_EXTERNAL -p $RDS_PORT -U $RDS_USER -d $NEW_DB_NAME `
-c "SELECT extname, extversion FROM pg_extension WHERE extname IN ('pg_bigm', 'vector');"
Write-Host "✅ 插件安装完成!" -ForegroundColor Green
# ============ Step 5: 导入数据到RDS ============
Write-Host "`n[Step 5] 导入数据到RDS测试数据库..." -ForegroundColor Cyan
Write-Host " 这可能需要几分钟,请耐心等待..." -ForegroundColor Yellow
Get-Content $BACKUP_FILE | docker exec -i -e PGPASSWORD=$RDS_PASSWORD $LOCAL_CONTAINER psql `
-h $RDS_HOST_EXTERNAL `
-p $RDS_PORT `
-U $RDS_USER `
-d $NEW_DB_NAME
if ($LASTEXITCODE -eq 0) {
Write-Host "✅ 数据导入成功!" -ForegroundColor Green
} else {
Write-Host "⚠️ 数据导入过程中可能有警告,请检查日志" -ForegroundColor Yellow
}
# ============ Step 6: 验证导入结果 ============
Write-Host "`n[Step 6] 验证导入结果..." -ForegroundColor Cyan
# 6.1 检查Schema数量
Write-Host " 6.1 检查Schema列表..." -ForegroundColor Yellow
docker exec -e PGPASSWORD=$RDS_PASSWORD $LOCAL_CONTAINER psql `
-h $RDS_HOST_EXTERNAL -p $RDS_PORT -U $RDS_USER -d $NEW_DB_NAME `
-c "SELECT nspname FROM pg_namespace WHERE nspname LIKE '%_schema' ORDER BY nspname;"
# 6.2 检查表数量
Write-Host "`n 6.2 检查各Schema表数量..." -ForegroundColor Yellow
docker exec -e PGPASSWORD=$RDS_PASSWORD $LOCAL_CONTAINER psql `
-h $RDS_HOST_EXTERNAL -p $RDS_PORT -U $RDS_USER -d $NEW_DB_NAME `
-c "SELECT schemaname, COUNT(*) as table_count FROM pg_tables WHERE schemaname NOT IN ('pg_catalog', 'information_schema') GROUP BY schemaname ORDER BY schemaname;"
# 6.3 检查iit_schema的表
Write-Host "`n 6.3 检查 iit_schema 的表..." -ForegroundColor Yellow
docker exec -e PGPASSWORD=$RDS_PASSWORD $LOCAL_CONTAINER psql `
-h $RDS_HOST_EXTERNAL -p $RDS_PORT -U $RDS_USER -d $NEW_DB_NAME `
-c "SELECT tablename FROM pg_tables WHERE schemaname = 'iit_schema';"
# ============ Step 7: 提醒关闭外网访问 ============
Write-Host "`n========================================" -ForegroundColor Red
Write-Host " ⚠️ 重要安全提醒 ⚠️" -ForegroundColor Red
Write-Host "========================================" -ForegroundColor Red
Write-Host "数据库迁移完成!" -ForegroundColor Green
Write-Host ""
Write-Host "请立即执行以下安全操作:" -ForegroundColor Yellow
Write-Host "1. 登录阿里云RDS控制台" -ForegroundColor Yellow
Write-Host "2. 释放RDS外网地址" -ForegroundColor Yellow
Write-Host "3. 恢复白名单为 172.17.0.0/16移除 0.0.0.0/0" -ForegroundColor Yellow
Write-Host ""
Write-Host "新的测试数据库连接字符串(内网):" -ForegroundColor Cyan
Write-Host "DATABASE_URL=postgresql://${RDS_USER}:Xibahe%40fengzhibo117@${RDS_HOST_INTERNAL}:5432/${NEW_DB_NAME}?connection_limit=18&pool_timeout=10" -ForegroundColor Cyan
Write-Host ""
Write-Host "备份文件: $BACKUP_FILE" -ForegroundColor Yellow
Write-Host "========================================" -ForegroundColor Green