package main import ( "context" "log" "net/http" "os/signal" "syscall" ) func main() { cfg := loadConfig() app, err := newApp(cfg) if err != nil { log.Fatalf("failed to initialize app: %v", err) } defer app.close() server := &http.Server{ Addr: ":" + cfg.Port, Handler: app.handler(), } ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM) defer stop() go func() { <-ctx.Done() shutdownCtx, cancel := context.WithTimeout(context.Background(), cfg.ShutdownTimeout) defer cancel() if err := server.Shutdown(shutdownCtx); err != nil { log.Printf("graceful shutdown failed: %v", err) } }() log.Printf("starting backend API on :%s", cfg.Port) if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed { log.Fatalf("server failed: %v", err) } }