main.go 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  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. // Initialize database
  21. database.Init(cfg)
  22. // Setup router
  23. r := router.Setup(database.DB, cfg)
  24. srv := &http.Server{
  25. Addr: ":" + cfg.ServerPort,
  26. Handler: r,
  27. }
  28. go func() {
  29. log.Printf("Server listening on port %s", cfg.ServerPort)
  30. if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
  31. log.Fatalf("listen: %s\n", err)
  32. }
  33. }()
  34. // Graceful shutdown with signal handling
  35. quit := make(chan os.Signal, 1)
  36. signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
  37. <-quit
  38. log.Println("Shutting down server...")
  39. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  40. defer cancel()
  41. if err := srv.Shutdown(ctx); err != nil {
  42. log.Fatal("Server forced to shutdown:", err)
  43. }
  44. log.Println("Server exiting")
  45. }