- 2.3: unknown model errors (400 + RFC 9457 problem+json with valid_models) - 2.5: GET /v1/models endpoint (derived from config, not hardcoded) - 2.6: POST /v1/embeddings passthrough (body-based dispatch, no rewrite) - 2.7: POST /v1/rerank with path rewrite (/v1/rerank → /rerank) - wire proxy.Handler in main.go (was using dummy handler) - 140+ tests passing, race detector clean - all requests: client → nginx → gateway → upstreams - ready for config deployment to go live
75 lines
1.8 KiB
Go
75 lines
1.8 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"log"
|
|
"net/http"
|
|
"os"
|
|
"os/signal"
|
|
"syscall"
|
|
|
|
"github.com/Riotpiaole/homelab-frontend/internal/config"
|
|
"github.com/Riotpiaole/homelab-frontend/internal/proxy"
|
|
"github.com/Riotpiaole/homelab-frontend/internal/server"
|
|
)
|
|
|
|
func main() {
|
|
// Load configuration
|
|
cfg, err := config.Load()
|
|
if err != nil {
|
|
fmt.Fprintf(os.Stderr, "failed to load config: %v\n", err)
|
|
os.Exit(1)
|
|
}
|
|
|
|
// Determine if auth is enabled by checking if any route requires it
|
|
authEnabled := false
|
|
for _, route := range cfg.Routes {
|
|
if route.Upstream.AuthRequired {
|
|
authEnabled = true
|
|
break
|
|
}
|
|
}
|
|
|
|
// Create the reverse proxy handler that routes requests based on configuration
|
|
upstreamHandler := proxy.New(cfg)
|
|
|
|
// Create server with health checker
|
|
srv := server.New(cfg.ListenAddr, cfg.ShutdownTimeout, nil)
|
|
|
|
// Initialize health checker with config validity and auth status
|
|
healthChecker := server.NewHealthChecker(true, authEnabled)
|
|
srv.SetHealthChecker(healthChecker)
|
|
|
|
// Create router that handles health endpoints and passes others to upstream
|
|
router := server.NewRouter(healthChecker, upstreamHandler)
|
|
srv.SetHandler(router)
|
|
|
|
// Set up signal handling
|
|
sigChan := make(chan os.Signal, 1)
|
|
signal.Notify(sigChan, syscall.SIGTERM, syscall.SIGINT)
|
|
|
|
// Start server in a goroutine
|
|
var serverErr error
|
|
go func() {
|
|
log.Printf("gateway listening on %s", srv.Addr())
|
|
serverErr = srv.ListenAndServe()
|
|
if serverErr != nil && serverErr != http.ErrServerClosed {
|
|
log.Printf("server error: %v", serverErr)
|
|
}
|
|
}()
|
|
|
|
// Wait for shutdown signal
|
|
sig := <-sigChan
|
|
log.Printf("received signal: %v", sig)
|
|
|
|
// Gracefully shutdown the server
|
|
if err := srv.Shutdown(context.Background()); err != nil {
|
|
fmt.Fprintf(os.Stderr, "shutdown error: %v\n", err)
|
|
os.Exit(1)
|
|
}
|
|
|
|
log.Printf("gateway shutdown complete")
|
|
os.Exit(0)
|
|
}
|