Summary: - Complete IIT Manager Agent MVP Day 1 (12.5% progress) - Database: Create iit_schema with 5 tables (IitProject, IitPendingAction, IitTaskRun, IitUserMapping, IitAuditLog) - Backend: Add module structure (577 lines) and types (223 lines) - WeChat: Configure Enterprise WeChat app (CorpID, AgentID, Secret) - WeChat: Obtain web authorization and JS-SDK authorization - WeChat: Configure trusted domain (iit.xunzhengyixue.com) - Frontend: Deploy v1.2 with WeChat domain verification file - Frontend: Fix CRLF issue in docker-entrypoint.sh (CRLF -> LF) - Testing: 11/11 database CRUD tests passed - Testing: Access Token retrieval test passed - Docs: Create module status and development guide - Docs: Update MVP task list with Day 1 completion - Docs: Rename deployment doc to SAE real-time status record - Deployment: Update frontend internal IP to 172.17.173.80 Technical Details: - Prisma: Multi-schema support (iit_schema) - pg-boss: Job queue integration prepared - Taro 4.x: Framework selected for WeChat Mini Program - Shadow State: Architecture foundation laid - Docker: Fix entrypoint script line endings for Linux container Status: Day 1/14 complete, ready for Day 2 REDCap integration
393 lines
7.8 KiB
Markdown
393 lines
7.8 KiB
Markdown
# SAE环境变量配置指南
|
||
|
||
> **文档版本:** v1.0
|
||
> **创建日期:** 2025-12-11
|
||
> **适用场景:** 阿里云SAE部署环境变量配置
|
||
> **使用方法:** 在SAE控制台逐行配置
|
||
|
||
---
|
||
|
||
## 📋 配置说明
|
||
|
||
在阿里云SAE控制台配置环境变量时,按照以下顺序逐行添加:
|
||
|
||
### 操作步骤
|
||
|
||
1. 登录阿里云控制台
|
||
2. 进入 Serverless应用引擎SAE
|
||
3. 选择应用 → 配置管理 → 环境变量
|
||
4. 点击「添加环境变量」
|
||
5. 逐行复制以下内容(替换所有"你的XXX")
|
||
|
||
---
|
||
|
||
## 🔑 必填环境变量
|
||
|
||
### 基础配置
|
||
|
||
```bash
|
||
NODE_ENV=development
|
||
PORT=3001
|
||
SERVICE_NAME=aiclinical-backend-dev
|
||
LOG_LEVEL=debug
|
||
```
|
||
|
||
### 数据库配置
|
||
|
||
```bash
|
||
# 格式:postgresql://用户名:密码@地址:端口/数据库名
|
||
# 示例:postgresql://aiclinical:MyPass123@rm-bp1xxxx.mysql.rds.aliyuncs.com:5432/aiclinical_dev
|
||
DATABASE_URL=postgresql://aiclinical:你的密码@你的RDS内网地址:5432/aiclinical_dev
|
||
|
||
# Serverless连接池优化
|
||
DB_MAX_CONNECTIONS=400
|
||
MAX_INSTANCES=10
|
||
```
|
||
|
||
**获取RDS地址:**
|
||
1. RDS控制台 → 实例列表 → 点击实例ID
|
||
2. 基本信息 → 内网地址(复制)
|
||
3. 示例:`rm-bp1abcd1234.mysql.rds.aliyuncs.com`
|
||
|
||
### OSS存储配置
|
||
|
||
```bash
|
||
STORAGE_TYPE=oss
|
||
OSS_REGION=oss-cn-hangzhou
|
||
OSS_BUCKET=aiclinical-dev
|
||
OSS_ACCESS_KEY_ID=你的AccessKeyId
|
||
OSS_ACCESS_KEY_SECRET=你的AccessKeySecret
|
||
```
|
||
|
||
**获取OSS密钥:**
|
||
1. 访问控制RAM → 用户 → `aiclinical-oss`
|
||
2. 如果忘记密钥,需要重新创建AccessKey
|
||
3. **重要:** 密钥只显示一次,立即保存!
|
||
|
||
### LLM API配置
|
||
|
||
```bash
|
||
# DeepSeek(推荐)
|
||
DEEPSEEK_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||
DEEPSEEK_BASE_URL=https://api.deepseek.com
|
||
|
||
# 通义千问(阿里云)
|
||
DASHSCOPE_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||
|
||
# CloseAI代理(可选)
|
||
CLOSEAI_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||
CLOSEAI_OPENAI_BASE_URL=https://api.openai-proxy.org/v1
|
||
CLOSEAI_CLAUDE_BASE_URL=https://api.openai-proxy.org/anthropic
|
||
```
|
||
|
||
**至少配置一个LLM API Key!**
|
||
|
||
### 安全配置
|
||
|
||
```bash
|
||
# JWT密钥(必须修改!)
|
||
# 生成工具:https://www.random.org/strings/
|
||
JWT_SECRET=请改为32位以上随机字符串abcdefg123456
|
||
JWT_EXPIRES_IN=7d
|
||
|
||
# CORS配置
|
||
CORS_ORIGIN=*
|
||
```
|
||
|
||
**⚠️ JWT_SECRET 绝对不能使用默认值!**
|
||
|
||
---
|
||
|
||
## ⚙️ 推荐配置
|
||
|
||
### 缓存配置(初期不使用Redis)
|
||
|
||
```bash
|
||
CACHE_TYPE=memory
|
||
QUEUE_TYPE=memory
|
||
```
|
||
|
||
**说明:** 初期用户量小,使用内存缓存足够
|
||
|
||
**未来需要Redis时,改为:**
|
||
```bash
|
||
CACHE_TYPE=redis
|
||
REDIS_HOST=r-bp1xxxx.redis.rds.aliyuncs.com
|
||
REDIS_PORT=6379
|
||
REDIS_PASSWORD=你的Redis密码
|
||
REDIS_DB=0
|
||
```
|
||
|
||
### Dify配置(可选)
|
||
|
||
```bash
|
||
DIFY_API_KEY=app-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||
DIFY_API_URL=https://api.dify.ai/v1
|
||
```
|
||
|
||
**说明:** 如果使用Dify提供RAG服务,需要配置
|
||
|
||
### Python微服务配置
|
||
|
||
```bash
|
||
# 临时方案:先用公网地址
|
||
EXTRACTION_SERVICE_URL=http://你的临时地址:8000
|
||
|
||
# 正式方案:部署Python到SAE后使用内网地址
|
||
# EXTRACTION_SERVICE_URL=http://aiclinical-python-dev.default:8000
|
||
```
|
||
|
||
### 文件上传配置
|
||
|
||
```bash
|
||
UPLOAD_MAX_SIZE=104857600
|
||
```
|
||
|
||
**说明:** 100MB = 104857600 bytes
|
||
|
||
---
|
||
|
||
## ✅ 配置检查清单
|
||
|
||
### 第一步:复制粘贴检查
|
||
|
||
- [ ] 所有环境变量已添加到SAE
|
||
- [ ] 所有"你的XXX"已替换为真实值
|
||
- [ ] 没有遗漏任何必填项
|
||
|
||
### 第二步:格式检查
|
||
|
||
- [ ] DATABASE_URL 格式正确
|
||
```
|
||
postgresql://用户名:密码@地址:端口/数据库
|
||
✅ 正确:postgresql://aiclinical:MyPass@rm-xxx.com:5432/db
|
||
❌ 错误:postgresql://aiclinical@rm-xxx.com:5432/db(缺少密码)
|
||
```
|
||
|
||
- [ ] 密码中没有特殊字符(`@ # $ % & 空格`)
|
||
```
|
||
✅ 推荐:MyPassword123
|
||
❌ 避免:My@Pass#123(包含@和#)
|
||
```
|
||
|
||
- [ ] JWT_SECRET 已修改(不是默认值)
|
||
- [ ] OSS_REGION 格式正确(带 `oss-` 前缀)
|
||
```
|
||
✅ 正确:oss-cn-hangzhou
|
||
❌ 错误:cn-hangzhou
|
||
```
|
||
|
||
### 第三步:密钥有效性检查
|
||
|
||
- [ ] RDS密码正确(可以用数据库客户端测试连接)
|
||
- [ ] OSS AccessKey有效(在RAM控制台确认)
|
||
- [ ] LLM API Key有效(可以用curl测试)
|
||
|
||
**测试LLM API Key:**
|
||
```bash
|
||
curl https://api.deepseek.com/v1/models \
|
||
-H "Authorization: Bearer sk-你的密钥"
|
||
```
|
||
|
||
---
|
||
|
||
## 📝 配置示例(脱敏版)
|
||
|
||
```bash
|
||
NODE_ENV=development
|
||
PORT=3001
|
||
SERVICE_NAME=aiclinical-backend-dev
|
||
LOG_LEVEL=debug
|
||
|
||
DATABASE_URL=postgresql://aiclinical:MySecurePass123@rm-bp1abc123.mysql.rds.aliyuncs.com:5432/aiclinical_dev
|
||
DB_MAX_CONNECTIONS=400
|
||
MAX_INSTANCES=10
|
||
|
||
STORAGE_TYPE=oss
|
||
OSS_REGION=oss-cn-hangzhou
|
||
OSS_BUCKET=aiclinical-dev
|
||
OSS_ACCESS_KEY_ID=LTAI5t12345678901234
|
||
OSS_ACCESS_KEY_SECRET=abcdefghijk1234567890123456789012
|
||
|
||
CACHE_TYPE=memory
|
||
QUEUE_TYPE=memory
|
||
|
||
DEEPSEEK_API_KEY=sk-1234567890abcdef1234567890abcdef
|
||
DEEPSEEK_BASE_URL=https://api.deepseek.com
|
||
|
||
DASHSCOPE_API_KEY=sk-abcdef1234567890abcdef1234567890
|
||
|
||
JWT_SECRET=a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0
|
||
JWT_EXPIRES_IN=7d
|
||
CORS_ORIGIN=*
|
||
|
||
EXTRACTION_SERVICE_URL=http://123.456.789.0:8000
|
||
|
||
UPLOAD_MAX_SIZE=104857600
|
||
```
|
||
|
||
---
|
||
|
||
## 🔐 安全最佳实践
|
||
|
||
### 密钥管理
|
||
|
||
1. **不要将密钥提交到Git**
|
||
- ❌ 不要创建 `.env.production` 文件
|
||
- ❌ 不要在代码中硬编码密钥
|
||
- ✅ 只在SAE控制台配置
|
||
|
||
2. **定期更换密钥**
|
||
- 每3-6个月更换一次
|
||
- 发现泄露立即更换
|
||
|
||
3. **使用密码管理器**
|
||
- 推荐:1Password、LastPass、Bitwarden
|
||
- 保存所有密钥和配置信息
|
||
|
||
### 环境隔离
|
||
|
||
```
|
||
开发环境:
|
||
- Bucket: aiclinical-dev
|
||
- Database: aiclinical_dev
|
||
- JWT_SECRET: 独立的密钥
|
||
|
||
生产环境:
|
||
- Bucket: aiclinical-prod
|
||
- Database: aiclinical_prod
|
||
- JWT_SECRET: 不同的密钥
|
||
```
|
||
|
||
**永远不要在生产环境使用开发环境的密钥!**
|
||
|
||
---
|
||
|
||
## 🆘 常见问题
|
||
|
||
### Q1: 忘记了RDS密码怎么办?
|
||
|
||
**解决方法:**
|
||
1. RDS控制台 → 账号管理
|
||
2. 找到用户 `aiclinical`
|
||
3. 点击「重置密码」
|
||
4. 设置新密码
|
||
5. 更新SAE环境变量中的 `DATABASE_URL`
|
||
|
||
### Q2: OSS AccessKey泄露了怎么办?
|
||
|
||
**解决方法:**
|
||
1. RAM控制台 → 用户 → `aiclinical-oss`
|
||
2. 禁用或删除泄露的AccessKey
|
||
3. 创建新的AccessKey
|
||
4. 更新SAE环境变量
|
||
|
||
### Q3: 如何验证环境变量配置正确?
|
||
|
||
**解决方法:**
|
||
1. 部署应用后,查看实时日志
|
||
2. 看到以下日志表示配置正确:
|
||
```
|
||
✅ [Config] Environment validation passed
|
||
✅ [Database] 数据库连接成功
|
||
📦 [Storage] 使用阿里云 OSS 存储
|
||
```
|
||
|
||
### Q4: DATABASE_URL中密码包含特殊字符怎么办?
|
||
|
||
**解决方法:**
|
||
如果密码包含 `@ # $ % & 空格` 等特殊字符,需要URL编码:
|
||
|
||
```
|
||
原密码:My@Pass#123
|
||
编码后:My%40Pass%23123
|
||
|
||
完整URL:
|
||
postgresql://aiclinical:My%40Pass%23123@rm-xxx.com:5432/aiclinical_dev
|
||
```
|
||
|
||
**编码对照表:**
|
||
```
|
||
@ → %40
|
||
# → %23
|
||
$ → %24
|
||
% → %25
|
||
& → %26
|
||
空格 → %20
|
||
```
|
||
|
||
**推荐:** 重新设置不包含特殊字符的密码更简单
|
||
|
||
---
|
||
|
||
## 📊 配置完成验证
|
||
|
||
### 自动验证
|
||
|
||
部署后,应用会自动验证环境变量:
|
||
|
||
```typescript
|
||
// backend/src/config/env.ts
|
||
// 会自动检查所有必填项
|
||
```
|
||
|
||
**日志输出示例:**
|
||
```
|
||
✅ [Config] Environment validation passed
|
||
[Config] Application configuration:
|
||
- Environment: development
|
||
- Port: 3001
|
||
- Storage: oss
|
||
- Cache: memory
|
||
- Queue: memory
|
||
- Log Level: debug
|
||
```
|
||
|
||
### 手动验证
|
||
|
||
```bash
|
||
# 访问健康检查接口
|
||
curl http://你的SAE地址:3001/health
|
||
|
||
# 预期返回
|
||
{
|
||
"status": "ok",
|
||
"database": "connected",
|
||
"storage": "oss",
|
||
"cache": "memory",
|
||
"timestamp": "2025-12-11T10:30:00.000Z"
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
**文档版本:** v1.0
|
||
**最后更新:** 2025-12-11
|
||
**维护者:** 技术架构师
|
||
**相关文档:** [SAE部署完全指南](../05-部署文档/02-SAE部署完全指南(产品经理版).md)
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|