package main import ( "context" "log" "net/http" "os" "os/signal" "syscall" "time" "nexavpn/backend/internal/app" "nexavpn/backend/internal/config" ) func main() { cfg := config.Load() application, err := app.New(cfg) if err != nil { log.Fatalf("failed to initialize app: %v", err) } defer application.Close() server := &http.Server{ Addr: cfg.HTTPAddress, Handler: application.Router, ReadHeaderTimeout: 5 * time.Second, } go func() { log.Printf("nexavpn backend listening on %s", cfg.HTTPAddress) if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed { log.Fatalf("http server failed: %v", err) } }() stop := make(chan os.Signal, 1) signal.Notify(stop, syscall.SIGINT, syscall.SIGTERM) <-stop ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() if err := server.Shutdown(ctx); err != nil { log.Printf("server shutdown error: %v", err) } }