summaryrefslogtreecommitdiff
path: root/main.go
diff options
context:
space:
mode:
authorAlexander Hunt <me@liz.coffee>2026-06-21 17:11:32 -0700
committerAlexander Hunt <me@liz.coffee>2026-06-21 17:11:32 -0700
commit6f3ba344c1f8413a463dc6274f24ef00bf47e534 (patch)
tree2e260c52f1ecf89ece4fad131a91cde7b3500921 /main.go
parentdf7b13a248853880e50743757caedcfbc2b7eb6d (diff)
downloadpenguins.lan-6f3ba344c1f8413a463dc6274f24ef00bf47e534.tar.gz
penguins.lan-6f3ba344c1f8413a463dc6274f24ef00bf47e534.zip
Adding option to bind via unix socketHEADmain
Diffstat (limited to 'main.go')
-rw-r--r--main.go41
1 files changed, 35 insertions, 6 deletions
diff --git a/main.go b/main.go
index 872749d..9ec1cd9 100644
--- a/main.go
+++ b/main.go
@@ -2,6 +2,8 @@ package main
import (
"log"
+ "net"
+ "os"
"github.com/joho/godotenv"
@@ -41,12 +43,22 @@ func main() {
if argv.Server {
server := api.MakeServer(argv, dbConn)
- log.Printf("listening on :%d", argv.Port)
- go func() {
- if err := server.ListenAndServe(); err != nil {
- log.Fatal(err)
- }
- }()
+ if argv.Socket != "" {
+ listener := unixListener(argv.Socket)
+ log.Printf("listening on unix socket %s", argv.Socket)
+ go func() {
+ if err := server.Serve(listener); err != nil {
+ log.Fatal(err)
+ }
+ }()
+ } else {
+ log.Printf("listening on :%d", argv.Port)
+ go func() {
+ if err := server.ListenAndServe(); err != nil {
+ log.Fatal(err)
+ }
+ }()
+ }
}
if argv.Dns {
@@ -63,3 +75,20 @@ func main() {
select {}
}
}
+
+// unixListener binds an HTTP unix socket, clearing any stale socket left by a
+// previous run and relaxing perms to 0660 so a same-group reverse proxy can
+// reach it.
+func unixListener(path string) net.Listener {
+ if err := os.Remove(path); err != nil && !os.IsNotExist(err) {
+ log.Fatalf("could not clear stale socket %s: %v", path, err)
+ }
+ listener, err := net.Listen("unix", path)
+ if err != nil {
+ log.Fatal(err)
+ }
+ if err := os.Chmod(path, 0o660); err != nil {
+ log.Fatalf("could not chmod socket %s: %v", path, err)
+ }
+ return listener
+}