package config import ( "os" "strings" ) // loadDotenv 加载 .env 文件到环境变量(文件不存在则跳过;不覆盖已有环境变量) func loadDotenv(path string) { data, err := os.ReadFile(path) if err != nil { return } for _, line := range strings.Split(string(data), "\n") { line = strings.TrimSpace(line) if line == "" || strings.HasPrefix(line, "#") { continue } k, v, ok := strings.Cut(line, "=") if !ok { continue } k = strings.TrimSpace(k) v = strings.Trim(strings.TrimSpace(v), `"'`) if os.Getenv(k) == "" { os.Setenv(k, v) } } } // applyEnvOverrides 用环境变量覆盖敏感配置(配合 .env 使用,真实密码不进 config.yaml) func applyEnvOverrides(c *Config) { for _, o := range []struct { env string dst *string }{ {"FQ_SERVER_ACCESS_KEY", &c.Server.AccessKey}, {"FQ_PG_HOST", &c.Cache.Postgres.Host}, {"FQ_PG_USER", &c.Cache.Postgres.User}, {"FQ_PG_PASSWORD", &c.Cache.Postgres.Password}, {"FQ_PG_DATABASE", &c.Cache.Postgres.Database}, {"FQ_REDIS_HOST", &c.Cache.Redis.Host}, {"FQ_REDIS_PASSWORD", &c.Cache.Redis.Password}, } { if v := os.Getenv(o.env); v != "" { *o.dst = v } } }