add systemd-socket activation
This commit is contained in:
1
go.mod
1
go.mod
@@ -5,6 +5,7 @@ go 1.21
|
|||||||
require (
|
require (
|
||||||
entgo.io/ent v0.12.5
|
entgo.io/ent v0.12.5
|
||||||
github.com/c2h5oh/datasize v0.0.0-20220606134207-859f65c6625b
|
github.com/c2h5oh/datasize v0.0.0-20220606134207-859f65c6625b
|
||||||
|
github.com/coreos/go-systemd/v22 v22.5.0
|
||||||
github.com/go-chi/chi/v5 v5.0.10
|
github.com/go-chi/chi/v5 v5.0.10
|
||||||
github.com/go-chi/render v1.0.3
|
github.com/go-chi/render v1.0.3
|
||||||
github.com/jackc/pgx/v4 v4.18.1
|
github.com/jackc/pgx/v4 v4.18.1
|
||||||
|
3
go.sum
3
go.sum
@@ -21,6 +21,8 @@ github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7
|
|||||||
github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
||||||
github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf h1:iW4rZ826su+pqaw19uhpSCzhj44qo35pNgKFGqzDKkU=
|
github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf h1:iW4rZ826su+pqaw19uhpSCzhj44qo35pNgKFGqzDKkU=
|
||||||
github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
||||||
|
github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs=
|
||||||
|
github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
|
||||||
github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
|
github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
|
||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
@@ -36,6 +38,7 @@ github.com/go-openapi/inflect v0.19.0/go.mod h1:lHpZVlpIQqLyKwJ4N+YSc9hchQy/i12f
|
|||||||
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
||||||
github.com/go-test/deep v1.0.3 h1:ZrJSEWsXzPOxaZnFteGEfooLba+ju3FYIbOrS+rQd68=
|
github.com/go-test/deep v1.0.3 h1:ZrJSEWsXzPOxaZnFteGEfooLba+ju3FYIbOrS+rQd68=
|
||||||
github.com/go-test/deep v1.0.3/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA=
|
github.com/go-test/deep v1.0.3/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA=
|
||||||
|
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
|
||||||
github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw=
|
github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw=
|
||||||
github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
|
github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
|
||||||
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
|
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
|
||||||
|
82
main.go
82
main.go
@@ -6,6 +6,7 @@ import (
|
|||||||
"entgo.io/ent/dialect/sql"
|
"entgo.io/ent/dialect/sql"
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/coreos/go-systemd/v22/activation"
|
||||||
"github.com/go-chi/chi/v5"
|
"github.com/go-chi/chi/v5"
|
||||||
"github.com/go-chi/chi/v5/middleware"
|
"github.com/go-chi/chi/v5/middleware"
|
||||||
"github.com/go-chi/render"
|
"github.com/go-chi/render"
|
||||||
@@ -98,14 +99,21 @@ func main() {
|
|||||||
|
|
||||||
log.Info("Start listening...")
|
log.Info("Start listening...")
|
||||||
sockets := make([]net.Listener, 0)
|
sockets := make([]net.Listener, 0)
|
||||||
for _, l := range conf.Httpd.Listen {
|
|
||||||
if l.Socket != "" {
|
// handle systemd socket activation
|
||||||
sL, err := net.Listen("unix", l.Socket)
|
listeners, err := activation.Listeners()
|
||||||
log.Infof("Listening on %s", l.Socket)
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(listeners) > 0 {
|
||||||
|
for _, l := range listeners {
|
||||||
|
log.Infof("Listening on %s", l.Addr())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Panicf("Failure listing on socket %s: %v", l.Socket, err)
|
log.Panicf("failure listing on socket %s: %v", l, err)
|
||||||
}
|
}
|
||||||
sockets = append(sockets, sL)
|
sockets = append(sockets, l)
|
||||||
|
l := l
|
||||||
go func() {
|
go func() {
|
||||||
srv := &http.Server{
|
srv := &http.Server{
|
||||||
ReadTimeout: time.Duration(conf.Httpd.Timeout.Read) * time.Second,
|
ReadTimeout: time.Duration(conf.Httpd.Timeout.Read) * time.Second,
|
||||||
@@ -113,30 +121,50 @@ func main() {
|
|||||||
IdleTimeout: time.Duration(conf.Httpd.Timeout.Idle) * time.Second,
|
IdleTimeout: time.Duration(conf.Httpd.Timeout.Idle) * time.Second,
|
||||||
Handler: r,
|
Handler: r,
|
||||||
}
|
}
|
||||||
_ = srv.Serve(sL)
|
_ = srv.Serve(l)
|
||||||
}()
|
}()
|
||||||
} else {
|
}
|
||||||
log.Infof("Listening on %s:%d", l.Host, l.Port)
|
} else { // handle config if not systemd-socket activated
|
||||||
tL, err := net.Listen("tcp", fmt.Sprintf("%s:%d", l.Host, l.Port))
|
for _, l := range conf.Httpd.Listen {
|
||||||
if err != nil {
|
if l.Socket != "" {
|
||||||
log.Panicf("Failure listing on %s:%d: %v", l.Host, l.Port, err)
|
sL, err := net.Listen("unix", l.Socket)
|
||||||
}
|
log.Infof("Listening on %s", l.Socket)
|
||||||
go func(l struct {
|
|
||||||
Socket string
|
|
||||||
Host string
|
|
||||||
Port int
|
|
||||||
}) {
|
|
||||||
srv := &http.Server{
|
|
||||||
ReadTimeout: time.Duration(conf.Httpd.Timeout.Read) * time.Second,
|
|
||||||
WriteTimeout: time.Duration(conf.Httpd.Timeout.Write) * time.Second,
|
|
||||||
IdleTimeout: time.Duration(conf.Httpd.Timeout.Idle) * time.Second,
|
|
||||||
Handler: r,
|
|
||||||
}
|
|
||||||
err = srv.Serve(tL)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("Failure serving on %s:%d: %v", l.Host, l.Port, err)
|
log.Panicf("Failure listing on socket %s: %v", l.Socket, err)
|
||||||
}
|
}
|
||||||
}(l)
|
sockets = append(sockets, sL)
|
||||||
|
go func() {
|
||||||
|
srv := &http.Server{
|
||||||
|
ReadTimeout: time.Duration(conf.Httpd.Timeout.Read) * time.Second,
|
||||||
|
WriteTimeout: time.Duration(conf.Httpd.Timeout.Write) * time.Second,
|
||||||
|
IdleTimeout: time.Duration(conf.Httpd.Timeout.Idle) * time.Second,
|
||||||
|
Handler: r,
|
||||||
|
}
|
||||||
|
_ = srv.Serve(sL)
|
||||||
|
}()
|
||||||
|
} else {
|
||||||
|
log.Infof("Listening on %s:%d", l.Host, l.Port)
|
||||||
|
tL, err := net.Listen("tcp", fmt.Sprintf("%s:%d", l.Host, l.Port))
|
||||||
|
if err != nil {
|
||||||
|
log.Panicf("Failure listing on %s:%d: %v", l.Host, l.Port, err)
|
||||||
|
}
|
||||||
|
go func(l struct {
|
||||||
|
Socket string
|
||||||
|
Host string
|
||||||
|
Port int
|
||||||
|
}) {
|
||||||
|
srv := &http.Server{
|
||||||
|
ReadTimeout: time.Duration(conf.Httpd.Timeout.Read) * time.Second,
|
||||||
|
WriteTimeout: time.Duration(conf.Httpd.Timeout.Write) * time.Second,
|
||||||
|
IdleTimeout: time.Duration(conf.Httpd.Timeout.Idle) * time.Second,
|
||||||
|
Handler: r,
|
||||||
|
}
|
||||||
|
err = srv.Serve(tL)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("Failure serving on %s:%d: %v", l.Host, l.Port, err)
|
||||||
|
}
|
||||||
|
}(l)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user