feat(config): implement layered configuration using config.yaml and .env

This commit is contained in:
2026-02-12 14:41:49 +08:00
parent e01cdc9889
commit aed996f409
6 changed files with 228 additions and 87 deletions

112
README.md
View File

@@ -111,26 +111,64 @@ go run main.go
服务器将在 http://localhost:3000 上运行。
### 5. 环境变量配置
### 5. 配置管理
项目支持以下环境变量(按优先级排序)
项目采用 **YAML 结构化管理 + 环境变量动态覆盖** 的方案
| 变量名 | 说明 | 默认值 |
|--------|------|--------|
| `PORT` | 服务器端口 | 3000 |
| `ENVIRONMENT` | 运行环境 (development/production) | development |
| `JWT_SECRET` | JWT 签名密钥 | your-secret-key-here-change-in-production |
| `JWT_EXPIRE` | JWT 过期时间(秒) | 7200 |
| `DATABASE_DRIVER` | 数据库驱动 (sqlite/postgres) | sqlite |
| `DATABASE_PATH` | SQLite 数据库路径 | ./data/database.sqlite |
| `POSTGRES_HOST` | PostgreSQL 主机 | localhost |
| `POSTGRES_PORT` | PostgreSQL 端口 | 5432 |
| `POSTGRES_USER` | PostgreSQL 用户名 | trace |
| `POSTGRES_PASSWORD` | PostgreSQL 密码 | trace123 |
| `POSTGRES_DB` | PostgreSQL 数据库名 | trace |
| `POSTGRES_SSLMODE` | PostgreSQL SSL 模式 | disable |
#### 配置文件优先级(从高到低)
**注意**: 环境变量也可以通过 `.env` 文件设置。
1. **环境变量** (最高优先级) - 格式:`APP_配置项`
2. **.env 文件** - 本地开发环境配置
3. **config.yaml** - 默认配置文件
4. **内置默认值** (最低优先级)
#### 环境变量命名规则
所有环境变量使用 `APP_` 前缀,多级配置使用 `_` 连接:
```bash
# 示例
APP_SERVER_PORT=8080 # 覆盖 server.port
APP_DATABASE_DRIVER=postgres # 覆盖 database.driver
APP_DATABASE_POSTGRES_HOST=db.com # 覆盖 database.postgres.host
APP_JWT_SECRET=my-secret-key # 覆盖 jwt.secret
```
#### 常用配置项
| 环境变量 | 对应配置项 | 说明 | 默认值 |
|---------|-----------|------|--------|
| `APP_SERVER_PORT` | server.port | 服务器端口 | 3000 |
| `APP_SERVER_ENVIRONMENT` | server.environment | 运行环境 | development |
| `APP_DATABASE_DRIVER` | database.driver | 数据库驱动 | sqlite |
| `APP_DATABASE_SQLITE_PATH` | database.sqlite.path | SQLite 路径 | ./data/database.sqlite |
| `APP_DATABASE_POSTGRES_HOST` | database.postgres.host | PostgreSQL 主机 | localhost |
| `APP_DATABASE_POSTGRES_PORT` | database.postgres.port | PostgreSQL 端口 | 5432 |
| `APP_DATABASE_POSTGRES_USER` | database.postgres.user | PostgreSQL 用户名 | trace |
| `APP_DATABASE_POSTGRES_PASSWORD` | database.postgres.password | PostgreSQL 密码 | trace123 |
| `APP_DATABASE_POSTGRES_DBNAME` | database.postgres.dbname | PostgreSQL 数据库名 | trace |
| `APP_JWT_SECRET` | jwt.secret | JWT 签名密钥 | your-secret-key... |
| `APP_JWT_EXPIRE` | jwt.expire | JWT 过期时间(秒) | 7200 |
#### 快速配置示例
**开发环境(.env**:
```bash
# 使用 SQLite
DATABASE_DRIVER=sqlite
DATABASE_PATH=./data/dev.sqlite
```
**生产环境(环境变量)**:
```bash
# 使用 PostgreSQL
export APP_SERVER_PORT=8080
export APP_SERVER_ENVIRONMENT=production
export APP_DATABASE_DRIVER=postgres
export APP_DATABASE_POSTGRES_HOST=prod-db.example.com
export APP_DATABASE_POSTGRES_PASSWORD=secure-password
export APP_JWT_SECRET=your-production-secret-key
```
### 6. 测试 API
@@ -243,33 +281,29 @@ CGO_ENABLED=0 GOOS=darwin GOARCH=arm64 go build -o trace-backend
### SQLite 到 PostgreSQL 的迁移
1. 修改配置文件 `config.yaml` 中的数据库驱动
```yaml
database:
driver: postgres
postgres:
host: localhost
port: 5432
user: trace
password: trace123
dbname: trace
sslmode: disable
```
2. 或者使用环境变量:
修改 `.env` 文件中的数据库配置
```bash
# 将数据库驱动改为 postgres
DATABASE_DRIVER=postgres
# PostgreSQL 配置
POSTGRES_HOST=localhost
POSTGRES_PORT=5432
POSTGRES_USER=trace
POSTGRES_PASSWORD=trace123
POSTGRES_DB=trace
POSTGRES_SSLMODE=disable
```
然后重新启动应用即可:
```bash
DATABASE_DRIVER=postgres \
POSTGRES_HOST=localhost \
POSTGRES_PORT=5432 \
POSTGRES_USER=trace \
POSTGRES_PASSWORD=trace123 \
POSTGRES_DB=trace \
POSTGRES_SSLMODE=disable \
./trace-backend
```
**注意**: 切换数据库后,原有 SQLite 中的数据不会自动迁移到 PostgreSQL。需要使用数据库迁移工具如 pgloader手动迁移数据。
## 贡献指南
1. 克隆项目