Informer cache sync timed out due to transient 429 from API server. REST loader does one GET + retry, polls every 30s. Zero new deps. go.mod back to 1.25.4, CI back to golang:1.25-bookworm.
90 lines
2.2 KiB
Go
90 lines
2.2 KiB
Go
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 {
|
|
if err := l.Start(30 * time.Second); err != nil {
|
|
log.Printf("ServiceAdapter loader failed: %v", err)
|
|
} else {
|
|
loader = l
|
|
log.Printf("ServiceAdapter loader started")
|
|
}
|
|
}
|
|
|
|
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")
|
|
}
|