Openstatus
www.openstatus.dev
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}