package main import ( "context" "net/http" "os" "os/signal" "syscall" "time" "hfb_sys/backend/internal/config" "hfb_sys/backend/internal/router" "go.uber.org/zap" ) func main() { cfg := config.Load() logger, err := zap.NewProduction() if cfg.AppEnv == "development" { logger, err = zap.NewDevelopment() } if err != nil { panic(err) } defer func() { _ = logger.Sync() }() engine := router.New(cfg, logger) server := &http.Server{ Addr: cfg.AppAddr, Handler: engine, ReadHeaderTimeout: 5 * time.Second, } go func() { logger.Info("api server starting", zap.String("addr", cfg.AppAddr)) if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed { logger.Fatal("api server failed", zap.Error(err)) } }() quit := make(chan os.Signal, 1) signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) <-quit ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() if err := server.Shutdown(ctx); err != nil { logger.Fatal("api server shutdown failed", zap.Error(err)) } logger.Info("api server stopped") }