feat(admin): Add user management and upgrade to module permission system

Features - User Management (Phase 4.1):
- Database: Add user_modules table for fine-grained module permissions
- Database: Add 4 user permissions (view/create/edit/delete) to role_permissions
- Backend: UserService (780 lines) - CRUD with tenant isolation
- Backend: UserController + UserRoutes (648 lines) - 13 API endpoints
- Backend: Batch import users from Excel
- Frontend: UserListPage (412 lines) - list/filter/search/pagination
- Frontend: UserFormPage (341 lines) - create/edit with module config
- Frontend: UserDetailPage (393 lines) - details/tenant/module management
- Frontend: 3 modal components (592 lines) - import/assign/configure
- API: GET/POST/PUT/DELETE /api/admin/users/* endpoints

Architecture Upgrade - Module Permission System:
- Backend: Add getUserModules() method in auth.service
- Backend: Login API returns modules array in user object
- Frontend: AuthContext adds hasModule() method
- Frontend: Navigation filters modules based on user.modules
- Frontend: RouteGuard checks requiredModule instead of requiredVersion
- Frontend: Remove deprecated version-based permission system
- UX: Only show accessible modules in navigation (clean UI)
- UX: Smart redirect after login (avoid 403 for regular users)

Fixes:
- Fix UTF-8 encoding corruption in ~100 docs files
- Fix pageSize type conversion in userService (String to Number)
- Fix authUser undefined error in TopNavigation
- Fix login redirect logic with role-based access check
- Update Git commit guidelines v1.2 with UTF-8 safety rules

Database Changes:
- CREATE TABLE user_modules (user_id, tenant_id, module_code, is_enabled)
- ADD UNIQUE CONSTRAINT (user_id, tenant_id, module_code)
- INSERT 4 permissions + role assignments
- UPDATE PUBLIC tenant with 8 module subscriptions

Technical:
- Backend: 5 new files (~2400 lines)
- Frontend: 10 new files (~2500 lines)
- Docs: 1 development record + 2 status updates + 1 guideline update
- Total: ~4900 lines of code

Status: User management 100% complete, module permission system operational
This commit is contained in:
2026-01-16 13:42:10 +08:00
parent 98d862dbd4
commit 66255368b7
560 changed files with 70424 additions and 52353 deletions

View File

@@ -1,42 +1,42 @@
# Node.js 后端 - SAE部署操作手册
> **<EFBFBD>𥕦遣<EFBFBD>園𡢿**嚗?025-12-24
> **创建时间**2025-12-24
> **操作对象**Node.js 后端服务
> **<EFBFBD>函蔡<EFBFBD><EFBFBD>**嚗𡁻燵<F0A181BB><EFBFBD> SAE嚗𠄎erverless摨𠉛鍂撘閙<EFBFBD>嚗?
> **<EFBFBD><EFBFBD>園𡢿**嚗?0-40<EFBFBD><EFBFBD><EFBFBD>
> **部署目标**:阿里云 SAEServerless应用引擎)
> **预计时间**30-40分钟
---
## <EFBFBD><EFBFBD> <20>滨蔭璉<E894AD><E79289>?
## 📋 前置检查
开始之前,请确认:
- [x] Docker镜像已推送到ACR`backend-service:v1.0`
- [x] RDS PostgreSQL已部署并迁移数据
- [x] Python敺格<EFBFBD><EFBFBD><EFBFBD>函蔡嚗<EFBFBD><EFBFBD>蝵穃𧑐<EFBFBD><EFBFBD>嚗䫤http://172.17.173.66:8000`嚗?
- [x] <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>滨蔭皜<EFBFBD><EFBFBD>撌脣<EFBFBD><EFBFBD><EFBFBD>閫?`11-Node.js<EFBFBD>𡒊垢-SAE<EFBFBD>函蔡<EFBFBD>滨蔭皜<EFBFBD><EFBFBD>.md`嚗?
- [x] Python微服务已部署(内网地址:`http://172.17.173.66:8000`
- [x] 环境变量配置清单已准备(见 `11-Node.js后端-SAE部署配置清单.md`
---
## 🚀 第一步登录SAE控制台并创建应用
### 1.1 餈𥕦<EFBFBD>SAE<EFBFBD><EFBFBD><EFBFBD>?
### 1.1 进入SAE控制台
1. 打开浏览器访问https://sae.console.aliyun.com/
2. <EFBFBD>㗇𥋘<EFBFBD><EFBFBD>嚗?*<2A>𤾸<EFBFBD>2嚗<32><E59A97>鈭穿<E988AD>**
3. <EFBFBD>㗇𥋘<EFBFBD><EFBFBD>蝛粹𡢿嚗?*cn-beijing:test-airesearch**
2. 选择地域:**华北2北京**
3. 选择命名空间:**cn-beijing:test-airesearch**
### 1.2 <EFBFBD>𥕦遣<EFBFBD><EFBFBD><EFBFBD>?
### 1.2 创建新应用
1. <EFBFBD>孵稬<EFBFBD>𣂼<EFBFBD>撱箏<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
2. 憛怠<EFBFBD><EFBFBD>箸𧋦靽⊥<EFBFBD>嚗?
1. 点击【创建应用】按钮
2. 填写基本信息:
```yaml
应用名称: nodejs-backend-test
部署方式: 容器镜像
```
3. <EFBFBD>孵稬<EFBFBD>𣂷<EFBFBD><EFBFBD>甇乓<EFBFBD>?
3. 点击【下一步】
---
@@ -44,38 +44,38 @@
### 2.1 选择镜像来源
1. <EFBFBD>𨅯<EFBFBD>蝐餃<EFBFBD>嚗𡁻<EFBFBD>㗇𥋘 **摰孵膥<E5ADB5>𨅯<EFBFBD><F0A885AF>滚𦛚嚗㇁CR嚗?*
2. <EFBFBD>㗇𥋘摰硺<EFBFBD>嚗?*銝芯犖<E88AAF>?*
3. <EFBFBD>㗇𥋘<EFBFBD><EFBFBD>嚗?*<2A>𤾸<EFBFBD>2嚗<32><E59A97>鈭穿<E988AD>**
1. 镜像类型:选择 **容器镜像服务ACR**
2. 选择实例:**个人版**
3. 选择地域:**华北2北京**
### 2.2 配置镜像仓库认证
<EFBFBD>𩤃<EFBFBD> **<EFBFBD><EFBFBD>**嚗𡁜<E59A97>憿餃<E686BF><E9A483>滨蔭霈方<E99C88><EFBFBD><EFBFBD><EFBFBD>瘜閙<E7989C><E99699>𣇉<EFBFBD><F0A38789><EFBFBD><E58EB0>?
⚠️ **重要**:必须先配置认证,否则无法拉取私有镜像
1. <EFBFBD>孵稬<EFBFBD><EFBFBD>蝵桅<EFBFBD><EFBFBD><EFBFBD>摨瓐<EFBFBD>?
2. 憛怠<EFBFBD>霈方<EFBFBD>靽⊥<EFBFBD>嚗?
1. 点击【配置镜像仓库】
2. 填写认证信息:
```yaml
Registry地址: crpi-cd5ij4pjt65mweeo-vpc.cn-beijing.personal.cr.aliyuncs.com
<EFBFBD><EFBFBD><EFBFBD>? gofeng117@163.com
用户名: gofeng117@163.com
密码: fengzhibo117
```
3. <EFBFBD>孵稬<EFBFBD>摰𠾼<EFBFBD>?
3. 点击【确定】
4. 点击【验证认证】,确保认证成功
### 2.3 选择镜像
1. <EFBFBD>㗇𥋘<EFBFBD><EFBFBD>蝛粹𡢿嚗?*ai-clinical**
2. <EFBFBD>㗇𥋘<EFBFBD>𨅯<EFBFBD>嚗?*backend-service**
3. <EFBFBD>㗇𥋘<EFBFBD>𨅯<EFBFBD><EFBFBD><EFBFBD>𧋦嚗?*v1.0**
1. 选择命名空间:**ai-clinical**
2. 选择镜像:**backend-service**
3. 选择镜像版本:**v1.0**
摰峕㟲<EFBFBD>𨅯<EFBFBD><EFBFBD><EFBFBD>摨娍遬蝷箔蛹嚗?
完整镜像地址应显示为:
```
crpi-cd5ij4pjt65mweeo-vpc.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:v1.0
```
4. <EFBFBD>孵稬<EFBFBD>𣂷<EFBFBD><EFBFBD>甇乓<EFBFBD>?
4. 点击【下一步】
---
@@ -84,31 +84,31 @@ crpi-cd5ij4pjt65mweeo-vpc.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backen
### 3.1 基础配置
```yaml
摨𠉛鍂摰硺<EFBFBD><EFBFBD>? 1
CPU: 1<EFBFBD>?
<EFBFBD><EFBFBD><EFBFBD>: 2048 MB嚗?GB嚗?
应用实例数: 1
CPU: 1核
内存: 2048 MB2GB
应用类型: Web应用
```
### 3.2 网络配置
1. **VPC<EFBFBD>滨蔭**嚗?
1. **VPC配置**
- VPC ID`vpc-2ze055cptkew9c38w4r06`
- 安全组:`sg-2zedk6fi8sgmmcwdu7tu`
- <EFBFBD><EFBFBD><EFBFBD>鞱䌊<EFBFBD><EFBFBD><EFBFBD><EFBFBD>蝵騌LB<EFBFBD>𡢅<EFBFBD><EFBFBD>?銝滚㗲<E6BB9A><EFBFBD><EFBFBD><E99A9E>蝵𤏸挪<F0A48FB8><EFBFBD>
- 勾选【自动分配公网SLB】❌ 不勾选(仅内网访问)
2. **蝡臬藁<EFBFBD>滨蔭**嚗?
2. **端口配置**
- 容器端口:`3001`
- 协议:`TCP`
### 3.3 环境变量配置
<EFBFBD>𩤃<EFBFBD> **<EFBFBD>喲睸甇仿炊**嚗𡁜<E59A97><F0A1819C>?`11-Node.js<EFBFBD>𡒊垢-SAE<EFBFBD>函蔡<EFBFBD>滨蔭皜<EFBFBD><EFBFBD>.md` 銝剔<E98A9D><E58994><EFBFBD><E887AC><EFBFBD>
⚠️ **关键步骤**:复制 `11-Node.js后端-SAE部署配置清单.md` 中的环境变量
**<EFBFBD><EFBFBD>A嚗𡁏鸌<EFBFBD>誩紡<EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗?*
**方式A批量导入推荐**
1. <EFBFBD>孵稬<EFBFBD>鞉鸌<EFBFBD>誩紡<EFBFBD><EFBFBD>?
2. 憭滚<EFBFBD>隞乩<EFBFBD><EFBFBD><EFBFBD>捆蝎䁅斐嚗?
1. 点击【批量导入】
2. 复制以下内容粘贴:
```env
DATABASE_URL=postgresql://airesearch:Xibahe%40fengzhibo117@pgm-2zex1m2y3r23hdn5.pg.rds.aliyuncs.com:5432/ai_clinical_research?connection_limit=18&pool_timeout=10
@@ -134,101 +134,101 @@ PYTHON_SERVICE_URL=http://172.17.173.66:8000
LOG_LEVEL=info
```
3. <EFBFBD>孵稬<EFBFBD>摰𠾼<EFBFBD>?
3. 点击【确定】
**<EFBFBD><EFBFBD>B嚗𡁻<EFBFBD>𣂷葵瘛餃<EFBFBD>**嚗<><E59A97><EFBFBD>𨀣鸌<F0A880A3>誩紡<E8AAA9><EFBFBD><E4B9A9>舐鍂嚗?
**方式B逐个添加**(如果批量导入不可用)
<EFBFBD>函㴓憓<EFBFBD><EFBFBD><EFBFBD>讛”<EFBFBD>潔葉<EFBFBD>𣂷葵瘛餃<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?`11-Node.js<EFBFBD>𡒊垢-SAE<EFBFBD>函蔡<EFBFBD>滨蔭皜<EFBFBD><EFBFBD>.md` 銝剔<E98A9D>銵冽聢<E586BD>?
在环境变量表格中逐个添加,参考 `11-Node.js后端-SAE部署配置清单.md` 中的表格。
### 3.4 启动命令配置
1. <EFBFBD><EFBFBD>𣂼鍳<EFBFBD>典𦶢隞扎<EFBFBD>睲葉憛怠<EFBFBD>嚗?
1. 在【启动命令】中填写:
```bash
node dist/server.js
```
**霂湔<EFBFBD>**嚗?
- <EFBFBD>?銝漤<E98A9D>閬?`npm start`<EFBFBD><EFBFBD><EFBFBD>誩歇蝏讐<EFBFBD>霂穃末嚗?
- <EFBFBD>?銝漤<E98A9D>閬?`prisma migrate`<EFBFBD><EFBFBD>桀歇撖澆<EFBFBD>嚗?
- <EFBFBD>?銝漤<E98A9D>閬?`prisma generate`<EFBFBD><EFBFBD><EFBFBD>𤩺<EFBFBD>撱箸𧒄撌脩<EFBFBD><EFBFBD><EFBFBD>
**说明**
- ✅ 不需要 `npm start`(镜像已经编译好)
- ✅ 不需要 `prisma migrate`(数据已导入)
- ✅ 不需要 `prisma generate`(镜像构建时已生成)
### 3.5 <EFBFBD>亙熒璉<EFBFBD><EFBFBD>仿<EFBFBD>蝵?
### 3.5 健康检查配置
1. <EFBFBD><EFBFBD><EFBFBD>𣂼鍳<EFBFBD><EFBFBD>摨瑟<EFBFBD><EFBFBD><EFBFBD>?
2. <EFBFBD>滨蔭<EFBFBD><EFBFBD>㺭嚗?
1. 勾选【启用健康检查】
2. 配置参数:
```yaml
<EFBFBD><EFBFBD>交䲮撘? HTTP霂瑟<EFBFBD>
检查方式: HTTP请求
请求路径: /health
端口: 3001
<EFBFBD><EFBFBD>撱嗉<EFBFBD>: 30蝘?
<EFBFBD><EFBFBD>仿𡢿<EFBFBD>? 10蝘?
<EFBFBD>𧒄<EFBFBD>園𡢿: 3蝘?
銝滚<EFBFBD>摨琿<EFBFBD><EFBFBD>? 3甈?
<EFBFBD>亙熒<EFBFBD><EFBFBD><EFBFBD>? 2甈?
初始延迟: 30
检查间隔: 10秒
超时时间: 3
不健康阈值: 3次
健康阈值: 2次
```
**銝箔<EFBFBD><EFBFBD><EFBFBD>憪见辣餈蠘挽蝵?0蝘𡜐<E89D98>**
- Node.js摨𠉛鍂<EFBFBD>臬𢆡<EFBFBD><EFBFBD>閬?0-15蝘?
- Prisma Client<EFBFBD><EFBFBD><EFBFBD><EFBFBD>閬?-10蝘?
- <EFBFBD>唳旿摨栞<EFBFBD><EFBFBD><EFBFBD>撱箇<EFBFBD><EFBFBD><EFBFBD>閬?蝘?
- <EFBFBD><EFBFBD>雿䠷<EFBFBD>嚗屸<EFBFBD><EFBFBD><EFBFBD><EFBFBD>摨瑟<EFBFBD><EFBFBD>亙仃韐?
**为什么初始延迟设置30秒**
- Node.js应用启动需要10-15
- Prisma Client初始化需要5-10
- 数据库连接池建立需要5秒
- 留有余量,避免首次健康检查失败
3. <EFBFBD>孵稬<EFBFBD>𣂷<EFBFBD><EFBFBD>甇乓<EFBFBD>?
3. 点击【下一步】
---
## <EFBFBD><EFBFBD> 蝚砍<E89D9A>甇伐<E79487>蝖株恕<E6A0AA>滨蔭撟園<E6929F>蝵?
## 📝 第四步:确认配置并部署
### 4.1 <EFBFBD><EFBFBD>仿<EFBFBD>蝵格<EFBFBD>閬?
### 4.1 检查配置摘要
在确认页面,仔细检查:
- [x] 镜像地址正确:`backend-service:v1.0`
- [x] <EFBFBD><EFBFBD><EFBFBD>滨蔭甇<EFBFBD>嚗?<3F>?GB
- [x] <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗?1銝迎<E98A9D><E8BF8E>臭誑<E887AD>孵稬<E5ADB5><EFBFBD>霂行<E99C82>嚗?
- [x] 资源配置正确1核2GB
- [x] 环境变量数量21个可以点击查看详情
- [x] 健康检查路径:`/health`
- [x] 启动命令:`node dist/server.js`
### 4.2 <EFBFBD>憪钅<EFBFBD>蝵?
### 4.2 开始部署
1. <EFBFBD>孵稬<EFBFBD>𣂼<EFBFBD>撱箏<EFBFBD><EFBFBD><EFBFBD>?
2. 蝑匧<EFBFBD><EFBFBD>函蔡嚗<EFBFBD>漲3-5<><35><EFBFBD>嚗?
1. 点击【创建应用】
2. 等待部署约3-5分钟
**<EFBFBD>函蔡餈<EFBFBD><EFBFBD>**嚗?
**部署过程**
```
1. <EFBFBD><EFBFBD><EFBFBD>𨅯<EFBFBD>嚗?<3F><><EFBFBD>嚗?
2. <EFBFBD>𥕦遣摰孵膥摰硺<EFBFBD>嚗?<3F><><EFBFBD>嚗?
3. <EFBFBD>臬𢆡摨𠉛鍂嚗?0蝘𡜐<E89D98>
1. 拉取镜像2分钟
2. 创建容器实例1分钟
3. 启动应用30秒
4. 执行健康检查30秒
```
---
## <EFBFBD>?蝚砌<E89D9A>甇伐<E79487><E4BC90>函蔡撉諹<E69289>
## ✅ 第五步:部署验证
### 5.1 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>函𠶖<EFBFBD>?
### 5.1 检查应用状态
1. 在SAE应用列表中找到 `nodejs-backend-test`
2. 查看状态:
- <EFBFBD>?摰硺<E691B0><E7A1BA><EFBFBD><E59786><EFBFBD>**餈鞱<E9A488>銝?*嚗<><EFBFBD><EFBFBD>
- <EFBFBD>?<3F>亙熒璉<E78692><E79289><EFBFBD>**<2A><EFBFBD>**嚗<><EFBFBD><EFBFBD>
- <EFBFBD>?憒<><E68692><EFBFBD>曄內"撘<>虜"<22>?<3F><EFBFBD><EFBFBD>"嚗諹<E59A97><E8ABB9>亦洵<E4BAA6>剜郊<E5899C>埝䰻
- ✅ 实例状态:**运行中**(绿色)
- ✅ 健康检查:**通过**(绿色)
- ❌ 如果显示"异常"或"未通过",进入第六步排查
### 5.2 查看实时日志
1. <EFBFBD>孵稬摨𠉛鍂<EFBFBD>滨妍嚗諹<EFBFBD><EFBFBD><EFBFBD><EFBFBD>刻祕<EFBFBD>?
2. <EFBFBD>孵稬<EFBFBD>鞉𠯫敹𨰜<EFBFBD><EFBFBD><EFBFBD>𣂼<EFBFBD><EFBFBD>嗆𠯫敹𨰜<EFBFBD>?
3. <EFBFBD>交𪄳隞乩<EFBFBD><EFBFBD>喲睸靽⊥<EFBFBD>嚗?
1. 点击应用名称,进入应用详情
2. 点击【日志】→【实时日志】
3. 查找以下关键信息:
**<EFBFBD>?<3F>𣂼<EFBFBD><F0A382BC><EFBFBD>𠯫敹㛖內靘?*嚗?
**✅ 成功的日志示例**
```
============================================================
🚀 AI临床研究平台 - 后端服务器启动成功!
============================================================
📍 服务地址: http://0.0.0.0:3001
<EFBFBD><EFBFBD> <20>亙熒璉<E78692><E79289>? http://0.0.0.0:3001/health
🔍 健康检查: http://0.0.0.0:3001/health
📡 API入口: http://0.0.0.0:3001/api/v1
🌍 运行环境: production
============================================================
@@ -238,32 +238,32 @@ node dist/server.js
[INFO] Health check endpoint available: /health
```
**<EFBFBD>?憭梯揖<E6A2AF><E68F96>𠯫敹㛖內靘?*嚗?
**❌ 失败的日志示例**
```
[ERROR] Database connection failed: connect ETIMEDOUT
[ERROR] Prisma Client initialization failed
[ERROR] Application startup failed
```
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>躰秤嚗諹<EFBFBD><EFBFBD>亦洵<EFBFBD>剜郊<EFBFBD>埝䰻<EFBFBD>?
如果看到错误,进入第六步排查。
### 5.3 获取内网地址
1. <EFBFBD><EFBFBD><EFBFBD>刻祕<EFBFBD><EFBFBD>△嚗峕𪄳<EFBFBD><EFBFBD>𣂼抅<EFBFBD>砌縑<EFBFBD><EFBFBD>?
1. 在应用详情页,找到【基本信息】
2. 复制内网地址,格式类似:`http://172.17.x.x:3001`
3. 记录到部署文档中
**蝷箔<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>**嚗?
**示例内网地址**
```
http://172.17.173.88:3001
```
### 5.4 瘚贝<EFBFBD><EFBFBD>亙熒璉<EFBFBD><EFBFBD>?
### 5.4 测试健康检查
<EFBFBD>沒AE<EFBFBD><EFBFBD><EFBFBD>𨔽ebshell<EFBFBD>睲葉<EFBFBD><EFBFBD>嚗?
在SAE的【Webshell】中执行
```bash
# 瘚贝<EFBFBD><EFBFBD>亙熒璉<EFBFBD><EFBFBD>?
# 测试健康检查
curl http://172.17.173.88:3001/health
# 期望返回HTTP 200
@@ -276,10 +276,10 @@ curl http://172.17.173.88:3001/health
}
```
### 5.5 瘚贝<EFBFBD><EFBFBD>唳旿摨栞<EFBFBD><EFBFBD>?
### 5.5 测试数据库连接
```bash
# 瘚贝<EFBFBD><EFBFBD><EFBFBD>API嚗<EFBFBD><EFBFBD><EFBFBD>𨀣<EFBFBD><EFBFBD>唳旿嚗?
# 测试用户API如果有数据
curl http://172.17.173.88:3001/api/v1/users \
-H "Authorization: Bearer test-token"
@@ -290,68 +290,68 @@ curl http://172.17.173.88:3001/api/v1/users \
## 🔧 第六步:故障排查(可选)
### <EFBFBD><EFBFBD>1嚗𡁜<EFBFBD>摨瑟<EFBFBD><EFBFBD><EFBFBD><EFBFBD>游仃韐?
### 问题1健康检查一直失败
**<EFBFBD><EFBFBD>𠶖**嚗𡁜<E59A97><F0A1819C>函𠶖<E587BD><F0A0B696>遬蝷?撘<>虜"嚗<><E59A97>靘钅<E99D98><EFBFBD><E89D9C><EFBFBD>?
**症状**:应用状态显示"异常",实例频繁重启
**<EFBFBD>埝䰻甇仿炊**嚗?
**排查步骤**
1. **<EFBFBD><EFBFBD>交𠯫敹𦯀葉<EFBFBD><EFBFBD><EFBFBD>霂臭縑<EFBFBD>?*嚗?
1. **检查日志中的错误信息**
```bash
# <EFBFBD>沒AE摰墧𧒄<EFBFBD><EFBFBD>銝剜䰻<EFBFBD><EFBFBD><EFBFBD><EFBFBD>霂?
# 在SAE实时日志中查找关键错误
[ERROR] ...
```
2. **撣貉<EFBFBD><EFBFBD><EFBFBD><EFBFBD>𡃏圾<EFBFBD>單䲮獢?*嚗?
2. **常见原因及解决方案**
| 错误信息 | 原因 | 解决方案 |
|---------|------|---------|
| `connect ETIMEDOUT` | <EFBFBD>唳旿摨栞<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?| 璉<><E79289>充DS<44><EFBFBD><E8B3A2>𨰻<EFBFBD><F0A8B0BB>PC<50>滨蔭 |
| `authentication failed` | <EFBFBD>唳旿摨枏<EFBFBD><EFBFBD><EFBFBD><EFBFBD>霂?| 璉<><E79289>ATABASE_URL銝剔<EFBFBD><EFBFBD><EFBFBD>蝻𣇉<EFBFBD> |
| `ENOENT: no such file or directory` | <EFBFBD>臬𢆡<EFBFBD>賭誘<EFBFBD>躰秤 | 蝖株恕<E6A0AA>臬𢆡<E887AC>賭誘銝?`node dist/server.js` |
| `Cannot find module 'prisma'` | Prisma Client<EFBFBD><EFBFBD><EFBFBD>?| <20>齿鰵<E9BDBF><E9B0B5><EFBFBD>𨅯<EFBFBD> |
| `Port 3001 already in use` | 蝡臬藁<EFBFBD><EFBFBD> | 璉<><E79289>亙捆<E4BA99>函垢<E587BD><E59EA2><EFBFBD>蝵?|
| `connect ETIMEDOUT` | 数据库连接超时 | 检查RDS白名单、VPC配置 |
| `authentication failed` | 数据库密码错误 | 检查DATABASE_URL中的密码编码 |
| `ENOENT: no such file or directory` | 启动命令错误 | 确认启动命令为 `node dist/server.js` |
| `Cannot find module 'prisma'` | Prisma Client未生成 | 重新构建镜像 |
| `Port 3001 already in use` | 端口冲突 | 检查容器端口配置 |
3. **撉諹<EFBFBD><EFBFBD>唳旿摨栞<EFBFBD><EFBFBD>?*嚗?
3. **验证数据库连接**
```bash
# <EFBFBD>沒AE<EFBFBD><EFBFBD>ebshell銝剜<EFBFBD>霂?
# 在SAE的Webshell中测试
curl -v telnet://pgm-2zex1m2y3r23hdn5.pg.rds.aliyuncs.com:5432
```
### <EFBFBD><EFBFBD>2嚗𡁻<EFBFBD><EFBFBD>𤩺<EFBFBD><EFBFBD>硋仃韐?
### 问题2镜像拉取失败
**<EFBFBD><EFBFBD>𠶖**嚗𡁏𠯫敹埈遬蝷?`Failed to pull image`
**症状**:日志显示 `Failed to pull image`
**<EFBFBD><EFBFBD><EFBFBD><EFBFBD>**嚗?
**解决方案**
1. <EFBFBD><EFBFBD>丕CR霈方<EFBFBD><EFBFBD>滨蔭嚗?
- Registry<EFBFBD><EFBFBD><EFBFBD>臬炏甇<EFBFBD>嚗ĀPC<EFBFBD><EFBFBD>嚗?
- <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>行迤蝖?
1. 检查ACR认证配置
- Registry地址是否正确VPC域名
- 用户名密码是否正确
2. <EFBFBD>齿鰵<EFBFBD>滨蔭<EFBFBD>𨅯<EFBFBD>隞枏<EFBFBD>霈方<EFBFBD>嚗?
- SAE摨𠉛鍂霂行<EFBFBD> <20>?<3F>滨蔭蝞∠<E89D9E> <20>?<3F>𨅯<EFBFBD>霈曄蔭
2. 重新配置镜像仓库认证:
- SAE应用详情 → 配置管理 → 镜像设置
- 重新输入认证信息
### 问题3环境变量未生效
**症状**:应用行为与预期不符
**<EFBFBD>埝䰻甇仿炊**嚗?
**排查步骤**
1. <EFBFBD>沒AE摨𠉛鍂霂行<EFBFBD> <20>?<3F><EFBFBD><E887AC><EFBFBD>銝哨<E98A9D>蝖株恕<E6A0AA><E68195><EFBFBD><EFBFBD><E58CA7>誩歇<E8AAA9>滨蔭
1. 在SAE应用详情 → 环境变量中,确认所有变量已配置
2. 在Webshell中查看环境变量
```bash
env | grep DATABASE_URL
env | grep JWT_SECRET
```
### <EFBFBD><EFBFBD>4嚗𡁜<EFBFBD>摮䀝<EFBFBD>頞喉<EFBFBD>OOM嚗?
### 问题4内存不足OOM
**<EFBFBD><EFBFBD>𠶖**嚗𡁜<E59A97><F0A1819C><EFBFBD><EFBFBD><E89D9C><EFBFBD><EFBFBD><E88D94><EFBFBD>銝剖枂<E58996>?`Out of Memory`
**症状**:应用频繁重启,日志中出现 `Out of Memory`
**<EFBFBD><EFBFBD><EFBFBD><EFBFBD>**嚗?
**解决方案**
1. <EFBFBD>沒AE摨𠉛鍂霂行<EFBFBD> <20>?<3F>箸𧋦<E7AEB8>滨蔭銝哨<E98A9D><EFBFBD><E692A0>摮䁅<E691AE><E48185>港蛹 **2<EFBFBD>?GB**
1. 在SAE应用详情 → 基本配置中,将内存调整为 **2核4GB**
2. 重新部署应用
---
@@ -360,45 +360,45 @@ curl http://172.17.173.88:3001/api/v1/users \
### 7.1 查看监控指标
<EFBFBD>沒AE摨𠉛鍂霂行<EFBFBD> <20>?<3F>烐綉銝哨<E98A9D><E593A8>單釣隞乩<E99A9E><E4B9A9><EFBFBD><EFBFBD>嚗?
在SAE应用详情 → 监控中,关注以下指标:
```yaml
CPU雿輻鍂<EFBFBD>? 摨?< 70%
<EFBFBD><EFBFBD><EFBFBD>雿輻鍂<EFBFBD>? 摨?< 80%
摰硺<EFBFBD><EFBFBD>亙熒<EFBFBD><EFBFBD>? 摨𥪯<E691A8><F0A5AAAF>?<3F>亙熒"
霂瑟<EFBFBD><EFBFBD><EFBFBD><EFBFBD>園𡢿: 摨?< 1000ms
CPU使用率: 应 < 70%
内存使用率: 应 < 80%
实例健康状态: 应保持"健康"
请求响应时间: 应 < 1000ms
```
### 7.2 设置告警
撱箄悅<EFBFBD>滨蔭隞乩<EFBFBD><EFBFBD>𡃏郎嚗?
建议配置以下告警:
```yaml
CPU雿輻鍂<EFBFBD>?> 80%: <EFBFBD><EFBFBD><EFBFBD><EFBFBD>霅?
<EFBFBD><EFBFBD><EFBFBD>雿輻鍂<EFBFBD>?> 90%: <20><EFBFBD><E785BE><EFBFBD>霅?
摰硺<EFBFBD>銝滚<EFBFBD>摨? 蝡见朖<E8A781><EFBFBD><E785BE><EFBFBD>霅?
CPU使用率 > 80%: 发送告警
内存使用率 > 90%: 发送告警
实例不健康: 立即发送告警
```
---
## 📝 第八步:更新部署文档
<EFBFBD>函蔡<EFBFBD>𣂼<EFBFBD><EFBFBD>𠬍<EFBFBD><EFBFBD>湔鰵隞乩<EFBFBD><EFBFBD><EFBFBD>﹝嚗?
部署成功后,更新以下文档:
### 8.1 更新部署进度总览
蝻𤥁<EFBFBD> `00-<EFBFBD>函蔡餈𥕦漲<EFBFBD><EFBFBD>.md`嚗?
编辑 `00-部署进度总览.md`
```markdown
| **Node.js<EFBFBD>𡒊垢** | <EFBFBD>?撌脣<E6928C><E884A3>?| v1.0 | SAE | 2025-12-24 | ... |
| **Node.js后端** | ✅ 已完成 | v1.0 | SAE | 2025-12-24 | ... |
```
### 8.2 记录内网地址
<EFBFBD>?`00-<EFBFBD>函蔡餈𥕦漲<EFBFBD><EFBFBD>.md` 銝剜溶<E5899C>𩤃<EFBFBD>
`00-部署进度总览.md` 中添加:
```markdown
| nodejs-backend-test | <EFBFBD>?餈鞱<E9A488>銝?| 1<EFBFBD>?GB | 1 | 3001 | http://172.17.173.88:3001 | <EFBFBD>𩤃<EFBFBD><EFBFBD><EFBFBD>蝵𡢅<EFBFBD> |
| nodejs-backend-test | ✅ 运行中 | 1核2GB | 1 | 3001 | http://172.17.173.88:3001 | 无(仅内网) |
```
---
@@ -409,7 +409,7 @@ Node.js后端部署成功后
### 1. 部署前端Nginx下一步
<EFBFBD>滨垢Nginx<EFBFBD><EFBFBD><EFBFBD><EFBFBD>蝵奘ode.js<6A>𡒊垢<F0A1928A><E59EA2><EFBFBD>蝵穃𧑐<E7A983><F0A79190>嚗?
前端Nginx需要配置Node.js后端的内网地址
```bash
# 前端Nginx环境变量
@@ -418,79 +418,78 @@ VITE_API_BASE_URL=http://172.17.173.88:3001
参考文档:`07-前端Nginx-SAE部署操作手册.md`
### 2. <EFBFBD>券曎頝舀<EFBFBD>霂?
### 2. 全链路测试
完整的请求链路:
```
<EFBFBD><EFBFBD>瘚讛<EFBFBD><EFBFBD>?
<EFBFBD>?
用户浏览器
前端Nginx (SAE)
<EFBFBD>?
Node.js<EFBFBD>𡒊垢 (SAE) <EFBFBD>?http://172.17.173.88:3001
<EFBFBD>?
<EFBFBD><EFBFBD><EFBFBD>?Python敺格<EFBFBD><EFBFBD>?(SAE) <EFBFBD>?http://172.17.173.66:8000
<EFBFBD><EFBFBD><EFBFBD>?RDS PostgreSQL <EFBFBD>?pgm-2zex1m2y3r23hdn5.pg.rds.aliyuncs.com:5432
<EFBFBD><EFBFBD><EFBFBD>?<3F><EFBFBD>鈭䭲SS <EFBFBD>?ai-clinical-research.oss-cn-beijing-internal.aliyuncs.com
Node.js后端 (SAE) http://172.17.173.88:3001
├─→ Python微服务 (SAE) http://172.17.173.66:8000
├─→ RDS PostgreSQL pgm-2zex1m2y3r23hdn5.pg.rds.aliyuncs.com:5432
└─→ 阿里云OSS ai-clinical-research.oss-cn-beijing-internal.aliyuncs.com
```
### 3. 性能优化(可选)
<EFBFBD><EFBFBD>瘚贝<EFBFBD><EFBFBD><EFBFBD>餈鞱<EFBFBD>蝔喳<EFBFBD><EFBFBD>虾隞亥<EFBFBD><EFBFBD><EFBFBD>嚗?
如果测试环境运行稳定,可以考虑:
- **撘寞<EFBFBD>找撓蝻?*嚗𡁻<E59A97>蝵株䌊<E6A0AA><EFBFBD>蝻拙捆閫<E68D86><E996AB>
- **弹性伸缩**:配置自动扩缩容规则
- **资源调整**根据监控数据调整CPU/内存
- **<EFBFBD><EFBFBD>隡睃<EFBFBD>**嚗𡁻<E59A97>蝵格𠯫敹埈<E695B9><E59F88><EFBFBD><EFBFBD><EFBFBD>?
- **日志优化**:配置日志清理策略
---
## <EFBFBD>?<3F>函蔡摰峕<E691B0><EFBFBD><E79289><EFBFBD><E4BAA4>?
## ✅ 部署完成检查清单
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>蝵脣<EFBFBD>嚗諹窈蝖株恕嚗?
在完成部署后,请确认:
- [ ] SAE摨𠉛鍂<EFBFBD><EFBFBD><EFBFBD>蛹"餈鞱<E9A488>銝?
- [ ] <EFBFBD>亙熒璉<EFBFBD><EFBFBD>交遬蝷?<3F><EFBFBD>"
- [ ] SAE应用状态为"运行中"
- [ ] 健康检查显示"通过"
- [ ] 实时日志无ERROR级别错误
- [ ] <EFBFBD>亙熒璉<EFBFBD><EFBFBD>交𦻖<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?00
- [ ] <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>撌脰扇敶?
- [ ] <EFBFBD>函蔡<EFBFBD><EFBFBD>﹝撌脫凒<EFBFBD>?
- [ ] Python敺格<EFBFBD><EFBFBD>虾隞交迤撣貉<EFBFBD><EFBFBD>?
- [ ] <EFBFBD>唳旿摨栞<EFBFBD><EFBFBD>交迤撣?
- [ ] 健康检查接口返回200
- [ ] 内网地址已记录
- [ ] 部署文档已更新
- [ ] Python微服务可以正常调用
- [ ] 数据库连接正常
- [ ] OSS文件上传/下载正常
---
## <EFBFBD><EFBFBD> <20><EFBFBD>銝𤾸葬<F0A4BEB8>?
## 📞 支持与帮助
### 常见问题
1. **Q: <EFBFBD><EFBFBD><EFBFBD>滚鍳摨𠉛鍂嚗?*
- A: SAE摨𠉛鍂霂行<EFBFBD> <20>?<3F>箸𧋦靽⊥<E99DBD> <20>?<3F>孵稬<E5ADB5><EFBFBD><E99EBE><EFBFBD>?
1. **Q: 如何重启应用?**
- A: SAE应用详情 → 基本信息 → 点击【重启】
2. **Q: <EFBFBD><EFBFBD><EFBFBD><EFBFBD>摰峕㟲<EFBFBD><EFBFBD>嚗?*
- A: SAE摨𠉛鍂霂行<EFBFBD> <20>?<3F><EFBFBD> <20>?<3F><><EFBFBD><EFBFBD><EFBFBD>𣈲<EFBFBD><F0A388B2>𧒄<EFBFBD><EFBFBD><E6B8B2>湔䰻霂<E99C82>
2. **Q: 如何查看完整日志?**
- A: SAE应用详情 → 日志 → 历史日志(支持时间范围查询)
3. **Q: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>𧋦嚗?*
- A: SAE摨𠉛鍂霂行<EFBFBD> <20>?<3F><>𧋦蝞∠<E89D9E> <20>?<3F>㗇𥋘<E39787><F0A58B98><EFBFBD><E89FAE>𧋦 <20>?<3F><EFBFBD>
3. **Q: 如何回滚到之前的版本?**
- A: SAE应用详情 → 版本管理 → 选择历史版本 → 回滚
4. **Q: <EFBFBD><EFBFBD><EFBFBD>拙捆摰硺<EFBFBD>嚗?*
- A: SAE摨𠉛鍂霂行<EFBFBD> <20>?<3F>箸𧋦<E7AEB8>滨蔭 <20>?靽格㺿摰硺<E691B0><E7A1BA>?閫<><20>?蝖株恕<E6A0AA>䀹凒
4. **Q: 如何扩容实例?**
- A: SAE应用详情 → 基本配置 → 修改实例数/规格 → 确认变更
### 联系方式
- **<EFBFBD><EFBFBD><EFBFBD>舀𣈲<EFBFBD>?*嚗𡁜<E59A97><F0A1819C>穃𣪧<E7A983>?
- **<EFBFBD><EFBFBD>鈭穃極<EFBFBD>?*嚗冴ttps://workorder.console.aliyun.com/
- **技术支持**:开发团队
- **阿里云工单**https://workorder.console.aliyun.com/
---
**<EFBFBD><EFBFBD><EFBFBD>𥕦遣<EFBFBD>園𡢿**嚗?025-12-24
**<EFBFBD><EFBFBD><EFBFBD>擧凒<EFBFBD>?*嚗?025-12-24
**蝏湔擪鈭箏<EFBFBD>**嚗朞<E59A97>蝏游𣪧<E6B8B8>?
**文档创建时间**2025-12-24
**最后更新**2025-12-24
**维护人员**:运维团队
---
<EFBFBD><EFBFBD> **蟡嗪<E89FA1>蝵脤◇<E884A4><EFBFBD><EFBFBD><E68692><EFBFBD><EFBFBD>嚗諹窈<E8ABB9><E7AA88><EFBFBD><EFBFBD><EFBFBD><EFBFBD>𨀣<EFBFBD><F0A880A3><EFBFBD><E4BAA6><EFBFBD><EFBFBD><EFBFBD>𠉛頂<F0A0899B><E9A082><EFBFBD>舀𣈲<E88880><F0A388B2><EFBFBD>?*
🎉 **祝部署顺利!如有问题,请参考故障排查章节或联系技术支持。**