Files
AIclinicalresearch/docs/07-运维文档/03-SAE环境变量配置指南.md
HaHafeng 2481b786d8 deploy: Complete 0126-27 deployment - database upgrade, services update, code recovery
Major Changes:
- Database: Install pg_bigm/pgvector plugins, create test database
- Python service: v1.0 -> v1.1, add pymupdf4llm/openpyxl/pypandoc
- Node.js backend: v1.3 -> v1.7, fix pino-pretty and ES Module imports
- Frontend: v1.2 -> v1.3, skip TypeScript check for deployment
- Code recovery: Restore empty files from local backup

Technical Fixes:
- Fix pino-pretty error in production (conditional loading)
- Fix ES Module import paths (add .js extensions)
- Fix OSSAdapter TypeScript errors
- Update Prisma Schema (63 models, 16 schemas)
- Update environment variables (DATABASE_URL, EXTRACTION_SERVICE_URL, OSS)
- Remove deprecated variables (REDIS_URL, DIFY_API_URL, DIFY_API_KEY)

Documentation:
- Create 0126 deployment folder with 8 documents
- Update database development standards v2.0
- Update SAE deployment status records

Deployment Status:
- PostgreSQL: ai_clinical_research_test with plugins
- Python: v1.1 @ 172.17.173.84:8000
- Backend: v1.7 @ 172.17.173.89:3001
- Frontend: v1.3 @ 172.17.173.90:80

Tested: All services running successfully on SAE
2026-01-27 08:13:27 +08:00

7.8 KiB
Raw Permalink Blame History

SAE环境变量配置指南

文档版本: v1.0
创建日期: 2025-12-11
适用场景: 阿里云SAE部署环境变量配置
使用方法: 在SAE控制台逐行配置


📋 配置说明

在阿里云SAE控制台配置环境变量时按照以下顺序逐行添加

操作步骤

  1. 登录阿里云控制台
  2. 进入 Serverless应用引擎SAE
  3. 选择应用 → 配置管理 → 环境变量
  4. 点击「添加环境变量」
  5. 逐行复制以下内容(替换所有"你的XXX"

🔑 必填环境变量

基础配置

NODE_ENV=development
PORT=3001
SERVICE_NAME=aiclinical-backend-dev
LOG_LEVEL=debug

数据库配置

# 格式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存储配置

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配置

# 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

安全配置

# JWT密钥必须修改
# 生成工具https://www.random.org/strings/
JWT_SECRET=请改为32位以上随机字符串abcdefg123456
JWT_EXPIRES_IN=7d

# CORS配置
CORS_ORIGIN=*

⚠️ JWT_SECRET 绝对不能使用默认值!


⚙️ 推荐配置

缓存配置初期不使用Redis

CACHE_TYPE=memory
QUEUE_TYPE=memory

说明: 初期用户量小,使用内存缓存足够

未来需要Redis时改为

CACHE_TYPE=redis
REDIS_HOST=r-bp1xxxx.redis.rds.aliyuncs.com
REDIS_PORT=6379
REDIS_PASSWORD=你的Redis密码
REDIS_DB=0

Dify配置可选

DIFY_API_KEY=app-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
DIFY_API_URL=https://api.dify.ai/v1

说明: 如果使用Dify提供RAG服务需要配置

Python微服务配置

# 临时方案:先用公网地址
EXTRACTION_SERVICE_URL=http://你的临时地址:8000

# 正式方案部署Python到SAE后使用内网地址
# EXTRACTION_SERVICE_URL=http://aiclinical-python-dev.default:8000

文件上传配置

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

curl https://api.deepseek.com/v1/models \
  -H "Authorization: Bearer sk-你的密钥"

📝 配置示例(脱敏版)

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

推荐: 重新设置不包含特殊字符的密码更简单


📊 配置完成验证

自动验证

部署后,应用会自动验证环境变量:

// 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

手动验证

# 访问健康检查接口
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部署完全指南