# 部署检查清?- ?到上线的完整Checklist > **文档版本?* v1.0 > **创建日期?* 2025-12-14 > **适用场景?* 首次部署到阿里云生产环境 > **预计时间?* 4-5小时(实际操作时间) --- ## 📋 使用说明 本清单按照部署顺序列出所有必需步骤,每个步骤包含: - ?复选框(完成后打勾?- ⏱️ 预计时间 - ⚠️ 关键注意事项 - 🔗 参考文档链? **建议:打印或复制到笔记软件,逐项完成?* --- ## 阶段1:基础设施准备(Day 1上午? ### 1.1 阿里云账号准? ?**实名认证** - ⏱️ 5分钟 - 阿里云控制台 > 账号管理 > 实名认证 - ⚠️ 企业认证需要营业执? ?**账号充?* - ⏱️ 2分钟 - 建议充值:¥500(首月成本约¥1,200?- 费用中心 > 充? ?**开通服?* - ⏱️ 5分钟 - 需要开通的服务? - ?SAE(Serverless应用引擎? - ?RDS(云数据库) - ?OSS(对象存储) - ?VPC(专有网络) - ?NAT网关 - ?ACR(容器镜像服务) - ?ECS(云服务器,Dify用) ?**创建RAM子账号(可选但推荐?* - ⏱️ 10分钟 - RAM访问控制 > 用户 > 创建用户 - 权限:AliyunSAEFullAccess, AliyunRDSFullAccess, AliyunOSSFullAccess - ⚠️ 不要用主账号部署,安全风险大 --- ### 1.2 VPC网络配置 ⭐⭐⭐⭐? ?**创建VPC** - ⏱️ 5分钟 - VPC控制?> 创建VPC - 名称:aiclinical-vpc-prod - 网段?72.16.0.0/12 - 地域:cn-hangzhou(杭州)或就近地? ?**创建交换?* - ⏱️ 3分钟 - VPC详情 > 交换?> 创建交换?- 名称:aiclinical-vsw-prod - 可用区:随机可用区A - 网段?72.16.0.0/20 ?**?创建NAT网关(必需!)** - ⏱️ 15分钟 - VPC控制?> NAT网关 > 创建NAT网关 - VPC:aiclinical-vpc-prod - 交换机:aiclinical-vsw-prod - 规格:小?- 计费方式:按使用量计?- ⚠️ **没有NAT网关,所有AI功能都会超时?* - 🔗 参考:`07-关键配置补充说明.md` ?? ?**创建并绑定EIP** - ⏱️ 5分钟 - NAT网关详情 > 弹性公网IP > 绑定EIP - 创建新EIP - 带宽:按使用流量 - 记录EIP地址:________________ ?**配置SNAT条目** - ⏱️ 3分钟 - NAT网关详情 > SNAT管理 > 创建SNAT条目 - 交换机:aiclinical-vsw-prod - 公网IP:刚才创建的EIP - ⚠️ 这一步让SAE可以访问公网 ?**创建安全?* - ⏱️ 5分钟 - ECS控制?> 安全?> 创建安全?- 名称:aiclinical-sg-prod - VPC:aiclinical-vpc-prod - 入方向规则: - 允许 80/TCP 来源?72.16.0.0/12(VPC内网? - 允许 22/TCP 来源:您的办公室IP(SSH管理? - 拒绝 所?来源?.0.0.0/0 --- ### 1.3 RDS PostgreSQL 15 部署 ?**创建RDS实例** - ⏱️ 10分钟(等待创?5分钟?- RDS控制?> 创建实例 - 数据库类型:PostgreSQL - 版本?5 - 规格:rds.pg.s2.large??GB?- 存储?00GB SSD - VPC:aiclinical-vpc-prod - 交换机:aiclinical-vsw-prod - 记录内网地址:rm-____________.pg.rds.aliyuncs.com ?**配置白名?* - ⏱️ 2分钟 - RDS实例详情 > 数据安全?> 白名单设?- 添加白名单分组:sae-vpc - IP地址?72.16.0.0/12(VPC网段?- ⚠️ **必须用VPC网段,不能用单机IP?* - 🔗 参考:`PostgreSQL部署策略-摸底报告.md` ?**创建数据库账?* - ⏱️ 3分钟 - RDS实例详情 > 账号管理 > 创建账号 - 账号名:aiclinical_rw - 密码:(16位强密码,记录到密码管理器) - 账号类型:普通账?- 授权数据库:稍后创建 ?**创建数据?* - ⏱️ 2分钟 - RDS实例详情 > 数据库管?> 创建数据?- 数据库名:ai_clinical_research - 字符集:UTF8 - 授权账号:aiclinical_rw(读写) ?**配置自动备份** - ⏱️ 3分钟 - RDS实例详情 > 备份恢复 > 备份设置 - 数据备份保留??- 日志备份保留?天(⚠️ 必须开启,支持PITR?- 备份周期:每?- 备份时间?2:00-04:00(凌晨) ?**导入数据库(pg_dump?* - ⏱️ 5分钟 - 本地执行? ```bash # 1. 导出本地数据? docker exec ai-clinical-postgres pg_dump -U postgres -d ai_clinical_research \ --format=plain --no-owner --no-acl --encoding=UTF8 \ > backup_$(date +%Y%m%d_%H%M%S).sql # 2. 导入到RDS(需要ECS跳板机或临时开启公网) psql -h rm-xxxxx.pg.rds.aliyuncs.com \ -p 5432 \ -U aiclinical_rw \ -d ai_clinical_research \ -f backup_20251214_100000.sql ``` - 🔗 参考:`PostgreSQL部署策略-摸底报告.md` ?? ?**验证数据库导?* - ⏱️ 3分钟 - 连接RDS,执行: ```sql -- 验证Schema \dn -- 应该看到10个Schema -- 验证表数? SELECT schemaname, COUNT(*) FROM pg_tables WHERE schemaname NOT IN ('pg_catalog', 'information_schema') GROUP BY schemaname; -- platform_schema: 8, aia_schema: 5, pkb_schema: 5, asl_schema: 6, dc_schema: 6 -- 验证数据 SELECT COUNT(*) FROM platform_schema.users; -- 应该?条(或你的实际数量) ``` --- ### 1.4 OSS对象存储配置 ?**创建OSS Bucket** - ⏱️ 5分钟 - OSS控制?> Bucket列表 > 创建Bucket - Bucket名称:aiclinical-data-prod - 地域:cn-hangzhou(与VPC同地域) - 读写权限:私有(Private)⚠?必须私有 - 版本控制:关?- 服务端加密:关闭(可选) ?**配置生命周期规则(可选)** - ⏱️ 3分钟 - Bucket详情 > 基础设置 > 生命周期 - 规则名称:delete-temp-files - 应用范围:uploads/temp/ - 操作:删?- 天数?0天(临时文件30天后自动删除? ?**创建RAM角色(推荐)** - ⏱️ 10分钟 - RAM访问控制 > 角色 > 创建角色 - 角色类型:普通服务角?- 受信服务:SAE - 角色名称:AliyunSAEDefaultRole - 权限策略:AliyunOSSFullAccess - ⚠️ 使用RAM角色比AccessKey更安? ?**记录OSS配置信息** - Bucket名称:aiclinical-data-prod - 地域:cn-hangzhou - 内网Endpoint:oss-cn-hangzhou-internal.aliyuncs.com - AccessKey ID:(如果不用RAM角色?- AccessKey Secret:(如果不用RAM角色? --- ### 1.5 ACR容器镜像仓库配置 ?**创建命名空间** - ⏱️ 3分钟 - 容器镜像服务 > 命名空间 > 创建命名空间 - 命名空间:aiclinical - 类型:私? ?**配置访问凭证** - ⏱️ 2分钟 - 容器镜像服务 > 访问凭证 > 设置固定密码 - 用户名:(阿里云账号?- 密码:(设置一个强密码?- 记录登录命令? ```bash docker login --username=your-account registry.cn-hangzhou.aliyuncs.com ``` --- ## 阶段2:核心服务部署(Day 1下午? ### 2.1 Node.js后端部署 ?**本地代码准备** - ⏱️ 10分钟 - 确保代码最新:`git pull origin main` - 安装依赖:`cd backend && npm install` - 编译代码:`npm run build` - 验证编译:`ls dist/` 应该有编译后的JS文件 ?**Prisma反向同步(重要)** - ⏱️ 5分钟 - 连接RDS,执行: ```bash cd backend # 修改 .env 为RDS连接 DATABASE_URL=postgresql://aiclinical_rw:password@rm-xxxxx.pg.rds.aliyuncs.com:5432/ai_clinical_research # 反向同步 npx prisma db pull # 生成Prisma Client npx prisma generate ``` - 🔗 参考:`05-Node.js后端-SAE容器部署指南.md` ?? ?**修改HTTP Client超时配置** - ⏱️ 5分钟 - 编辑 `backend/src/common/http/httpClient.ts` - 设置timeout: 120000?20秒) - 🔗 参考:`07-关键配置补充说明.md` ?? ?**修改Dify Client容错处理** - ⏱️ 5分钟 - 编辑 `backend/src/common/rag/DifyClient.ts` - 添加临时Key容错逻辑 - 🔗 参考:`07-关键配置补充说明.md` ?? ?**构建Docker镜像** - ⏱️ 5分钟 - ```bash cd backend docker build -t backend:v1.0.0 . ``` - 验证镜像:`docker images | grep backend` ?**本地测试镜像** - ⏱️ 5分钟 - ```bash docker run -p 3001:3001 \ -e DATABASE_URL="postgresql://..." \ -e NODE_ENV=production \ backend:v1.0.0 ``` - 测试健康检查:`curl http://localhost:3001/health` ?**推送到ACR** - ⏱️ 3分钟 - ```bash docker tag backend:v1.0.0 registry.cn-hangzhou.aliyuncs.com/aiclinical/backend:v1.0.0 docker push registry.cn-hangzhou.aliyuncs.com/aiclinical/backend:v1.0.0 ``` ?**创建SAE应用** - ⏱️ 10分钟 - SAE控制?> 应用列表 > 创建应用 - 应用名称:aiclinical-backend - 部署方式:容器镜?- 镜像地址:registry.cn-hangzhou.aliyuncs.com/aiclinical/backend:v1.0.0 - VPC:aiclinical-vpc-prod - 交换机:aiclinical-vsw-prod - 实例规格??GB - 实例数量:最?,最?0 - 健康检查:HTTP /health ?**配置环境变量(关键)** - ⏱️ 10分钟 - SAE应用详情 > 环境变量 - 必需变量? ```bash # 数据? DATABASE_URL=postgresql://aiclinical_rw:password@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*** OSS_ACCESS_KEY_SECRET=*** # 缓存/队列(Postgres-Only? CACHE_TYPE=postgres QUEUE_TYPE=pgboss # Dify(⚠?临时值) DIFY_API_URL=http://172.16.x.x/v1 DIFY_API_KEY=temp_placeholder_will_update_later # Python微服务(稍后填写? EXTRACTION_SERVICE_URL=http://172.16.x.x:8000 # ⚠️ 使用Python服务的内网IP(从SAE控制台获取) # LLM API DEEPSEEK_API_KEY=sk-*** # 其他 NODE_ENV=production PORT=3001 JWT_SECRET=(生成一个强密钥? ``` ?**部署应用** - ⏱️ 5分钟(等待部?0分钟?- SAE控制?> 部署 - 等待实例启动 - 查看日志:应该看?数据库连接成? ?**验证后端服务** - ⏱️ 3分钟 - ```bash # 健康检? curl http://aiclinical-backend.sae:3001/health # 应该返回 200 OK # 测试用户注册 curl -X POST http://aiclinical-backend.sae:3001/api/v1/auth/register \ -H "Content-Type: application/json" \ -d '{"email":"test@example.com","password":"Test123456","name":"测试用户"}' # 应该返回 200 OK ``` --- ### 2.2 Python微服务部? ?**本地代码准备** - ⏱️ 5分钟 - `cd extraction_service` - 确保requirements.txt正确 ?**修改Dockerfile(Workers限制?* - ⏱️ 2分钟 - 编辑 `extraction_service/Dockerfile` - CMD设置workers=2 - 🔗 参考:`07-关键配置补充说明.md` ?? ?**构建Docker镜像** - ⏱️ 10分钟(Python镜像较大?- ```bash cd extraction_service docker build -t python-service:v1.0.0 . ``` ?**本地测试镜像** - ⏱️ 5分钟 - ```bash docker run -p 8000:8000 python-service:v1.0.0 curl http://localhost:8000/health ``` ?**推送到ACR** - ⏱️ 5分钟 - ```bash docker tag python-service:v1.0.0 registry.cn-hangzhou.aliyuncs.com/aiclinical/python-service:v1.0.0 docker push registry.cn-hangzhou.aliyuncs.com/aiclinical/python-service:v1.0.0 ``` ?**创建SAE应用** - ⏱️ 10分钟 - 应用名称:aiclinical-python-service - 镜像:registry.cn-hangzhou.aliyuncs.com/aiclinical/python-service:v1.0.0 - 实例规格??GB(⚠?不要低于2GB?- 实例数量:最?,最? ?**配置环境变量** - ⏱️ 3分钟 - ```bash OSS_REGION=cn-hangzhou OSS_BUCKET=aiclinical-data-prod OSS_ACCESS_KEY_ID=*** OSS_ACCESS_KEY_SECRET=*** ``` ?**部署并验?* - ⏱️ 5分钟 - 部署应用 - 测试:`curl http://172.16.x.x:8000/health`(使用实际内网IP? --- ### 2.3 前端部署 ?**本地代码准备** - ⏱️ 10分钟 - `cd frontend-v2` - `npm install` - `npm run build` ?**修改nginx.conf(文件大小限制)** - ⏱️ 2分钟 - 编辑 `frontend-v2/nginx.conf.template` - 添加 `client_max_body_size 50M;` - 🔗 参考:`07-关键配置补充说明.md` ?? ?**构建Docker镜像** - ⏱️ 5分钟 - ```bash cd frontend-v2 docker build -t frontend:v1.0.0 . ``` ?**推送到ACR** - ⏱️ 3分钟 - ```bash docker tag frontend:v1.0.0 registry.cn-hangzhou.aliyuncs.com/aiclinical/frontend:v1.0.0 docker push registry.cn-hangzhou.aliyuncs.com/aiclinical/frontend:v1.0.0 ``` ?**创建SAE应用** - ⏱️ 10分钟 - 应用名称:aiclinical-frontend - 镜像:registry.cn-hangzhou.aliyuncs.com/aiclinical/frontend:v1.0.0 - 实例规格?.5?GB - 实例数量? ?**配置环境变量** - ⏱️ 2分钟 - ```bash BACKEND_SERVICE_HOST=aiclinical-backend.sae BACKEND_SERVICE_PORT=3001 ``` ?**部署并验?* - ⏱️ 5分钟 - 部署应用 - 浏览器访问:http://前端公网地址 - 应该看到登录页面 --- ## 阶段3:Dify服务部署(Day 2上午? ### 3.1 ECS服务器准? ?**创建ECS实例** - ⏱️ 10分钟(等待创?分钟?- ECS控制?> 创建实例 - 实例规格:ecs.c6.xlarge??GB?- 镜像:Ubuntu 22.04 - VPC:aiclinical-vpc-prod - 交换机:aiclinical-vsw-prod - 安全组:aiclinical-sg-prod - 公网IP:分配(用于管理和Dify访问?- 记录公网IP:________________ ?**SSH登录ECS** - ⏱️ 2分钟 - ```bash ssh root@ECS公网IP ``` ?**安装Docker** - ⏱️ 5分钟 - ```bash curl -fsSL https://get.docker.com | bash systemctl start docker systemctl enable docker docker --version ``` ?**安装Docker Compose** - ⏱️ 3分钟 - ```bash curl -L "https://github.com/docker/compose/releases/download/v2.20.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose docker-compose --version ``` ?**配置Swap(防止OOM?* - ⏱️ 5分钟 - ```bash fallocate -l 4G /swapfile chmod 600 /swapfile mkswap /swapfile swapon /swapfile echo '/swapfile none swap sw 0 0' >> /etc/fstab swapon --show ``` - 🔗 参考:`03-Dify-ECS部署完全指南.md` ?? --- ### 3.2 Dify部署 ?**下载Dify** - ⏱️ 5分钟 - ```bash cd /opt git clone https://github.com/langgenius/dify.git cd dify/docker ``` ?**修改docker-compose.yaml(端口安全)** - ⏱️ 5分钟 - 编辑 `docker-compose.yaml` - Redis端口:`127.0.0.1:6379:6379` - Weaviate端口:`127.0.0.1:8080:8080` - ⚠️ 只有Nginx对外?0端口?- 🔗 参考:`07-关键配置补充说明.md` ?? ?**配置.env文件** - ⏱️ 10分钟 - ```bash cp .env.example .env vi .env ``` - 关键配置? ```bash # Redis REDIS_HOST=redis REDIS_PORT=6379 # PostgreSQL DB_HOST=db DB_PORT=5432 DB_DATABASE=dify DB_USERNAME=postgres DB_PASSWORD=(生成强密码? # Weaviate WEAVIATE_ENDPOINT=http://weaviate:8080 # 其他 SECRET_KEY=(生成强密钥? ``` ?**启动Dify** - ⏱️ 10分钟(首次启动需要拉取镜像) - ```bash docker-compose up -d docker-compose logs -f # 等待所有服务启动(?-3分钟? ``` ?**验证Dify服务** - ⏱️ 3分钟 - 浏览器访问:http://ECS公网IP - 应该看到Dify欢迎页面 --- ### 3.3 Dify配置 ?**注册管理员账?* - ⏱️ 2分钟 - 首次访问会提示注?- 邮箱:admin@your-company.com - 密码:(强密码) ?**创建API Key** - ⏱️ 3分钟 - 登录Dify - 设置 > API密钥 > 创建密钥 - 名称:Backend Service - 复制API Key:app-xxxxxxxxxxxxxxxxxxxxx - ⚠️ 妥善保存,只显示一? ?**更新后端环境变量** - ⏱️ 5分钟 - SAE控制?> aiclinical-backend > 环境变量 - 修改? ```bash DIFY_API_URL=http://172.16.x.x/v1 # ECS内网IP DIFY_API_KEY=app-xxxxxxxxxxxxxxxxxxxxx # 真实Key ``` - 保存 > 重启应用 ?**测试PKB功能** - ⏱️ 5分钟 - ```bash # 创建知识? curl -X POST http://前端地址/api/v1/pkb/knowledge-bases \ -H "Authorization: Bearer USER_TOKEN" \ -d '{"name":"测试知识?}' # 应该返回 200 OK ``` --- ## 阶段4:端到端测试(Day 2下午? ### 4.1 功能测试 ?**用户注册/登录** - ⏱️ 5分钟 - 前端注册新用?- 登录成功 ?**AI对话(AIA模块?* - ⏱️ 5分钟 - 创建项目 - 发起对话 - 验证DeepSeek API调用成功 ?**知识库(PKB模块?* - ⏱️ 10分钟 - 创建知识?- 上传PDF文档 - 验证Dify处理成功 ?**文献筛选(ASL模块?* - ⏱️ 10分钟 - 创建筛选项?- 上传PDF - 验证Python服务解析成功 ?**数据清洗(DC模块?* - ⏱️ 10分钟 - 上传Excel - 执行清洗 - 验证Polars处理成功 --- ### 4.2 性能测试 ?**响应时间** - ⏱️ 10分钟 - API响应时间 < 2?- 页面加载时间 < 3? ?**并发测试** - ⏱️ 10分钟 - 使用Apache Bench或JMeter - 模拟10个并发用?- 验证无错? --- ### 4.3 监控配置 ?**配置日志收集** - ⏱️ 10分钟 - SAE自动收集stdout/stderr - 验证日志可查? ?**配置告警规则** - ⏱️ 15分钟 - 云监?> 告警规则 - CPU > 70% - 内存 > 80% - 错误日志 > 10?分钟 --- ## 阶段5:优化与文档(Day 3? ### 5.1 可选优? ?**配置SSH隧道(开发便利)** - ⏱️ 10分钟 - 🔗 参考:`07-关键配置补充说明.md` ?? ?**实现OSS签名URL(安全)** - ⏱️ 30分钟 - 🔗 参考:`07-关键配置补充说明.md` ?? ?**配置域名(可选)** - ⏱️ 30分钟 - 购买域名 - 配置DNS解析 - 配置HTTPS证书 --- ### 5.2 文档整理 ?**记录配置信息** - ⏱️ 20分钟 - 创建 `部署配置清单.xlsx` - 记录所有密码、地址、Key ?**备份配置文件** - ⏱️ 10分钟 - Dify?`.env` ?`docker-compose.yaml` - 上传到私有Git仓库或加密存? ?**编写运维手册** - ⏱️ 30分钟 - 日常操作流程 - 故障处理流程 - 联系人信? --- ## 总结 ### 时间统计 | 阶段 | 预计时间 | 实际时间 | |------|---------|---------| | 阶段1:基础设施 | 2小时 | _______ | | 阶段2:核心服?| 2小时 | _______ | | 阶段3:Dify服务 | 1小时 | _______ | | 阶段4:测?| 1小时 | _______ | | 阶段5:优?| 可?| _______ | | **总计** | **6小时** | _______ | ### 成本统计 | 服务 | 规格 | 月成?| |------|------|--------| | SAE前端 | 0.5?GB×1 | ¥50 | | SAE后端 | 1?GB×2 | ¥200 | | SAE Python | 1?GB×1 | ¥100 | | RDS PostgreSQL | 2?GB | ¥400 | | ECS Dify | 4?GB | ¥300 | | OSS | 50GB | ¥10 | | NAT网关 | 小型+EIP | ¥100 | | **总计** | - | **¥1,160/?* | ### 下一? ?观察7天稳定??根据监控数据调整资源 ?准备故障演练 ?编写用户手册 --- **恭喜!你已经完成了从0?的部署!** 🎉 **文档创建人:** AI助手 **最后更新:** 2025-12-14 **版本?* v1.0