library-picturebook-activity/backend/docs/ENVIRONMENT_CONFIG.md
2025-11-23 14:04:20 +08:00

291 lines
6.2 KiB
Markdown
Raw Permalink 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.

# 环境配置指南
## 环境区分方案
项目支持通过 `NODE_ENV` 环境变量和不同的 `.env` 文件来区分开发和生产环境。
## 配置文件结构
```
backend/
├── .env # 默认配置(可选,作为后备)
├── .env.development # 开发环境配置
├── .env.production # 生产环境配置
└── .env.test # 测试环境配置(可选)
```
## 配置优先级
配置文件按以下优先级加载:
1. `.env.${NODE_ENV}` - 根据当前环境加载(最高优先级)
2. `.env` - 默认配置文件(后备)
例如:
- `NODE_ENV=development` → 加载 `.env.development`
- `NODE_ENV=production` → 加载 `.env.production`
- 未设置 `NODE_ENV` → 默认加载 `.env.development`,然后 `.env`
## 开发环境配置
### 创建 `.env.development` 文件
```env
# 开发环境配置
NODE_ENV=development
# 开发数据库(本地数据库)
DATABASE_URL="mysql://root:password@localhost:3306/competition_management_dev?schema=public"
# JWT 密钥(开发环境可以使用简单密钥)
JWT_SECRET="dev-secret-key-not-for-production"
# 服务器端口
PORT=3001
# 日志级别
LOG_LEVEL=debug
# CORS 配置(开发环境允许所有来源)
CORS_ORIGIN=*
```
### 开发环境数据库命名建议
- 数据库名:`competition_management_dev`
- 便于区分:开发和生产使用不同的数据库
- 安全:避免误操作生产数据
## 生产环境配置
### 创建 `.env.production` 文件
```env
# 生产环境配置
NODE_ENV=production
# 生产数据库(远程或云数据库)
DATABASE_URL="mysql://prod_user:strong_password@prod-db-host:3306/competition_management?schema=public&sslmode=require"
# JWT 密钥(必须使用强随机字符串)
# 生成方式: openssl rand -hex 32
JWT_SECRET="your-production-secret-key-must-be-strong-and-random-64-chars"
# 服务器端口
PORT=3001
# 日志级别
LOG_LEVEL=error
# CORS 配置(生产环境指定具体域名)
CORS_ORIGIN=https://yourdomain.com
# 数据库连接池配置
DB_POOL_MIN=2
DB_POOL_MAX=10
# SSL/TLS 配置
SSL_ENABLED=true
```
### 生产环境数据库配置要点
1. **使用独立的数据库服务器**
2. **启用 SSL 连接**`sslmode=require`
3. **使用强密码**
4. **限制数据库用户权限**(最小权限原则)
5. **定期备份**
## 使用方法
### 开发环境
```bash
# 方式 1: 设置环境变量后启动
NODE_ENV=development pnpm start:dev
# 方式 2: 在 package.json 中配置(推荐)
# 已自动配置,直接运行:
pnpm start:dev
```
### 生产环境
```bash
# 方式 1: 设置环境变量后启动
NODE_ENV=production pnpm start:prod
# 方式 2: 在部署脚本中设置
export NODE_ENV=production
pnpm start:prod
```
### 测试环境(可选)
```bash
# 创建 .env.test 文件
NODE_ENV=test
DATABASE_URL="mysql://root:password@localhost:3306/competition_management_test?schema=public"
JWT_SECRET="test-secret-key"
PORT=3002
# 运行测试
NODE_ENV=test pnpm test
```
## 数据库命名规范
建议使用以下命名规范来区分不同环境的数据库:
| 环境 | 数据库名 | 说明 |
|------|---------|------|
| 开发 | `competition_management_dev` | 开发环境数据库 |
| 测试 | `competition_management_test` | 测试环境数据库 |
| 生产 | `competition_management` | 生产环境数据库 |
| 预发布 | `competition_management_staging` | 预发布环境数据库 |
## 创建不同环境的数据库
### 开发环境数据库
```sql
CREATE DATABASE competition_management_dev
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
```
### 生产环境数据库
```sql
CREATE DATABASE competition_management
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
```
## 环境变量管理最佳实践
### 1. 使用 .gitignore
确保 `.env*` 文件不被提交到版本控制:
```gitignore
# .env files
.env
.env.local
.env.*.local
.env.development
.env.production
.env.test
```
### 2. 提供示例文件
创建 `.env.example``.env.*.example` 文件作为模板:
```bash
# 开发环境示例
cp .env.development.example .env.development
# 生产环境示例
cp .env.production.example .env.production
```
### 3. 使用环境变量管理工具(生产环境)
- **Docker**: 使用 `docker-compose.yml` 中的 `env_file`
- **Kubernetes**: 使用 `ConfigMap``Secret`
- **云平台**:
- AWS: Secrets Manager
- Azure: Key Vault
- GCP: Secret Manager
### 4. 验证配置
在应用启动时验证必要的环境变量:
```typescript
// 可以在 main.ts 中添加验证
if (!process.env.DATABASE_URL) {
throw new Error('DATABASE_URL is required');
}
```
## 快速开始
### 1. 创建开发环境配置
```bash
cd backend
# 创建开发环境配置文件
cat > .env.development << EOF
NODE_ENV=development
DATABASE_URL="mysql://root:password@localhost:3306/competition_management_dev?schema=public"
JWT_SECRET="dev-secret-key"
PORT=3001
EOF
```
### 2. 创建生产环境配置
```bash
# 创建生产环境配置文件(不要提交到 Git
cat > .env.production << EOF
NODE_ENV=production
DATABASE_URL="mysql://prod_user:password@prod-host:3306/competition_management?schema=public&sslmode=require"
JWT_SECRET="$(openssl rand -hex 32)"
PORT=3001
EOF
```
### 3. 初始化数据库
```bash
# 开发环境
NODE_ENV=development pnpm prisma:migrate dev
# 生产环境(部署时)
NODE_ENV=production pnpm prisma:migrate deploy
```
## 常见问题
### Q: 如何确保使用正确的环境配置?
A: 在启动应用前检查 `NODE_ENV` 环境变量:
```bash
echo $NODE_ENV # 应该显示 development 或 production
```
### Q: 生产环境配置应该存储在哪里?
A:
- **不要提交到 Git**
- 使用环境变量管理工具(如 Docker secrets、K8s secrets
- 或使用云平台提供的密钥管理服务
### Q: 如何在不同环境间切换?
A: 通过设置 `NODE_ENV` 环境变量:
```bash
# 开发环境
export NODE_ENV=development
pnpm start:dev
# 生产环境
export NODE_ENV=production
pnpm start:prod
```
### Q: 数据库迁移如何区分环境?
A: Prisma 会根据 `DATABASE_URL` 环境变量自动使用对应的数据库:
```bash
# 开发环境迁移
NODE_ENV=development pnpm prisma:migrate dev
# 生产环境迁移
NODE_ENV=production pnpm prisma:migrate deploy
```