From 7193571f1d13e057748518fd49781d62323162ea Mon Sep 17 00:00:00 2001 From: engigu Date: Wed, 24 Dec 2025 08:47:02 +0800 Subject: [PATCH] feat: support env start --- README.md | 52 +++++++++++++++--- docker-compose.ghcr.yml | 11 ++++ docker-compose.yml | 11 ++++ internal/services/config_service.go | 84 ++++++++++++++++++++++++++--- 4 files changed, 146 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 164d5b3..79ccc97 100644 --- a/README.md +++ b/README.md @@ -52,6 +52,14 @@ services: - ./envs:/app/envs environment: - TZ=Asia/Shanghai + # 以下环境变量可覆盖配置文件(可选) + # - BH_SERVER_PORT=8052 + # - BH_DB_TYPE=mysql + # - BH_DB_HOST=localhost + # - BH_DB_PORT=3306 + # - BH_DB_USER=root + # - BH_DB_PASSWORD=password + # - BH_DB_NAME=baihu restart: unless-stopped ``` @@ -135,6 +143,8 @@ docker-compose up -d ## 配置说明 ⚙️ +### 配置文件 + 配置文件路径:`configs/config.ini` ```ini @@ -152,12 +162,42 @@ dbname = ql_panel table_prefix = baihu_ ``` -| 配置项 | 说明 | 默认值 | -|--------|------|--------| -| `server.port` | 服务端口 | 8052 | -| `server.host` | 监听地址 | 0.0.0.0 | -| `database.type` | 数据库类型 | sqlite | -| `database.table_prefix` | 表前缀 | baihu_ | +### 环境变量 + +所有配置项都支持通过环境变量覆盖,环境变量优先级高于配置文件: + +| 环境变量 | 对应配置 | 说明 | 默认值 | +|----------|----------|------|--------| +| `BH_SERVER_PORT` | server.port | 服务端口 | 8052 | +| `BH_SERVER_HOST` | server.host | 监听地址 | 0.0.0.0 | +| `BH_DB_TYPE` | database.type | 数据库类型 (sqlite/mysql) | sqlite | +| `BH_DB_HOST` | database.host | 数据库地址 | localhost | +| `BH_DB_PORT` | database.port | 数据库端口 | 3306 | +| `BH_DB_USER` | database.user | 数据库用户 | root | +| `BH_DB_PASSWORD` | database.password | 数据库密码 | - | +| `BH_DB_NAME` | database.dbname | 数据库名称 | ql_panel | +| `BH_DB_PATH` | database.path | SQLite 文件路径 | ./data/ql.db | +| `BH_DB_TABLE_PREFIX` | database.table_prefix | 表前缀 | baihu_ | +| `BH_SECRET` | security.secret | JWT 密钥 | 自动生成 | + +**使用 MySQL 示例:** + +```bash +docker run -d \ + --name baihu \ + -p 8052:8052 \ + -v $(pwd)/data:/app/data \ + -v $(pwd)/envs:/app/envs \ + -e TZ=Asia/Shanghai \ + -e BH_DB_TYPE=mysql \ + -e BH_DB_HOST=mysql-server \ + -e BH_DB_PORT=3306 \ + -e BH_DB_USER=root \ + -e BH_DB_PASSWORD=your_password \ + -e BH_DB_NAME=baihu \ + --restart unless-stopped \ + ghcr.io/engigu/baihu:main +``` ### 调度设置 diff --git a/docker-compose.ghcr.yml b/docker-compose.ghcr.yml index 7f3d26e..30986ad 100644 --- a/docker-compose.ghcr.yml +++ b/docker-compose.ghcr.yml @@ -12,4 +12,15 @@ services: - ./envs:/app/envs environment: - TZ=Asia/Shanghai + # 以下环境变量可覆盖配置文件(可选) + # - BH_SERVER_PORT=8052 + # - BH_SERVER_HOST=0.0.0.0 + # - BH_DB_TYPE=mysql + # - BH_DB_HOST=localhost + # - BH_DB_PORT=3306 + # - BH_DB_USER=root + # - BH_DB_PASSWORD=password + # - BH_DB_NAME=baihu + # - BH_DB_TABLE_PREFIX=baihu_ + # - BH_SECRET=your_secret_key restart: unless-stopped diff --git a/docker-compose.yml b/docker-compose.yml index 3013eb4..ede03ef 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -11,4 +11,15 @@ services: - ./envs:/app/envs environment: - TZ=Asia/Shanghai + # 以下环境变量可覆盖配置文件(可选) + # - BH_SERVER_PORT=8052 + # - BH_SERVER_HOST=0.0.0.0 + # - BH_DB_TYPE=mysql + # - BH_DB_HOST=localhost + # - BH_DB_PORT=3306 + # - BH_DB_USER=root + # - BH_DB_PASSWORD=password + # - BH_DB_NAME=baihu + # - BH_DB_TABLE_PREFIX=baihu_ + # - BH_SECRET=your_secret_key restart: unless-stopped \ No newline at end of file diff --git a/internal/services/config_service.go b/internal/services/config_service.go index cc60a73..4f69422 100644 --- a/internal/services/config_service.go +++ b/internal/services/config_service.go @@ -2,6 +2,9 @@ package services import ( "baihu/internal/constant" + "log" + "os" + "strconv" "gopkg.in/ini.v1" ) @@ -34,15 +37,59 @@ type AppConfig struct { var Config *AppConfig +// getEnvStr 获取环境变量字符串 +func getEnvStr(key string, target *string) { + if v := os.Getenv(key); v != "" { + *target = v + } +} + +// getEnvInt 获取环境变量整数 +func getEnvInt(key string, target *int) { + if v := os.Getenv(key); v != "" { + if n, err := strconv.Atoi(v); err == nil { + *target = n + } + } +} + func LoadConfig(path string) (*AppConfig, error) { - cfg, err := ini.Load(path) - if err != nil { - return nil, err + // 初始化默认配置 + Config = &AppConfig{ + Server: ServerConfig{ + Port: 8052, + Host: "0.0.0.0", + }, + Database: DatabaseConfig{ + Type: "sqlite", + Host: "localhost", + Port: 3306, + User: "root", + Password: "", + DBName: "baihu", + Path: constant.DefaultDBPath, + TablePrefix: "baihu_", + }, + Security: SecurityConfig{ + Secret: "", + }, } - Config = &AppConfig{} - if err := cfg.MapTo(Config); err != nil { - return nil, err + // 检查配置文件是否存在 + if _, err := os.Stat(path); err == nil { + // 配置文件存在,从文件加载 + log.Printf("[Config] Loading from file: %s", path) + cfg, err := ini.Load(path) + if err != nil { + return nil, err + } + if err := cfg.MapTo(Config); err != nil { + return nil, err + } + } else { + // 配置文件不存在,使用环境变量 + log.Printf("[Config] File not found, loading from environment variables") + applyEnvOverrides() } // 设置默认数据库路径 @@ -56,9 +103,34 @@ func LoadConfig(path string) (*AppConfig, error) { // 设置 Secret 到 constant 包 constant.Secret = Config.Security.Secret + // 输出配置信息(隐藏敏感信息) + log.Printf("[Config] Server: %s:%d", Config.Server.Host, Config.Server.Port) + log.Printf("[Config] Database: type=%s, host=%s, port=%d, dbname=%s", + Config.Database.Type, Config.Database.Host, Config.Database.Port, Config.Database.DBName) + return Config, nil } +// applyEnvOverrides 从环境变量加载配置 +func applyEnvOverrides() { + // Server + getEnvInt("BH_SERVER_PORT", &Config.Server.Port) + getEnvStr("BH_SERVER_HOST", &Config.Server.Host) + + // Database + getEnvStr("BH_DB_TYPE", &Config.Database.Type) + getEnvStr("BH_DB_HOST", &Config.Database.Host) + getEnvInt("BH_DB_PORT", &Config.Database.Port) + getEnvStr("BH_DB_USER", &Config.Database.User) + getEnvStr("BH_DB_PASSWORD", &Config.Database.Password) + getEnvStr("BH_DB_NAME", &Config.Database.DBName) + getEnvStr("BH_DB_PATH", &Config.Database.Path) + getEnvStr("BH_DB_TABLE_PREFIX", &Config.Database.TablePrefix) + + // Security + getEnvStr("BH_SECRET", &Config.Security.Secret) +} + func GetConfig() *AppConfig { return Config }