DeployHelper/internal/conf/conf.go

117 lines
3.1 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}