Openstatus www.openstatus.dev
at main 97 lines 2.1 kB view raw
1package main 2 3import ( 4 "context" 5 "errors" 6 "fmt" 7 "net/http" 8 "net/http/httputil" 9 "net/url" 10 "os" 11 "os/signal" 12 "syscall" 13 14 "github.com/gin-gonic/gin" 15 "github.com/rs/zerolog/log" 16) 17 18func proxy(c *gin.Context) { 19 20 var targetUrl string 21 22 region := c.Request.Header.Get("railway-region") 23 24 switch region { 25 case "europe-west4-drams3a": 26 targetUrl = "http://openstatus-checker-eu-west.railway.internal:8080" 27 case "us-east4-eqdc4a": 28 targetUrl = "http://openstatus-checker-us-east.railway.internal:8080" 29 case "us-west2": 30 targetUrl = "http://openstatus-checker-us-west.railway.internal:8080" 31 case "asia-southeast1-eqsg3a": 32 targetUrl = "http://checker-southeast-asia.railway.internal:8080" 33 default: 34 fmt.Println("No region") 35 } 36 remote, err := url.Parse(targetUrl) 37 if err != nil { 38 panic(err) 39 } 40 41 proxy := httputil.NewSingleHostReverseProxy(remote) 42 43 c.Request.Host = remote.Host 44 45 proxy.ServeHTTP(c.Writer, c.Request) 46} 47 48func main() { 49 ctx, cancel := context.WithCancel(context.Background()) 50 defer cancel() 51 done := make(chan os.Signal, 1) 52 signal.Notify(done, os.Interrupt, syscall.SIGINT, syscall.SIGTERM) 53 54 go func() { 55 <-done 56 cancel() 57 }() 58 59 cloudProvider := env("CLOUD_PROVIDER", "railway") 60 region := env("RAILWAY_REPLICA_REGION", env("REGION", "local")) 61 router := gin.New() 62 63 //Create a catchall route 64 router.NoRoute(proxy) 65 66 router.GET("/healthz", func(c *gin.Context) { 67 c.JSON(http.StatusOK, gin.H{"message": "pong", "region": region, "provider": cloudProvider}) 68 }) 69 70 httpServer := &http.Server{ 71 Addr: fmt.Sprintf("0.0.0.0:%s", env("PORT", "8080")), 72 Handler: router, 73 } 74 75 go func() { 76 if err := httpServer.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) { 77 log.Ctx(ctx).Error().Err(err).Msg("failed to start http server") 78 cancel() 79 } 80 }() 81 82 <-ctx.Done() 83 if err := httpServer.Shutdown(ctx); err != nil { 84 log.Ctx(ctx).Error().Err(err).Msg("failed to shutdown http server") 85 86 return 87 } 88 89} 90 91func env(key, fallback string) string { 92 if value, ok := os.LookupEnv(key); ok { 93 return value 94 } 95 96 return fallback 97}