# 环境配置管理指南 ## 📋 概述 小虾 SaaS 支持多环境配置:开发、测试、预发布、生产。 --- ## 🔧 环境类型 ### 1. Development(开发) **特点:** - 使用 InMemory 数据库 - 详细日志输出 - 热重载 - Debug 模式 **配置:** ```env ENVIRONMENT=development DEBUG=true USE_IN_MEMORY_DB=true LOG_LEVEL=DEBUG ``` ### 2. Testing(测试) **特点:** - 独立测试数据库 - 快速重置 - Mock 外部服务 **配置:** ```env ENVIRONMENT=testing DEBUG=true USE_IN_MEMORY_DB=true DATABASE_URL=postgresql://test:test@localhost:5432/xiaoxia_test ``` ### 3. Staging(预发布) **特点:** - 生产级配置 - 真实数据库 - 完整监控 **配置:** ```env ENVIRONMENT=staging DEBUG=false USE_IN_MEMORY_DB=false DATABASE_URL=postgresql://staging:***@db-staging:5432/xiaoxia_staging LOG_LEVEL=INFO ``` ### 4. Production(生产) **特点:** - 最高安全级别 - 完整监控告警 - 数据备份 **配置:** ```env ENVIRONMENT=production DEBUG=false USE_IN_MEMORY_DB=false DATABASE_URL=postgresql://prod:***@db-prod:5432/xiaoxia_prod LOG_LEVEL=WARNING SENTRY_DSN=https://... ``` --- ## 📁 配置文件结构 ``` ├── .env # 本地开发配置(不提交) ├── .env.example # 配置模板 ├── .env.development # 开发环境 ├── .env.testing # 测试环境 ├── .env.staging # 预发布环境 └── .env.production # 生产环境(不提交) ``` --- ## 🚀 启动命令 ### 开发环境 ```bash # 使用默认 .env uvicorn apps.api.main:app --reload # 或指定环境文件 ENV_FILE=.env.development uvicorn apps.api.main:app --reload ``` ### 测试环境 ```bash ENV_FILE=.env.testing pytest tests/ ``` ### 生产环境 ```bash # 使用 Gunicorn gunicorn apps.api.main:app \ --workers 4 \ --worker-class uvicorn.workers.UvicornWorker \ --bind 0.0.0.0:8000 \ --env ENV_FILE=.env.production ``` --- ## 🔒 敏感信息管理 ### 1. 使用环境变量 ```bash # 不要硬编码 ❌ JWT_SECRET_KEY = "my-secret-key" # 从环境变量读取 ✅ JWT_SECRET_KEY = os.getenv("JWT_SECRET_KEY") ``` ### 2. 使用密钥管理服务 **AWS Secrets Manager:** ```python import boto3 def get_secret(secret_name): client = boto3.client('secretsmanager') return client.get_secret_value(SecretId=secret_name) ``` **阿里云 KMS:** ```python from aliyunsdkcore.client import AcsClient from aliyunsdkkms.request.v20160120 import DecryptRequest def get_secret(encrypted_secret): client = AcsClient(...) request = DecryptRequest.DecryptRequest() request.set_CiphertextBlob(encrypted_secret) return client.do_action_with_exception(request) ``` ### 3. Git 安全 ```bash # .gitignore .env .env.production .env.staging *.key *.pem secrets/ ``` --- ## 📊 日志级别配置 ### 按环境配置 ```python LOG_LEVELS = { "development": "DEBUG", "testing": "INFO", "staging": "INFO", "production": "WARNING", } LOG_LEVEL = LOG_LEVELS.get(ENVIRONMENT, "INFO") ``` ### 日志格式 **开发环境(详细):** ``` 2026-06-17 08:36:45 DEBUG [request_id=abc123] User login attempt: user@example.com ``` **生产环境(精简):** ``` 2026-06-17 08:36:45 INFO Request completed: POST /api/v1/auth/login status=200 time=0.045s ``` --- ## 🔄 配置热更新 ### 支持的配置 - 日志级别 - 速率限制 - 功能开关 ### 实现方式 ```python class DynamicConfig: def __init__(self): self._config = {} def reload(self): """从数据库或配置中心重新加载""" self._config = load_config_from_db() def get(self, key, default=None): return self._config.get(key, default) # 全局实例 dynamic_config = DynamicConfig() ``` --- ## 🎯 最佳实践 ### 1. 配置分层 ``` 环境变量 > .env 文件 > 默认值 ``` ### 2. 配置验证 ```python from pydantic import validator class Settings(BaseSettings): JWT_SECRET_KEY: str @validator('JWT_SECRET_KEY') def validate_secret_key(cls, v): if len(v) < 32: raise ValueError('JWT_SECRET_KEY must be at least 32 characters') return v ``` ### 3. 配置文档 所有配置项都应该在 `.env.example` 中有说明: ```env # JWT 密钥(生产环境必须修改) # 长度至少 32 字符 JWT_SECRET_KEY=your-super-secret-key-change-this-in-production # 数据库连接字符串 # 格式:postgresql://user:password@host:port/database DATABASE_URL=postgresql://xiaoxia:password@localhost:5432/xiaoxia_saas ``` --- ## 🚨 生产环境检查清单 - [ ] `DEBUG=false` - [ ] `JWT_SECRET_KEY` 已修改(至少 32 字符) - [ ] 数据库密码已修改 - [ ] Redis 密码已配置 - [ ] SMTP 密码使用应用专用密码 - [ ] `LOG_LEVEL=WARNING` 或 `INFO` - [ ] `.env.production` 不在版本控制中 - [ ] CORS 配置为实际域名 - [ ] 速率限制已启用 - [ ] 监控告警已配置 --- ## 📞 故障排查 ### 配置未生效 ```bash # 1. 检查环境变量 env | grep DATABASE_URL # 2. 检查 .env 文件 cat .env # 3. 验证配置加载 python -c "from apps.api.app.config import settings; print(settings.DATABASE_URL)" ``` ### 敏感信息泄露 ```bash # 检查 Git 历史 git log -p | grep -i "password\|secret\|token" # 清理敏感信息(谨慎使用) git filter-branch --force --index-filter \ "git rm --cached --ignore-unmatch .env" \ --prune-empty --tag-name-filter cat -- --all ``` --- **最后更新:** 2026-06-17