170 lines
4.7 KiB
Go
170 lines
4.7 KiB
Go
package config
|
|
|
|
import (
|
|
"ai-gateway/internal/scheduler"
|
|
"encoding/json"
|
|
"fmt"
|
|
"io/ioutil"
|
|
"log"
|
|
"os"
|
|
)
|
|
|
|
// 固定路径常量 - 用于 Docker 挂载
|
|
const (
|
|
// DataDir 数据目录,用于存放配置和数据库文件(固定路径,便于 Docker 挂载)
|
|
DataDir = "/data"
|
|
// ConfigPath 配置文件固定路径
|
|
ConfigPath = "/data/config.json"
|
|
// DatabasePath 数据库文件固定路径
|
|
DatabasePath = "/data/gateway.db"
|
|
)
|
|
|
|
// Config 应用程序配置结构
|
|
type Config struct {
|
|
// 服务器配置
|
|
Server ServerConfig `json:"server"`
|
|
// 日志清理配置
|
|
LogCleaner scheduler.LogCleanerConfig `json:"log_cleaner"`
|
|
// 应用配置
|
|
App AppConfig `json:"app"`
|
|
}
|
|
|
|
// ServerConfig 服务器配置
|
|
type ServerConfig struct {
|
|
Port string `json:"port"`
|
|
Host string `json:"host"`
|
|
}
|
|
|
|
// AppConfig 应用配置
|
|
type AppConfig struct {
|
|
Name string `json:"name"`
|
|
Version string `json:"version"`
|
|
Environment string `json:"environment"`
|
|
LogLevel string `json:"log_level"`
|
|
LogInDB bool `json:"log_in_db"`
|
|
}
|
|
|
|
// DefaultConfig 默认配置
|
|
func DefaultConfig() *Config {
|
|
return &Config{
|
|
Server: ServerConfig{
|
|
Port: "8080",
|
|
Host: "0.0.0.0",
|
|
},
|
|
LogCleaner: scheduler.LogCleanerConfig{
|
|
Enabled: true, // 默认启用自动清理
|
|
ExecuteTime: "02:00", // 凌晨2点执行
|
|
RetentionDays: 7, // 保留7天的日志
|
|
CheckInterval: 5, // 每5分钟检查一次
|
|
},
|
|
App: AppConfig{
|
|
Name: "AI Gateway",
|
|
Version: "1.0.0",
|
|
Environment: "production",
|
|
LogLevel: "info",
|
|
},
|
|
}
|
|
}
|
|
|
|
// LoadConfig 从文件加载配置
|
|
func LoadConfig(filepath string) (*Config, error) {
|
|
// 确保数据目录存在
|
|
if err := os.MkdirAll(DataDir, 0755); err != nil {
|
|
log.Printf("⚠️ 创建数据目录失败: %v", err)
|
|
}
|
|
// 如果配置文件不存在,返回默认配置并创建配置文件
|
|
if _, err := os.Stat(filepath); os.IsNotExist(err) {
|
|
log.Printf("⚠️ 配置文件不存在,使用默认配置并创建: %s", filepath)
|
|
config := DefaultConfig()
|
|
if err := config.Save(filepath); err != nil {
|
|
log.Printf("❌ 保存默认配置失败: %v", err)
|
|
// 即使保存失败,仍然返回默认配置
|
|
return config, nil
|
|
}
|
|
log.Printf("✅ 已创建默认配置文件: %s", filepath)
|
|
return config, nil
|
|
}
|
|
|
|
// 读取配置文件
|
|
data, err := ioutil.ReadFile(filepath)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("读取配置文件失败: %v", err)
|
|
}
|
|
|
|
// 解析JSON配置
|
|
var config Config
|
|
if err := json.Unmarshal(data, &config); err != nil {
|
|
return nil, fmt.Errorf("解析配置文件失败: %v", err)
|
|
}
|
|
|
|
log.Printf("✅ 配置文件加载成功: %s", filepath)
|
|
return &config, nil
|
|
}
|
|
|
|
// LoadConfigOrDefault 加载配置或使用默认配置(不会失败)
|
|
func LoadConfigOrDefault(filepath string) *Config {
|
|
config, err := LoadConfig(filepath)
|
|
if err != nil {
|
|
log.Printf("⚠️ 加载配置失败,使用默认配置: %v", err)
|
|
return DefaultConfig()
|
|
}
|
|
return config
|
|
}
|
|
|
|
// Save 保存配置到文件
|
|
func (c *Config) Save(filepath string) error {
|
|
// 将配置序列化为格式化的JSON
|
|
data, err := json.MarshalIndent(c, "", " ")
|
|
if err != nil {
|
|
return fmt.Errorf("序列化配置失败: %v", err)
|
|
}
|
|
|
|
// 写入文件
|
|
if err := ioutil.WriteFile(filepath, data, 0644); err != nil {
|
|
return fmt.Errorf("写入配置文件失败: %v", err)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// Validate 验证配置的有效性
|
|
func (c *Config) Validate() error {
|
|
// 验证服务器端口
|
|
if c.Server.Port == "" {
|
|
return fmt.Errorf("服务器端口不能为空")
|
|
}
|
|
|
|
// 验证日志清理配置
|
|
if c.LogCleaner.Enabled {
|
|
if c.LogCleaner.ExecuteTime == "" {
|
|
return fmt.Errorf("日志清理执行时间不能为空")
|
|
}
|
|
if c.LogCleaner.RetentionDays < 0 {
|
|
return fmt.Errorf("日志保留天数不能为负数")
|
|
}
|
|
if c.LogCleaner.CheckInterval <= 0 {
|
|
c.LogCleaner.CheckInterval = 5 // 设置默认值
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// Print 打印配置信息(用于调试)
|
|
func (c *Config) Print() {
|
|
log.Println("📋 当前配置:")
|
|
log.Printf(" 📁 数据目录: %s", DataDir)
|
|
log.Printf(" 📄 配置文件: %s", ConfigPath)
|
|
log.Printf(" 🗄️ 数据库路径: %s (固定)", DatabasePath)
|
|
log.Printf(" 🌐 服务器地址: %s:%s", c.Server.Host, c.Server.Port)
|
|
log.Printf(" 🧹 日志自动清理: %v", c.LogCleaner.Enabled)
|
|
if c.LogCleaner.Enabled {
|
|
log.Printf(" ⏰ 执行时间: %s", c.LogCleaner.ExecuteTime)
|
|
log.Printf(" 📅 保留天数: %d天", c.LogCleaner.RetentionDays)
|
|
log.Printf(" 🔍 检查间隔: %d分钟", c.LogCleaner.CheckInterval)
|
|
}
|
|
log.Printf(" 📱 应用名称: %s v%s", c.App.Name, c.App.Version)
|
|
log.Printf(" 🌍 运行环境: %s", c.App.Environment)
|
|
log.Printf(" 📝 日志级别: %s", c.App.LogLevel)
|
|
}
|