package main import ( "fmt" "log" "net/http" "os" "os/signal" "syscall" "time" "forgejo.riotpiao.com/rock/homelab-frontend/internal/config" "forgejo.riotpiao.com/rock/homelab-frontend/internal/proxy" "forgejo.riotpiao.com/rock/homelab-frontend/internal/server" "forgejo.riotpiao.com/rock/homelab-frontend/internal/serviceadapter" "forgejo.riotpiao.com/rock/homelab-frontend/internal/temporal" ) func main() { cfg, err := config.Load() if err != nil { fmt.Fprintf(os.Stderr, "failed to load config: %v\n", err) os.Exit(1) } authEnabled := false for _, route := range cfg.Routes { if route.Upstream.AuthRequired { authEnabled = true break } } upstreamHandler := proxy.New(cfg) temporalHostPort := os.Getenv("TEMPORAL_HOST_PORT") if temporalHostPort == "" { temporalHostPort = "localhost:7233" } log.Printf("Temporal server: %s", temporalHostPort) temporalHandler := temporal.NewHandler(temporalHostPort) srv := server.New(cfg.ListenAddr, cfg.ShutdownTimeout, nil) healthChecker := server.NewHealthChecker(true, authEnabled) srv.SetHealthChecker(healthChecker) // ServiceAdapter: registry + loader + dispatcher registry := serviceadapter.NewRegistry(nil) dispatcher := serviceadapter.NewDispatcher(registry) var loader *serviceadapter.Loader if l, err := serviceadapter.NewLoader(registry, "api"); err != nil { log.Printf("ServiceAdapter loader disabled: %v", err) } else { l.Start(30 * time.Second) loader = l log.Printf("ServiceAdapter loader started (background)") } router := server.NewRouter(healthChecker, dispatcher, temporalHandler, upstreamHandler) srv.SetHandler(router) sigChan := make(chan os.Signal, 1) signal.Notify(sigChan, syscall.SIGTERM, syscall.SIGINT) go func() { log.Printf("gateway listening on %s", srv.Addr()) if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed { log.Printf("server error: %v", err) } }() sig := <-sigChan log.Printf("received signal: %v", sig) if loader != nil { loader.Stop() } if err := srv.Shutdown(nil); err != nil { fmt.Fprintf(os.Stderr, "shutdown error: %v\n", err) os.Exit(1) } log.Printf("gateway shutdown complete") }