# 环境变量配置说明

本文档提供所有可配置的环境变量说明。

## 目录

- [配置优先级](#配置优先级)
- [服务器配置](#服务器配置)
- [数据库配置](#数据库配置)
- [认证配置](#认证配置)
- [Redis 配置](#redis-配置)
- [配置示例](#配置示例)

---

## 配置优先级

配置的加载优先级从高到低为：

1. **环境变量**（最高优先级）
2. **配置文件**（config/ 目录）
3. **默认值**（代码中硬编码）

这意味着：
- 环境变量会覆盖配置文件中的设置
- 配置文件会覆盖代码中的默认值

---

## 服务器配置

### SERVER_HOST

服务器监听地址。

| 属性 | 值 |
|------|-----|
| 类型 | 字符串 |
| 默认值 | `0.0.0.0` |
| 说明 | `0.0.0.0` 表示监听所有网络接口 |

**示例**：
```bash
SERVER_HOST=127.0.0.1  # 仅本地访问
SERVER_HOST=0.0.0.0     # 允许外部访问
```

### SERVER_PORT

服务器监听端口。

| 属性 | 值 |
|------|-----|
| 类型 | 整数 |
| 默认值 | `3000` |
| 说明 | 1-65535 之间的有效端口 |

**示例**：
```bash
SERVER_PORT=3000   # 开发环境
SERVER_PORT=8080   # 生产环境
SERVER_PORT=80     # HTTP 标准端口
```

---

## 数据库配置

### DATABASE__DATABASE_TYPE

数据库类型，支持 MySQL、PostgreSQL、SQLite。

| 属性 | 值 |
|------|-----|
| 类型 | 字符串 |
| 默认值 | `sqlite` |
| 可选值 | `mysql`、`postgresql`、`sqlite` |

**示例**：
```bash
DATABASE__DATABASE_TYPE=sqlite       # SQLite 数据库
DATABASE__DATABASE_TYPE=mysql        # MySQL 数据库
DATABASE__DATABASE_TYPE=postgresql  # PostgreSQL 数据库
```

### MySQL 配置

当 `DATABASE__DATABASE_TYPE=mysql` 时使用。

#### DATABASE__HOST

MySQL 服务器地址。

| 属性 | 值 |
|------|-----|
| 类型 | 字符串 |
| 默认值 | `localhost` |

**示例**：
```bash
DATABASE__HOST=localhost
DATABASE__HOST=192.168.1.100
DATABASE__HOST=mysql.example.com
```

#### DATABASE__PORT

MySQL 服务器端口。

| 属性 | 值 |
|------|-----|
| 类型 | 整数 |
| 默认值 | `3306` |

**示例**：
```bash
DATABASE__PORT=3306
```

#### DATABASE__USER

MySQL 用户名。

| 属性 | 值 |
|------|-----|
| 类型 | 字符串 |
| 默认值 | - |
| 必填 | 是 |

**示例**：
```bash
DATABASE__USER=root
DATABASE__USER=webapp
```

#### DATABASE__PASSWORD

MySQL 密码。

| 属性 | 值 |
|------|-----|
| 类型 | 字符串 |
| 默认值 | - |
| 必填 | 是 |

**示例**：
```bash
DATABASE__PASSWORD=your-password
```

#### DATABASE__DATABASE

MySQL 数据库名称。

| 属性 | 值 |
|------|-----|
| 类型 | 字符串 |
| 默认值 | - |
| 必填 | 是 |

**示例**：
```bash
DATABASE__DATABASE=web_template
```

### PostgreSQL 配置

当 `DATABASE__DATABASE_TYPE=postgresql` 时使用，配置项与 MySQL 相同。

| 环境变量 | 说明 | 默认值 |
|---------|------|--------|
| DATABASE__HOST | PostgreSQL 服务器地址 | localhost |
| DATABASE__PORT | PostgreSQL 服务器端口 | 5432 |
| DATABASE__USER | PostgreSQL 用户名 | - |
| DATABASE__PASSWORD | PostgreSQL 密码 | - |
| DATABASE__DATABASE | PostgreSQL 数据库名称 | - |

### SQLite 配置

当 `DATABASE__DATABASE_TYPE=sqlite` 时使用。

#### DATABASE__PATH

SQLite 数据库文件路径。

| 属性 | 值 |
|------|-----|
| 类型 | 字符串 |
| 默认值 | - |
| 必填 | 是 |

**示例**：
```bash
DATABASE__PATH=data/app.db
DATABASE__PATH=/var/data/webapp.db
```

**注意**：
- 目录必须存在，程序不会自动创建目录
- 文件不存在时会自动创建

### DATABASE__MAX_CONNECTIONS

数据库连接池最大连接数。

| 属性 | 值 |
|------|-----|
| 类型 | 整数 |
| 默认值 | `10` |

**示例**：
```bash
DATABASE__MAX_CONNECTIONS=10    # 开发环境
DATABASE__MAX_CONNECTIONS=100   # 生产环境
```

**建议**：
- 开发环境：5-10
- 生产环境：根据应用负载调整（通常是 CPU 核心数的 2-4 倍）

---

## 认证配置

### AUTH__JWT_SECRET

JWT 签名密钥。

| 属性 | 值 |
|------|-----|
| 类型 | 字符串 |
| 默认值 | - |
| 必填 | 是 |

**安全建议**：
- 生产环境使用至少 32 位的随机字符串
- 定期更换密钥
- 不要在代码中硬编码

**生成强密钥**：
```bash
# 使用 OpenSSL
openssl rand -base64 32

# 使用 Python
python -c "import secrets; print(secrets.token_urlsafe(32))"

# 使用 Node.js
node -e "console.log(require('crypto').randomBytes(32).toString('base64'))"
```

**示例**：
```bash
# 开发环境（不安全）
AUTH__JWT_SECRET=dev-secret-key

# 生产环境（安全）
AUTH__JWT_SECRET=Kx7Yn2Zp9qR8wF4tL6mN3vB5xC8zD1sE9aH2jK7
```

### AUTH__ACCESS_TOKEN_EXPIRATION_MINUTES

Access Token 过期时间（分钟）。

| 属性 | 值 |
|------|-----|
| 类型 | 整数 |
| 默认值 | `15` |

**示例**：
```bash
AUTH__ACCESS_TOKEN_EXPIRATION_MINUTES=15   # 15 分钟（推荐）
AUTH__ACCESS_TOKEN_EXPIRATION_MINUTES=30   # 30 分钟
AUTH__ACCESS_TOKEN_EXPIRATION_MINUTES=60   # 1 小时
```

**建议**：
- 安全性要求高：5-15 分钟
- 用户体验优先：30-60 分钟
- 权衡安全性和用户体验

### AUTH__REFRESH_TOKEN_EXPIRATION_DAYS

Refresh Token 过期时间（天）。

| 属性 | 值 |
|------|-----|
| 类型 | 整数 |
| 默认值 | `7` |

**示例**：
```bash
AUTH__REFRESH_TOKEN_EXPIRATION_DAYS=7    # 7 天（推荐）
AUTH__REFRESH_TOKEN_EXPIRATION_DAYS=30   # 30 天
AUTH__REFRESH_TOKEN_EXPIRATION_DAYS=90   # 90 天
```

**建议**：
- Web 应用：7-30 天
- 移动应用：30-90 天
- 安全性要求高的应用：7 天或更短

---

## Redis 配置

### REDIS__HOST

Redis 服务器地址。

| 属性 | 值 |
|------|-----|
| 类型 | 字符串 |
| 默认值 | `localhost` |

**示例**：
```bash
REDIS__HOST=localhost
REDIS__HOST=192.168.1.100
REDIS__HOST=redis.example.com
```

### REDIS__PORT

Redis 服务器端口。

| 属性 | 值 |
|------|-----|
| 类型 | 整数 |
| 默认值 | `6379` |

**示例**：
```bash
REDIS__PORT=6379
```

### REDIS__PASSWORD

Redis 密码（如果设置了密码）。

| 属性 | 值 |
|------|-----|
| 类型 | 字符串 |
| 默认值 | - |
| 必填 | 否 |

**示例**：
```bash
REDIS__PASSWORD=your-redis-password
```

### REDIS__DB

Redis 数据库编号。

| 属性 | 值 |
|------|-----|
| 类型 | 整数 |
| 默认值 | `0` |
| 范围 | 0-15 |

**示例**：
```bash
REDIS__DB=0    # 默认数据库
REDIS__DB=1    # 数据库 1
```

---

## 配置示例

### 开发环境（SQLite）

**重要**：本项目不支持 .env 文件。开发环境请使用 `config/` 目录下的 toml 配置文件。

**方式一：使用默认配置（最简单）**

无需任何配置，直接运行即可：

```bash
cargo run
```

**方式二：修改配置文件**

如果需要修改配置，编辑 `config/default.toml` 或创建 `config/local.toml`：

```bash
# 复制默认配置
cp config/default.toml config/local.toml

# 编辑配置文件
nano config/local.toml  # 或使用其他编辑器

# 运行
cargo run -- -c config/local.toml
```

### 开发环境（MySQL）

**重要**：本项目不支持 .env 文件。开发环境请使用 `config/` 目录下的 toml 配置文件。

编辑 MySQL 配置文件：

```bash
# 编辑开发环境配置文件
nano config/development.toml

# 设置 database.type = "mysql" 并修改连接信息

# 运行
cargo run
```

或使用环境变量（适用于 Docker/Kubernetes）：

```bash
DATABASE__DATABASE_TYPE=mysql \
DATABASE__HOST=localhost \
DATABASE__PORT=3306 \
DATABASE__USER=root \
DATABASE__PASSWORD=root \
DATABASE__DATABASE=web_template_dev \
cargo run
```

### 生产环境

**重要**：本项目不支持 .env 文件。生产环境请使用 `config/` 目录下的 toml 配置文件或环境变量。

**方式一：使用配置文件**

修改 `config/production.toml` 中的配置：

```bash
# 编辑生产环境配置文件
nano config/production.toml

# 运行
cargo run -- -e production -c config/production.toml
```

**方式二：使用环境变量（Docker/Kubernetes 推荐）**

```bash
DATABASE__DATABASE_TYPE=mysql \
DATABASE__HOST=mysql.production.example.com \
DATABASE__PORT=3306 \
DATABASE__USER=webapp \
DATABASE__PASSWORD=strong-password-here \
DATABASE__DATABASE=web_template_prod \
DATABASE__MAX_CONNECTIONS=100 \
AUTH__JWT_SECRET=Kx7Yn2Zp9qR8wF4tL6mN3vB5xC8zD1sE9aH2jK7 \
REDIS__HOST=redis.production.example.com \
REDIS__PORT=6379 \
REDIS__PASSWORD=strong-redis-password \
REDIS__DB=0 \
cargo run -- -e production
```

### Docker Compose 配置

```yaml
# docker-compose.yml
version: '3.8'

services:
  web:
    image: email-unlimit-server:latest
    ports:
      - "3000:3000"
    environment:
      - SERVER_HOST=0.0.0.0
      - SERVER_PORT=3000
      - DATABASE__DATABASE_TYPE=postgresql
      - DATABASE__HOST=db
      - DATABASE__PORT=5432
      - DATABASE__USER=webapp
      - DATABASE__PASSWORD=password
      - DATABASE__DATABASE=web_template
      - DATABASE__MAX_CONNECTIONS=10
      - AUTH__JWT_SECRET=${JWT_SECRET}
      - AUTH__ACCESS_TOKEN_EXPIRATION_MINUTES=15
      - AUTH__REFRESH_TOKEN_EXPIRATION_DAYS=7
      - REDIS__HOST=redis
      - REDIS__PORT=6379
      - REDIS__DB=0
    depends_on:
      - db
      - redis

  db:
    image: postgres:15
    environment:
      - POSTGRES_USER=webapp
      - POSTGRES_PASSWORD=password
      - POSTGRES_DB=web_template
    volumes:
      - postgres_data:/var/lib/postgresql/data

  redis:
    image: redis:7
    volumes:
      - redis_data:/data

volumes:
  postgres_data:
  redis_data:
```

---

## 安全检查清单

生产环境部署前检查：

- [ ] JWT 密钥使用强随机字符串（至少 32 位）
- [ ] 数据库密码使用强密码
- [ ] Redis 设置密码（如果可从外部访问）
- [ ] 服务器监听地址根据需求配置（0.0.0.0 或 127.0.0.1）
- [ ] 数据库连接数根据负载调整
- [ ] Token 过期时间根据安全要求配置
- [ ] 环境变量文件不提交到版本控制

---

## 相关文档

- [配置文件详解](configuration.md) - 配置文件组织说明
- [快速开始指南](../development/getting-started.md) - 安装和配置指南
- [生产环境部署](production-guide.md) - 生产部署最佳实践

---

**提示**：使用 `.env.example` 作为模板，不要提交包含敏感信息的 `.env` 文件到版本控制。
# 可选基础设施与 Web 防护

Redis 和邮件能力默认关闭。常用环境变量：

```text
REDIS__ENABLED=false
EMAIL__ENABLED=false
EMAIL__SMTP_HOST=smtp.example.com
EMAIL__SMTP_PORT=587
EMAIL__SMTP_USERNAME=
EMAIL__SMTP_PASSWORD=
EMAIL__FROM_EMAIL=noreply@example.com
SERVER__REQUEST_TIMEOUT_SECONDS=30
SERVER__MAX_BODY_BYTES=1048576
SERVER__CONCURRENCY_LIMIT=256
SERVER__RATE_LIMIT_PER_MINUTE=120
SERVER__CORS_ORIGINS=["https://app.example.com"]
```

生产环境必须设置非默认 JWT 密钥，且 `cors_origins` 不允许包含 `*`。


