From: Dan Fuhry Date: Thu, 6 Nov 2025 11:55:06 +0000 (-0500) Subject: [http/proxy] enable config_watcher + live reload support X-Git-Url: https://go.fuhry.dev/?a=commitdiff_plain;h=ba94abac532a9196d0f547f913ce434a1607f9ba;p=runtime.git [http/proxy] enable config_watcher + live reload support --- diff --git a/http/proxy/main.go b/http/proxy/main.go index b4eb445..c0c6b90 100644 --- a/http/proxy/main.go +++ b/http/proxy/main.go @@ -3,7 +3,6 @@ package main import ( "context" "flag" - "os" "os/signal" "syscall" "time" @@ -11,32 +10,56 @@ import ( "github.com/coreos/go-systemd/daemon" "gopkg.in/yaml.v3" + "go.fuhry.dev/runtime/config_watcher" + "go.fuhry.dev/runtime/ephs" "go.fuhry.dev/runtime/http" - "go.fuhry.dev/runtime/mtls" "go.fuhry.dev/runtime/utils/log" ) func main() { - mtls.SetDefaultIdentity("authproxy") - ctx, cancel := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM) defer cancel() + ephs.DefaultClientContext = ctx + configPath := flag.String("config", "", "YAML file to load configuration from") flag.Parse() server := http.NewServerWithContext(ctx) - contents, err := os.ReadFile(*configPath) + watcher, err := config_watcher.Watch(ctx, *configPath) + if err != nil { + log.Default().Panic(err) + } + defer watcher.Close() + + upd, err := watcher.Next() if err != nil { log.Default().Panic(err) } - err = yaml.Unmarshal(contents, server) + err = yaml.Unmarshal(upd.Contents, server) if err != nil { log.Default().Panic(err) } + go (func() { + for { + upd, err := watcher.Next() + if err != nil { + return + } + + log.Default().Notice("Config change detected, reloading server") + + err = yaml.Unmarshal(upd.Contents, server) + if err != nil { + log.Default().Alertf("YAML unmarshal/hot reload failed, ignoring update: ", err) + continue + } + } + })() + go (func() { if err := server.ListenAndServeTLS(); err != nil && err != http.ErrServerClosed { log.Panic(err)