package main import ( "context" "flag" "log" "os" "os/signal" "syscall" "time" "secunda-test/internal/app" ) func main() { migrateOnly := flag.Bool("migrate", false, "run migrations and exit") flag.Parse() ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM) defer stop() container, err := app.New(ctx) if err != nil { log.Fatal(err) } defer container.Close() if *migrateOnly { if err := container.Migrate(ctx); err != nil { log.Fatal(err) } return } if err := container.Migrate(ctx); err != nil { log.Fatal(err) } go func() { if err := container.Server.ListenAndServe(); err != nil { log.Printf("http server stopped: %v", err) } }() log.Printf("listening on %s", container.Config.HTTP.Addr) <-ctx.Done() shutdownCtx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() if err := container.Server.Shutdown(shutdownCtx); err != nil { log.Printf("graceful shutdown failed: %v", err) } }