package config import ( "fmt" "os" "sync" "time" ) // Config 应用配置(持久化在 MySQL monitor_kv,首次启动前由环境变量提供默认值;MySQL 连接信息首次连接仍依赖环境变量/DB_DSN) type Config struct { Server ServerConfig `json:"server"` Monitor MonitorConfig `json:"monitor"` DataPath string `json:"data_path"` Database DatabaseConfig `json:"database"` } // ServerConfig 服务器配置 type ServerConfig struct { Port string `json:"port"` Host string `json:"host"` } // MonitorConfig 监控配置 type MonitorConfig struct { Interval time.Duration `json:"interval"` // 检测间隔 Timeout time.Duration `json:"timeout"` // 请求超时时间 RetryCount int `json:"retry_count"` // 重试次数 HistoryDays int `json:"history_days"` // 保留历史天数 } var ( cfg *Config once sync.Once ) // GetConfig 获取配置单例(连接 MySQL 后由 storage 根据 monitor_kv 覆盖) func GetConfig() *Config { once.Do(func() { cfg = &Config{ Server: ServerConfig{ Port: getEnv("SERVER_PORT", "8080"), Host: getEnv("SERVER_HOST", "0.0.0.0"), }, Monitor: MonitorConfig{ Interval: parseDuration(getEnv("MONITOR_INTERVAL", "30m"), 30*time.Minute), Timeout: parseDuration(getEnv("MONITOR_TIMEOUT", "10s"), 10*time.Second), RetryCount: parseInt(getEnv("MONITOR_RETRY_COUNT", "3"), 3), HistoryDays: parseInt(getEnv("MONITOR_HISTORY_DAYS", "30"), 30), }, DataPath: getEnv("DATA_PATH", "./data"), Database: DatabaseConfig{ Host: getEnv("DB_HOST", "192.168.1.100"), Port: getEnv("DB_PORT", "3306"), User: getEnv("DB_USER", "mengyaping"), Password: getEnv("DB_PASSWORD", "mengyaping"), Database: getEnv("DB_NAME", "mengyaping"), }, } }) return cfg } // getEnv 获取环境变量,如果不存在则返回默认值 func getEnv(key, defaultValue string) string { if value := os.Getenv(key); value != "" { return value } return defaultValue } // parseInt 解析整数环境变量 func parseInt(value string, defaultValue int) int { if value == "" { return defaultValue } var result int if _, err := fmt.Sscanf(value, "%d", &result); err != nil { return defaultValue } return result } // parseDuration 解析时间间隔环境变量 func parseDuration(value string, defaultValue time.Duration) time.Duration { if value == "" { return defaultValue } if duration, err := time.ParseDuration(value); err == nil { return duration } return defaultValue }