package main import ( "context" "errors" "log/slog" "net/http" "os" "os/signal" "syscall" "time" "gitea.meghsakha.com/platform/tenant-registry/internal/config" "gitea.meghsakha.com/platform/tenant-registry/internal/server" ) func main() { logger := slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{Level: slog.LevelInfo})) slog.SetDefault(logger) cfg, err := config.Load() if err != nil { slog.Error("config load failed", "err", err) os.Exit(1) } mux := server.NewRouter(cfg, logger) srv := &http.Server{ Addr: cfg.Addr, Handler: mux, ReadTimeout: 10 * time.Second, WriteTimeout: 30 * time.Second, IdleTimeout: 60 * time.Second, } ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM) defer stop() go func() { slog.Info("tenant-registry listening", "addr", cfg.Addr, "env", cfg.Env) if err := srv.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) { slog.Error("server crashed", "err", err) os.Exit(1) } }() <-ctx.Done() slog.Info("shutdown requested") shutdownCtx, cancel := context.WithTimeout(context.Background(), 15*time.Second) defer cancel() if err := srv.Shutdown(shutdownCtx); err != nil { slog.Error("shutdown failed", "err", err) os.Exit(1) } slog.Info("bye") }