diff --git a/CHANGELOG.md b/CHANGELOG.md index 873c2443..eba0de95 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,8 @@ - Added the triggered rate rimit rule in the error log `details`. +- Added optional `ServeEvent.Listener` field to initialize a custom network listener (e.g. `unix`) instead of the default `tcp` ([#3233](https://github.com/pocketbase/pocketbase/discussions/3233)). + - Other minor improvements (wrapped the backup restore in a transaction as an extra precaution, updated npm deps, regenerated JSVM docs with the recent tygoja changes, etc.). diff --git a/apis/serve.go b/apis/serve.go index 8095a4ee..d2af0c76 100644 --- a/apis/serve.go +++ b/apis/serve.go @@ -153,13 +153,6 @@ func Serve(app core.App, config ServeConfig) error { ErrorLog: log.New(&serverErrorLogWriter{app: app}, "", 0), } - serveEvent := new(core.ServeEvent) - serveEvent.App = app - serveEvent.Router = pbRouter - serveEvent.Server = server - serveEvent.CertManager = certManager - serveEvent.InstallerFunc = DefaultInstallerFunc - var listener net.Listener // graceful shutdown @@ -207,6 +200,13 @@ func Serve(app core.App, config ServeConfig) error { var baseURL string + serveEvent := new(core.ServeEvent) + serveEvent.App = app + serveEvent.Router = pbRouter + serveEvent.Server = server + serveEvent.CertManager = certManager + serveEvent.InstallerFunc = DefaultInstallerFunc + // trigger the OnServe hook and start the tcp listener serveHookErr := app.OnServe().Trigger(serveEvent, func(e *core.ServeEvent) error { handler, err := e.Router.BuildMux() @@ -237,9 +237,13 @@ func Serve(app core.App, config ServeConfig) error { } } - listener, err = net.Listen("tcp", addr) - if err != nil { - return err + if e.Listener == nil { + listener, err = net.Listen("tcp", addr) + if err != nil { + return err + } + } else { + listener = e.Listener } if e.InstallerFunc != nil { @@ -260,7 +264,7 @@ func Serve(app core.App, config ServeConfig) error { if listener == nil { //nolint:staticcheck - return errors.New("The OnServe finalizer wasn't invoked. Did you forget to call the ServeEvent.Next() method?") + return errors.New("The OnServe listener was not initialized. Did you forget to call the ServeEvent.Next() method?") } if config.ShowStartBanner { diff --git a/core/events.go b/core/events.go index 41511e7a..5f54f583 100644 --- a/core/events.go +++ b/core/events.go @@ -2,6 +2,7 @@ package core import ( "context" + "net" "net/http" "time" @@ -104,6 +105,11 @@ type ServeEvent struct { Server *http.Server CertManager *autocert.Manager + // Listener allow specifying a custom network listener. + // + // Leave it nil to use the default net.Listen("tcp", e.Server.Addr). + Listener net.Listener + // InstallerFunc is the "installer" function that is called after // successful server tcp bind but only if there is no explicit // superuser record created yet.