main.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. package main
  2. import (
  3. "context"
  4. "log"
  5. "net/http"
  6. "os"
  7. "os/signal"
  8. "syscall"
  9. "time"
  10. "github.com/celestia-trace/backend/config"
  11. "github.com/celestia-trace/backend/database"
  12. "github.com/celestia-trace/backend/router"
  13. "github.com/joho/godotenv"
  14. )
  15. func main() {
  16. // Try loading .env if it exists
  17. _ = godotenv.Load()
  18. // Load configuration
  19. cfg := config.Load()
  20. if err := cfg.Validate(); err != nil {
  21. log.Fatalf("Invalid configuration: %v", err)
  22. }
  23. // Initialize database
  24. database.Init(cfg)
  25. // Setup router
  26. r := router.Setup(database.DB, cfg)
  27. srv := &http.Server{
  28. Addr: ":" + cfg.ServerPort,
  29. Handler: r,
  30. }
  31. go func() {
  32. log.Printf("Server listening on port %s", cfg.ServerPort)
  33. if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
  34. log.Fatalf("listen: %s\n", err)
  35. }
  36. }()
  37. // Graceful shutdown with signal handling
  38. quit := make(chan os.Signal, 1)
  39. signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
  40. <-quit
  41. log.Println("Shutting down server...")
  42. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  43. defer cancel()
  44. if err := srv.Shutdown(ctx); err != nil {
  45. log.Fatal("Server forced to shutdown:", err)
  46. }
  47. log.Println("Server exiting")
  48. }