# AI临床研究平台 - 阿里云部署架构总览 > **文档版本?* v1.0 > **创建日期?* 2025-12-14 > **目标环境?* 阿里?SAE + RDS PostgreSQL 15 + OSS > **架构类型?* 云原?Serverless + 容器化微服务 > **适用团队?* 1-2人初创团??10人成长团? --- ## 📋 目录 1. [架构全景图](#架构全景? 2. [5个核心模块关系](#5个核心模块关? 3. [模块与阿里云服务映射](#模块与阿里云服务映射) 4. [开发环境与部署环境](#开发环境与部署环境) 5. [Docker版本管理策略](#docker版本管理策略) 6. [线上故障快速修复](#线上故障快速修? 7. [部署文档导航](#部署文档导航) --- ## 架构全景? ### 1. 逻辑架构(用户视角) ``` ┌─────────────────────────────────────────────────────────────────────?? 用户浏览器(Browser? ?? https://your-domain.com ?└────────────────────────────────┬────────────────────────────────────? ? ┌────────────▼───────────────? ? 前端 SPA (React 19) ? ? - 用户界面 ? ? - 路由管理 ? ? - API调用 ? └────────────┬───────────────? ? ┌──────────────────┼──────────────────? ? ? ? ┌─────────▼──────? ┌───────▼───────? ┌──────▼──────────? ? Node.js后端 ? ?Python微服? ? ? Dify RAG平台 ? ? (Fastify) ? ? (FastAPI) ? ? (知识库检? ? ? ? ? ? ? ? ?- 业务逻辑 ? ?- PDF解析 ? ?- 文档上传 ? ?- 权限控制 ? ?- 数据清洗 ? ?- 向量检? ? ?- API聚合 ? ?- 文件提取 ? ?- LLM对话 ? └────────┬───────? └───────┬───────? └──────┬──────────? ? ? ? ? ? ? └──────────────────┼──────────────────? ? ┌───────────▼────────────? ? PostgreSQL 15 数据? ? ? (RDS) ? ? ? ? - 10个Schema隔离 ? ? - pg-boss任务队列 ? ? - Postgres-Only架构 ? └────────────────────────?``` ### 2. 物理架构(阿里云资源? ``` ┌───────────────────────────────────────────────────────────────────────────?? 阿里?VPC(专有网络) ?? 172.16.0.0/12(内网隔离) ?├───────────────────────────────────────────────────────────────────────────?? ?? ┌─────────────────────────────────────────────────────────────────? ?? ? SAE (Serverless Application Engine) ? ?? ? 容器化应用部署平? ? ?? ├─────────────────────────────────────────────────────────────────? ?? ? ? ?? ? ┌───────────────? ┌───────────────? ┌──────────────────? ? ?? ? ? 前端Nginx ? ?Node.js后端 ? ?Python微服? ? ? ?? ? ? 容器应用 ? ? 容器应用 ? ? 容器应用 ? ? ?? ? ├───────────────? ├───────────────? ├──────────────────? ? ?? ? ?Nginx 1.25 ? ?Node.js 22 ? ?Python 3.11 ? ? ?? ? ?React构建产物 ? ?Fastify 5 ? ?FastAPI 0.104 ? ? ?? ? ?健康检?路由 ? ?Prisma 6 ? ?PyMuPDF/Polars ? ? ?? ? └───────┬───────? └───────┬───────? └────────┬─────────? ? ?? ? ? ? ? ? ?? ? ? 内网调用 ? 内网调用 ? ? ?? ? └──────────────────┴───────────────────? ? ?? ? ? ? ?? └─────────────────────────────┼─────────────────────────────────? ?? ? ?? ┌──────────────────────────────────────────────────────────? ?? ? ?NAT网关 + EIP(公网出口,必需? ? ?? ├──────────────────────────────────────────────────────────? ?? ? - 为SAE提供公网访问能力 ? ?? ? - 后端调用DeepSeek/OpenAI API ? ?? ? - Python下载公网PDF ? ?? ? - npm install公网依赖 ? ?? ? - 成本:NAT网关¥60/?+ EIP流量? ? ?? ? - ⚠️ 没有NAT网关,AI功能全部超时? ? ?? └──────────────────────────────────────────────────────────? ?? ? ?? ┌─────────────────────────────▼──────────────────────────? ?? ? RDS PostgreSQL 15(云数据库) ? ?? ? rds.pg.s2.large (2?GB) ? ?? ├────────────────────────────────────────────────────────? ?? ? - 数据库名:ai_clinical_research ? ?? ? - 用户:aiclinical_rw(应用专用账号) ? ?? ? - 内网地址:rm-xxxxx.pg.rds.aliyuncs.com:5432 ? ?? ? - 自动备份:每天凌??+ 日志备份(PITR? ? ?? ? - 白名单:172.16.0.0/12(SAE的VPC网段? ? ?? └────────────────────────────────────────────────────────? ?? ?? ┌──────────────────────────────────────────────────────────? ?? ? OSS (Object Storage Service) 对象存储 ? ?? ? Bucket: aiclinical-data-prod ? ?? ├──────────────────────────────────────────────────────────? ?? ? - 用户上传文件(PDF、Word、Excel? ? ?? ? - 文献数据(ASL模块? ? ?? ? - 数据清洗结果(DC模块? ? ?? ? - 数据库备份归档(可选) ? ?? ? - 访问方式:SDK(内网免流量费) ? ?? └──────────────────────────────────────────────────────────? ?? ?└───────────────────────────────────────────────────────────────────────? ┌───────────────────────────────────────────────────────────────────────────?? 独立 ECS 服务器(Dify部署? ?? ecs.c6.xlarge (4?GB) ?├───────────────────────────────────────────────────────────────────────────?? ┌──────────────────────────────────────────────────────────────? ?? ? Dify RAG 平台 (Docker Compose) ? ?? ├──────────────────────────────────────────────────────────────? ?? ? - Dify API (dify/api:0.6.13) ? ?? ? - Dify Web (dify/web:0.6.13) ? ?? ? - PostgreSQL 15 (postgres:15-alpine,Dify专用数据? ? ?? ? - Redis (redis:6-alpine,Dify缓存) ? ?? ? - Weaviate (向量数据? ? ?? ? - Nginx (路由层,处理CORS) ? ?? ? - Sandbox (代码执行沙箱) ? ?? ? ? ?? ? 内网地址:http://172.16.x.x(通过VPC与SAE互联? ? ?? └──────────────────────────────────────────────────────────────? ?? ?└───────────────────────────────────────────────────────────────────────────?``` ### 3. 数据流向? ``` 用户上传文件 ? ├──?前端 (React) ? ? ? ├──?/api/v1/pkb/documents (上传到知识库) ? ? ? ? ? ├──?Node.js后端 ? ? ? ? ? ? ? ├──?OSS (存储原始文件) ? ? ? └──?Dify API (创建文档向量) ? ? ? ? ? ? ? └──?Weaviate (存储向量) ? ? ? ? ? └──?RDS (存储元数? ? ? ? ├──?/api/v1/asl/literatures (文献筛? ? ? ? ? ? ├──?Node.js后端 ? ? ? ? ? ? ? ├──?Python微服?(PDF解析) ? ? ? ? ? ? ? ? ? └──?OSS (读取PDF) ? ? ? ? ? ? ? └──?RDS (存储文献数据) ? ? ? ? ? └──?返回解析结果 ? ? ? └──?/api/v1/dc/extraction (数据清洗) ? ? ? ├──?Node.js后端 ? ? ? ? ? ├──?Python微服?(Polars数据处理) ? ? ? ? ? ? ? └──?OSS (读取Excel/CSV) ? ? ? ? ? └──?RDS (存储清洗结果) ? ? ? └──?返回清洗结果 ? └──?展示结果 ``` --- ## 5个核心模块关? ### 1. 模块依赖关系? ``` ┌─────────────────────────────────────────────────────────────────?? 核心依赖层级 (从下到上) ?└─────────────────────────────────────────────────────────────────? L4: 用户界面?┌──────────────────────────────────────────────────────?? 前端 (React 19 + Vite 7) ?? - 调用 Node.js后端?REST API ?? - 不直接调?Python微服务和Dify ?? - 通过反向代理 (/api/) 路由到后? ?└──────────────────────────────────────────────────────? ? ?HTTP/HTTPS ?───────────────────────────────────────────────────────── L3: 业务逻辑?┌──────────────────────────────────────────────────────?? Node.js 后端 (Fastify + Prisma) ?? - 业务逻辑聚合 ?? - 权限控制 ?? - 调用 Python微服?(内网HTTP) ?? - 调用 Dify API (内网HTTP) ?? - 数据库访?(Prisma ORM) ?└──────────────────────────────────────────────────────? ? ? ? ? ? ? ?(内网) ?(内网) ?(Prisma) ? ? ? ┌──────┴────────? ┌──────┴──────? ┌────▼──────? ?Python微服? ? ? Dify平台 ? ?PostgreSQL? └───────────────? └─────────────? └───────────? ───────────────────────────────────────────────────────── L2: 能力支撑?┌────────────────────────────? ┌────────────────────────────?? Python 微服? ? ? Dify RAG 平台 ?? (FastAPI + PyMuPDF) ? ? (知识?+ LLM) ?├────────────────────────────? ├────────────────────────────?? - PDF解析 (ASL模块) ? ? - 文档上传分块 ?? - Docx/Txt提取 (ASL) ? ? - Embedding向量? ?? - 数据清洗 (DC模块) ? ? - 向量检? ?? - Polars数据处理 ? ? - LLM对话生成 ?? - OCR识别 (Nougat) ? ? - RAG流程编排 ?? ? ? ?? 依赖? ? ? 依赖? ?? - OSS (读取文件) ? ? - Weaviate (向量存储) ?? - RDS (存储结果,可? ? ? - PostgreSQL (Dify专用) ?? ? ? - Redis (Dify缓存) ?└────────────────────────────? └────────────────────────────? ? ? ? ? └────────────┬───────────────────? ?───────────────────────────────────────────────────────── L1: 基础设施?┌────────────────────? ┌────────────────? ┌──────────────?? PostgreSQL 15 ? ? OSS对象存储 ? ? Redis (可? ?? (RDS) ? ? (文件存储) ? ? (Dify专用) ?├────────────────────? ├────────────────? ├──────────────??- 10个Schema隔离 ? ?- PDF文件 ? ?- Dify缓存 ??- pg-boss任务队列 ? ?- Word/Excel ? ?- Dify会话 ??- 用户数据 ? ?- 文献数据 ? ? ??- 业务数据 ? ?- 清洗结果 ? ?(初期不需? ??- Prisma ORM访问 ? ?- SDK访问 ? ? Redis,可? ?? ? ?- 内网免流? ? ? Postgres替代)?└────────────────────? └────────────────? └──────────────?``` ### 2. 模块间调用关系表 | 调用?| 被调用方 | 调用方式 | 调用目的 | 网络 | |--------|---------|---------|---------|------| | **前端** | Node.js后端 | HTTP REST API | 所有业务功?| 公网(HTTPS?| | **Node.js后端** | Python微服?| HTTP REST API | PDF解析、数据清?| 内网(VPC?| | **Node.js后端** | Dify API | HTTP REST API | 知识库管理、RAG检?| 内网(VPC?| | **Node.js后端** | PostgreSQL | Prisma ORM | 数据CRUD、事?| 内网(VPC?| | **Node.js后端** | OSS | SDK (ali-oss) | 文件上传/下载 | 内网(VPC?| | **Python微服?* | OSS | SDK (oss2) | 读取PDF/Excel | 内网(VPC?| | **Python微服?* | PostgreSQL | 可选(直接SQL?| 读取配置数据 | 内网(VPC?| | **Dify** | Weaviate | gRPC | 向量存储/检?| 本地(Dify内部?| | **Dify** | PostgreSQL | 原生驱动 | Dify元数?| 本地(Dify内部?| | **Dify** | Redis | 原生驱动 | Dify缓存 | 本地(Dify内部?| **关键原则?* - ?**单一入口**:前端只调用 Node.js后端,不直接调用其他服务 - ?**内网通信**:SAE内部服务通过内网互联(免流量费,低延迟) - ?**服务隔离**:Dify独立部署在ECS,通过内网暴露API - ?**数据持久?*:核心数据统一存储在RDS,文件存储在OSS ### 3. 模块责任边界 | 模块 | 核心职责 | 不负?| |------|---------|--------| | **前端** | - 用户交互
- 页面渲染
- 路由管理
- API调用 | ?业务逻辑
?权限校验
?直接访问数据?OSS | | **Node.js后端** | - 业务逻辑聚合
- 权限控制
- API网关
- 数据库访?br>- 调度微服?| ?PDF解析
?数据清洗
?向量检?| | **Python微服?* | - PDF解析
- 文档提取
- 数据清洗
- OCR识别 | ?业务逻辑
?权限控制
?数据库CRUD | | **Dify平台** | - 知识库管?br>- 向量存储
- RAG检?br>- LLM对话 | ?用户认证
?业务数据存储
?权限管理 | | **PostgreSQL** | - 业务数据持久?br>- 事务管理
- 任务队列(pg-boss?| ?文件存储
?缓存(可选) | | **OSS** | - 文件存储
- 静态资?br>- 备份归档 | ?结构化数?br>?实时计算 | --- ## 模块与阿里云服务映射 ### 1. 服务映射? | 核心模块 | 阿里云服?| 规格配置 | 成本估算 | 部署文档 | |---------|-----------|---------|---------|---------| | **前端 (React)** | SAE容器实例 | 0.5?GB × 1实例 | ¥50/?| [06-前端Nginx-SAE容器部署指南](./06-前端Nginx-SAE容器部署指南.md) | | **Node.js后端** | SAE容器实例 | 1?GB × 2实例(弹性) | ¥200/?| [05-Node.js后端-SAE容器部署指南](./05-Node.js后端-SAE容器部署指南.md) | | **Python微服?* | SAE容器实例 | 1?GB × 1实例(⚠?如OOM升至4GB?| ¥100-200/?| [04-Python微服?SAE容器部署指南](./04-Python微服?SAE容器部署指南.md) | | **Dify平台** | ECS服务?| 4?GB(独立) | ¥300/?| [03-Dify-ECS部署完全指南](./03-Dify-ECS部署完全指南.md) | | **PostgreSQL 15** | RDS PostgreSQL | 2?GB (rds.pg.s2.large) | ¥400/?| [PostgreSQL部署策略-摸底报告](./PostgreSQL部署策略-摸底报告.md) | | **文件存储** | OSS标准存储 | 按量付费?0GB?| ¥10/?| (各模块文档中包含) | | **?NAT网关** | NAT网关 + EIP | 小规格NAT + 按量EIP | ¥60-100/?| ⚠️ **必需**(SAE访问公网?| | **容器镜像** | ACR容器镜像仓库 | 个人版(免费?| ¥0/?| (各模块文档中包含) | | **VPC网络** | VPC专有网络 | 默认配置 | ¥0/?| (各模块文档中包含) | | **域名/CDN** | (可选)未来配置 | - | ¥50/?| - | **总成本估算:** ¥1,200-1,350/月(初期配置,含NAT网关? ⚠️ **成本优化说明?* - NAT网关(?00/月)是生产环境标配,不建议省?- 替代方案:SAE绑定EIP(?0-50/月,部分地域支持,稳定性较差)或ECS做SNAT(?,配置复杂,不推荐) - Python服务如遇OOM,需升级?GB内存(增加?00/月) ### 2. SAE?个模块的关系 #### 2.1 SAE部署的模块(3个) ``` ┌────────────────────────────────────────────────────────────────?? SAE (Serverless Application Engine) ?? 弹性伸?+ 按需付费 ?├────────────────────────────────────────────────────────────────?? ?? ┌──────────────────? ┌──────────────────? ┌──────────────┐│ ? ? 前端Nginx容器 ? ?Node.js后端容器 ? ?Python容器 ││ ? ├──────────────────? ├──────────────────? ├──────────────┤│ ? ?实例数:1 ? ?实例数:2-10 ? ?实例数:1-3 ││ ? ?CPU: 0.5? ? ?CPU: 1? ? ?CPU: 1? ││ ? ?内存: 1GB ? ?内存: 2GB ? ?内存: 2GB ││ ? ?健康检? / ? ?健康检? /health? ?健康检? /health││ ? ?自动伸缩: 关闭 ? ?自动伸缩: 开? ? ?自动伸缩: 开启│?? └──────────────────? └──────────────────? └──────────────┘│ ? ?? 共同特性: ?? ?Docker容器部署(镜像从ACR拉取? ?? ?内网互联(免流量费) ?? ?自动扩缩容(基于CPU/内存/QPS? ?? ?滚动发布(零停机部署? ?? ?健康检查(自动重启异常实例? ?? ?日志自动收集(stdout/stderr ?SLS? ?? ?环境变量注入(DATABASE_URL等敏感信息) ?? ?└────────────────────────────────────────────────────────────────?``` **SAE的核心价值:** 1. **弹性伸?*:流量高峰自动扩容,低谷自动缩容 2. **按需付费**:只为实际使用的资源付费 3. **零运?*:无需管理服务器,自动故障转移 4. **快速部?*:从镜像启动实例<30? #### 2.2 非SAE部署的模块(2个) | 模块 | 部署方式 | 原因 | |------|---------|------| | **Dify平台** | ECS + Docker Compose | - 服务复杂?个容器)
- 需要稳定IP(内网调用)
- 独立数据?Redis
- 不需要弹性伸?| | **PostgreSQL 15** | RDS托管服务 | - 企业级数据库
- 自动备份/PITR
- 高可用(主从?br>- 无需自己运维 | ### 3. OSS?个模块的关系 #### 3.1 OSS使用场景 | 模块 | 使用OSS的场?| ??| Bucket目录结构 | |------|--------------|-------|---------------| | **Node.js后端** | - 用户上传文件
- 文档管理
- 临时文件中转 | ??| `/uploads/{userId}/{fileId}.pdf` | | **Python微服?* | - 读取PDF进行解析
- 读取Excel进行清洗
- 写入处理结果 | ??| `/asl/literatures/`
`/dc/extracted/` | | **Dify平台** | - (可选)上传文档到OSS
- Dify内部使用本地存储 | 不使?| - | | **前端** | - 不直接访问OSS
- 通过后端API上传/下载 | 不使?| - | | **PostgreSQL** | - (可选)备份归档到OSS | 不使?| `/backups/` | #### 3.2 OSS Bucket设计 ``` aiclinical-data-prod (Bucket名称) ?├── uploads/ # 用户上传的原始文?? ├── {userId}/ ? ? ├── {fileId}.pdf ? ? ├── {fileId}.docx ? ? └── {fileId}.xlsx ? ?├── asl/ # ASL智能文献模块 ? ├── literatures/ # 文献PDF ? ? └── {projectId}/{litId}.pdf ? ├── extracted/ # 提取的文?? ? └── {projectId}/{litId}.json ? ?├── dc/ # DC数据清洗模块 ? ├── raw/ # 原始数据文件 ? ? └── {taskId}/data.xlsx ? ├── cleaned/ # 清洗后的数据 ? ? └── {taskId}/result.xlsx ? ?├── pkb/ # PKB个人知识库模?? ├── documents/ # 知识库文?? ? └── {kbId}/{docId}.pdf ? ?└── backups/ # 数据库备份(可选) └── {date}/ai_clinical_research.sql.gz ``` **OSS配置要点?* - ?**内网访问**:SAE通过内网访问OSS(免流量费) - ?**权限控制**:使用RAM角色授权,不暴露AccessKey - ?**生命周期**:临时文?0天后自动删除 - ?**跨域配置**:如果前端直传,需配置CORS ### 4. RDS?个模块的关系 #### 4.1 RDS访问权限 | 模块 | 数据库名?| 访问用户 | 权限 | 连接方式 | |------|-----------|---------|------|---------| | **Node.js后端** | ai_clinical_research | aiclinical_rw | SELECT/INSERT/UPDATE/DELETE | Prisma ORM | | **Python微服?* | ai_clinical_research | aiclinical_rw(可选) | SELECT(只读配置) | psycopg2(可选) | | **Dify平台** | ?不使用主RDS | - | - | Dify使用独立PostgreSQL | | **前端** | ?不直接访?| - | - | 通过后端API | | **PostgreSQL** | - | postgres(超级用户) | ALL | 仅用于迁?备份 | **连接池配置:** ``` 总连接数?00(RDS默认?├── Node.js后端?00 (2实例 × 10连接/实例,预?80) ├── Python微服务:50 (1实例 × 5连接/实例,预?5) ├── pg-boss?0 (后台任务) ├── 预留?00 (管理、备份、临时扩? ``` --- ## 开发环境与部署环境 ### 1. 环境对比? | 维度 | 本地开发环?| 阿里云部署环?| |------|-------------|---------------| | **前端** | Vite Dev Server (localhost:3000) | SAE Nginx容器 (HTTPS) | | **Node.js后端** | tsx watch (localhost:3001) | SAE容器 (内网 + 公网) | | **Python微服?* | uvicorn (localhost:8000) | SAE容器 (内网) | | **Dify平台** | Docker Compose (localhost) | ECS Docker Compose (内网) | | **PostgreSQL** | Docker (localhost:5432) | RDS (内网地址) | | **OSS** | 本地文件系统 (./uploads) | 阿里云OSS | | **Redis** | ?不使用(Postgres-Only?| ?不使用(Dify独立Redis?| ### 2. 开发与部署的平滑迁? #### 2.1 配置管理策略 ``` 项目根目? ?├── backend/ ? ├── .env.local # 本地开发配置(不提交Git?? ├── .env.example # 配置模板(提交Git?? └── src/config/env.ts # 配置加载逻辑 ?├── frontend-v2/ ? ├── .env.local # 本地开发配?? ├── .env.production # 生产环境配置模板 ? └── vite.config.ts # Vite配置 ?└── extraction_service/ ├── .env.local # 本地开发配? └── app/config.py # Python配置加载 ``` **配置加载优先级:** ``` 环境变量 > .env.local > .env > 代码默认?``` #### 2.2 环境变量对比 **本地开?(`.env.local`)?* ```bash # 数据?DATABASE_URL=postgresql://postgres:postgres@localhost:5432/ai_clinical_research # 存储 STORAGE_TYPE=local LOCAL_STORAGE_DIR=./uploads # 缓存/队列 CACHE_TYPE=memory QUEUE_TYPE=memory # 微服?DIFY_API_URL=http://localhost/v1 EXTRACTION_SERVICE_URL=http://localhost:8000 ``` **阿里云部署(SAE环境变量配置):** ```bash # 数据库(⚠️ 敏感信息,SAE加密存储?DATABASE_URL=postgresql://aiclinical_rw:强密码@rm-xxxxx.pg.rds.aliyuncs.com:5432/ai_clinical_research?connection_limit=10&pool_timeout=10 # 存储(OSS?STORAGE_TYPE=oss OSS_REGION=cn-hangzhou OSS_BUCKET=aiclinical-data-prod OSS_ACCESS_KEY_ID=LTAI5***(SAE环境变量?OSS_ACCESS_KEY_SECRET=***(SAE加密? # 缓存/队列(Postgres-Only?CACHE_TYPE=postgres QUEUE_TYPE=pgboss # 微服务(内网地址)⚠?使用内网IP,不要用.sae域名 DIFY_API_URL=http://172.16.x.x/v1 EXTRACTION_SERVICE_URL=http://172.16.x.x:8000 # ⚠️ 注意?# - 172.16.x.x 需要替换为实际的内网IP # - 获取方式:SAE控制?> 应用详情 > 实例列表 > 查看内网IP # - ?不要使用 .sae ?.cluster.local 域名(K8s服务发现需要额外配置) # 生产环境标识 NODE_ENV=production ``` ### 3. 持续部署流程(CI/CD? #### 3.1 整体流程? ``` ┌──────────────────────────────────────────────────────────────────?? 开发者本地开? ?? 1. 修改代码 ?? 2. 本地测试(npm run dev / pytest? ?? 3. Git提交(git commit -m "feat: xxx"? ?? 4. 推送到远程仓库(git push origin main? ?└────────────────────────────┬─────────────────────────────────────? ? ?┌──────────────────────────────────────────────────────────────────?? CI/CD 流水线(未来:GitHub Actions? ?? ┌────────────────────────────────────────────────────────────??? ?Stage 1: 构建与测? ??? ├────────────────────────────────────────────────────────────??? ? - npm install / pip install ??? ? - npm run build / docker build ??? ? - npm test / pytest ??? ? - Lint检?(eslint / flake8) ??? └────────────────────────────────────────────────────────────??? ? ?? ? ?? ┌────────────────────────────────────────────────────────────??? ?Stage 2: Docker镜像构建 ??? ├────────────────────────────────────────────────────────────??? ? - docker build -t frontend:v1.2.3 ??? ? - docker build -t backend:v1.2.3 ??? ? - docker build -t python-service:v1.2.3 ??? └────────────────────────────────────────────────────────────??? ? ?? ? ?? ┌────────────────────────────────────────────────────────────??? ?Stage 3: 推送到ACR容器镜像仓库 ??? ├────────────────────────────────────────────────────────────??? ? - docker tag ... registry.cn-hangzhou.aliyuncs.com/... ??? ? - docker push registry.cn-hangzhou.aliyuncs.com/... ??? └────────────────────────────────────────────────────────────??? ? ?? ? ?? ┌────────────────────────────────────────────────────────────??? ?Stage 4: 部署到SAE ??? ├────────────────────────────────────────────────────────────??? ? - SAE触发滚动部署 ??? ? - 健康检?-> 切换流量 ??? ? - 自动回滚(如果失败) ??? └────────────────────────────────────────────────────────────??└──────────────────────────────────────────────────────────────────? ? ?┌──────────────────────────────────────────────────────────────────?? 生产环境运行 ?? - 健康检查监? ?? - 日志收集分析 ?? - 性能指标监控 ?└──────────────────────────────────────────────────────────────────?``` #### 3.2 初期手工部署流程(推荐) **阶段1:初期(1-2人团队,?个月?* ```bash # ===== 前端部署 ===== cd frontend-v2 npm run build # 构建生产版本 docker build -t frontend:v1.0.0 . # 构建Docker镜像 docker tag frontend:v1.0.0 registry.cn-hangzhou.aliyuncs.com/your-namespace/frontend:v1.0.0 docker push registry.cn-hangzhou.aliyuncs.com/your-namespace/frontend:v1.0.0 # 在SAE控制台点?部署" -> 选择新镜?-> 确认 # ===== 后端部署 ===== cd backend npm run build # 编译TypeScript docker build -t backend:v1.0.0 . docker tag backend:v1.0.0 registry.cn-hangzhou.aliyuncs.com/your-namespace/backend:v1.0.0 docker push registry.cn-hangzhou.aliyuncs.com/your-namespace/backend:v1.0.0 # 在SAE控制台点?部署" -> 选择新镜?-> 确认 # ===== Python微服务部?===== cd extraction_service docker build -t python-service:v1.0.0 . docker tag python-service:v1.0.0 registry.cn-hangzhou.aliyuncs.com/your-namespace/python-service:v1.0.0 docker push registry.cn-hangzhou.aliyuncs.com/your-namespace/python-service:v1.0.0 # 在SAE控制台点?部署" -> 选择新镜?-> 确认 ``` **优势?* - ?简单直接,学习成本?- ?完全可控,出错容易排?- ?无需配置CI/CD工具 **阶段2:成长期?-10人团队,3个月后)** 配置GitHub Actions或阿里云云效自动化部署? #### 3.3 部署频率建议 | 模块 | 部署频率 | 建议时间 | 回滚策略 | |------|---------|---------|---------| | **前端** | 每周1-2?| 周五下午 | SAE一键回滚(保留3个版本) | | **Node.js后端** | 每周1-2?| 周五下午 | SAE一键回?+ 数据库回滚脚?| | **Python微服?* | ???| 周五下午 | SAE一键回?| | **Dify平台** | 按需(很少) | 周末 | Docker Compose重启旧镜?| | **PostgreSQL** | 按需(迁移) | 周末凌晨 | RDS快照恢复 | ### 4. 开发到部署的检查清? #### 4.1 代码准备 ``` ?1. 本地测试通过 ├─ npm run dev / uvicorn正常运行 ├─ 核心功能手工测试 └─ 单元测试/集成测试通过(如果有? ?2. 代码审查 ├─ Lint检查通过(eslint / flake8? ├─ 代码格式化(prettier / black? └─ 无敏感信息泄漏(.env文件不提交) ?3. 环境变量确认 ├─ 所有生产环境变量已配置到SAE ├─ 数据库连接字符串正确(含connection_limit? └─ OSS/Dify等外部服务地址正确 ``` #### 4.2 Docker镜像构建 ``` ?4. Dockerfile优化 ├─ 使用多阶段构建(减小镜像体积? ├─ 基础镜像版本固定(如 node:22-alpine,不用latest? ├─ 非root用户运行(安全) └─ 健康检查配置正? ?5. 镜像构建与测? ├─ docker build成功 ├─ docker run本地测试通过 ├─ 镜像大小合理(前?100MB,后?300MB,Python<1GB? └─ 镜像打标签(版本号) ``` #### 4.3 部署到SAE ``` ?6. 部署前准? ├─ 备份数据库(RDS手动快照? ├─ 通知团队(如果是重大变更? └─ 准备回滚方案 ?7. SAE部署 ├─ 推送镜像到ACR ├─ SAE选择新镜像版? ├─ 滚动发布(灰度发布,逐个实例替换? └─ 观察日志和监? ?8. 部署后验? ├─ 健康检查端点返?00 ├─ 核心功能冒烟测试 ├─ 日志无ERROR └─ 监控指标正常(CPU/内存/响应时间? ?9. 回滚准备(如果失败) ├─ SAE一键回滚到上一版本 ├─ 数据库恢复快照(如果有Schema变更? └─ 排查问题日志 ``` --- ## Docker版本管理策略 ### 1. 镜像版本命名规范 #### 1.1 语义化版?(Semantic Versioning) ``` 格式:{服务名}:{主版本}.{次版本}.{修订版本}[-{环境}] 示例?frontend:1.0.0 # 生产版本 frontend:1.0.0-dev # 开发版?frontend:1.1.0 # 功能更新 frontend:1.1.1 # Bug修复 ``` **版本号规则:** - **主版?(Major)**:重大架构变更,不兼容旧版本(如 1.x.x ?2.x.x?- **次版?(Minor)**:新增功能,向下兼容(如 1.0.x ?1.1.x?- **修订版本 (Patch)**:Bug修复,完全兼容(?1.0.0 ?1.0.1? #### 1.2 标签策略 | 标签类型 | 示例 | 用?| 保留策略 | |---------|------|------|---------| | **版本?* | `v1.2.3` | 正式发布版本 | 永久保留 | | **latest** | `latest` | 最新稳定版 | 自动更新 | | **dev** | `dev` | 开发测试版 | 滚动保留最?0?| | **Git SHA** | `sha-a1b2c3d` | 特定提交版本 | 按需保留 | | **日期** | `20251214` | 按日期归?| 保留30?| **完整示例?* ```bash # 构建时打多个标签 docker build -t frontend:v1.2.3 \ -t frontend:latest \ -t frontend:sha-a1b2c3d \ -t frontend:20251214 \ . # 推送到ACR docker tag frontend:v1.2.3 registry.cn-hangzhou.aliyuncs.com/aiclinical/frontend:v1.2.3 docker tag frontend:v1.2.3 registry.cn-hangzhou.aliyuncs.com/aiclinical/frontend:latest docker push registry.cn-hangzhou.aliyuncs.com/aiclinical/frontend:v1.2.3 docker push registry.cn-hangzhou.aliyuncs.com/aiclinical/frontend:latest ``` ### 2. 本地版本管理 #### 2.1 本地是否需要版本管理? **答案:初期不需要,成长期建议轻量管理?* | 阶段 | 本地管理策略 | 原因 | |------|-------------|------| | **初期?-2人)** | ?不需?| - 开发者少,口头协调即?br>- 本地镜像只用于测?br>- 直接推送到ACR统一管理 | | **成长期(3-10人)** | ?轻量管理 | - 使用Git标签管理版本
- `package.json`/`pyproject.toml`记录版本
- 本地镜像定期清理 | #### 2.2 本地镜像清理 ```bash # 查看本地镜像 docker images | grep frontend # 删除未使用的镜像(保留最?个版本) docker image prune -a --filter "until=720h" # 删除30天前的镜? # 删除所有未使用的镜像(危险,慎用) docker image prune -a ``` **建议清理频率?* - 开发机:每周清理一?- CI/CD服务器:每次构建后自动清? ### 3. ACR容器镜像仓库管理 #### 3.1 镜像仓库结构 ``` 阿里云容器镜像服?(ACR) ├── 命名空间: aiclinical(团队共享) ? ?? ├── 仓库: frontend ? ? ├── latest(自动更新) ? ? ├── v1.0.0 ? ? ├── v1.0.1 ? ? ├── v1.1.0 ? ? └── ... (保留最?0个版? ? ?? ├── 仓库: backend ? ? ├── latest ? ? ├── v1.0.0 ? ? ├── v1.0.1 ? ? └── ... ? ?? ├── 仓库: python-service ? ? ├── latest ? ? ├── v1.0.0 ? ? └── ... ? ?? └── 仓库: dify (可选,如果自定义构? ? └── v0.6.13 ?└── 个人版免费配额:3个命名空间,无限仓库数,300GB存储/?``` #### 3.2 镜像生命周期管理 **保留策略?* ```yaml 规则1: 保留最新的20个版本标?规则2: 保留所有带"v"前缀的正式版本(v1.0.0、v1.1.0等) 规则3: 自动清理30天前的dev/test标签 规则4: latest标签永久保留 ``` **ACR配置示例(控制台配置):** ``` 容器镜像服务 > 仓库管理 > frontend > 生命周期规则 ├─ 规则1: 保留最?0个版?? ├─ 类型: 按数量保?? ├─ 保留数量: 20 ? └─ 标签匹配: * ?└─ 规则2: 清理旧的dev标签 ├─ 类型: 按时间清? ├─ 保留时间: 30? └─ 标签匹配: *-dev ``` ### 4. 版本与Git的关? #### 4.1 Git标签与Docker标签同步 ```bash # 开发流?git add . git commit -m "feat: add user profile page" git push origin main # 发布版本时创建Git标签 git tag -a v1.2.3 -m "Release v1.2.3: Add user profile" git push origin v1.2.3 # 构建Docker镜像(版本号与Git标签一致) docker build -t frontend:v1.2.3 . docker tag frontend:v1.2.3 registry.cn-hangzhou.aliyuncs.com/aiclinical/frontend:v1.2.3 docker push registry.cn-hangzhou.aliyuncs.com/aiclinical/frontend:v1.2.3 ``` #### 4.2 自动版本号管理(可选) **方法1:从 `package.json` 读取版本?* ```json // frontend-v2/package.json { "name": "aiclinical-frontend", "version": "1.2.3", ... } ``` ```bash # 构建脚本自动读取版本?VERSION=$(node -p "require('./package.json').version") docker build -t frontend:v$VERSION . ``` **方法2:从Git提交SHA生成版本?* ```bash # 使用Git SHA作为版本号(适合CI/CD?GIT_SHA=$(git rev-parse --short HEAD) docker build -t frontend:sha-$GIT_SHA . ``` ### 5. 版本管理工具推荐 | 工具 | 用?| 适用阶段 | |------|------|---------| | **Git Tags** | 代码版本管理 | ?所有阶?| | **package.json/pyproject.toml** | 应用版本声明 | ?所有阶?| | **Docker Labels** | 镜像元数据标?| ?成长? | | **语义化版本工?(semantic-release)** | 自动版本号生?| 可选(成熟期) | | **Harbor/ACR版本管理** | 镜像仓库治理 | ?成长? | --- ## 线上故障快速修? ### 1. 故障分级与修复策? | 故障等级 | 影响范围 | 修复策略 | 预期RTO | 示例 | |---------|---------|---------|---------|------| | **P0(致命)** | 全站不可?| 立即回滚 | <5分钟 | 数据库连接失败、应用启动失?| | **P1(严重)** | 核心功能不可?| 回滚或热修复 | <30分钟 | 用户无法登录、文件上传失?| | **P2(一般)** | 部分功能异常 | 热修复或下个版本 | <2小时 | 某个页面报错、样式错?| | **P3(轻微)** | 用户体验问题 | 下个版本修复 | <1?| 文案错误、图标缺?| ### 2. 修复方案对比 | 修复方法 | 适用场景 | 操作步骤 | 优点 | 缺点 | 推荐?| |---------|---------|---------|------|------|--------| | **方案1:SAE一键回?* | P0/P1故障 | SAE控制台点?回滚" | ?最快(<5分钟?br>?零风?| ?回到旧版本,新功能丢?| ⭐⭐⭐⭐?| | **方案2:热修复(重新部署完整镜像)** | P1/P2故障 | 修改代码→构建镜像→推送→部署 | ?彻底修复
?保留新功?| ?慢(10-30分钟?br>?需要完整构?| ⭐⭐⭐⭐ | | **方案3:单文件热更新(不推荐)** | ?不推?| SSH进容器→修改文件 | ??| ?容器重启后丢?br>?无版本记?br>?违反Docker理念 | ?| | **方案4:配置热更新** | 配置错误 | SAE环境变量→重启应?| ?快(<5分钟?br>?无需重新构建 | ?只适用于配置问?| ⭐⭐⭐⭐ | ### 3. 详细修复流程 #### 3.1 方案1:SAE一键回滚(推荐)⭐⭐⭐⭐⭐ **适用场景?* - 新版本部署后发现严重Bug - 性能急剧下降 - 功能完全不可? **操作步骤?* ``` 步骤1: 登录阿里云控制台 ?SAE 步骤2: 选择问题应用(如 aiclinical-backend?步骤3: 点击"部署历史" 步骤4: 找到上一个稳定版本(?v1.2.2?步骤5: 点击"回滚"按钮 步骤6: 确认 ?SAE自动执行滚动回滚 步骤7: 观察健康检查和日志 步骤8: 验证功能恢复 预计时间?-5分钟 ``` **SAE回滚机制?* ``` 回滚过程(滚动回滚,零停机) ├── 阶段1: 从ACR拉取旧版本镜?├── 阶段2: 启动1个旧版本实例 ├── 阶段3: 健康检查通过后,切换流量到旧实例 ├── 阶段4: 逐步停止新版本实?├── 阶段5: 全部实例回滚完成 └── 时间?-3分钟?实例的情况) ``` **回滚后的处理?* ``` ?1. 验证核心功能恢复 ?2. 通知团队回滚完成 ?3. 分析故障原因(日?监控??4. 修复Bug(本地测试充分) ?5. 重新部署修复版本 ``` #### 3.2 方案2:热修复(重新部署完整Docker镜像)⭐⭐⭐? **适用场景?* - 无法回滚(旧版本也有问题?- Bug已定位且修复简?- 需要保留新功能 **操作步骤?* ```bash # ===== 场景:后端API返回500错误 ===== # 步骤1: 本地复现问题 npm run dev # 测试API: POST /api/v1/users # 错误日志: TypeError: Cannot read property 'email' of undefined # 步骤2: 修复代码 # backend/src/modules/users/userService.ts # 修复:添加空值校?if (!userData || !userData.email) { throw new Error('Email is required') } # 步骤3: 本地测试通过 npm run dev # 重新测试API ?200 OK # 步骤4: 构建新镜像(版本号升级) npm run build docker build -t backend:v1.2.4 . # 修订版本?1 # 步骤5: 推送到ACR docker tag backend:v1.2.4 registry.cn-hangzhou.aliyuncs.com/aiclinical/backend:v1.2.4 docker push registry.cn-hangzhou.aliyuncs.com/aiclinical/backend:v1.2.4 # 步骤6: SAE部署 # 控制??部署 ?镜像版本: v1.2.4 ?确认 ?滚动发布 # 步骤7: 观察部署过程 # SAE日志实时查看 ?无ERROR ?健康检查通过 # 步骤8: 验证修复 curl -X POST https://api.your-domain.com/api/v1/users \ -H "Content-Type: application/json" \ -d '{"email":"test@example.com"}' # 返回: 200 OK # 步骤9: 更新Git git add . git commit -m "hotfix: add email validation in userService" git tag v1.2.4 git push origin main git push origin v1.2.4 ``` **预计时间?0-30分钟** ``` 代码修复: 5分钟 构建镜像: 3-5分钟(Node.js后端?推送镜? 1-2分钟 SAE部署: 2-3分钟 验证: 2分钟 Git提交: 1分钟 ``` #### 3.3 方案3:单文件热更新(❌不推荐,仅紧急情况) **为什么不推荐?* 1. ?**容器重启后丢?*:容器是无状态的,重启后修改消失 2. ?**无版本记?*:无法追溯修改历?3. ?**多实例不一?*:SAE有多个实例,只修改一个实例无?4. ?**违反Docker理念**:容器应该是不可变的 **如果必须使用(极端紧急情况)?* ```bash # ⚠️ 仅供紧急情况参考,不推? # 步骤1: 登录SAE实例(通过云助手) # SAE控制??实例列表 ?登录实例 # 步骤2: 找到文件位置 cd /app ls -la # 步骤3: 修改文件 vi src/modules/users/userService.js # 修改错误的代? # 步骤4: 重启应用(SAE会自动重启) # ⚠️ 注意:这个修改只在当前实例生效,重启后丢? # 步骤5: 立即准备正式修复(方??# 本地修改 ?构建镜像 ?部署 ``` **总结:除非系统完全崩溃且无法回滚,否则不要使用单文件热更新!** #### 3.4 方案4:配置热更新(环境变量)⭐⭐⭐⭐ **适用场景?* - 数据库连接字符串错误 - API密钥/Token过期 - 外部服务地址变更 - Feature Flag开? **操作步骤?* ``` # 场景:Dify API地址配置错误 步骤1: SAE控制??选择应用 ?环境变量 步骤2: 找到错误的变? DIFY_API_URL=http://172.16.1.100/v1 # ?错误IP 步骤3: 修改为正确? DIFY_API_URL=http://172.16.2.50/v1 # ?正确IP 步骤4: 保存 ?SAE提示"需要重启应? 步骤5: 点击"重启应用" ?滚动重启(零停机?步骤6: 观察日志 ?连接成功 步骤7: 验证功能恢复 预计时间?-5分钟 ``` **环境变量修改的注意事项:** - ?修改后必须重启应用才能生?- ?滚动重启,不影响服务可用?- ⚠️ 敏感信息(密码)修改后,记得更新本地 `.env.example` - ⚠️ 如果涉及数据库迁移,确保数据库已准备? ### 4. 故障预防与监? #### 4.1 预防措施 ``` ?1. 充分的本地测? ├─ 核心功能手工测试 ├─ 边界条件测试 └─ 与生产环境类似的数据测试 ?2. 灰度发布(SAE支持? ├─ 先部署到1个实例(10%流量? ├─ 观察10-30分钟 └─ 无问题后全量发布 ?3. 健康检查完? ├─ /health 端点检查数据库连接 ├─ /health 端点检查外部服务(Dify/OSS? └─ 健康检查失败自动重? ?4. 监控告警 ├─ 错误日志告警(SLS? ├─ API响应时间告警(ARMS? └─ 数据库连接数告警(RDS监控? ?5. 自动化测试(未来? ├─ 单元测试(Jest / Pytest? ├─ 集成测试(Supertest / Playwright? └─ CI/CD中自动执?``` #### 4.2 监控指标 | 指标类型 | 监控指标 | 告警阈?| 处理措施 | |---------|---------|---------|---------| | **应用监控** | 错误?| >5% | 立即查看日志,考虑回滚 | | **应用监控** | API响应时间 | >2?| 检查数据库慢查询、外部服?| | **应用监控** | 健康检查失?| >3?| 自动重启实例,检查依赖服?| | **数据库监?* | 连接?| >80% | 检查连接泄漏,增加连接?| | **数据库监?* | 慢查?| >1?| 优化SQL,添加索?| | **容器监控** | CPU使用?| >70% | 检查死循环,考虑扩容 | | **容器监控** | 内存使用?| >80% | 检查内存泄漏,重启实例 | ### 5. 故障修复决策? ``` ┌─────────────────? ? 发现线上故障 ? └────────┬────────? ? ┌────────▼────────? ?影响范围评估? ? └────┬────────────? ? ┌──────────┼──────────? ? ? ┌───────▼────────? ┌──────▼────────? ? 全站不可? ? ?部分功能异常 ? ? (P0/P1) ? ? (P2/P3) ? └───────┬────────? └──────┬────────? ? ? ┌───────▼────────? ┌──────▼────────? ?能否快速定位? ? ?能否快速修复? ? └───┬────────┬───? └──┬────────┬───? ?No ?Yes ?Yes ?No ? ? ? ? ┌─────▼──?┌──▼─────?┌──▼──?┌───▼────? ?立即 ??是配???热修??下个?? ?回滚 ??问题???? ??本修?? └────────?└──┬──┬──?└─────?└────────? ? ? ┌─────▼──▼────? ?修改环境变量 ? ?+ 重启应用 ? └──────────────?``` --- ## 部署文档导航 ### 📚 独立部署文档清单 | # | 文档名称 | 部署对象 | 目标环境 | 预计时间 | |---|---------|---------|---------|---------| | 1 | [PostgreSQL部署策略-摸底报告](./PostgreSQL部署策略-摸底报告.md) | PostgreSQL 15数据?| RDS PostgreSQL 15 | 10分钟(pg_dump导入?| | 2 | [Dify-ECS部署完全指南](./03-Dify-ECS部署完全指南.md) | Dify RAG平台 | ECS + Docker Compose | 30-60分钟 | | 3 | [Python微服?SAE容器部署指南](./04-Python微服?SAE容器部署指南.md) | Python微服?| SAE容器实例 | 20-30分钟 | | 4 | [Node.js后端-SAE容器部署指南](./05-Node.js后端-SAE容器部署指南.md) | Node.js后端 | SAE容器实例 | 20-30分钟 | | 5 | [前端Nginx-SAE容器部署指南](./06-前端Nginx-SAE容器部署指南.md) | React前端 | SAE容器实例 | 15-20分钟 | **总部署时间:** ?-3小时(从0到全部上线) ### 🎯 部署顺序建议 ``` 第一阶段:基础设施(Day 1)⭐ 必需 ├── 1. 创建VPC和安全组 (10分钟) ├── 2. ?创建NAT网关 + 绑定EIP (15分钟) ?新增,必需?├── 3. 部署RDS PostgreSQL 15 (10分钟,等待实例创?5分钟) ├── 4. 导入数据库(pg_dump?(5分钟) └── 5. 创建OSS Bucket (5分钟) └── 配置生命周期、权? 第二阶段:核心服务(Day 1)⚠?临时配置 ├── 6. 部署Node.js后端到SAE (20分钟) ? └── ⚠️ DIFY_API_KEY=temp(临时值,等Dify部署后更新) ├── 7. 部署Python微服务到SAE (20分钟) └── 8. 端到端测试(后端API + Python服务?(15分钟) 第三阶段:用户界面(Day 2?├── 9. 部署前端到SAE (15分钟) └── 10. 完整功能测试(不含PKB模块?(30分钟) 第四阶段:Dify服务(Day 2-3)⭐ PKB模块必需 ├── 11. 部署Dify到ECS (60分钟) ├── 12. 登录Dify生成API Key (5分钟) ├── 13. 更新后端DIFY_API_KEY环境变量 (5分钟) └── 14. 测试PKB知识库功?(15分钟) 总计:约4-5小时(实际操作时间,不含等待?``` ### 📖 如何使用这些文档? #### 新团队首次部? ``` 步骤1: 阅读本《部署架构总览? ├─ 理解整体架构 ├─ 理解模块依赖关系 └─ 熟悉阿里云服? 步骤2: 按顺序阅读独立部署文? ├─ PostgreSQL部署策略(理解数据库架构? ├─ Node.js后端部署(核心服务) ├─ Python微服务部署(能力支撑? ├─ 前端Nginx部署(用户界面) └─ Dify部署(可选,PKB模块需要) 步骤3: 准备阿里云账号和资源 ├─ 实名认证 ├─ 充值(建议¥500起步? ├─ 创建RAM子账号(安全? └─ 开通SAE/RDS/OSS/ACR服务 步骤4: 按第一阶段→第二阶段→第三阶段顺序部署 └─ 每个阶段完成后测试验? 步骤5: 监控与优? ├─ 配置告警规则 ├─ 观察7天运行情? └─ 根据实际情况调整规格 ``` #### 已有系统维护 ``` 日常开发部? ├─ 修改代码 ├─ 本地测试 ├─ 构建Docker镜像 ├─ 推送到ACR └─ SAE控制台部? 线上故障处理: ├─ 参?线上故障快速修?章节 ├─ P0/P1: 立即回滚 ├─ P2/P3: 热修复或下个版本 └─ 故障复盘,更新文? 新模块上? ├─ 参考对应的独立部署文档 ├─ 确认依赖服务(数据库/OSS/其他服务?├─ 灰度发布(先1个实例) └─ 全量发布 ``` ### 🔗 文档间的引用关系 ``` 00-部署架构总览.md (本文? ?├──?PostgreSQL部署策略-摸底报告.md ? ├─ 数据库架构详?? ├─ pg_dump导入流程 ? ├─ 备份策略 ? └─ 最佳实??├──?03-Dify-ECS部署完全指南.md ? ├─ Docker Compose配置 ? ├─ Nginx路由?? ├─ Swap配置 ? └─ 故障排查 ?├──?04-Python微服?SAE容器部署指南.md ? ├─ Dockerfile多阶段构?? ├─ 系统依赖安装(PyTorch/OpenCV?? ├─ SAE配置 ? └─ 内网调用 ?├──?05-Node.js后端-SAE容器部署指南.md ? ├─ Prisma反向同步(db pull?? ├─ 数据库连接池 ? ├─ 优雅关闭 ? └─ 环境变量配置 ?└──?06-前端Nginx-SAE容器部署指南.md ├─ SPA路由配置 ├─ API反向代理 ├─ 静态资源缓? └─ envsubst动态配?``` --- ## 🛡?安全与最佳实? ### 1. 时区统一配置 ⭐⭐⭐⭐? **问题?* 不同服务的时区不一致会导致?- 日志时间对不上(前端14:00,后?6:00?- pg-boss定时任务在错误时间触?- 用户看到的时间戳错误 **解决?* 所有服务统一使用 `Asia/Shanghai` 时区 ```dockerfile # backend/Dockerfile - Node.js后端 FROM node:22-alpine AS runtime RUN apk add --no-cache tzdata ENV TZ=Asia/Shanghai # ... 其他配置 # extraction_service/Dockerfile - Python微服?FROM python:3.11-slim AS runtime RUN apt-get update && apt-get install -y tzdata ENV TZ=Asia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone # ... 其他配置 # frontend-v2/Dockerfile - 前端(已配置?FROM nginx:1.25-alpine RUN apk add --no-cache tzdata ENV TZ=Asia/Shanghai # ... 其他配置 ``` ```sql -- RDS PostgreSQL 时区配置 -- RDS控制?> 参数设置 > timezone timezone = Asia/Shanghai ``` **验证时区?* ```bash # 查看容器时区 docker exec date # 应该显示:Sat Dec 14 14:30:00 CST 2024 # 查看RDS时区 psql -c "SHOW timezone;" # 应该显示:Asia/Shanghai ``` ### 2. 安全组配置最佳实?⭐⭐⭐⭐? #### ECS安全组配置(Dify服务器) **正确配置?* ```bash # ECS控制?> 安全?> 配置规则 # ?入方向规则(Inbound?允许 80/TCP 来源?72.16.0.0/12 # Nginx(VPC内网访问?允许 22/TCP 来源:您的办公室公网IP # SSH管理 拒绝 所? 来源?.0.0.0/0 # 默认拒绝 ``` **⚠️ 安全红线(绝对禁止)?* ```bash # ?禁止 5000/TCP(Dify API)对公网开?# 后果:黑客可绕过后端消耗LLM额度 # ?禁止 8080/TCP(Weaviate)对公网开?# 后果:向量数据可能被窃取 # ?禁止 6379/TCP(Redis)对公网开?# 后果:Redis无密码,可能被清? # ?正确:docker-compose.yaml中端口绑?services: redis: ports: - "127.0.0.1:6379:6379" # 只监听本? weaviate: ports: - "127.0.0.1:8080:8080" # 只监听本?``` **验证安全配置?* ```bash # 从公网测试(应该失败?telnet ECS公网IP 6379 # 应该超时或拒绝连? # 从VPC内测试(应该成功?curl http://172.16.x.x # Dify内网地址 # 应该返回 Dify 响应 ``` 🔗 **详细配置?* 参?`03-Dify-ECS部署完全指南.md` ### 3. 镜像拉取策略 ⭐⭐⭐⭐? **问题?* SAE可能不会拉取新镜像(代码不更新的"灵异事件"? ```bash # 场景?开发者修改代??构建镜像 ?推送到ACR(覆盖v1.0.0??SAE部署 ?发现代码没更新??? # 原因?SAE默认镜像拉取策略可能?IfNotPresent 如果本地已有 v1.0.0,不会重新拉?``` **解决方案?* | 方案 | 适用环境 | 优势 | 劣势 | |------|---------|------|------| | **方案A:版本号管理** | 生产环境 | 版本可追溯,稳定 | 需手动递增版本?| | **方案B:Always拉取** | 测试环境 | 始终最新,方便 | 每次重启拉取,慢 | **方案A:每次部署使用新版本号(强烈推荐?* ```bash # 使用语义化版本号 v1.0.0 ?v1.0.1 ?v1.0.2 ... # 或使用时间戳 v20251214-1430 ?v20251214-1530 ... # 或使用Git SHA v-a1b2c3d ?v-b2c3d4e ... ``` **方案B:配置SAE镜像拉取策略** ```bash # SAE控制?> 应用配置 > 镜像设置 镜像拉取策略:Always # ⚠️ 注意?# - 每次重启都会拉取镜像(启动稍慢) # - 适合测试环境,不推荐生产环境 ``` ### 4. 开发调试最佳实? #### 本地连接RDS数据库(SSH隧道? **场景?* 开发人员需要用Navicat/DBeaver查看RDS数据 **问题?* RDS在VPC内网,本地无法直接访? **解决?* 通过ECS建立SSH隧道 ```bash # 步骤1:建立SSH隧道 ssh -N -L 5433:rm-xxxxx.pg.rds.aliyuncs.com:5432 \ root@ECS公网IP \ -i ~/.ssh/dify-ecs.pem # 参数说明?# -N: 不执行远程命令,只建立隧?# -L: 本地端口转发 # 5433: 本地监听端口(避免与本地PostgreSQL 5432冲突?# rm-xxxxx: RDS内网地址 # 5432: RDS端口 # 步骤2:Navicat/DBeaver连接配置 主机:localhost 端口?433 用户名:aiclinical_rw 密码:(RDS密码?数据库:ai_clinical_research # 步骤3:测试连?# 应该成功连接到RDS?``` **后台运行(可选)?* ```bash # 方法1:nohup后台运行 nohup ssh -N -L 5433:rm-xxxxx.pg.rds.aliyuncs.com:5432 \ root@ECS-IP -i key.pem > /dev/null 2>&1 & # 方法2:保持隧道运行(新终端窗口) ssh -N -L 5433:rm-xxxxx.pg.rds.aliyuncs.com:5432 \ root@ECS-IP -i key.pem # 保持此终端窗口打开 ``` 🔗 **详细步骤参考:** `07-关键配置补充说明.md` ?? ### 5. Python服务内存管理 ⭐⭐⭐⭐ **问题?* Python服务(PyMuPDF/Nougat)内存密集,容易OOM | 场景 | CPU | 内存 | Workers | 适用情况 | |------|-----|------|---------|---------| | **基础?* | 1?| 2GB | 2 | 简单PDF解析 | | **标准?* | 2?| 4GB | 3 | 包含OCR(Nougat?| | **增强?* | 2?| 8GB | 4 | 大量OCR + 高并?| **⚠️ 重要提示?* - 如果遇到OOM(Out of Memory),优先升级内存?GB - 或者限制Gunicorn并发数:`--workers 1 --threads 2` - PyMuPDF + Nougat OCR单个请求可能占用500MB-1GB内存 **Dockerfile优化(已应用):** ```dockerfile CMD ["gunicorn", "main:app", \ "--bind", "0.0.0.0:8000", \ "--workers", "2", \ "--timeout", "120", \ "--max-requests", "100", \ "--max-requests-jitter", "10"] ``` 🔗 **详细配置?* 参?`04-Python微服?SAE容器部署指南.md` ### 6. NAT网关成本优化 **当前方案:NAT网关(推荐)** ``` 成本:NAT网关¥60/?+ EIP流量费?0-50/?= ¥90-110/?优势:稳定可靠,生产环境标配 劣势:成本相对较?``` **替代方案(不推荐,仅供参考)?* | 方案 | 成本 | 稳定?| 复杂?| 推荐?| |------|------|--------|--------|--------| | NAT网关 | ¥100/?| ⭐⭐⭐⭐?| ?| ⭐⭐⭐⭐⭐(推荐)| | SAE绑定EIP | ¥30-50/?| ⭐⭐?| ?| ⭐⭐⭐(部分地域)| | ECS做SNAT | ¥0(复用ECS?| ⭐⭐ | ?| ⭐⭐(不推荐)| **建议?* 初创团队不要在这里省钱,NAT网关是生产环境的标配? --- ## 📝 总结与建? ### 核心架构特点 1. **?云原生Serverless架构** - 前端/后端/Python全部容器化部署到SAE - 弹性伸缩,按需付费 - 零运维,自动故障转移 2. **?微服务隔?* - 5个核心模块职责清? - 内网通信,免流量? - 独立部署,互不影? 3. **?数据安全可控** - PostgreSQL 10个Schema隔离 - RDS自动备份 + PITR - VPC内网隔离,白名单控制 4. **?适合初创团队** - 1-2人可运维 - 手工部署简单直? - 成本可控(?,100/月起? ### 下一步行? ``` ??周:基础设施搭建 ├─ 阿里云账号准? ├─ VPC/RDS/OSS创建 └─ 数据库导? ??周:核心服务部署 ├─ Node.js后端上线 ├─ Python微服务上? ├─ 前端上线 └─ 端到端测? ??周:可选服?+ 监控 ├─ Dify部署(如需PKB模块? ├─ 配置监控告警 └─ 压力测试 ??周:稳定性优? ├─ 根据监控数据调整资源 ├─ 故障演练(回滚、修复) └─ 文档完善 ``` ### 持续改进建议 | 阶段 | 改进方向 | 优先?| |------|---------|--------| | **3个月?* | - 完善监控告警
- 编写运维手册
- 故障演练 | ⭐⭐⭐⭐?| | **6个月?* | - 配置CI/CD
- 自动化测?br>- 性能优化 | ⭐⭐⭐⭐ | | **1年内** | - 跨地域灾?br>- 容器编排升级(ACK?br>- 微服务治?| ⭐⭐?| --- **文档创建人:** AI助手 **最后更新:** 2025-12-14 **版本?* v1.0 **核心理念:架构清晰、职责分离、云原生、易于运?* ⭐⭐?