package main import ( "context" "log" "os" "os/signal" "strconv" "syscall" "time" "github.com/Henelik/cms/internal/content" "github.com/Henelik/cms/pkg/config" "github.com/Henelik/cms/pkg/database" "github.com/Henelik/cms/web/public" "github.com/gofiber/fiber/v2" ) func main() { cfgPath := os.Getenv("CONFIG") if cfgPath == "" { cfgPath = "./config.yaml" } cfg, err := config.Load(cfgPath) if err != nil { log.Panic(err.Error()) } db, err := database.NewDB(cfg.DBDriver, cfg.DBConnString) if err != nil { log.Panic(err.Error()) } if err := database.Migrate(db); err != nil { log.Panic(err.Error()) } app := fiber.New() content.RegisterRoutes(app) public.RegisterRoutes(app) go func() { if err := app.Listen(":" + strconv.Itoa(cfg.ServerPort)); err != nil { log.Panic(err.Error()) } }() quit := make(chan os.Signal, 1) signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) <-quit log.Println("shutting down server...") ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() if err := app.ShutdownWithContext(ctx); err != nil { log.Printf("server forced to shutdown: %v", err) } if sqlDB, err := db.DB(); err == nil { if err := sqlDB.Close(); err != nil { log.Printf("failed to close database: %v", err) } } else { log.Printf("failed to get underlying sql.DB: %v", err) } log.Println("server exited") }