Files
AIclinicalresearch/docs/07-运维文档/03-SAE环境变量配置指南.md
HaHafeng dac3cecf78 feat(iit): Complete IIT Manager Agent Day 1 - Environment initialization and WeChat integration
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
2026-01-01 14:32:58 +08:00

393 lines
7.8 KiB
Markdown
Raw 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
> **适用场景:** 阿里云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)