package main import ( "context" "errors" "fmt" "log" "net/http" "os" "os/signal" "syscall" "time" "github.com/panelhosting/panel/internal/config" "github.com/panelhosting/panel/internal/database" "github.com/panelhosting/panel/internal/server" ) func main() { cfg, err := config.Load() if err != nil { log.Fatal(err) } ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM) defer stop() pool, err := database.NewPool(ctx, cfg.DatabaseURL) if err != nil { log.Fatal(err) } defer pool.Close() addr := fmt.Sprintf(":%s", cfg.HTTPPort) srv, err := server.New(pool, addr) if err != nil { log.Fatal(err) } go func() { if err := srv.Start(); err != nil && !errors.Is(err, http.ErrServerClosed) { log.Fatal(err) } }() <-ctx.Done() log.Println("shutting down...") shutdownCtx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() if err := srv.Shutdown(shutdownCtx); err != nil { log.Fatal(err) } }