package config import ( "log" "os" "path/filepath" "github.com/joho/godotenv" ) // Config 应用配置 type Config struct { Port string DBHost string DBPort string DBUser string DBPass string DBName string JWTSecret string RedisURL string S3Bucket string } // Load 加载配置(支持 .env 文件) // 1. 先加载 .env(基础配置,本地开发友好) // 2. 再加载 .env.(环境覆盖,由 ENV 环境变量指定) // 搜索路径:可执行文件目录 → 当前目录 → server/ 子目录 // 优先级(高 → 低):环境覆盖 → .env → 系统环境变量 → 默认值 func Load() *Config { loadEnv := func(name string) { if exe, err := os.Executable(); err == nil { _ = godotenv.Overload(filepath.Join(filepath.Dir(exe), name)) } _ = godotenv.Overload(name) _ = godotenv.Overload(filepath.Join(".", "server", name)) } loadEnv(".env") if env := os.Getenv("ENV"); env != "" { loadEnv(".env." + env) } c := &Config{ Port: getEnv("PORT", "8080"), DBHost: getEnv("DB_HOST", "127.0.0.1"), DBPort: getEnv("DB_PORT", "3306"), DBUser: getEnv("DB_USER", "root"), DBPass: getEnv("DB_PASS", ""), DBName: getEnv("DB_NAME", "inchstep"), JWTSecret: getEnv("JWT_SECRET", "dev-secret-change-in-production"), RedisURL: getEnv("REDIS_URL", "redis://127.0.0.1:6379/0"), S3Bucket: getEnv("S3_BUCKET", ""), } log.Println("[寸进] 配置加载完成") log.Printf("[寸进] DB: %s:%s/%s", c.DBHost, c.DBPort, c.DBName) log.Printf("[寸进] JWT: %s...", maskSecret(c.JWTSecret, 8)) log.Printf("[寸进] Redis: %s", c.RedisURL) return c } func getEnv(key, fallback string) string { if v := os.Getenv(key); v != "" { return v } return fallback } func maskSecret(s string, keep int) string { if len(s) <= keep { return s } return s[:keep] + "..." }