# 环境配置指南 ## 环境类型 小虾 SaaS 支持三种环境: - **Development(开发环境)**:本地开发使用 - **Staging(测试环境)**:用于测试和预发布 - **Production(生产环境)**:正式生产环境 --- ## 配置文件 ### 1. `.env.example` - 配置模板 包含所有可配置项的示例,用于参考和初始化。 ### 2. `.env` - 开发环境配置(本地) 本地开发时使用,不提交到 Git。 ### 3. `.env.staging` - Staging 环境配置 测试环境配置,可以提交到 Git。 ### 4. `.env.production` - 生产环境配置 生产环境配置,**敏感信息需要单独管理,不要提交到 Git**。 --- ## 使用方法 ### 方法 1:使用环境变量指定环境 ```bash # 开发环境(默认) python -m uvicorn apps.api.main:app --reload # Staging 环境 export APP_ENV=staging python -m uvicorn apps.api.main:app --host 0.0.0.0 --port 8000 # 生产环境 export APP_ENV=production python -m uvicorn apps.api.main:app --host 0.0.0.0 --port 8000 ``` ### 方法 2:直接指定配置文件 ```bash # 使用 .env.staging cp .env.staging .env python -m uvicorn apps.api.main:app # 使用 .env.production cp .env.production .env python -m uvicorn apps.api.main:app ``` --- ## 配置项说明 ### 基础配置 - `APP_ENV`: 环境类型(development / staging / production) - `APP_NAME`: 应用名称 - `DEBUG`: 是否启用调试模式 ### API 配置 - `API_HOST`: API 监听地址 - `API_PORT`: API 端口 - `API_PREFIX`: API 路由前缀(如 /api/v1) ### 数据库配置 - `DATABASE_URL`: PostgreSQL 连接字符串 - `DATABASE_POOL_SIZE`: 连接池大小 - `DATABASE_MAX_OVERFLOW`: 最大溢出连接数 - `DATABASE_POOL_TIMEOUT`: 连接池超时时间(秒) - `DATABASE_POOL_RECYCLE`: 连接回收时间(秒) ### Redis 配置 - `REDIS_URL`: Redis 连接字符串 - `REDIS_MAX_CONNECTIONS`: 最大连接数 ### Celery 配置 - `CELERY_BROKER_URL`: Celery broker URL - `CELERY_RESULT_BACKEND`: Celery result backend URL - `CELERY_WORKER_CONCURRENCY`: Worker 并发数 - `CELERY_WORKER_MAX_TASKS_PER_CHILD`: 每个 worker 最大任务数 ### OSS / 生成文件配置 - `OSS_ENDPOINT`: 阿里云 OSS endpoint - `OSS_ACCESS_KEY_ID`: OSS AccessKey ID(未配置时上传类 OSS 操作不可用) - `OSS_ACCESS_KEY_SECRET`: OSS AccessKey Secret - `OSS_BUCKET_NAME`: OSS bucket 名称 - `GENERATED_FILES_URL_PREFIX`: 本地生成文件公开前缀,默认 `/generated-files` 说明:历史 MinIO 配置已退役;staging 当前支持 OSS 未配置时的本地 generated-files fallback。 ### 日志配置 - `LOG_LEVEL`: 日志级别(DEBUG / INFO / WARNING / ERROR / CRITICAL) - `LOG_FORMAT`: 日志格式(json / text) - `LOG_FILE`: 日志文件路径 ### CORS 配置 - `CORS_ORIGINS`: 允许的跨域来源(逗号分隔) - `CORS_ALLOW_CREDENTIALS`: 是否允许携带凭证 ### 安全配置 - `SECRET_KEY`: 应用密钥(用于 JWT 签名等) - `ACCESS_TOKEN_EXPIRE_MINUTES`: 访问令牌过期时间 - `REFRESH_TOKEN_EXPIRE_DAYS`: 刷新令牌过期天数 --- ## 生产环境最佳实践 ### 1. 不要硬编码敏感信息 ❌ 不要这样: ```python DATABASE_URL = "postgresql://user:password@localhost/db" ``` ✅ 应该这样: ```python from app.core.config import get_settings settings = get_settings() database_url = settings.database_url ``` ### 2. 使用环境变量覆盖 生产环境的敏感配置应该通过环境变量注入: ```bash export DATABASE_URL="postgresql://user:secure_password@prod-db/db" export JWT_SECRET_KEY="very-long-random-string" export OSS_ACCESS_KEY_SECRET="another-secure-key" ``` ### 3. 使用密钥管理工具 推荐使用: - Docker Secrets - Kubernetes Secrets - AWS Secrets Manager - HashiCorp Vault ### 4. 生产环境配置检查清单 - [ ] `DEBUG=false` - [ ] `JWT_SECRET_KEY` 使用随机字符串(至少 32 字符) - [ ] 数据库使用强密码 - [ ] OSS 凭证已配置,或明确保持本地 generated-files fallback - [ ] `CORS_ORIGINS` 只包含信任的域名 - [ ] 日志级别设置为 `INFO` 或 `WARNING` - [ ] 数据库连接池配置合理 - [ ] 启用 HTTPS(由 Nginx/网关层负责) --- ## Docker 部署配置 ### Canonical Docker compose 中使用环境文件 ```yaml services: api: image: xiaoxia-saas-api:latest env_file: - .env.production environment: - DATABASE_URL=${DATABASE_URL} # 从环境变量覆盖 ``` ### Gitea Actions 部署脚本 在 `.gitea/workflows/deploy.yml` 中: ```yaml - name: Deploy to production run: | # 复制环境配置 cp .env.production /var/lib/xiaoxia-saas-production/.env # 启动服务 cd /var/lib/xiaoxia-saas-production/repo docker compose -f infra/docker/compose.yml up -d ``` --- ## 配置验证 ### 查看当前配置 ```python from app.core.config import get_settings settings = get_settings() print(f"Environment: {settings.app_env}") print(f"Debug mode: {settings.debug}") print(f"Database: {settings.database_url}") print(f"Is production: {settings.is_production}") ``` ### 配置测试脚本 ```bash # 测试开发环境配置 python -c "from app.core.config import get_settings; s=get_settings(); print(s.app_env)" # 测试 staging 环境配置 APP_ENV=staging python -c "from app.core.config import get_settings; s=get_settings(); print(s.app_env)" # 测试生产环境配置 APP_ENV=production python -c "from app.core.config import get_settings; s=get_settings(); print(s.app_env)" ``` --- ## 常见问题 ### Q: 为什么我的配置没有生效? A: 检查: 1. 环境变量 `APP_ENV` 是否正确设置 2. 配置文件 `.env.{环境}` 是否存在 3. 环境变量名是否正确(大小写不敏感) 4. 是否重启了服务 ### Q: 如何在 Docker 中使用环境配置? A: 使用 `env_file` 或 `environment` 指定配置: ```yaml services: api: env_file: .env.production ``` ### Q: 生产环境如何保护敏感配置? A: 1. 不要提交 `.env.production` 到 Git 2. 使用 Docker Secrets 或 Kubernetes Secrets 3. 通过 CI/CD 注入环境变量 4. 使用密钥管理工具(Vault, AWS Secrets Manager 等) --- ## 相关文档 - [部署文档](DEPLOYMENT.md) - [API 文档](API.md) - [开发指南](DEVELOPMENT.md)