package main import ( "context" "log" "net/http" "os" "os/signal" "syscall" "time" "kubeviz/internal/config" "kubeviz/internal/httpserver" ) func main() { cfg := config.Load() srv, err := httpserver.New(cfg) if err != nil { log.Fatalf("failed to initialize server: %v", err) } httpSrv := &http.Server{ Addr: cfg.Addr, Handler: srv.Handler(), ReadTimeout: 20 * time.Second, WriteTimeout: 20 * time.Second, IdleTimeout: 60 * time.Second, } go func() { log.Printf("kubeviz server listening on %s", cfg.Addr) if err := httpSrv.ListenAndServe(); err != nil && err != http.ErrServerClosed { log.Fatalf("server failure: %v", 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() srv.Shutdown(ctx) if err := httpSrv.Shutdown(ctx); err != nil { log.Printf("graceful shutdown failed: %v", err) } }