package config import ( "fmt" "os" ) // Config 保存进程运行所需的全部配置。 type Config struct { Addr string // HTTP 监听地址 DBDriver string // 数据库驱动:sqlite(默认)/ mysql / postgres DBDSN string // mysql / postgres 的连接串;sqlite 不使用 DBPath string // SQLite 文件路径 DataKey string // 敏感字段加密主密钥 JWTSecret string // JWT 签名密钥 AdminUsername string // 初始管理员用户名 AdminPassword string // 初始管理员密码,仅在该用户不存在时用于创建 PublicURL string // 面板公网基址(如 https://demo.example.com),日志回传引导创建用 } // Load 从环境变量读取配置;DATA_KEY、JWT_SECRET 无默认值,缺失即失败。 func Load() (*Config, error) { dataKey := os.Getenv("DATA_KEY") if dataKey == "" { return nil, fmt.Errorf("load config: DATA_KEY is required") } jwtSecret := os.Getenv("JWT_SECRET") if jwtSecret == "" { return nil, fmt.Errorf("load config: JWT_SECRET is required") } driver, dsn, err := dbFromEnv() if err != nil { return nil, err } return &Config{ Addr: envOr("ADDR", ":8080"), DBDriver: driver, DBDSN: dsn, DBPath: envOr("DB_PATH", "oci-portal.db"), DataKey: dataKey, JWTSecret: jwtSecret, AdminUsername: envOr("ADMIN_USERNAME", "admin"), AdminPassword: os.Getenv("ADMIN_PASSWORD"), PublicURL: os.Getenv("PUBLIC_URL"), }, nil } // dbFromEnv 读取并校验数据库驱动配置;外部库缺 DSN 视为配置错误,启动即失败。 func dbFromEnv() (driver, dsn string, err error) { driver = envOr("DB_DRIVER", "sqlite") dsn = os.Getenv("DB_DSN") switch driver { case "sqlite": case "mysql", "postgres": if dsn == "" { return "", "", fmt.Errorf("load config: DB_DSN is required when DB_DRIVER=%s", driver) } default: return "", "", fmt.Errorf("load config: unsupported DB_DRIVER %q (sqlite/mysql/postgres)", driver) } return driver, dsn, nil } func envOr(name, def string) string { if v := os.Getenv(name); v != "" { return v } return def }