diff --git a/cmd/server/main.go b/cmd/server/main.go index dc376de..5d59243 100644 --- a/cmd/server/main.go +++ b/cmd/server/main.go @@ -1,9 +1,13 @@ package main import ( + "context" "log" "os" + "os/signal" "strconv" + "syscall" + "time" "github.com/Henelik/cms/internal/content" "github.com/Henelik/cms/pkg/config" @@ -37,5 +41,32 @@ func main() { content.RegisterRoutes(app) public.RegisterRoutes(app) - app.Listen(":" + strconv.Itoa(cfg.ServerPort)) + 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") }