1
0
mirror of https://github.com/muety/wakapi.git synced 2023-08-10 21:12:56 +03:00

feat: 🎸 add support for using a UNIX domain socket

This commit is contained in:
Andrew Udvare 2021-06-23 11:22:51 -04:00
parent dd6a040171
commit 3c12df52d9
No known key found for this signature in database
GPG Key ID: 1AFD9AFC120C26DD
3 changed files with 46 additions and 10 deletions

View File

@ -151,6 +151,7 @@ You can specify configuration options either via a config file (default: `config
| `server.port` | `WAKAPI_PORT` | `3000` | Port to listen on | | `server.port` | `WAKAPI_PORT` | `3000` | Port to listen on |
| `server.listen_ipv4` | `WAKAPI_LISTEN_IPV4` | `127.0.0.1` | IPv4 network address to listen on (leave blank to disable IPv4) | | `server.listen_ipv4` | `WAKAPI_LISTEN_IPV4` | `127.0.0.1` | IPv4 network address to listen on (leave blank to disable IPv4) |
| `server.listen_ipv6` | `WAKAPI_LISTEN_IPV6` | `::1` | IPv6 network address to listen on (leave blank to disable IPv6) | | `server.listen_ipv6` | `WAKAPI_LISTEN_IPV6` | `::1` | IPv6 network address to listen on (leave blank to disable IPv6) |
| `server.listen_socket` | `WAKAPI_LISTEN_SOCKET` | - | UNIX socket to listen on (leave blank to disable UNIX socket) |
| `server.tls_cert_path` | `WAKAPI_TLS_CERT_PATH` | - | Path of SSL server certificate (leave blank to not use HTTPS) | | `server.tls_cert_path` | `WAKAPI_TLS_CERT_PATH` | - | Path of SSL server certificate (leave blank to not use HTTPS) |
| `server.tls_key_path` | `WAKAPI_TLS_KEY_PATH` | - | Path of SSL server private key (leave blank to not use HTTPS) | | `server.tls_key_path` | `WAKAPI_TLS_KEY_PATH` | - | Path of SSL server private key (leave blank to not use HTTPS) |
| `server.base_path` | `WAKAPI_BASE_PATH` | `/` | Web base path (change when running behind a proxy under a sub-path) | | `server.base_path` | `WAKAPI_BASE_PATH` | `/` | Web base path (change when running behind a proxy under a sub-path) |

View File

@ -98,6 +98,7 @@ type serverConfig struct {
Port int `default:"3000" env:"WAKAPI_PORT"` Port int `default:"3000" env:"WAKAPI_PORT"`
ListenIpV4 string `yaml:"listen_ipv4" default:"127.0.0.1" env:"WAKAPI_LISTEN_IPV4"` ListenIpV4 string `yaml:"listen_ipv4" default:"127.0.0.1" env:"WAKAPI_LISTEN_IPV4"`
ListenIpV6 string `yaml:"listen_ipv6" default:"::1" env:"WAKAPI_LISTEN_IPV6"` ListenIpV6 string `yaml:"listen_ipv6" default:"::1" env:"WAKAPI_LISTEN_IPV6"`
ListenSocket string `yaml:"listen_socket" default:"" env:"WAKAPI_LISTEN_SOCKET"`
BasePath string `yaml:"base_path" default:"/" env:"WAKAPI_BASE_PATH"` BasePath string `yaml:"base_path" default:"/" env:"WAKAPI_BASE_PATH"`
PublicUrl string `yaml:"public_url" default:"http://localhost:3000" env:"WAKAPI_PUBLIC_URL"` PublicUrl string `yaml:"public_url" default:"http://localhost:3000" env:"WAKAPI_PUBLIC_URL"`
TlsCertPath string `yaml:"tls_cert_path" default:"" env:"WAKAPI_TLS_CERT_PATH"` TlsCertPath string `yaml:"tls_cert_path" default:"" env:"WAKAPI_TLS_CERT_PATH"`
@ -350,8 +351,8 @@ func Load(version string) *Config {
} }
// some validation checks // some validation checks
if config.Server.ListenIpV4 == "" && config.Server.ListenIpV6 == "" { if config.Server.ListenIpV4 == "" && config.Server.ListenIpV6 == "" && config.Server.ListenSocket == "" {
logbuch.Fatal("either of listen_ipv4 or listen_ipv6 must be set") logbuch.Fatal("either of listen_ipv4 or listen_ipv6 or listen_socket must be set")
} }
if config.Db.MaxConn <= 0 { if config.Db.MaxConn <= 0 {
logbuch.Fatal("you must allow at least one database connection") logbuch.Fatal("you must allow at least one database connection")

36
main.go
View File

@ -4,6 +4,7 @@ import (
"embed" "embed"
"io/fs" "io/fs"
"log" "log"
"net"
"net/http" "net/http"
"os" "os"
"strconv" "strconv"
@ -233,7 +234,7 @@ func main() {
} }
func listen(handler http.Handler) { func listen(handler http.Handler) {
var s4, s6 *http.Server var s4, s6, sSocket *http.Server
// IPv4 // IPv4
if config.Server.ListenIpV4 != "" { if config.Server.ListenIpV4 != "" {
@ -257,6 +258,15 @@ func listen(handler http.Handler) {
} }
} }
// UNIX domain socket
if config.Server.ListenSocket != "" {
sSocket = &http.Server{
Handler: handler,
ReadTimeout: 10 * time.Second,
WriteTimeout: 10 * time.Second,
}
}
if config.UseTLS() { if config.UseTLS() {
if s4 != nil { if s4 != nil {
logbuch.Info("--> Listening for HTTPS on %s... ✅", s4.Addr) logbuch.Info("--> Listening for HTTPS on %s... ✅", s4.Addr)
@ -274,6 +284,18 @@ func listen(handler http.Handler) {
} }
}() }()
} }
if sSocket != nil {
logbuch.Info("--> Listening for HTTPS on %s... ✅", config.Server.ListenSocket)
go func() {
unixListener, err := net.Listen("unix", config.Server.ListenSocket)
if err != nil {
logbuch.Fatal(err.Error())
}
if err := sSocket.ServeTLS(unixListener, config.Server.TlsCertPath, config.Server.TlsKeyPath); err != nil {
logbuch.Fatal(err.Error())
}
}()
}
} else { } else {
if s4 != nil { if s4 != nil {
logbuch.Info("--> Listening for HTTP on %s... ✅", s4.Addr) logbuch.Info("--> Listening for HTTP on %s... ✅", s4.Addr)
@ -291,6 +313,18 @@ func listen(handler http.Handler) {
} }
}() }()
} }
if sSocket != nil {
logbuch.Info("--> Listening for HTTP on %s... ✅", config.Server.ListenSocket)
go func() {
unixListener, err := net.Listen("unix", config.Server.ListenSocket)
if err != nil {
logbuch.Fatal(err.Error())
}
if err := sSocket.Serve(unixListener); err != nil {
logbuch.Fatal(err.Error())
}
}()
}
} }
<-make(chan interface{}, 1) <-make(chan interface{}, 1)