docs(deploy): Update deployment documentation for Node.js backend
Summary: - Created Node.js backend Docker image build guide - Updated deployment progress overview with backend status - Updated system status documentation Backend build achievements: - Fixed 200+ TypeScript compilation errors (200+ to 0) - Completed Prisma reverse sync (32 models from RDS) - Manually added 30+ Prisma relation fields - Successfully built Docker image (838MB) - Pushed image to ACR (v1.0 + latest tags) Documentation updates: - Added 10-Node.js后端-Docker镜像构建手册.md - Updated 00-部署进度总览.md with backend deployment status - Updated 00-系统当前状态与开发指南.md with latest progress - Fixed date format (2024 -> 2025) Next steps: - Deploy Node.js backend to SAE - Configure environment variables - Test end-to-end functionality Status: Backend Docker image ready for SAE deployment
This commit is contained in:
@@ -246,5 +246,6 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -41,5 +41,6 @@ WHERE table_schema = 'dc_schema'
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -81,3 +81,4 @@ ORDER BY ordinal_position;
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -94,3 +94,4 @@ runMigration()
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -26,5 +26,6 @@ COMMENT ON COLUMN "dc_schema"."dc_tool_c_sessions"."column_mapping" IS '列名
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -53,5 +53,6 @@ COMMENT ON COLUMN dc_schema.dc_tool_c_sessions.expires_at IS '过期时间(创
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -203,5 +203,6 @@ function extractCodeBlocks(obj, blocks = []) {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -222,5 +222,6 @@ checkDCTables();
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -174,5 +174,6 @@ createAiHistoryTable()
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -161,5 +161,6 @@ createToolCTable()
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -158,5 +158,6 @@ createToolCTable()
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -292,3 +292,4 @@ export function getBatchItems<T>(
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -326,5 +326,6 @@ runTests().catch((error) => {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -267,5 +267,6 @@ runTest()
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -305,5 +305,6 @@ Content-Type: application/json
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -241,5 +241,6 @@ export const conflictDetectionService = new ConflictDetectionService();
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -191,5 +191,6 @@ curl -X POST http://localhost:3000/api/v1/dc/tool-c/test/execute \
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -245,5 +245,6 @@ export const streamAIController = new StreamAIController();
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -393,3 +393,4 @@ SET session_replication_role = 'origin';
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -95,3 +95,4 @@ WHERE key = 'verify_test';
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -238,3 +238,4 @@ verifyDatabase()
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
1
backend/src/types/global.d.ts
vendored
1
backend/src/types/global.d.ts
vendored
@@ -28,3 +28,4 @@ export {}
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -49,5 +49,6 @@ Write-Host "✅ 完成!" -ForegroundColor Green
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -336,5 +336,6 @@ runAdvancedTests().catch(error => {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -402,5 +402,6 @@ runAllTests()
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -360,5 +360,6 @@ runAllTests()
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -146,3 +146,4 @@ Set-Location ..
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
# AIclinicalresearch 系统当前状态与开发指南
|
# AIclinicalresearch 系统当前状态与开发指南
|
||||||
|
|
||||||
> **文档版本:** v2.1
|
> **文档版本:** v2.2
|
||||||
> **创建日期:** 2025-11-28
|
> **创建日期:** 2025-11-28
|
||||||
> **维护者:** 开发团队
|
> **维护者:** 开发团队
|
||||||
> **最后更新:** 2024-12-24
|
> **最后更新:** 2025-12-24
|
||||||
> **重大进展:** 🚀 **阿里云生产环境部署启动** - PostgreSQL数据迁移完成、前端Nginx与Python微服务镜像已推送ACR
|
> **重大进展:** 🚀 **后端核心服务镜像构建完成** - Node.js后端镜像已推送ACR(修复200+TS错误,补全30+Prisma关系)
|
||||||
> **文档目的:** 快速了解系统当前状态,为新AI助手提供上下文
|
> **文档目的:** 快速了解系统当前状态,为新AI助手提供上下文
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -97,14 +97,16 @@
|
|||||||
- 10个Schema隔离(platform/aia/pkb/asl/dc/ssa/st/rvw/admin/common)
|
- 10个Schema隔离(platform/aia/pkb/asl/dc/ssa/st/rvw/admin/common)
|
||||||
|
|
||||||
**云原生部署**:
|
**云原生部署**:
|
||||||
- 阿里云 SAE (Serverless 应用引擎)
|
- 阿里云 SAE (Serverless 应用引擎) ✅ 已部署Python微服务
|
||||||
|
- 阿里云 ACR (容器镜像服务) ✅ 已推送3个镜像(Frontend、Backend、Python)
|
||||||
|
- 阿里云 RDS (PostgreSQL 15) ✅ 已迁移数据
|
||||||
- RDS PostgreSQL 15 + OSS (对象存储) + NAT网关
|
- RDS PostgreSQL 15 + OSS (对象存储) + NAT网关
|
||||||
- ACR (容器镜像服务 - 个人版免费)
|
- ACR (容器镜像服务 - 个人版免费)
|
||||||
- **部署状态**:🚀 **进行中**(PostgreSQL✅、Python微服务✅、前端镜像✅、Node.js后端⏳)
|
- **部署状态**:🚀 **进行中**(PostgreSQL✅、Python微服务✅、前端镜像✅、Node.js后端⏳)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 🚀 当前开发状态(2024-12-24)
|
## 🚀 当前开发状态(2025-12-24)
|
||||||
|
|
||||||
### ✅ 已完成模块
|
### ✅ 已完成模块
|
||||||
|
|
||||||
@@ -256,7 +258,7 @@
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 🚀 阿里云生产环境部署状态(2024-12-24)
|
## 🚀 阿里云生产环境部署状态(2025-12-24)
|
||||||
|
|
||||||
### ✅ 已完成部署
|
### ✅ 已完成部署
|
||||||
|
|
||||||
@@ -276,7 +278,7 @@
|
|||||||
- **数据迁移**: ✅ 完成(90MB SQL文件,约12秒导入)
|
- **数据迁移**: ✅ 完成(90MB SQL文件,约12秒导入)
|
||||||
- **Schema验证**: ✅ 11个Schema全部迁移成功
|
- **Schema验证**: ✅ 11个Schema全部迁移成功
|
||||||
- **数据验证**: ✅ 用户3条、项目2条、文献1204条
|
- **数据验证**: ✅ 用户3条、项目2条、文献1204条
|
||||||
- **部署时间**: 2024-12-24
|
- **部署时间**: 2025-12-24
|
||||||
|
|
||||||
- ✅ **OSS对象存储**
|
- ✅ **OSS对象存储**
|
||||||
- Bucket: `ai-clinical-research`
|
- Bucket: `ai-clinical-research`
|
||||||
@@ -290,23 +292,37 @@
|
|||||||
- ✅ **Registry**: `crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com`
|
- ✅ **Registry**: `crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com`
|
||||||
- ✅ **已推送镜像**:
|
- ✅ **已推送镜像**:
|
||||||
- **前端Nginx**: `ai-clinical_frontend-nginx:v1.0`(约50MB)
|
- **前端Nginx**: `ai-clinical_frontend-nginx:v1.0`(约50MB)
|
||||||
- 构建时间: 2024-12-24
|
- 构建时间: 2025-12-24
|
||||||
- 基础镜像: `nginx:alpine`
|
- 基础镜像: `nginx:alpine`
|
||||||
- 功能: React SPA + Nginx反向代理 + 动态环境变量
|
- 功能: React SPA + Nginx反向代理 + 动态环境变量
|
||||||
- 配置文件: `frontend-v2/Dockerfile`, `nginx.conf`, `.dockerignore`
|
- 配置文件: `frontend-v2/Dockerfile`, `nginx.conf`, `.dockerignore`
|
||||||
|
|
||||||
- **Python微服务**: `python-extraction:v1.0`(1.12GB)
|
- **Python微服务**: `python-extraction:v1.0`(1.12GB)
|
||||||
- 构建时间: 2024-12-24
|
- 构建时间: 2025-12-24
|
||||||
- 基础镜像: `python:3-slim`
|
- 基础镜像: `python:3-slim`
|
||||||
- 功能: PDF提取(PyMuPDF)+ 数据清洗(pandas/numpy/polars)
|
- 功能: PDF提取(PyMuPDF)+ 数据清洗(pandas/numpy/polars)
|
||||||
- 特性: 移除Nougat(减小1.5GB)、使用阿里云Debian源
|
- 特性: 移除Nougat(减小1.5GB)、使用阿里云Debian源
|
||||||
- 配置文件: `extraction_service/Dockerfile`, `requirements-prod.txt`, `.dockerignore`
|
- 配置文件: `extraction_service/Dockerfile`, `requirements-prod.txt`, `.dockerignore`
|
||||||
|
|
||||||
|
- **Node.js后端**: `backend-service:v1.0`(838MB,压缩后~186MB)✨ 新增!
|
||||||
|
- 构建时间: 2025-12-24(约5分钟)
|
||||||
|
- 基础镜像: `node:alpine`
|
||||||
|
- 构建策略: 改进版方案B(本地编译+Docker打包)
|
||||||
|
- 技术突破: 修复200+TypeScript错误、手动补全30+Prisma关系字段
|
||||||
|
- 架构特性: Postgres-Only(pg-boss队列+PostgreSQL缓存)
|
||||||
|
- 配置文件: `backend/Dockerfile`, `backend/.dockerignore`, `backend/prisma/schema.prisma`
|
||||||
|
|
||||||
### 🚧 进行中
|
### 🚧 进行中
|
||||||
|
|
||||||
#### 4. SAE应用部署
|
#### 4. SAE应用部署
|
||||||
- ⏳ **Python微服务**: 镜像已推送,待部署到SAE
|
- ✅ **Python微服务**: 已成功部署到SAE轻量版
|
||||||
- 目标规格: 1核2GB
|
- 应用名称: `python-extraction-test`
|
||||||
|
- 规格: 1核2GB
|
||||||
|
- 内网地址: `http://172.17.173.66:8000`
|
||||||
|
- 状态: 运行中 ✅
|
||||||
|
|
||||||
|
- ⏳ **Node.js后端**: 镜像已推送,待部署到SAE
|
||||||
|
- 目标规格: 1核2GB(测试环境)
|
||||||
- 端口: 8000
|
- 端口: 8000
|
||||||
- 健康检查: `/api/health`
|
- 健康检查: `/api/health`
|
||||||
|
|
||||||
@@ -471,24 +487,34 @@ AIclinicalresearch/
|
|||||||
| **2025-11-26~27** | DC Day 2-3 | ✅ DC工具B健康检查+模板管理 |
|
| **2025-11-26~27** | DC Day 2-3 | ✅ DC工具B健康检查+模板管理 |
|
||||||
| **2025-11-28** | DC Day 4-8 | ✅ DC Tool C MVP + UX重大改进完成 |
|
| **2025-11-28** | DC Day 4-8 | ✅ DC Tool C MVP + UX重大改进完成 |
|
||||||
| **2025-12-13** | 架构优化 | ✅ Postgres-Only架构改造完成 |
|
| **2025-12-13** | 架构优化 | ✅ Postgres-Only架构改造完成 |
|
||||||
| **2024-12-24** | **部署启动** 🚀 | ✅ PostgreSQL数据迁移 + 前端/Python镜像推送ACR |
|
| **2025-12-24 上午** | **部署启动** 🚀 | ✅ PostgreSQL数据迁移 + 前端/Python镜像推送ACR |
|
||||||
| **当前** | 部署进行中 | 🚧 SAE应用部署 + Node.js后端构建 |
|
| **2025-12-24 下午** | **后端镜像构建** 🎉 | ✅ Node.js后端镜像构建成功(修复200+TS错误) |
|
||||||
|
| **当前** | 部署进行中 | 🚧 SAE应用部署(Python已完成,Node.js待部署) |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 🎯 下一步计划
|
## 🎯 下一步计划
|
||||||
|
|
||||||
### 🔥 最高优先级(1-2天)- 部署到生产环境
|
### 🔥 最高优先级(当前)- 部署到生产环境
|
||||||
1. **Python微服务部署到SAE**
|
1. ✅ **Python微服务部署到SAE** - 已完成
|
||||||
- 创建SAE应用
|
- ✅ 创建SAE应用(轻量版)
|
||||||
- 配置环境变量
|
- ✅ 配置环境变量(OSS、数据库)
|
||||||
- 健康检查验证
|
- ✅ 健康检查验证
|
||||||
- 获取内网地址
|
- ✅ 获取内网地址:`http://172.17.173.66:8000`
|
||||||
|
|
||||||
2. **Node.js后端Docker镜像构建**
|
2. ✅ **Node.js后端Docker镜像构建** - 已完成
|
||||||
- 创建Dockerfile
|
- ✅ Prisma反向同步(32个模型)
|
||||||
- 配置数据库连接(RDS内网地址)
|
- ✅ 手动补全Prisma关系字段(30+个)
|
||||||
- 构建并推送到ACR
|
- ✅ 修复TypeScript编译错误(200+ → 0)
|
||||||
|
- ✅ 创建Dockerfile(改进版方案B)
|
||||||
|
- ✅ 构建并推送到ACR(838MB镜像)
|
||||||
|
|
||||||
|
3. ⏳ **Node.js后端部署到SAE** - 待执行
|
||||||
|
- [ ] 创建SAE应用(1核2GB,测试环境)
|
||||||
|
- [ ] 配置ACR镜像拉取认证
|
||||||
|
- [ ] 配置环境变量(数据库、Python服务、OSS、LLM API)
|
||||||
|
- [ ] 健康检查验证
|
||||||
|
- [ ] 获取内网地址
|
||||||
|
|
||||||
3. **Node.js后端部署到SAE**
|
3. **Node.js后端部署到SAE**
|
||||||
- 创建SAE应用(2核4GB)
|
- 创建SAE应用(2核4GB)
|
||||||
@@ -624,8 +650,8 @@ npm run dev # http://localhost:3000
|
|||||||
### 部署完成度
|
### 部署完成度
|
||||||
- ✅ **基础设施**:VPC(100%)、NAT网关(100%)、安全组(100%)
|
- ✅ **基础设施**:VPC(100%)、NAT网关(100%)、安全组(100%)
|
||||||
- ✅ **数据存储**:RDS PostgreSQL(100%)、OSS(100%)
|
- ✅ **数据存储**:RDS PostgreSQL(100%)、OSS(100%)
|
||||||
- ✅ **容器镜像**:前端Nginx(100%)、Python微服务(100%)
|
- ✅ **容器镜像**:前端Nginx(100%)、Python微服务(100%)、Node.js后端(100%)✨ 新增!
|
||||||
- 🚧 **SAE应用**:Python微服务(待部署)、Node.js后端(镜像待构建)、前端Nginx(待部署)
|
- ✅ **SAE应用**:Python微服务(100%,已运行)、Node.js后端(镜像已推送,待部署)、前端Nginx(待部署)
|
||||||
- 📋 **验证测试**:全链路测试(待进行)
|
- 📋 **验证测试**:全链路测试(待进行)
|
||||||
|
|
||||||
### 测试覆盖率
|
### 测试覆盖率
|
||||||
@@ -756,7 +782,7 @@ if (items.length >= 50) {
|
|||||||
---
|
---
|
||||||
|
|
||||||
**文档版本**:v2.1
|
**文档版本**:v2.1
|
||||||
**最后更新**:2024-12-24
|
**最后更新**:2025-12-24
|
||||||
**下次更新**:SAE应用部署完成 或 全链路验证测试完成
|
**下次更新**:SAE应用部署完成 或 全链路验证测试完成
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -588,3 +588,4 @@ async saveProcessedData(recordId, newData) {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -775,3 +775,4 @@ export const AsyncProgressBar: React.FC<AsyncProgressBarProps> = ({
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1266,5 +1266,6 @@ interface FulltextScreeningResult {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -380,5 +380,6 @@ GET /api/v1/asl/fulltext-screening/tasks/:taskId/export
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -323,5 +323,6 @@ Linter错误:0个
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -482,5 +482,6 @@ Failed to open file '\\tmp\\extraction_service\\temp_10000_test.pdf'
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -548,5 +548,6 @@ df['creatinine'] = pd.to_numeric(df['creatinine'], errors='coerce')
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -386,5 +386,6 @@ npm run dev
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -963,5 +963,6 @@ export const aiController = new AIController();
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1297,5 +1297,6 @@ npm install react-markdown
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -206,4 +206,5 @@ FMA___基线 | FMA___1个月 | FMA___2个月
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -364,4 +364,5 @@ formula = "FMA总分(0-100) / 100"
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -199,3 +199,4 @@ async handleFillnaMice(request, reply) {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -171,3 +171,4 @@ method: 'mean' | 'median' | 'mode' | 'constant' | 'ffill' | 'bfill'
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -319,5 +319,6 @@ Changes:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -391,5 +391,6 @@ cd path; command
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -620,5 +620,6 @@ import { logger } from '../../../../common/logging/index.js';
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -624,5 +624,6 @@ Content-Length: 45234
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -276,5 +276,6 @@ Response:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -429,5 +429,6 @@ Response:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -423,5 +423,6 @@ import { ChatContainer } from '@/shared/components/Chat';
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -333,5 +333,6 @@ const initialMessages = defaultMessages.length > 0 ? defaultMessages : [{
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -373,5 +373,6 @@ python main.py
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -621,5 +621,6 @@ http://localhost:5173/data-cleaning/tool-c
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -231,5 +231,6 @@ Day 5 (6-8小时):
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -409,5 +409,6 @@ Docs: docs/03-业务模块/DC-数据清洗整理/06-开发记录/DC模块重建
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -384,5 +384,6 @@ const mockAssets: Asset[] = [
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -368,5 +368,6 @@ frontend-v2/src/modules/dc/
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -328,5 +328,6 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -282,5 +282,6 @@ ConflictDetectionService // 冲突检测(字段级对比)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -331,5 +331,6 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -294,5 +294,6 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -358,5 +358,6 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -446,5 +446,6 @@ Tool B后端代码**100%复用**了平台通用能力层,无任何重复开发
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -292,5 +292,6 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -223,5 +223,6 @@ $ node scripts/check-dc-tables.mjs
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -456,5 +456,6 @@ ${fields.map((f, i) => `${i + 1}. ${f.name}:${f.desc}`).join('\n')}
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# 🚀 AI临床研究平台 - 部署进度总览
|
# 🚀 AI临床研究平台 - 部署进度总览
|
||||||
|
|
||||||
> **文档用途**:统一展示项目部署状态、资源信息、操作手册索引
|
> **文档用途**:统一展示项目部署状态、资源信息、操作手册索引
|
||||||
> **更新时间**:2024-12-24
|
> **更新时间**:2025-12-24
|
||||||
> **维护人员**:开发团队
|
> **维护人员**:开发团队
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -10,10 +10,10 @@
|
|||||||
|
|
||||||
| 服务名称 | 部署状态 | 镜像版本 | 部署位置 | 完成时间 | 操作文档 |
|
| 服务名称 | 部署状态 | 镜像版本 | 部署位置 | 完成时间 | 操作文档 |
|
||||||
|---------|---------|---------|---------|---------|---------|
|
|---------|---------|---------|---------|---------|---------|
|
||||||
| **PostgreSQL数据库** | ✅ 已完成 | PostgreSQL 15 | RDS | 2024-12-24 | [08-PostgreSQL数据库部署操作手册.md](./08-PostgreSQL数据库部署操作手册.md) |
|
| **PostgreSQL数据库** | ✅ 已完成 | PostgreSQL 15 | RDS | 2025-12-24 | [08-PostgreSQL数据库部署操作手册.md](./08-PostgreSQL数据库部署操作手册.md) |
|
||||||
| **前端Nginx服务** | ✅ 已完成 | v1.0 | SAE(待部署) | 2024-12-24 | [07-前端Nginx-SAE部署操作手册.md](./07-前端Nginx-SAE部署操作手册.md) |
|
| **前端Nginx服务** | ✅ 已完成 | v1.0 | SAE(待部署) | 2025-12-24 | [07-前端Nginx-SAE部署操作手册.md](./07-前端Nginx-SAE部署操作手册.md) |
|
||||||
| **Python微服务** | ✅ 已完成 | v1.0 | SAE(轻量版) | 2024-12-24 | [09-Python微服务-SAE部署操作手册.md](./09-Python微服务-SAE部署操作手册.md) |
|
| **Python微服务** | ✅ 已完成 | v1.0 | SAE(轻量版) | 2025-12-24 | [09-Python微服务-SAE部署操作手册.md](./09-Python微服务-SAE部署操作手册.md) |
|
||||||
| **Node.js后端** | ⏳ 待开始 | - | - | - | - |
|
| **Node.js后端** | ✅ 已完成 | v1.0 | SAE(待部署) | 2025-12-24 | [10-Node.js后端-Docker镜像构建手册.md](./10-Node.js后端-Docker镜像构建手册.md) |
|
||||||
| **Dify AI服务** | ⏳ 待开始 | - | - | - | - |
|
| **Dify AI服务** | ⏳ 待开始 | - | - | - | - |
|
||||||
|
|
||||||
**图例说明**:
|
**图例说明**:
|
||||||
@@ -40,7 +40,7 @@
|
|||||||
|---------|---------|---------|---------|---------|
|
|---------|---------|---------|---------|---------|
|
||||||
| **python-extraction** | v1.0 | 1.12GB | `crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/python-extraction:v1.0` | `crpi-cd5ij4pjt65mweeo-vpc.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/python-extraction:v1.0` |
|
| **python-extraction** | v1.0 | 1.12GB | `crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/python-extraction:v1.0` | `crpi-cd5ij4pjt65mweeo-vpc.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/python-extraction:v1.0` |
|
||||||
| **ai-clinical_frontend-nginx** | v1.0 | ~50MB | `crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/ai-clinical_frontend-nginx:v1.0` | `crpi-cd5ij4pjt65mweeo-vpc.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/ai-clinical_frontend-nginx:v1.0` |
|
| **ai-clinical_frontend-nginx** | v1.0 | ~50MB | `crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/ai-clinical_frontend-nginx:v1.0` | `crpi-cd5ij4pjt65mweeo-vpc.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/ai-clinical_frontend-nginx:v1.0` |
|
||||||
| **nodejs-backend** | - | - | `crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/nodejs-backend` | `crpi-cd5ij4pjt65mweeo-vpc.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/nodejs-backend` |
|
| **backend-service** | v1.0 | 838MB | `crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:v1.0` | `crpi-cd5ij4pjt65mweeo-vpc.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:v1.0` |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -99,7 +99,7 @@
|
|||||||
| `common_schema` | 公共模块 | 0 | 预留 |
|
| `common_schema` | 公共模块 | 0 | 预留 |
|
||||||
| `information_schema` | 系统元数据 | - | PostgreSQL标准 |
|
| `information_schema` | 系统元数据 | - | PostgreSQL标准 |
|
||||||
|
|
||||||
**关键数据量**(截至2024-12-24):
|
**关键数据量**(截至2025-12-24):
|
||||||
- 用户:3条
|
- 用户:3条
|
||||||
- AI项目:2条
|
- AI项目:2条
|
||||||
- 文献:1204条
|
- 文献:1204条
|
||||||
@@ -125,7 +125,7 @@ postgresql://airesearch:Xibahe%40fengzhibo117@pgm-2zex1m2y3r23hdn5.pg.rds.aliyun
|
|||||||
| 应用名称 | 状态 | 规格 | 实例数 | 端口 | 内网地址 | 公网地址 |
|
| 应用名称 | 状态 | 规格 | 实例数 | 端口 | 内网地址 | 公网地址 |
|
||||||
|---------|------|------|-------|------|---------|---------|
|
|---------|------|------|-------|------|---------|---------|
|
||||||
| **python-extraction-test** | ✅ 运行中 | 1核2GB | 1 | 8000 | `http://172.17.173.66:8000` | 无(仅内网) |
|
| **python-extraction-test** | ✅ 运行中 | 1核2GB | 1 | 8000 | `http://172.17.173.66:8000` | 无(仅内网) |
|
||||||
| **nodejs-backend** | 待构建 | 2核4GB | 1 | 3001 | 待部署后填写 | 待部署后填写 |
|
| **nodejs-backend-test** | 镜像已推送 | 1核2GB | 1 | 3001 | 待部署后填写 | 待部署后填写 |
|
||||||
| **frontend-nginx** | 镜像已推送 | 1核2GB | 1 | 80 | 待部署后填写 | 待部署后填写 |
|
| **frontend-nginx** | 镜像已推送 | 1核2GB | 1 | 80 | 待部署后填写 | 待部署后填写 |
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -189,16 +189,19 @@ AIclinicalresearch/extraction_service/
|
|||||||
VPC:crpi-cd5ij4pjt65mweeo-vpc.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/python-extraction:v1.0
|
VPC:crpi-cd5ij4pjt65mweeo-vpc.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/python-extraction:v1.0
|
||||||
```
|
```
|
||||||
|
|
||||||
**Node.js后端**(待构建):
|
**Node.js后端**:
|
||||||
```
|
```
|
||||||
AIclinicalresearch/backend/
|
AIclinicalresearch/backend/
|
||||||
├── Dockerfile ⏳ 待创建
|
├── Dockerfile ✅ 已提交Git(改进版方案B:本地编译+Docker打包)
|
||||||
├── .dockerignore ⏳ 待创建
|
├── .dockerignore ✅ 已提交Git(优化构建上下文)
|
||||||
└── (配置文件) ⏳ 待确认
|
├── prisma/schema.prisma ✅ 已同步RDS(32个模型+30+关系字段)
|
||||||
|
└── tsconfig.json ✅ 已优化(排除测试文件)
|
||||||
|
|
||||||
镜像存储位置(预留):
|
镜像存储位置:
|
||||||
公网:crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/nodejs-backend:v1.0
|
公网:crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:v1.0
|
||||||
VPC:crpi-cd5ij4pjt65mweeo-vpc.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/nodejs-backend:v1.0
|
VPC:crpi-cd5ij4pjt65mweeo-vpc.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:v1.0
|
||||||
|
|
||||||
|
镜像摘要:sha256:a4ffb61c15af1cd1ed9de187b4464a1aab773918e5b41b4df5b8ad96514f9941
|
||||||
```
|
```
|
||||||
|
|
||||||
**Git提交规范**:
|
**Git提交规范**:
|
||||||
@@ -218,7 +221,7 @@ VPC:crpi-cd5ij4pjt65mweeo-vpc.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/
|
|||||||
### 3.1 PostgreSQL数据库
|
### 3.1 PostgreSQL数据库
|
||||||
|
|
||||||
**部署概要**:
|
**部署概要**:
|
||||||
- **部署时间**:2024-12-24
|
- **部署时间**:2025-12-24
|
||||||
- **部署方式**:`pg_dump` 全量导出 → RDS导入
|
- **部署方式**:`pg_dump` 全量导出 → RDS导入
|
||||||
- **数据迁移时长**:约12秒(90MB SQL文件)
|
- **数据迁移时长**:约12秒(90MB SQL文件)
|
||||||
- **验证状态**:✅ Schema完整、数据一致、关系正确
|
- **验证状态**:✅ Schema完整、数据一致、关系正确
|
||||||
@@ -256,7 +259,7 @@ docker run --name ai-clinical-postgres \
|
|||||||
- **镜像版本**:`v1.0`
|
- **镜像版本**:`v1.0`
|
||||||
- **镜像大小**:约50MB
|
- **镜像大小**:约50MB
|
||||||
- **基础镜像**:`nginx:alpine`
|
- **基础镜像**:`nginx:alpine`
|
||||||
- **构建时间**:2024-12-24
|
- **构建时间**:2025-12-24
|
||||||
|
|
||||||
**镜像功能**:
|
**镜像功能**:
|
||||||
- ✅ 托管React单页应用(SPA)
|
- ✅ 托管React单页应用(SPA)
|
||||||
@@ -292,14 +295,95 @@ docker run --name ai-clinical-postgres \
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### 3.3 Python微服务
|
### 3.3 Node.js后端服务
|
||||||
|
|
||||||
|
**镜像信息**:
|
||||||
|
- **仓库名称**:`backend-service`
|
||||||
|
- **镜像版本**:`v1.0`
|
||||||
|
- **镜像大小**:838MB (压缩后 ~186MB)
|
||||||
|
- **基础镜像**:`node:alpine`
|
||||||
|
- **构建时间**:2025-12-24
|
||||||
|
- **构建策略**:改进版方案B(本地编译+Docker打包)
|
||||||
|
|
||||||
|
**构建成果**:
|
||||||
|
- ✅ TypeScript编译成功(0错误,修复200+个错误)
|
||||||
|
- ✅ Prisma Schema已同步RDS(32个模型)
|
||||||
|
- ✅ 手动补全30+个关系字段
|
||||||
|
- ✅ 镜像已推送到ACR(v1.0 + latest)
|
||||||
|
|
||||||
|
**技术架构**:
|
||||||
|
- **Node.js版本**:22.x
|
||||||
|
- **Prisma版本**:6.17.0
|
||||||
|
- **ORM**:Prisma(支持多Schema)
|
||||||
|
- **Web框架**:Fastify
|
||||||
|
- **队列系统**:pg-boss(Postgres-Only架构)
|
||||||
|
- **缓存系统**:PostgreSQL(替代Redis)
|
||||||
|
|
||||||
|
**构建产物**:
|
||||||
|
- **Dockerfile**:`AIclinicalresearch/backend/Dockerfile`
|
||||||
|
- **.dockerignore**:`AIclinicalresearch/backend/.dockerignore`
|
||||||
|
- **Prisma Schema**:`AIclinicalresearch/backend/prisma/schema.prisma`
|
||||||
|
|
||||||
|
**SAE配置建议**:
|
||||||
|
- **CPU/内存**:1核 / 2GB(测试环境)
|
||||||
|
- **实例数**:1
|
||||||
|
- **端口**:3001
|
||||||
|
- **健康检查**:`GET /health` 返回200
|
||||||
|
- **环境变量**(关键配置):
|
||||||
|
```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微服务地址
|
||||||
|
PYTHON_SERVICE_URL=http://172.17.173.66:8000
|
||||||
|
|
||||||
|
# OSS配置
|
||||||
|
OSS_ACCESS_KEY_ID=LTAI5tB2Dt3NdvBL3G7nYGv7
|
||||||
|
OSS_ACCESS_KEY_SECRET=1iSN9k39RkApP93QjUhC1DcPIeMG4V
|
||||||
|
OSS_BUCKET=ai-clinical-research
|
||||||
|
OSS_ENDPOINT=oss-cn-beijing-internal.aliyuncs.com
|
||||||
|
|
||||||
|
# JWT密钥
|
||||||
|
JWT_SECRET=your-secret-key-change-in-production
|
||||||
|
JWT_EXPIRES_IN=7d
|
||||||
|
|
||||||
|
# LLM API Keys
|
||||||
|
DEEPSEEK_API_KEY=sk-7f8cc37a79fa4799860b38fc7ba2e150
|
||||||
|
DASHSCOPE_API_KEY=sk-75b4ff29a14a49e79667a331034f3298
|
||||||
|
|
||||||
|
# 队列和缓存(Postgres-Only)
|
||||||
|
QUEUE_TYPE=pgboss
|
||||||
|
CACHE_TYPE=postgres
|
||||||
|
```
|
||||||
|
|
||||||
|
**操作文档**:
|
||||||
|
- [10-Node.js后端-Docker镜像构建手册.md](./10-Node.js后端-Docker镜像构建手册.md) - 镜像构建详细步骤
|
||||||
|
- [05-Node.js后端-SAE容器部署指南.md](./05-Node.js后端-SAE容器部署指南.md) - SAE部署技术指南
|
||||||
|
|
||||||
|
**部署状态**:
|
||||||
|
- ✅ Prisma反向同步完成(32个模型)
|
||||||
|
- ✅ TypeScript编译成功(修复200+错误)
|
||||||
|
- ✅ Docker镜像构建成功
|
||||||
|
- ✅ 镜像已推送至ACR
|
||||||
|
- ⏳ 待部署到SAE
|
||||||
|
|
||||||
|
**关键突破**:
|
||||||
|
1. ✅ 解决了Prisma `db pull` 后缺少关系字段的问题(手动补全30+个)
|
||||||
|
2. ✅ 修复了TypeScript类型错误(JSON、Buffer、pg-boss等)
|
||||||
|
3. ✅ 优化了Docker构建策略(本地编译,避免网络超时)
|
||||||
|
4. ✅ 实现了零编译错误(200+ → 0)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3.4 Python微服务
|
||||||
|
|
||||||
**镜像信息**:
|
**镜像信息**:
|
||||||
- **仓库名称**:`python-extraction`
|
- **仓库名称**:`python-extraction`
|
||||||
- **镜像版本**:`v1.0`
|
- **镜像版本**:`v1.0`
|
||||||
- **镜像大小**:1.12GB
|
- **镜像大小**:1.12GB
|
||||||
- **基础镜像**:`python:3-slim`
|
- **基础镜像**:`python:3-slim`
|
||||||
- **构建时间**:2024-12-24
|
- **构建时间**:2025-12-24
|
||||||
|
|
||||||
**功能模块**:
|
**功能模块**:
|
||||||
- ✅ **PDF文本提取**:PyMuPDF 1.26.7
|
- ✅ **PDF文本提取**:PyMuPDF 1.26.7
|
||||||
@@ -369,7 +453,7 @@ docker run --name ai-clinical-postgres \
|
|||||||
http://172.17.173.66:8000
|
http://172.17.173.66:8000
|
||||||
```
|
```
|
||||||
|
|
||||||
**部署时间**:2024-12-24
|
**部署时间**:2025-12-24
|
||||||
**健康检查**:✅ 通过
|
**健康检查**:✅ 通过
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -482,7 +566,7 @@ docker exec ai-clinical-postgres pg_dump \
|
|||||||
> "backup_$(date +%Y%m%d_%H%M%S).sql"
|
> "backup_$(date +%Y%m%d_%H%M%S).sql"
|
||||||
|
|
||||||
# 导入到RDS(需临时开启外网)
|
# 导入到RDS(需临时开启外网)
|
||||||
cat backup_20241224_154529.sql | \
|
cat backup_20251224_154529.sql | \
|
||||||
docker exec -i -e PGPASSWORD="Xibahe@fengzhibo117" \
|
docker exec -i -e PGPASSWORD="Xibahe@fengzhibo117" \
|
||||||
ai-clinical-postgres psql \
|
ai-clinical-postgres psql \
|
||||||
-h pgm-2zex1m2y3r23hdn5.pg.rds.aliyuncs.com \
|
-h pgm-2zex1m2y3r23hdn5.pg.rds.aliyuncs.com \
|
||||||
@@ -557,12 +641,12 @@ aliyun sae DeployApplication \
|
|||||||
1. ✅ **基础设施**:VPC、NAT网关、安全组
|
1. ✅ **基础设施**:VPC、NAT网关、安全组
|
||||||
2. ✅ **数据库**:RDS PostgreSQL(数据迁移+验证)
|
2. ✅ **数据库**:RDS PostgreSQL(数据迁移+验证)
|
||||||
3. ✅ **对象存储**:OSS Bucket创建+权限配置
|
3. ✅ **对象存储**:OSS Bucket创建+权限配置
|
||||||
4. 🔄 **后端服务**:
|
4. ✅ **后端服务**:
|
||||||
- Python微服务(文档提取+数据清洗)
|
- ✅ Python微服务(文档提取+数据清洗)- 已部署到SAE
|
||||||
- Node.js后端(API服务器)
|
- ✅ Node.js后端(API服务器)- 镜像已构建,待部署
|
||||||
5. 🔄 **前端服务**:Nginx静态资源托管
|
5. ⏳ **前端服务**:Nginx静态资源托管 - 镜像已推送,待部署
|
||||||
6. 🔄 **AI服务**:Dify部署
|
6. ⏳ **AI服务**:Dify部署
|
||||||
7. 🔄 **验证测试**:全链路功能验证
|
7. ⏳ **验证测试**:全链路功能验证
|
||||||
|
|
||||||
**依赖关系**:
|
**依赖关系**:
|
||||||
```
|
```
|
||||||
@@ -641,7 +725,10 @@ aliyun sae DescribeApplicationInstances --AppId xxx
|
|||||||
### 高优先级 🔴
|
### 高优先级 🔴
|
||||||
- [x] **Python微服务**:部署到SAE并验证 ✅ 已完成
|
- [x] **Python微服务**:部署到SAE并验证 ✅ 已完成
|
||||||
- [x] **Python微服务**:创建SAE部署操作手册 ✅ 已完成
|
- [x] **Python微服务**:创建SAE部署操作手册 ✅ 已完成
|
||||||
- [ ] **Node.js后端**:Docker镜像构建
|
- [x] **Node.js后端**:Docker镜像构建 ✅ 已完成(2025-12-24)
|
||||||
|
- [x] **Node.js后端**:Prisma反向同步 ✅ 已完成(32个模型)
|
||||||
|
- [x] **Node.js后端**:TypeScript编译修复 ✅ 已完成(修复200+错误)
|
||||||
|
- [x] **Node.js后端**:镜像推送到ACR ✅ 已完成
|
||||||
- [ ] **Node.js后端**:部署到SAE
|
- [ ] **Node.js后端**:部署到SAE
|
||||||
- [ ] **Node.js后端**:配置环境变量(Python服务地址)
|
- [ ] **Node.js后端**:配置环境变量(Python服务地址)
|
||||||
|
|
||||||
@@ -669,11 +756,12 @@ aliyun sae DescribeApplicationInstances --AppId xxx
|
|||||||
- [07-前端Nginx-SAE部署操作手册.md](./07-前端Nginx-SAE部署操作手册.md) - 前端Nginx部署步骤
|
- [07-前端Nginx-SAE部署操作手册.md](./07-前端Nginx-SAE部署操作手册.md) - 前端Nginx部署步骤
|
||||||
- [08-PostgreSQL数据库部署操作手册.md](./08-PostgreSQL数据库部署操作手册.md) - PostgreSQL部署步骤
|
- [08-PostgreSQL数据库部署操作手册.md](./08-PostgreSQL数据库部署操作手册.md) - PostgreSQL部署步骤
|
||||||
- [09-Python微服务-SAE部署操作手册.md](./09-Python微服务-SAE部署操作手册.md) - Python微服务部署步骤
|
- [09-Python微服务-SAE部署操作手册.md](./09-Python微服务-SAE部署操作手册.md) - Python微服务部署步骤
|
||||||
- 待创建:Node.js后端SAE部署操作手册
|
- [10-Node.js后端-Docker镜像构建手册.md](./10-Node.js后端-Docker镜像构建手册.md) - Node.js后端Docker构建详解
|
||||||
|
|
||||||
### 技术架构文档
|
### 技术架构文档
|
||||||
- [00-部署架构总览.md](./00-部署架构总览.md) - 架构设计与技术选型
|
- [00-部署架构总览.md](./00-部署架构总览.md) - 架构设计与技术选型
|
||||||
- [04-Python微服务-SAE容器部署指南.md](./04-Python微服务-SAE容器部署指南.md) - Python服务技术详解
|
- [04-Python微服务-SAE容器部署指南.md](./04-Python微服务-SAE容器部署指南.md) - Python服务技术详解
|
||||||
|
- [05-Node.js后端-SAE容器部署指南.md](./05-Node.js后端-SAE容器部署指南.md) - Node.js后端技术详解
|
||||||
- [06-前端Nginx-SAE容器部署指南.md](./06-前端Nginx-SAE容器部署指南.md) - 前端Nginx技术详解
|
- [06-前端Nginx-SAE容器部署指南.md](./06-前端Nginx-SAE容器部署指南.md) - 前端Nginx技术详解
|
||||||
|
|
||||||
### 分析报告
|
### 分析报告
|
||||||
@@ -683,7 +771,7 @@ aliyun sae DescribeApplicationInstances --AppId xxx
|
|||||||
|
|
||||||
## 🔄 八、更新日志
|
## 🔄 八、更新日志
|
||||||
|
|
||||||
### 2024-12-24
|
### 2025-12-24
|
||||||
- ✅ PostgreSQL数据库部署完成
|
- ✅ PostgreSQL数据库部署完成
|
||||||
- ✅ 前端Nginx Docker镜像构建并推送至ACR
|
- ✅ 前端Nginx Docker镜像构建并推送至ACR
|
||||||
- ✅ Python微服务Docker镜像构建并推送至ACR
|
- ✅ Python微服务Docker镜像构建并推送至ACR
|
||||||
@@ -691,6 +779,11 @@ aliyun sae DescribeApplicationInstances --AppId xxx
|
|||||||
- ✅ 创建Python微服务SAE部署操作手册(轻量版SAE配置)
|
- ✅ 创建Python微服务SAE部署操作手册(轻量版SAE配置)
|
||||||
- ✅ Python微服务成功部署到SAE(内网地址:172.17.173.66:8000)
|
- ✅ Python微服务成功部署到SAE(内网地址:172.17.173.66:8000)
|
||||||
- ✅ 解决ACR镜像拉取权限问题(配置镜像仓库认证)
|
- ✅ 解决ACR镜像拉取权限问题(配置镜像仓库认证)
|
||||||
|
- ✅ Node.js后端Prisma反向同步完成(32个模型,手动补全30+关系字段)
|
||||||
|
- ✅ Node.js后端TypeScript编译修复完成(修复200+错误→0错误)
|
||||||
|
- ✅ Node.js后端Docker镜像构建成功(838MB,改进版方案B)
|
||||||
|
- ✅ Node.js后端镜像推送至ACR(v1.0 + latest)
|
||||||
|
- ✅ 创建Node.js后端Docker镜像构建手册
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -708,5 +801,5 @@ aliyun sae DescribeApplicationInstances --AppId xxx
|
|||||||
---
|
---
|
||||||
|
|
||||||
> **提示**:本文档会随着部署进度持续更新,请定期查看最新版本!
|
> **提示**:本文档会随着部署进度持续更新,请定期查看最新版本!
|
||||||
> **最后更新**:2024-12-24
|
> **最后更新**:2025-12-24
|
||||||
|
|
||||||
|
|||||||
@@ -865,3 +865,4 @@ ACR镜像仓库:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1352,3 +1352,4 @@ SAE应用配置:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1168,3 +1168,4 @@ docker exec -e PGPASSWORD="密码" ai-clinical-postgres psql -h RDS地址 -U air
|
|||||||
祝部署顺利!🎉
|
祝部署顺利!🎉
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
582
docs/05-部署文档/10-Node.js后端-Docker镜像构建手册.md
Normal file
582
docs/05-部署文档/10-Node.js后端-Docker镜像构建手册.md
Normal file
@@ -0,0 +1,582 @@
|
|||||||
|
# Node.js 后端 - Docker 镜像构建操作手册
|
||||||
|
|
||||||
|
**文档版本**: v1.0
|
||||||
|
**创建时间**: 2024-12-24
|
||||||
|
**适用范围**: AIclinicalresearch 平台 - Node.js 后端服务
|
||||||
|
**目标读者**: 运维工程师、后端开发工程师
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📋 目录
|
||||||
|
|
||||||
|
1. [构建概述](#构建概述)
|
||||||
|
2. [前置准备](#前置准备)
|
||||||
|
3. [构建流程](#构建流程)
|
||||||
|
4. [镜像信息](#镜像信息)
|
||||||
|
5. [故障排查](#故障排查)
|
||||||
|
6. [最佳实践](#最佳实践)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. 构建概述
|
||||||
|
|
||||||
|
### 1.1 构建策略
|
||||||
|
|
||||||
|
本次构建采用**改进版方案B(本地编译+Docker打包)**,相比传统方案有以下优势:
|
||||||
|
|
||||||
|
| 对比项 | 传统方案 | 改进版方案B |
|
||||||
|
|--------|----------|-------------|
|
||||||
|
| **TypeScript编译** | Docker中执行 | 本地预编译 ✅ |
|
||||||
|
| **依赖安装** | 完整依赖 | 仅生产依赖 ✅ |
|
||||||
|
| **网络依赖** | 高(易超时) | 低(更稳定) ✅ |
|
||||||
|
| **构建时间** | ~10分钟 | ~5分钟 ✅ |
|
||||||
|
| **平台兼容性** | 有风险 | 无风险 ✅ |
|
||||||
|
|
||||||
|
### 1.2 构建成果
|
||||||
|
|
||||||
|
```
|
||||||
|
镜像名称: backend-service:v1.0
|
||||||
|
镜像大小: 838MB (压缩后 ~186MB)
|
||||||
|
镜像ID: a4ffb61c15af
|
||||||
|
构建时间: ~5分钟
|
||||||
|
ACR地址: crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:v1.0
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. 前置准备
|
||||||
|
|
||||||
|
### 2.1 环境检查
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
# 1. 检查Docker状态
|
||||||
|
docker --version
|
||||||
|
docker ps
|
||||||
|
|
||||||
|
# 2. 检查Node.js环境
|
||||||
|
node --version # 应该显示 v22.x
|
||||||
|
npm --version
|
||||||
|
|
||||||
|
# 3. 确认当前目录
|
||||||
|
cd D:\MyCursor\AIclinicalresearch\backend
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.2 代码准备
|
||||||
|
|
||||||
|
#### ✅ 必须完成的步骤
|
||||||
|
|
||||||
|
**步骤1:Prisma反向同步(必须)**
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
# 设置临时RDS连接环境变量
|
||||||
|
$env:DATABASE_URL = "postgresql://airesearch:Xibahe%40fengzhibo117@pgm-2zex1m2y3r23hdn5oo.pg.rds.aliyuncs.com:5432/ai_clinical_research?connection_limit=18&pool_timeout=10"
|
||||||
|
|
||||||
|
# 执行Prisma反向同步
|
||||||
|
npx prisma db pull
|
||||||
|
|
||||||
|
# 输出应该显示:
|
||||||
|
# ✔ Introspected 32 models and wrote them into prisma\schema.prisma
|
||||||
|
```
|
||||||
|
|
||||||
|
**步骤2:生成Prisma Client**
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
npx prisma generate
|
||||||
|
|
||||||
|
# 输出应该显示:
|
||||||
|
# ✔ Generated Prisma Client (v6.17.0)
|
||||||
|
```
|
||||||
|
|
||||||
|
**步骤3:TypeScript编译(必须)**
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
# 编译TypeScript代码
|
||||||
|
npm run build
|
||||||
|
|
||||||
|
# 成功输出:
|
||||||
|
# > ai-clinical-backend@1.0.0 build
|
||||||
|
# > tsc
|
||||||
|
# (无错误信息)
|
||||||
|
|
||||||
|
# 检查dist目录是否生成
|
||||||
|
ls dist
|
||||||
|
```
|
||||||
|
|
||||||
|
⚠️ **重要提示**:如果编译失败,必须先修复所有TypeScript错误!
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. 构建流程
|
||||||
|
|
||||||
|
### 3.1 完整构建步骤
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
# 1. 确保在backend目录
|
||||||
|
cd D:\MyCursor\AIclinicalresearch\backend
|
||||||
|
|
||||||
|
# 2. 检查Dockerfile和.dockerignore
|
||||||
|
ls Dockerfile
|
||||||
|
ls .dockerignore
|
||||||
|
|
||||||
|
# 3. 开始构建(需要5分钟)
|
||||||
|
docker build -t backend-service:v1.0 .
|
||||||
|
|
||||||
|
# 4. 查看构建结果
|
||||||
|
docker images backend-service:v1.0
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.2 构建过程说明
|
||||||
|
|
||||||
|
**阶段1:依赖安装(约4分钟)**
|
||||||
|
```dockerfile
|
||||||
|
FROM node:alpine AS builder
|
||||||
|
RUN apk add --no-cache openssl
|
||||||
|
COPY package*.json ./
|
||||||
|
COPY prisma ./prisma/
|
||||||
|
RUN npm ci --production # 仅安装生产依赖
|
||||||
|
RUN npx prisma generate # 生成Prisma Client
|
||||||
|
```
|
||||||
|
|
||||||
|
**阶段2:复制本地编译结果(约10秒)**
|
||||||
|
```dockerfile
|
||||||
|
COPY dist ./dist # 复制本地已编译的TypeScript代码
|
||||||
|
```
|
||||||
|
|
||||||
|
**阶段3:运行镜像打包(约1分钟)**
|
||||||
|
```dockerfile
|
||||||
|
FROM node:alpine
|
||||||
|
COPY --from=builder /app/node_modules ./node_modules
|
||||||
|
COPY --from=builder /app/dist ./dist
|
||||||
|
COPY --from=builder /app/prisma ./prisma
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.3 推送到ACR
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
# 1. 登录ACR(使用个人版实例地址)
|
||||||
|
echo "fengzhibo117" | docker login --username=gofeng117@163.com --password-stdin crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com
|
||||||
|
|
||||||
|
# 输出:Login Succeeded
|
||||||
|
|
||||||
|
# 2. 打标签
|
||||||
|
docker tag backend-service:v1.0 crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:v1.0
|
||||||
|
docker tag backend-service:v1.0 crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:latest
|
||||||
|
|
||||||
|
# 3. 推送镜像
|
||||||
|
docker push crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:v1.0
|
||||||
|
docker push crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:latest
|
||||||
|
|
||||||
|
# 输出:
|
||||||
|
# v1.0: digest: sha256:a4ffb61c15af... size: 856
|
||||||
|
# latest: digest: sha256:a4ffb61c15af... size: 856
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. 镜像信息
|
||||||
|
|
||||||
|
### 4.1 镜像地址
|
||||||
|
|
||||||
|
**VPC内网地址(SAE部署使用):**
|
||||||
|
```
|
||||||
|
crpi-cd5ij4pjt65mweeo-vpc.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:v1.0
|
||||||
|
```
|
||||||
|
|
||||||
|
**公网地址(查看和拉取):**
|
||||||
|
```
|
||||||
|
crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:v1.0
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.2 镜像详情
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
镜像摘要: sha256:a4ffb61c15af1cd1ed9de187b4464a1aab773918e5b41b4df5b8ad96514f9941
|
||||||
|
大小: 838MB (压缩后 ~186MB)
|
||||||
|
架构: linux/amd64
|
||||||
|
基础镜像: node:alpine
|
||||||
|
Node版本: 22.x
|
||||||
|
标签: v1.0, latest
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.3 镜像内容
|
||||||
|
|
||||||
|
```
|
||||||
|
/app/
|
||||||
|
├── node_modules/ # 生产依赖
|
||||||
|
├── dist/ # 编译后的JS代码
|
||||||
|
├── prisma/ # Prisma Schema
|
||||||
|
│ └── schema.prisma
|
||||||
|
├── package.json
|
||||||
|
└── uploads/ # 临时文件目录
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.4 启动命令
|
||||||
|
|
||||||
|
```dockerfile
|
||||||
|
CMD ["node", "dist/index.js"]
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.5 健康检查
|
||||||
|
|
||||||
|
```dockerfile
|
||||||
|
HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
|
||||||
|
CMD node -e "require('http').get('http://localhost:3001/health', (res) => { process.exit(res.statusCode === 200 ? 0 : 1); })"
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. 故障排查
|
||||||
|
|
||||||
|
### 5.1 常见问题
|
||||||
|
|
||||||
|
#### ❌ 问题1:TypeScript编译失败
|
||||||
|
|
||||||
|
**症状:**
|
||||||
|
```
|
||||||
|
error TS2554: Expected 2-3 arguments, but got 1.
|
||||||
|
error TS2322: Type 'XXX' is not assignable to type 'YYY'.
|
||||||
|
```
|
||||||
|
|
||||||
|
**原因:**
|
||||||
|
- Prisma反向同步后缺少关系字段
|
||||||
|
- 代码与Prisma生成的类型不匹配
|
||||||
|
|
||||||
|
**解决方案:**
|
||||||
|
```powershell
|
||||||
|
# 1. 重新同步Prisma
|
||||||
|
npx prisma db pull
|
||||||
|
npx prisma generate
|
||||||
|
|
||||||
|
# 2. 重新编译
|
||||||
|
npm run build
|
||||||
|
|
||||||
|
# 3. 如果还有错误,检查tsconfig.json配置
|
||||||
|
```
|
||||||
|
|
||||||
|
#### ❌ 问题2:Docker构建网络超时
|
||||||
|
|
||||||
|
**症状:**
|
||||||
|
```
|
||||||
|
npm error code ECONNRESET
|
||||||
|
npm error network aborted
|
||||||
|
```
|
||||||
|
|
||||||
|
**原因:**
|
||||||
|
- npm镜像源网络不稳定
|
||||||
|
- npm ci 下载依赖失败
|
||||||
|
|
||||||
|
**解决方案:**
|
||||||
|
✅ **使用改进版方案B(本次采用的方案)**
|
||||||
|
- 本地预编译,跳过Docker中的编译步骤
|
||||||
|
- 只安装生产依赖,减少网络传输
|
||||||
|
|
||||||
|
#### ❌ 问题3:推送到ACR失败(403 Forbidden)
|
||||||
|
|
||||||
|
**症状:**
|
||||||
|
```
|
||||||
|
Error response from daemon: login attempt to https://registry.cn-beijing.aliyuncs.com/v2/ failed with status: 403 Forbidden
|
||||||
|
```
|
||||||
|
|
||||||
|
**原因:**
|
||||||
|
- 使用了错误的ACR地址
|
||||||
|
- 应该使用个人版实例地址,不是企业版地址
|
||||||
|
|
||||||
|
**解决方案:**
|
||||||
|
```powershell
|
||||||
|
# ✅ 正确的登录地址(个人版实例)
|
||||||
|
docker login crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com
|
||||||
|
|
||||||
|
# ❌ 错误的登录地址(企业版)
|
||||||
|
docker login registry.cn-beijing.aliyuncs.com
|
||||||
|
```
|
||||||
|
|
||||||
|
#### ❌ 问题4:VPC内网地址推送超时
|
||||||
|
|
||||||
|
**症状:**
|
||||||
|
```
|
||||||
|
failed to do request: Head "https://crpi-cd5ij4pjt65mweeo-vpc.cn-beijing.personal.cr.aliyuncs.com/...": net/http: TLS handshake timeout
|
||||||
|
```
|
||||||
|
|
||||||
|
**原因:**
|
||||||
|
- VPC内网地址只能在阿里云VPC内访问
|
||||||
|
- 本地开发环境无法访问VPC内网
|
||||||
|
|
||||||
|
**解决方案:**
|
||||||
|
```powershell
|
||||||
|
# 本地开发环境使用公网地址推送
|
||||||
|
docker push crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:v1.0
|
||||||
|
|
||||||
|
# SAE部署时使用VPC内网地址拉取(在SAE控制台配置)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5.2 验证镜像
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
# 1. 检查镜像是否存在
|
||||||
|
docker images backend-service:v1.0
|
||||||
|
|
||||||
|
# 2. 查看镜像详细信息
|
||||||
|
docker inspect backend-service:v1.0
|
||||||
|
|
||||||
|
# 3. 测试运行镜像(可选)
|
||||||
|
docker run -d `
|
||||||
|
--name backend-test `
|
||||||
|
-p 3001:3001 `
|
||||||
|
-e DATABASE_URL="postgresql://..." `
|
||||||
|
-e NODE_ENV=production `
|
||||||
|
backend-service:v1.0
|
||||||
|
|
||||||
|
# 4. 查看容器日志
|
||||||
|
docker logs backend-test
|
||||||
|
|
||||||
|
# 5. 测试健康检查
|
||||||
|
curl http://localhost:3001/health
|
||||||
|
|
||||||
|
# 6. 清理测试容器
|
||||||
|
docker stop backend-test
|
||||||
|
docker rm backend-test
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. 最佳实践
|
||||||
|
|
||||||
|
### 6.1 构建前检查清单
|
||||||
|
|
||||||
|
- [ ] 已完成Prisma反向同步(`npx prisma db pull`)
|
||||||
|
- [ ] 已生成Prisma Client(`npx prisma generate`)
|
||||||
|
- [ ] TypeScript编译成功(`npm run build`)
|
||||||
|
- [ ] dist目录已生成且包含所有编译后的JS文件
|
||||||
|
- [ ] Docker Desktop已启动并运行
|
||||||
|
- [ ] 网络连接正常
|
||||||
|
|
||||||
|
### 6.2 版本管理
|
||||||
|
|
||||||
|
**镜像标签规范:**
|
||||||
|
```
|
||||||
|
v1.0 - 特定版本(推荐用于生产环境)
|
||||||
|
latest - 最新版本(用于测试环境)
|
||||||
|
v1.0.1 - Bug修复版本
|
||||||
|
v1.1.0 - 功能更新版本
|
||||||
|
```
|
||||||
|
|
||||||
|
**推送策略:**
|
||||||
|
```powershell
|
||||||
|
# 生产环境部署(推送特定版本)
|
||||||
|
docker push crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:v1.0
|
||||||
|
|
||||||
|
# 测试环境部署(同时推送latest)
|
||||||
|
docker push crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:v1.0
|
||||||
|
docker push crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:latest
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6.3 构建优化
|
||||||
|
|
||||||
|
**1. 利用Docker缓存**
|
||||||
|
```dockerfile
|
||||||
|
# ✅ 先复制package.json,利用依赖缓存
|
||||||
|
COPY package*.json ./
|
||||||
|
RUN npm ci --production
|
||||||
|
|
||||||
|
# ✅ 最后复制代码,代码变化不影响依赖层缓存
|
||||||
|
COPY dist ./dist
|
||||||
|
```
|
||||||
|
|
||||||
|
**2. 使用.dockerignore**
|
||||||
|
```
|
||||||
|
node_modules
|
||||||
|
.env
|
||||||
|
.env.*
|
||||||
|
dist # 本地dist通过COPY显式复制
|
||||||
|
test
|
||||||
|
tests
|
||||||
|
*.md
|
||||||
|
.git
|
||||||
|
```
|
||||||
|
|
||||||
|
**3. 多阶段构建**
|
||||||
|
```dockerfile
|
||||||
|
# 阶段1:依赖安装
|
||||||
|
FROM node:alpine AS builder
|
||||||
|
...
|
||||||
|
|
||||||
|
# 阶段2:运行时镜像(更小)
|
||||||
|
FROM node:alpine
|
||||||
|
COPY --from=builder ...
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6.4 安全建议
|
||||||
|
|
||||||
|
1. **不要在镜像中包含敏感信息**
|
||||||
|
- ❌ 不要把`.env`文件复制到镜像
|
||||||
|
- ✅ 使用SAE环境变量注入配置
|
||||||
|
|
||||||
|
2. **使用非root用户运行**
|
||||||
|
```dockerfile
|
||||||
|
RUN addgroup -g 1001 -S nodejs && \
|
||||||
|
adduser -S nodejs -u 1001
|
||||||
|
USER nodejs
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **定期更新基础镜像**
|
||||||
|
```dockerfile
|
||||||
|
FROM node:alpine # 使用最新的Alpine版本
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 附录A:Dockerfile完整内容
|
||||||
|
|
||||||
|
```dockerfile
|
||||||
|
# ==================== 阶段 1: 依赖安装阶段 ====================
|
||||||
|
FROM node:alpine AS builder
|
||||||
|
|
||||||
|
# 替换Alpine镜像源为阿里云镜像(解决网络问题)
|
||||||
|
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
|
||||||
|
|
||||||
|
# 安装 Prisma 运行时依赖
|
||||||
|
RUN apk add --no-cache openssl
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# 1. 复制依赖文件
|
||||||
|
COPY package*.json ./
|
||||||
|
|
||||||
|
# 2. 复制 Prisma Schema(用于生成Prisma Client)
|
||||||
|
COPY prisma ./prisma/
|
||||||
|
|
||||||
|
# 3. 只安装生产依赖(大幅减少网络传输和安装时间)
|
||||||
|
RUN npm config set registry https://registry.npmmirror.com && \
|
||||||
|
npm config set fetch-retry-mintimeout 20000 && \
|
||||||
|
npm config set fetch-retry-maxtimeout 120000 && \
|
||||||
|
npm config set fetch-retries 5 && \
|
||||||
|
npm ci --production --prefer-offline --no-audit
|
||||||
|
|
||||||
|
# 4. 生成 Prisma Client(生产环境需要)
|
||||||
|
RUN npx prisma generate
|
||||||
|
|
||||||
|
# 5. 复制本地已编译好的 dist 文件夹(跳过TypeScript编译)
|
||||||
|
COPY dist ./dist
|
||||||
|
|
||||||
|
# ==================== 阶段 2: 运行阶段 ====================
|
||||||
|
FROM node:alpine
|
||||||
|
|
||||||
|
# 替换Alpine镜像源为阿里云镜像(解决网络问题)
|
||||||
|
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
|
||||||
|
|
||||||
|
# 安装运行时依赖 + 时区数据
|
||||||
|
RUN apk add --no-cache \
|
||||||
|
openssl \
|
||||||
|
curl \
|
||||||
|
ca-certificates \
|
||||||
|
tzdata
|
||||||
|
|
||||||
|
# ⚠️ 统一时区:Asia/Shanghai
|
||||||
|
ENV TZ=Asia/Shanghai
|
||||||
|
|
||||||
|
# 创建非 root 用户(安全最佳实践)
|
||||||
|
RUN addgroup -g 1001 -S nodejs && \
|
||||||
|
adduser -S nodejs -u 1001
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# 从构建阶段复制产物
|
||||||
|
COPY --from=builder --chown=nodejs:nodejs /app/node_modules ./node_modules
|
||||||
|
COPY --from=builder --chown=nodejs:nodejs /app/dist ./dist
|
||||||
|
COPY --from=builder --chown=nodejs:nodejs /app/package*.json ./
|
||||||
|
COPY --from=builder --chown=nodejs:nodejs /app/prisma ./prisma
|
||||||
|
|
||||||
|
# 创建上传目录(用于临时文件)
|
||||||
|
RUN mkdir -p /app/uploads && chown -R nodejs:nodejs /app/uploads
|
||||||
|
|
||||||
|
# 切换到非 root 用户
|
||||||
|
USER nodejs
|
||||||
|
|
||||||
|
# 健康检查
|
||||||
|
HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
|
||||||
|
CMD node -e "require('http').get('http://localhost:3001/health', (res) => { process.exit(res.statusCode === 200 ? 0 : 1); })"
|
||||||
|
|
||||||
|
# 暴露端口
|
||||||
|
EXPOSE 3001
|
||||||
|
|
||||||
|
# 🔥 启动命令(仅启动应用,不执行数据库迁移)
|
||||||
|
CMD ["node", "dist/index.js"]
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 附录B:.dockerignore完整内容
|
||||||
|
|
||||||
|
```
|
||||||
|
# Node.js
|
||||||
|
node_modules
|
||||||
|
npm-debug.log
|
||||||
|
yarn-error.log
|
||||||
|
|
||||||
|
# 开发文件
|
||||||
|
.env
|
||||||
|
.env.*
|
||||||
|
*.local
|
||||||
|
|
||||||
|
# 构建产物(改进方案B:使用本地编译好的dist)
|
||||||
|
# dist # 暂时注释掉,允许复制本地dist
|
||||||
|
|
||||||
|
# 测试文件
|
||||||
|
test
|
||||||
|
tests
|
||||||
|
*.test.ts
|
||||||
|
*.spec.ts
|
||||||
|
coverage
|
||||||
|
|
||||||
|
# 文档和临时文件
|
||||||
|
docs
|
||||||
|
*.md
|
||||||
|
.vscode
|
||||||
|
.idea
|
||||||
|
.DS_Store
|
||||||
|
Thumbs.db
|
||||||
|
|
||||||
|
# 上传文件(运行时生成)
|
||||||
|
uploads/*
|
||||||
|
|
||||||
|
# Git
|
||||||
|
.git
|
||||||
|
.gitignore
|
||||||
|
|
||||||
|
# 日志
|
||||||
|
*.log
|
||||||
|
logs
|
||||||
|
|
||||||
|
# 临时文件
|
||||||
|
temp
|
||||||
|
tmp
|
||||||
|
*.swp
|
||||||
|
*.swo
|
||||||
|
*~
|
||||||
|
|
||||||
|
# 数据库文件(SQLite,如果有)
|
||||||
|
*.db
|
||||||
|
*.sqlite
|
||||||
|
|
||||||
|
# 脚本文件(仅开发使用)
|
||||||
|
scripts/*.ts
|
||||||
|
*.bat
|
||||||
|
*.ps1
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 附录C:相关文档
|
||||||
|
|
||||||
|
- [Node.js后端-SAE容器部署指南](./05-Node.js后端-SAE容器部署指南.md)
|
||||||
|
- [部署进度总览](./00-部署进度总览.md)
|
||||||
|
- [PostgreSQL数据库部署操作手册](./08-PostgreSQL数据库部署操作手册.md)
|
||||||
|
- [Python微服务-SAE部署操作手册](./09-Python微服务-SAE部署操作手册.md)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**文档维护者**: AI Assistant
|
||||||
|
**最后更新**: 2024-12-24
|
||||||
|
**版本**: v1.0
|
||||||
|
|
||||||
|
|
||||||
@@ -476,3 +476,4 @@ NAT网关成本¥100/月,对初创团队是一笔开销
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -381,3 +381,4 @@ curl http://你的SAE地址:3001/health
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -713,3 +713,4 @@ const job = await queue.getJob(jobId);
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -480,3 +480,4 @@ processLiteraturesInBackground(task.id, projectId, testLiteratures);
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -957,3 +957,4 @@ ROI = (¥22,556 - ¥144) / ¥144 × 100% = 15,564%
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1014,3 +1014,4 @@ Redis 实例:¥500/月
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -470,5 +470,6 @@ import { ChatContainer } from '@/shared/components/Chat';
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -47,3 +47,4 @@ models/
|
|||||||
*.onnx
|
*.onnx
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -33,5 +33,6 @@ __version__ = '1.0.0'
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -166,5 +166,6 @@ def get_missing_summary(df: pd.DataFrame) -> dict:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -126,5 +126,6 @@ def apply_filter(
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -292,3 +292,4 @@ def get_unpivot_preview(
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -300,5 +300,6 @@ if __name__ == "__main__":
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -66,5 +66,6 @@ except Exception as e:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -46,5 +46,6 @@ except Exception as e:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -67,3 +67,4 @@ vite.config.*.timestamp-*
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -34,3 +34,4 @@ exec nginx -g 'daemon off;'
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -190,3 +190,4 @@ http {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -535,5 +535,6 @@ export default FulltextDetailDrawer;
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -128,5 +128,6 @@ export const useAssets = (activeTab: AssetTabType) => {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -118,5 +118,6 @@ export const useRecentTasks = () => {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -317,5 +317,6 @@ export default DropnaDialog;
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -404,3 +404,4 @@ export default MetricTimePanel;
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -290,3 +290,4 @@ export default PivotPanel;
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -90,3 +90,4 @@ export function useSessionStatus({
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -80,5 +80,6 @@ export interface DataStats {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -76,5 +76,6 @@ export type AssetTabType = 'all' | 'processed' | 'raw';
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -31,5 +31,6 @@ export { default as Placeholder } from './Placeholder';
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
1
frontend-v2/src/vite-env.d.ts
vendored
1
frontend-v2/src/vite-env.d.ts
vendored
@@ -13,3 +13,4 @@ interface ImportMeta {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -33,5 +33,6 @@ __version__ = '1.0.0'
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user