package main import ( "context" "log" "os" "os/signal" "syscall" "go-grpc-gateway-template/internal/config" "go-grpc-gateway-template/internal/server" ) func main() { // Load configuration cfg := config.Load() if err := cfg.Validate(); err != nil { log.Fatalf("Invalid configuration: %v", err) } // Create server srv := server.New(cfg) // Setup graceful shutdown ctx, cancel := context.WithCancel(context.Background()) defer cancel() // Handle signals sigChan := make(chan os.Signal, 1) signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM) go func() { <-sigChan log.Println("Received shutdown signal") cancel() }() // Start server if err := srv.Start(ctx); err != nil { log.Printf("Server error: %v", err) } // Shutdown server if err := srv.Shutdown(context.Background()); err != nil { log.Printf("Shutdown error: %v", err) } }