DeployHelper/internal/conf/conf.go

117 lines
3.1 KiB
Go
Raw Normal View History

2025-08-01 16:38:08 +08:00
package conf
import (
"ego/internal/cache"
"ego/internal/conf/locales"
"ego/internal/util"
"ego/pkg/logger"
"fmt"
"os"
"github.com/joho/godotenv"
"go.uber.org/zap"
)
// Init 初始化所有配置
func Init() error {
// 1. 加载环境变量
if err := loadEnvironmentVariables(); err != nil {
// 这里不能使用logger因为还没初始化
return fmt.Errorf("环境变量加载失败: %w", err)
}
// 2. 初始化日志系统在验证环境变量之前因为后续步骤需要使用logger
if err := logger.BuildLogger(); err != nil {
// 这里不能使用logger因为初始化失败了
return fmt.Errorf("日志系统初始化失败: %w", err)
}
// 3. 验证必要环境变量
if err := validateRequiredEnvVars(); err != nil {
logger.Error(nil, "环境变量验证失败", zap.Error(err))
return fmt.Errorf("环境变量验证失败: %w", err)
}
// 4. 加载翻译文件
if err := locales.LoadLocales(); err != nil {
logger.Error(nil, "翻译文件加载失败", zap.Error(err))
return fmt.Errorf("翻译文件加载失败: %w", err)
}
// 5. 连接数据库
mysqlDSN := os.Getenv("MYSQL_DSN")
if err := Database(mysqlDSN); err != nil {
logger.Error(nil, "数据库初始化失败", zap.Error(err))
return fmt.Errorf("数据库初始化失败: %w", err)
}
// 6. 连接 Redis
if err := cache.Redis(); err != nil {
logger.Error(nil, "Redis初始化失败", zap.Error(err))
return fmt.Errorf("Redis初始化失败: %w", err)
}
// 7. 输出JWT密钥状态日志在logger初始化完成后
util.LogJwtKeyStatus()
logger.Info(nil, "所有配置初始化完成")
return nil
}
// Close 关闭所有资源
func Close() {
logger.Info(nil, "开始关闭应用程序资源...")
// 关闭数据库
if err := closeDatabase(); err != nil {
logger.Error(nil, "数据库关闭失败", zap.Error(err))
} else {
logger.Info(nil, "数据库已关闭")
}
// 关闭 Redis
if err := cache.Close(); err != nil {
logger.Error(nil, "Redis关闭失败", zap.Error(err))
} else {
logger.Info(nil, "Redis已关闭")
}
logger.Info(nil, "应用程序资源关闭完成")
}
// loadEnvironmentVariables 加载环境变量并处理错误
func loadEnvironmentVariables() error {
// 尝试加载.env文件如果文件不存在也不报错
if err := godotenv.Load(); err != nil {
// 只有在文件存在但读取失败时才报错
if !os.IsNotExist(err) {
return fmt.Errorf("加载 .env 文件失败: %w", err)
}
// .env文件不存在使用系统环境变量
logger.Info(nil, ".env 文件不存在,使用系统环境变量")
} else {
logger.Info(nil, "成功加载 .env 文件")
}
return nil
}
// validateRequiredEnvVars 验证必要的环境变量
func validateRequiredEnvVars() error {
requiredVars := map[string]string{
"MYSQL_DSN": "数据库连接字符串",
}
var missingVars []string
for envVar, description := range requiredVars {
if os.Getenv(envVar) == "" {
missingVars = append(missingVars, fmt.Sprintf("%s (%s)", envVar, description))
}
}
if len(missingVars) > 0 {
return fmt.Errorf("缺少必要环境变量: %v", missingVars)
}
return nil
}