package main import ( "log" "os" "time" "github.com/gin-gonic/gin" "eai_agentplatform/backend/internal/api" "eai_agentplatform/backend/internal/auth" "eai_agentplatform/backend/internal/config" "eai_agentplatform/backend/internal/model" "eai_agentplatform/backend/internal/store" ) func main() { // 交付维护子命令(不进服务主流程) if len(os.Args) > 1 { switch os.Args[1] { case "-reset-admin": resetAdmin(os.Args[2:]) return case "-backup": backupOnce() return } } cfg := config.Load() if _, err := store.Init(cfg.DBPath); err != nil { log.Fatalf("数据库初始化失败: %v", err) } if err := store.SeedDefaults(); err != nil { log.Fatalf("种子数据初始化失败: %v", err) } // 定期备份:SQLite 是单文件且无外部副本,坏一份就是全丢。 // 失败只在日志里报,绝不因此拦下服务。 if cfg.BackupEnabled { store.StartBackupLoop(store.DB, cfg.DBPath, cfg.BackupDir, cfg.BackupKeep, cfg.BackupIntervalHours) } r := gin.Default() api.RegisterRoutes(r, cfg) log.Printf("eai_agentplatform 后端启动,端口 :%s", cfg.Port) if err := r.Run(":" + cfg.Port); err != nil { log.Fatalf("启动失败: %v", err) } } // backupOnce 手工备份一次后退出:eai_agentplatform-server -backup // 用于升级/迁移/交付前留一份手边的副本,比等定期那份更让人放心。 func backupOnce() { cfg := config.Load() if _, err := store.Init(cfg.DBPath); err != nil { log.Fatalf("数据库初始化失败: %v", err) } path, err := store.Backup(store.DB, cfg.BackupDir, cfg.BackupKeep, time.Now()) if err != nil { log.Fatalf("备份失败: %v", err) } log.Printf("[OK] 已备份到 %s", path) } // resetAdmin 交付前重置管理员密码:eai_agentplatform-server -reset-admin <新密码> func resetAdmin(args []string) { if len(args) < 1 || args[0] == "" { log.Fatal("用法: eai_agentplatform-server -reset-admin <新密码>") } cfg := config.Load() if _, err := store.Init(cfg.DBPath); err != nil { log.Fatalf("数据库初始化失败: %v", err) } hash, err := auth.HashPassword(args[0]) if err != nil { log.Fatalf("密码加密失败: %v", err) } if err := store.DB.Model(&model.User{}).Where("username = ?", "admin").Update("password_hash", hash).Error; err != nil { log.Fatalf("重置密码失败: %v", err) } log.Println("[OK] 管理员密码已重置") }