package main import ( "log" "os" "time" ) // 由 build.go 通过 -ldflags 注入 var ( buildVersion = "0.0.0-dev" buildImageTag = "dev" buildTime = "unknown" ) func main() { // 写入 VERSION.ini 到持久化目录 if err := os.WriteFile("./VERSION.ini", []byte(buildVersion+"\n"), 0644); err != nil { log.Printf("⚠️ 写入 VERSION.ini 失败: %v", err) } else { log.Printf("📌 版本: %s", buildVersion) } if err := InitDB(); err != nil { log.Fatal("❌ 数据库初始化失败:", err) } if err := GenerateFrpcConfig(); err != nil { log.Println("⚠️ 生成配置文件失败:", err) } if err := StartFrpc(); err != nil { log.Println("⚠️ 启动 frpc 失败:", err) } go startWatchdog() r := SetupRouter() log.Println("🚀 frpc-console 启动成功!") log.Println("📍 访问地址: http://localhost:9300") log.Println("📍 API 地址: http://localhost:9300/api") if err := r.Run(":9300"); err != nil { log.Fatal("❌ 服务启动失败:", err) } } func startWatchdog() { ticker := time.NewTicker(30 * time.Second) defer ticker.Stop() for range ticker.C { if !isFrpcRunning() { log.Println("⚠️ frpc 进程已停止,自动重启...") if err := StartFrpc(); err != nil { log.Printf("❌ 自动重启 frpc 失败: %v", err) } else { log.Println("✅ frpc 已自动重启") } } } }