# 环境变量配置指南

## 概述

Go 服务支持通过**环境变量**来确定配置,优先级为:

```
环境变量 > 配置文件 > 默认值
```

## 1. 环境选择

### 方式一:环境变量 `APP_ENV`(推荐)
```bash
# Windows PowerShell
$env:APP_ENV="prod"
.\start.bat

# Linux/Mac
export APP_ENV=prod
./start.sh

# Docker
docker run -e APP_ENV=prod ...
```

### 方式二:命令行参数
```bash
go run main.go -env=prod
```

### 方式三:默认值
不设置任何参数时,默认使用 `dev` 环境

---

## 2. 支持的环境变量

### 服务器配置
| 环境变量 | 配置项 | 说明 | 示例 |
|---------|--------|------|------|
| `SERVER_PORT` | server.port | 服务端口 | 8080 |
| `SERVER_MODE` | server.mode | 运行模式 | release |

### 数据库配置
| 环境变量 | 配置项 | 说明 | 示例 |
|---------|--------|------|------|
| `DB_HOST` | database.host | 数据库地址 | localhost |
| `DB_PORT` | database.port | 数据库端口 | 3306 |
| `DB_USERNAME` | database.username | 用户名 | root |
| `DB_PASSWORD` | database.password | 密码 | your_password |
| `DB_NAME` | database.dbname | 数据库名 | ai_wht |
| `DB_CHARSET` | database.charset | 字符集 | utf8mb4 |

### JWT 配置
| 环境变量 | 配置项 | 说明 | 示例 |
|---------|--------|------|------|
| `JWT_SECRET` | jwt.secret | JWT 密钥 | your_secret_key |
| `JWT_EXPIRE_HOURS` | jwt.expire_hours | 过期时间(小时) | 168 |

### 微信配置
| 环境变量 | 配置项 | 说明 | 示例 |
|---------|--------|------|------|
| `WECHAT_APP_ID` | wechat.app_id | 微信 AppID | wx1234567890 |
| `WECHAT_APP_SECRET` | wechat.app_secret | 微信 AppSecret | your_secret |

### 小红书配置
| 环境变量 | 配置项 | 说明 | 示例 |
|---------|--------|------|------|
| `XHS_PYTHON_SERVICE_URL` | xhs.python_service_url | Python服务地址 | http://localhost:8000 |

---

## 3. 使用场景

### 场景一:本地开发(覆盖数据库密码)
```bash
# Windows
$env:DB_PASSWORD="local_password"
go run main.go

# Linux/Mac
export DB_PASSWORD=local_password
go run main.go
```

### 场景二:生产部署
```bash
# 设置生产环境
$env:APP_ENV="prod"
$env:DB_HOST="prod-db.example.com"
$env:DB_PASSWORD="prod_secure_password"
$env:JWT_SECRET="prod_jwt_secret_key"
$env:WECHAT_APP_ID="wx_prod_appid"
$env:WECHAT_APP_SECRET="wx_prod_secret"

.\start.bat
```

### 场景三:Docker 部署
```dockerfile
# Dockerfile
FROM golang:1.21-alpine

WORKDIR /app
COPY . .

RUN go build -o main .

# 设置环境变量
ENV APP_ENV=prod
ENV SERVER_PORT=8080
ENV DB_HOST=mysql-server

CMD ["./main"]
```

```bash
# docker-compose.yml
version: '3.8'
services:
  go-backend:
    build: .
    environment:
      - APP_ENV=prod
      - DB_HOST=mysql
      - DB_PASSWORD=${DB_PASSWORD}
      - WECHAT_APP_ID=${WECHAT_APP_ID}
      - WECHAT_APP_SECRET=${WECHAT_APP_SECRET}
    ports:
      - "8080:8080"
```

### 场景四:CI/CD 流水线
```yaml
# GitHub Actions
env:
  APP_ENV: prod
  DB_HOST: ${{ secrets.DB_HOST }}
  DB_PASSWORD: ${{ secrets.DB_PASSWORD }}
  JWT_SECRET: ${{ secrets.JWT_SECRET }}
  WECHAT_APP_ID: ${{ secrets.WECHAT_APP_ID }}
  WECHAT_APP_SECRET: ${{ secrets.WECHAT_APP_SECRET }}
```

---

## 4. 配置优先级示例

假设 `config.prod.yaml` 中配置:
```yaml
database:
  host: localhost
  port: 3306
  password: file_password
```

运行时设置环境变量:
```bash
$env:DB_HOST="prod-server.com"
$env:DB_PASSWORD="env_password"
```

**最终生效的配置:**
```
host: prod-server.com         # 来自环境变量 DB_HOST
port: 3306                    # 来自配置文件
password: env_password        # 来自环境变量 DB_PASSWORD
```

---

## 5. 查看当前配置

启动服务时,会在日志中输出:
```
2024/12/15 14:45:00 从环境变量 APP_ENV 读取环境: prod
2024/12/15 14:45:00 配置加载成功: prod 环境
2024/12/15 14:45:00 数据库配置: root@prod-server.com:3306/ai_wht
```

---

## 6. 安全建议

1. **敏感信息不要写入配置文件**,使用环境变量:
   - `DB_PASSWORD`
   - `JWT_SECRET`
   - `WECHAT_APP_SECRET`

2. **生产环境必须覆盖的环境变量**:
   ```bash
   APP_ENV=prod
   DB_PASSWORD=<secure_password>
   JWT_SECRET=<random_secret_key>
   WECHAT_APP_SECRET=<wechat_secret>
   ```

3. **使用密钥管理工具**(可选):
   - Azure Key Vault
   - AWS Secrets Manager
   - HashiCorp Vault

---

## 7. 快速启动脚本

### Windows (start_with_env.bat)
```bat
@echo off
set APP_ENV=prod
set DB_HOST=localhost
set DB_PASSWORD=your_password
set JWT_SECRET=your_jwt_secret
set WECHAT_APP_ID=your_appid
set WECHAT_APP_SECRET=your_secret

go run main.go
```

### Linux/Mac (start_with_env.sh)
```bash
#!/bin/bash
export APP_ENV=prod
export DB_HOST=localhost
export DB_PASSWORD=your_password
export JWT_SECRET=your_jwt_secret
export WECHAT_APP_ID=your_appid
export WECHAT_APP_SECRET=your_secret

go run main.go
```

---

## 8. 常见问题

### Q: 环境变量没生效?
**A:** 检查环境变量名称是否正确,区分大小写。

### Q: 如何查看所有环境变量?
**A:**
```bash
# Windows
Get-ChildItem Env:

# Linux/Mac
printenv
```

### Q: 如何临时设置环境变量?
**A:**
```bash
# Windows - 当前会话有效
$env:DB_PASSWORD="temp_password"

# Linux/Mac - 当前会话有效
export DB_PASSWORD=temp_password
```

### Q: 如何永久设置环境变量?
**A:**
- Windows: 系统设置 → 高级系统设置 → 环境变量
- Linux/Mac: 添加到 `~/.bashrc` 或 `~/.zshrc`
