chore: 重构数据库迁移与 nginx 配置目录
This commit is contained in:
@@ -15,7 +15,7 @@
|
||||
| 路径 | 说明 |
|
||||
|------|------|
|
||||
| `main.go` | 入口:连接数据库、初始化 `Store`、注册路由 |
|
||||
| `internal/database/` | MySQL 连接与环境选择(`DB_DSN` / `APP_ENV`) |
|
||||
| `internal/database/` | MySQL 连接(`DB_DSN` 或 `DB_HOST`/`DB_USER`/`DB_PASSWORD`/`DB_NAME`/`DB_PORT`,支持 `.env` 本地加载) |
|
||||
| `internal/handlers/` | HTTP 处理:认证、资料、签到、公开页、管理端等 |
|
||||
| `internal/models/` | 领域模型(用户、待激活、重置密码、辅助邮箱等) |
|
||||
| `internal/storage/` | 持久化:`Store` + GORM 模型与业务方法 |
|
||||
@@ -25,24 +25,35 @@
|
||||
|
||||
## 环境与数据库
|
||||
|
||||
连接字符串优先级:**`DB_DSN` > 内置规则**。
|
||||
代码中**不再内置任何数据库地址或账号密码**,连接参数完全来自环境变量,连接字符串优先级:**`DB_DSN` > `DB_HOST`/`DB_PORT`/`DB_USER`/`DB_PASSWORD`/`DB_NAME`**。
|
||||
|
||||
1. **若设置 `DB_DSN`**:直接使用该完整 DSN(适合 CI、容器或临时切换)。
|
||||
2. **否则**:根据 `APP_ENV` 选择内置库:
|
||||
- `APP_ENV=production` 或 `prod` → 生产库:`192.168.1.100:3306` / 库名 `sproutgate` / 用户 `sproutgate`
|
||||
- 未设置或其它值 → 开发/测试库:`10.1.1.100:3306` / 库名 `sproutgate-test` / 用户 `sproutgate-test`
|
||||
2. **否则**:用 `DB_HOST`/`DB_USER`/`DB_PASSWORD` 拼接 DSN,`DB_HOST`/`DB_USER`/`DB_PASSWORD` 三者缺一即报错退出;`DB_PORT` 默认 `3306`,`DB_NAME` 默认 `sproutgate`(开发、生产统一用这个库名,仅 host/账号不同)。
|
||||
|
||||
本地开发时,在 `sproutgate-backend/.env`(已在 `.gitignore` 中忽略,不会提交)里写:
|
||||
|
||||
```
|
||||
DB_HOST=10.1.1.100
|
||||
DB_PORT=3306
|
||||
DB_USER=sproutgate-test
|
||||
DB_PASSWORD=sproutgate-test
|
||||
DB_NAME=sproutgate
|
||||
```
|
||||
|
||||
`go run .` / `go run ./cmd/migrate` 启动时会自动从当前目录读取并加载 `.env`(已存在的环境变量不会被覆盖);生产部署通过容器/`docker-compose` 环境变量注入,不依赖 `.env` 文件。
|
||||
|
||||
其它常用环境变量:
|
||||
|
||||
| 变量 | 说明 | 默认 |
|
||||
|------|------|------|
|
||||
| `PORT` | HTTP 监听端口 | `8080` |
|
||||
| `APP_ENV` | 影响默认 MySQL 选择与 `/api/health` 返回的 `env` | 空则 health 中为 `development` |
|
||||
| `APP_ENV` | 仅影响 `/api/health` 返回的 `env` 字段,不再决定数据库选择 | 空则 health 中为 `development` |
|
||||
| `GIN_MODE` | `release` 时 GORM 日志级别更安静(警告级) | debug 模式 |
|
||||
| `DB_DSN` | 完整 MySQL DSN,覆盖上述内置地址 | 未设置 |
|
||||
| `DB_DSN` | 完整 MySQL DSN,覆盖 `DB_HOST` 等单项配置 | 未设置 |
|
||||
| `DB_HOST` / `DB_PORT` / `DB_USER` / `DB_PASSWORD` / `DB_NAME` | MySQL 连接参数;`DB_HOST`/`DB_USER`/`DB_PASSWORD` 必填,无内置默认值 | `DB_PORT=3306`,`DB_NAME=sproutgate` |
|
||||
| `GEO_LOOKUP_URL` | `GET /api/auth/me` 未带 `X-Visit-Location` 时,服务端按 IP 请求该基址反查展示地理位置(实现见 `internal/clientgeo`,会拼接 `?ip=`) | 默认 `https://cf-ip-geo.smyhub.com/api` |
|
||||
|
||||
**建议**:生产部署时设置 `APP_ENV=production`,并确保 MySQL 防火墙与账号权限正确;敏感连接信息也可只通过 `DB_DSN` 注入,无需改代码。
|
||||
**建议**:生产部署通过 `docker-compose.yml` 旁的 `.env`(同样被 `.gitignore` 忽略)注入 `DB_HOST`/`DB_USER`/`DB_PASSWORD`,不要把真实账号密码写进任何会提交到仓库的文件。
|
||||
|
||||
## 数据库表(AutoMigrate)
|
||||
|
||||
@@ -66,16 +77,18 @@
|
||||
在 **`sproutgate-backend`** 目录下:
|
||||
|
||||
```bash
|
||||
# 导入到当前环境对应的库(默认开发库,除非设置 APP_ENV 或 DB_DSN)
|
||||
# 导入到 .env(或当前环境变量)指向的库
|
||||
go run ./cmd/migrate --data-dir ./data
|
||||
```
|
||||
|
||||
Windows PowerShell 示例(写入生产库):
|
||||
Windows PowerShell 示例(临时指定生产库连接参数):
|
||||
|
||||
```powershell
|
||||
$env:APP_ENV = "production"
|
||||
$env:DB_HOST = "192.168.1.100"
|
||||
$env:DB_USER = "sproutgate"
|
||||
$env:DB_PASSWORD = "<生产密码>"
|
||||
go run ./cmd/migrate --data-dir ./data
|
||||
Remove-Item Env:APP_ENV # 可选:清除变量,避免影响本机其它命令
|
||||
Remove-Item Env:DB_HOST, Env:DB_USER, Env:DB_PASSWORD # 可选:清除变量,避免影响本机其它命令
|
||||
```
|
||||
|
||||
迁移内容:`data/config/*.json`(写入 `app_configs` 与 `invite_codes`)、`data/users/*.json`(写入 `users`)。对已存在主键执行 **UPSERT**:同账号、同配置键会更新为迁移文件中的值。
|
||||
|
||||
Reference in New Issue
Block a user