Files
AIclinicalresearch/docs/05-部署文档/_archive-2025首次部署/02-SAE部署完全指南(产品经理版).md
HaHafeng 6124c7abc6 docs(platform): Add database documentation system and restructure deployment docs
Completed:
- Add 6 core database documents (docs/01-平台基础层/07-数据库/)
  Architecture overview, migration history, environment comparison,
  tech debt tracking, seed data management, PostgreSQL extensions
- Restructure deployment docs: archive 20 legacy files to _archive-2025/
- Create unified daily operations manual (01-日常更新操作手册.md)
- Add pending deployment change tracker (03-待部署变更清单.md)
- Update database development standard to v3.0 (three iron rules)
- Fix Prisma schema type drift: align @db.* annotations with actual DB
  IIT: UUID/Timestamptz(6), SSA: Timestamp(6)/VarChar(20/50/100)
- Add migration: 20260227_align_schema_with_db_types (idempotent ALTER)
- Add Cursor Rule for auto-reminding deployment change documentation
- Update system status guide v6.4 with deployment and DB doc references
- Add architecture consultation docs (Prisma guide, SAE deployment guide)

Technical details:
- Manual migration due to shadow DB limitation (TD-001 in tech debt)
- Deployment docs reduced from 20+ scattered files to 3 core documents
- Cursor Rule triggers on schema.prisma, package.json, Dockerfile changes

Made-with: Cursor
2026-02-27 14:35:25 +08:00

915 lines
20 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 🚀 阿里云SAE部署完全指南产品经理版
> **文档版本:** v1.0
> **创建日期:** 2025-12-11
> **适用人群:** 无部署经验的产品经理、项目负责人
> **预计时间:** 2-3小时包含等待时间
> **难度等级:** ⭐⭐ 简单(保姆级教程)
---
## 📋 目录
1. [前置准备](#前置准备)
2. [需不需要购买Redis](#需不需要购买redis)
3. [第一步准备Docker镜像](#第一步准备docker镜像)
4. [第二步:配置阿里云服务](#第二步配置阿里云服务)
5. [第三步部署到SAE](#第三步部署到sae)
6. [第四步:部署前端](#第四步部署前端)
7. [第五步:验证部署](#第五步验证部署)
8. [常见问题解决](#常见问题解决)
---
## 前置准备
### ✅ 您已经购买的服务
| 服务 | 状态 | 说明 |
|------|------|------|
| **阿里云SAE** | ✅ 已购买 | Serverless应用引擎 |
| **云数据库RDS PostgreSQL** | ✅ 已购买 | 数据库服务 |
| **对象存储OSS** | ✅ 已购买 | 文件存储服务 |
### 💻 您需要安装的工具
1. **Docker Desktop**
- 下载地址https://www.docker.com/products/docker-desktop/
- Windows系统选择 "Docker Desktop for Windows"
- 安装后重启电脑
2. **阿里云CLI可选**
- 如果不想用命令行,可以全程使用阿里云控制台网页操作
---
## 需不需要购买Redis
### 📊 答案:**初期不需要,未来可能需要**
| 场景 | 是否需要Redis | 说明 |
|------|--------------|------|
| **开发测试环境** | ❌ 不需要 | 使用内存缓存即可 |
| **初期用户<100人** | ❌ 不需要 | 使用内存缓存足够 |
| **中期用户100-1000人** | ⚠️ 建议购买 | 提升性能¥200/月 |
| **成熟期用户>1000人** | ✅ 必须购买 | 必须使用Redis |
### 🎯 我的建议
**现在创建开发测试环境不要购买Redis**
原因:
1. ✅ 您的代码已经支持 `CACHE_TYPE=memory`(内存缓存)
2. ✅ 开发测试阶段,内存缓存完全够用
3. ✅ 等真正上线后,根据实际情况再决定
4. ✅ 节省成本初期省¥200/月)
**环境变量配置:**
```bash
# 不使用Redis
CACHE_TYPE=memory
# 未来需要时,只需改为:
CACHE_TYPE=redis
REDIS_HOST=r-xxxx.redis.rds.aliyuncs.com
REDIS_PASSWORD=your_password
```
---
## 第一步准备Docker镜像
### 📦 1.1 创建Dockerfile文件
`AIclinicalresearch/backend/` 目录下创建文件 `Dockerfile`(如果不存在):
```dockerfile
# ==================== 构建阶段 ====================
FROM node:22-alpine AS builder
WORKDIR /app
# 复制依赖文件
COPY package*.json ./
COPY prisma ./prisma/
# 安装依赖npm ci 比 npm install 更稳定)
RUN npm ci
# 复制源代码
COPY . .
# 生成 Prisma Client
RUN npx prisma generate
# 构建 TypeScript → JavaScript
RUN npm run build
# ==================== 运行阶段(精简镜像)====================
FROM node:22-alpine
WORKDIR /app
# 复制依赖文件
COPY package*.json ./
COPY prisma ./prisma/
# 只安装生产依赖(体积更小)
RUN npm ci --only=production
# 生成 Prisma Client
RUN npx prisma generate
# 从构建阶段复制编译后的代码
COPY --from=builder /app/dist ./dist
# 复制配置文件
COPY prompts ./prompts
COPY config ./config
# 创建非root用户安全
RUN addgroup -g 1001 -S nodejs && \
adduser -S nodejs -u 1001
USER nodejs
# 暴露端口
EXPOSE 3001
# 健康检查SAE需要
HEALTHCHECK --interval=30s --timeout=3s --start-period=40s --retries=3 \
CMD node -e "require('http').get('http://localhost:3001/health', (r) => {process.exit(r.statusCode === 200 ? 0 : 1)})"
# 启动应用
CMD ["node", "dist/index.js"]
```
### 📦 1.2 创建 .dockerignore 文件
`backend/` 目录下创建 `.dockerignore`
```
node_modules
dist
npm-debug.log
.env
.env.*
uploads
*.md
.git
.gitignore
tests
```
### 📦 1.3 构建Docker镜像
**打开PowerShell管理员模式进入backend目录**
```powershell
# 进入后端目录
cd D:\MyCursor\AIclinicalresearch\backend
# 构建镜像这一步需要5-10分钟
docker build -t aiclinical-backend:dev .
# 查看镜像是否构建成功
docker images | Select-String "aiclinical-backend"
```
**预期输出:**
```
aiclinical-backend dev xxxx 2 minutes ago xxx MB
```
---
## 第二步:配置阿里云服务
### 🗄️ 2.1 配置RDS数据库
#### Step 1: 登录阿里云控制台
1. 打开浏览器,访问 https://www.aliyun.com
2. 点击右上角「登录」
3. 选择「云数据库 RDS」
#### Step 2: 配置白名单
1. 点击您的RDS实例
2. 左侧菜单 → 「数据安全性」 → 「白名单设置」
3. 点击「添加白名单分组」
- 分组名称:`SAE应用`
- 白名单IP先填 `0.0.0.0/0`(允许所有,测试用)
- **⚠️ 正式上线后要改为SAE的VPC网段**
#### Step 3: 创建数据库和用户
1. 左侧菜单 → 「数据库管理」
2. 点击「创建数据库」
- 数据库名称:`aiclinical_dev`
- 字符集:`UTF8`
- 点击「确定」
3. 左侧菜单 → 「账号管理」
4. 点击「创建账号」
- 账号名称:`aiclinical`
- 账号类型:普通账号
- 密码:设置一个强密码(记住它!)
- 授权数据库:选择 `aiclinical_dev`,权限「读写」
- 点击「确定」
#### Step 4: 获取连接地址
1. 点击实例「基本信息」页面
2. 找到「内网地址」(类似:`rm-xxxx.mysql.rds.aliyuncs.com`
3. **复制并保存这个地址**(后面会用到)
---
### 📦 2.2 配置OSS对象存储
#### Step 1: 创建Bucket
1. 阿里云控制台 → 「对象存储OSS」
2. 点击「Bucket列表」 → 「创建Bucket」
- Bucket名称`aiclinical-dev`(小写字母+数字+横杠)
- 区域选择与RDS相同的区域华东1
- 存储类型:「标准存储」
- 读写权限:「私有」
- 其他选项默认
- 点击「确定」
#### Step 2: 创建RAM用户用于API访问
1. 阿里云控制台 → 「访问控制RAM」
2. 左侧菜单 → 「用户」 → 「创建用户」
- 登录名称:`aiclinical-oss`
- 访问方式:勾选「编程访问」
- 点击「确定」
3. 创建成功后,**立即保存显示的AccessKey**
```
AccessKeyId: LTAI5t...(复制保存)
AccessKeySecret: xxxxxx复制保存只显示一次
```
4. 给用户授权:
- 点击用户名称 → 「权限管理」 → 「添加权限」
- 选择权限:`AliyunOSSFullAccess`
- 点击「确定」
---
### 🐳 2.3 配置容器镜像服务ACR
#### Step 1: 开通服务
1. 阿里云控制台 → 「容器镜像服务」
2. 如果提示开通,点击「立即开通」(**免费**
#### Step 2: 创建命名空间
1. 左侧菜单 → 「默认实例」 → 「命名空间」
2. 点击「创建命名空间」
- 命名空间:`aiclinical`
- 点击「确定」
#### Step 3: 创建镜像仓库
1. 左侧菜单 → 「镜像仓库」 → 「创建镜像仓库」
- 仓库名称:`backend-dev`
- 命名空间:选择 `aiclinical`
- 摘要:`AI临床研究平台后端-开发环境`
- 仓库类型:「私有」
- 代码源:「本地仓库」
- 点击「下一步」→「创建」
#### Step 4: 获取登录密码
1. 右上角点击用户头像 → 「AccessKey管理」
2. 或者:容器镜像服务 → 右上角「设置访问凭证」
3. 设置镜像仓库登录密码(记住它!)
---
### 📤 2.4 推送镜像到阿里云
**打开PowerShell执行以下命令**
```powershell
# 1. 登录阿里云容器镜像服务
# 替换<你的阿里云账号>为你的阿里云登录邮箱或用户名
docker login --username=<你的阿里云账号> registry.cn-hangzhou.aliyuncs.com
# 输入密码(就是刚才设置的镜像仓库登录密码)
# 2. 给镜像打标签
# 替换 <你的命名空间> 为 aiclinical
docker tag aiclinical-backend:dev `
registry.cn-hangzhou.aliyuncs.com/aiclinical/backend-dev:v1.0.0
# 3. 推送到阿里云需要3-5分钟
docker push registry.cn-hangzhou.aliyuncs.com/aiclinical/backend-dev:v1.0.0
```
**推送成功标志:**
```
v1.0.0: digest: sha256:xxxx size: xxxx
```
---
## 第三步部署到SAE
### 🚀 3.1 创建SAE应用
#### Step 1: 进入SAE控制台
1. 阿里云控制台 → 「Serverless应用引擎SAE」
2. 选择区域与RDS、OSS相同
#### Step 2: 创建应用
1. 点击「创建应用」
2. **基本信息**
- 应用名称:`aiclinical-backend-dev`
- 命名空间:默认
- VPC选择与RDS相同的VPC
- vSwitch任意选择一个
3. **应用部署配置**
- 应用部署方式:「镜像」
- 镜像来源:「容器镜像服务企业版实例」
- 镜像:选择刚才推送的 `registry.cn-hangzhou.aliyuncs.com/aiclinical/backend-dev:v1.0.0`
- 镜像版本:`v1.0.0`
4. **实例规格**
- 实例规格:`1核2GB`
- 实例数1个固定
5. **网络配置**
- 勾选「公网访问」
- 端口:`3001`
6. 点击「下一步」
---
### ⚙️ 3.2 配置环境变量
在「高级设置」页面,找到「环境变量」:
```bash
# ========== 基础配置 ==========
NODE_ENV=development
PORT=3001
SERVICE_NAME=aiclinical-backend-dev
LOG_LEVEL=debug
# ========== 数据库配置 ==========
# 替换为您的RDS地址
DATABASE_URL=postgresql://aiclinical:你的密码@rm-xxxx.mysql.rds.aliyuncs.com:5432/aiclinical_dev
# ========== 存储配置 ==========
STORAGE_TYPE=oss
OSS_REGION=oss-cn-hangzhou
OSS_BUCKET=aiclinical-dev
OSS_ACCESS_KEY_ID=你的AccessKeyId
OSS_ACCESS_KEY_SECRET=你的AccessKeySecret
# ========== 缓存配置不使用Redis==========
CACHE_TYPE=memory
QUEUE_TYPE=memory
# ========== LLM配置 ==========
DEEPSEEK_API_KEY=你的DeepSeek API Key
DEEPSEEK_BASE_URL=https://api.deepseek.com
DASHSCOPE_API_KEY=你的通义千问 API Key
CLOSEAI_API_KEY=你的CloseAI API Key
CLOSEAI_OPENAI_BASE_URL=https://api.openai-proxy.org/v1
CLOSEAI_CLAUDE_BASE_URL=https://api.openai-proxy.org/anthropic
# ========== Dify配置如果使用==========
DIFY_API_KEY=你的Dify API Key
DIFY_API_URL=https://api.dify.ai/v1
# ========== 安全配置 ==========
JWT_SECRET=请生成一个随机字符串至少32位
CORS_ORIGIN=*
# ========== Python微服务配置 ==========
# 暂时先用公网地址后续改为SAE内网
EXTRACTION_SERVICE_URL=http://你的Python服务地址:8000
```
**⚠️ 重要提示:**
- 替换所有 `你的XXX` 为真实的值
- JWT_SECRET 可以用在线工具生成https://www.random.org/strings/
- 环境变量设置错误是部署失败的主要原因!
---
### ✅ 3.3 配置健康检查
在「健康检查」部分:
```yaml
检查方式: HTTP
检查路径: /health
端口: 3001
初始延迟: 30秒
检查间隔: 10秒
超时时间: 3秒
不健康阈值: 3次
健康阈值: 2次
```
点击「创建应用」等待3-5分钟。
---
### 🎉 3.4 验证部署
#### Step 1: 查看部署状态
1. 应用列表中找到 `aiclinical-backend-dev`
2. 查看状态:
- ❌ 启动中 → 等待
- ❌ 异常 → 查看日志排查问题
- ✅ 运行中 → 成功!
#### Step 2: 获取公网地址
1. 点击应用名称进入详情
2. 「基本信息」页面找到「公网SLB地址」
3. 复制地址(类似:`http://123.456.789.0:3001`
#### Step 3: 测试接口
打开浏览器,访问:
```
http://<你的SAE公网地址>/health
```
**预期返回:**
```json
{
"status": "ok",
"database": "connected",
"timestamp": "2025-12-11T10:30:00.000Z"
}
```
---
## 第四步:部署前端
### 🌐 4.1 构建前端静态文件
**打开PowerShell进入frontend-v2目录**
```powershell
# 进入前端目录
cd D:\MyCursor\AIclinicalresearch\frontend-v2
# 安装依赖(如果还没安装)
npm install
# 修改 API 地址
# 打开 vite.config.ts配置代理或直接修改 API_BASE_URL
```
**修改 `vite.config.ts`**
```typescript
export default defineConfig({
server: {
proxy: {
'/api': {
target: 'http://你的SAE后端地址:3001', // ← 改成你的SAE地址
changeOrigin: true,
},
},
},
// 构建时的环境变量
define: {
'import.meta.env.VITE_API_BASE_URL': JSON.stringify('http://你的SAE后端地址:3001')
}
})
```
**构建生产版本:**
```powershell
npm run build
```
构建完成后,在 `dist/` 目录生成静态文件。
---
### 🚀 4.2 部署前端到OSS
#### 方案A使用阿里云控制台推荐新手
1. 打开OSS控制台
2. 进入 `aiclinical-dev` Bucket
3. 点击「文件管理」 → 「上传文件」
4. 选择 `frontend-v2/dist/` 目录下的**所有文件**
5. 上传完成后,设置 `index.html` 为默认首页
#### 方案B使用OSS命令行工具
**安装ossutil可选**
```powershell
# 下载 ossutil
# Windows: https://gosspublic.alicdn.com/ossutil/ossutil64.exe
# 配置
.\ossutil64.exe config
# 输入 AccessKeyId、AccessKeySecret、Endpoint如 oss-cn-hangzhou.aliyuncs.com
# 上传前端文件
.\ossutil64.exe cp -r .\dist\ oss://aiclinical-dev/frontend/ --update
```
---
### 🌐 4.3 配置OSS静态网站托管
1. OSS控制台 → `aiclinical-dev` Bucket
2. 左侧菜单 → 「基础设置」 → 「静态页面」
3. 点击「设置」:
- 默认首页:`index.html`
- 默认404页`index.html`
- 点击「保存」
4. 获取访问地址:
- Bucket概览页面找到「Bucket域名」
- 外网访问地址:`http://aiclinical-dev.oss-cn-hangzhou.aliyuncs.com/`
---
## 第五步:验证部署
### ✅ 5.1 全链路测试
#### 测试1健康检查
```
访问http://你的SAE地址:3001/health
预期:返回 {"status":"ok"}
```
#### 测试2数据库连接
```powershell
# 在SAE控制台 → 应用详情 → 实时日志
# 查看是否有 "✅ 数据库连接成功" 日志
```
#### 测试3OSS存储
```
访问http://你的SAE地址:3001/api/v1/test/upload
上传一个测试文件,查看是否成功
```
#### 测试4前端访问
```
访问http://aiclinical-dev.oss-cn-hangzhou.aliyuncs.com/
查看页面是否正常显示
```
---
### 📊 5.2 查看监控数据
1. SAE控制台 → 应用详情 → 「监控大盘」
2. 查看:
- CPU使用率
- 内存使用率
- QPS每秒请求数
- 响应时间
---
## 常见问题解决
### ❌ 问题1应用启动失败
**症状:**
- 应用状态显示「异常」
- 健康检查失败
**解决步骤:**
1. **查看日志:**
```
SAE控制台 → 应用详情 → 实时日志
找到红色的 ERROR 日志
```
2. **常见错误:**
**错误A数据库连接失败**
```
Error: Connection refused
```
- 检查 `DATABASE_URL` 格式是否正确
- 检查 RDS 白名单是否包含 SAE 的 IP
- 检查 RDS 用户名密码是否正确
**错误B环境变量缺失**
```
DATABASE_URL is required
```
- 检查环境变量是否配置完整
- 重新部署应用
**错误CPrisma 连接失败**
```
Prisma Client initialization failed
```
- 需要运行数据库迁移:
```bash
# 本地执行迁移然后推送到RDS
npx prisma migrate deploy
```
---
### ❌ 问题2OSS上传失败
**症状:**
- 文件上传返回 403 Forbidden
**解决步骤:**
1. 检查 RAM 用户权限:
- 控制台 → RAM → 用户 → 权限
- 确保有 `AliyunOSSFullAccess`
2. 检查环境变量:
```bash
OSS_ACCESS_KEY_ID=正确的ID
OSS_ACCESS_KEY_SECRET=正确的Secret
OSS_BUCKET=正确的Bucket名称
```
3. 测试 OSS 连接:
```javascript
// 在应用日志中查看
console.log('OSS配置:', {
region: process.env.OSS_REGION,
bucket: process.env.OSS_BUCKET
})
```
---
### ❌ 问题3前端无法访问后端
**症状:**
- 前端显示「网络错误」
- API 请求失败
**解决步骤:**
1. 检查CORS配置
```bash
# 在SAE环境变量中确认
CORS_ORIGIN=* # 允许所有来源(开发环境)
```
2. 检查后端地址:
```javascript
// frontend-v2/vite.config.ts
proxy: {
'/api': {
target: 'http://正确的SAE地址:3001',
changeOrigin: true
}
}
```
3. 测试后端连通性:
```bash
# 在本地PowerShell执行
curl http://你的SAE地址:3001/health
```
---
### ❌ 问题4Python微服务无法连接
**症状:**
- 文件提取失败
- 日志显示 `Connection refused to extraction service`
**临时方案:**
目前Python微服务还在本地运行需要以下两种方案之一
**方案APython服务也部署到SAE推荐**
1. 创建 `extraction_service/Dockerfile`
```dockerfile
FROM python:3.10-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
COPY . .
EXPOSE 8000
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
```
2. 构建并推送:
```powershell
cd extraction_service
docker build -t aiclinical-python:dev .
docker tag aiclinical-python:dev `
registry.cn-hangzhou.aliyuncs.com/aiclinical/python-dev:v1.0.0
docker push registry.cn-hangzhou.aliyuncs.com/aiclinical/python-dev:v1.0.0
```
3. 在SAE创建新应用 `aiclinical-python-dev`
4. 修改Node后端环境变量
```bash
EXTRACTION_SERVICE_URL=http://python服务的SAE内网地址:8000
```
**方案B使用内网穿透临时开发**
1. 使用ngrok或frp等工具
2. 将本地8000端口暴露到公网
3. 修改环境变量为公网地址
---
## 📊 部署完成检查清单
### ✅ 后端部署
- [ ] Docker镜像构建成功
- [ ] 镜像推送到阿里云ACR
- [ ] RDS数据库配置完成
- [ ] RDS白名单已添加
- [ ] OSS Bucket创建完成
- [ ] RAM用户权限配置正确
- [ ] SAE应用创建成功
- [ ] 环境变量配置完整
- [ ] 健康检查通过
- [ ] `/health` 接口返回正常
### ✅ 前端部署
- [ ] 前端代码构建成功
- [ ] API地址配置正确
- [ ] 文件上传到OSS
- [ ] 静态网站托管开启
- [ ] 前端页面可访问
- [ ] 前后端通信正常
### ✅ 数据库
- [ ] 数据库迁移执行成功
- [ ] Schema创建完成
- [ ] 测试数据插入成功
---
## 🎉 恭喜!部署完成!
### 📝 记录重要信息
请将以下信息保存到安全的地方:
```
【开发测试环境】
后端地址http://你的SAE地址:3001
前端地址http://aiclinical-dev.oss-cn-hangzhou.aliyuncs.com
RDS连接信息
- 地址rm-xxxx.mysql.rds.aliyuncs.com
- 数据库aiclinical_dev
- 用户名aiclinical
- 密码:***(请保密)
OSS信息
- Bucketaiclinical-dev
- AccessKeyIdLTAI5t***
- AccessKeySecret***(请保密)
ACR镜像仓库
- 命名空间aiclinical
- 仓库backend-dev, python-dev
- 登录密码:***(请保密)
```
---
## 📚 下一步
1. **持续集成/持续部署CI/CD**
- 配置GitHub Actions或Jenkins
- 自动构建和部署
2. **监控告警**
- 开通阿里云ARMS监控
- 配置钉钉/邮件告警
3. **正式环境部署**
- 创建生产环境Bucket`aiclinical-prod`
- 创建生产环境RDS独立实例
- 创建生产环境SAE应用
- 购买Redis用于生产环境缓存
- 配置CDN加速静态资源
4. **域名配置**
- 购买域名
- 配置DNS解析
- 申请SSL证书
- 配置HTTPS
---
## 💡 成本优化建议
### 开发测试环境(当前配置)
| 服务 | 规格 | 月费 | 说明 |
|------|------|------|------|
| SAE | 1C2G × 1实例 | ¥150 | 按量付费 |
| RDS | 2C4G 通用版 | ¥300 | 包年更优惠 |
| OSS | 100GB存储 | ¥10 | 按实际使用 |
| ACR | 免费额度 | ¥0 | 无需付费 |
| **合计** | | **¥460/月** | |
### 节省成本技巧
1. **RDS包年优惠**购买1年可节省15%
2. **闲时关闭SAE**测试环境夜间可关闭节省50%
3. **OSS生命周期**设置90天后转低频存储
4. **不使用Redis**省¥200/月
---
**文档版本:** v1.0
**最后更新:** 2025-12-11
**维护者:** 技术架构师
**反馈:** 如有问题,请联系技术团队