package main import ( "net/http" "cloudnest/internal/bootstrap" "cloudnest/internal/config" "cloudnest/internal/di" "cloudnest/internal/pkg/logger" "github.com/gin-gonic/gin" ) func main() { // Step 1: Initialize logger FIRST to prevent nil pointer panics // 第一步:先初始化日志记录器以防止空指针 panic logger.Init("info") // Step 2: Load configuration // 第二步:加载配置 cfg := config.Load() // Step 3: Re-initialize logger with the configured log level // 第三步:使用配置的日志级别重新初始化日志记录器 logger.Init(cfg.App.LogLevel) // Step 4: Initialize services // 第四步:初始化服务 c := di.New() if err := c.InitializeServices(); err != nil { logger.Fatal("failed to initialize services", "error", err) } // Step 5: Build the HTTP engine (auth service only registers auth routes) // 第五步:构建 HTTP 引擎(认证服务只注册认证路由) engine, err := c.BuildAuthEngine() if err != nil { logger.Fatal("failed to build engine", "error", err) } setupStaticFiles(engine) // Step 6: Create server with lifecycle management // 第六步:创建带生命周期管理的服务器 srv := bootstrap.NewServer(cfg, engine) if err := srv.Run(); err != nil { if err == bootstrap.ErrReloadRequested { logger.Info("exiting for reload, supervisor should restart") } else { logger.Error("server exited with error", "error", err) } } } func setupStaticFiles(engine *gin.Engine) { engine.GET("/", func(c *gin.Context) { serveHTML(c, "web/index.html") }) engine.GET("/login", func(c *gin.Context) { serveHTML(c, "web/login.html") }) engine.GET("/register", func(c *gin.Context) { serveHTML(c, "web/register.html") }) engine.NoRoute(func(c *gin.Context) { if c.Request.Method == http.MethodGet { serveHTML(c, "web/index.html") } else { c.JSON(http.StatusNotFound, gin.H{"code": 404, "message": "not found"}) } }) }