forked from NYANDEV/forgejo
Add initial support for unix sockets (#2852)
This commit is contained in:
parent
70fbcd2f27
commit
1dd003bd4c
3 changed files with 44 additions and 13 deletions
18
cmd/web.go
18
cmd/web.go
|
@ -8,6 +8,7 @@ import (
|
||||||
"crypto/tls"
|
"crypto/tls"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/http/fcgi"
|
"net/http/fcgi"
|
||||||
"os"
|
"os"
|
||||||
|
@ -582,6 +583,9 @@ func runWeb(ctx *cli.Context) error {
|
||||||
|
|
||||||
var err error
|
var err error
|
||||||
listenAddr := fmt.Sprintf("%s:%s", setting.HttpAddr, setting.HttpPort)
|
listenAddr := fmt.Sprintf("%s:%s", setting.HttpAddr, setting.HttpPort)
|
||||||
|
if setting.Protocol == setting.UNIX_SOCKET {
|
||||||
|
listenAddr = fmt.Sprintf("%s", setting.HttpAddr)
|
||||||
|
}
|
||||||
log.Info("Listen: %v://%s%s", setting.Protocol, listenAddr, setting.AppSubUrl)
|
log.Info("Listen: %v://%s%s", setting.Protocol, listenAddr, setting.AppSubUrl)
|
||||||
switch setting.Protocol {
|
switch setting.Protocol {
|
||||||
case setting.HTTP:
|
case setting.HTTP:
|
||||||
|
@ -591,6 +595,20 @@ func runWeb(ctx *cli.Context) error {
|
||||||
err = server.ListenAndServeTLS(setting.CertFile, setting.KeyFile)
|
err = server.ListenAndServeTLS(setting.CertFile, setting.KeyFile)
|
||||||
case setting.FCGI:
|
case setting.FCGI:
|
||||||
err = fcgi.Serve(nil, m)
|
err = fcgi.Serve(nil, m)
|
||||||
|
case setting.UNIX_SOCKET:
|
||||||
|
os.Remove(listenAddr)
|
||||||
|
listener, err := net.ListenUnix("unix", &net.UnixAddr{listenAddr, "unix"})
|
||||||
|
if err != nil {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
// FIXME add proper implementation of signal capture on all protocols
|
||||||
|
// execute this on SIGTERM or SIGINT: listener.Close()
|
||||||
|
err = os.Chmod(listenAddr, os.FileMode(setting.UnixSocketPermission))
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(4, "Failed to set permission of unix socket: %v", err)
|
||||||
|
}
|
||||||
|
err = http.Serve(listener, m)
|
||||||
|
|
||||||
default:
|
default:
|
||||||
log.Fatal(4, "Invalid protocol: %s", setting.Protocol)
|
log.Fatal(4, "Invalid protocol: %s", setting.Protocol)
|
||||||
}
|
}
|
||||||
|
|
|
@ -61,6 +61,8 @@ DOMAIN = localhost
|
||||||
ROOT_URL = %(PROTOCOL)s://%(DOMAIN)s:%(HTTP_PORT)s/
|
ROOT_URL = %(PROTOCOL)s://%(DOMAIN)s:%(HTTP_PORT)s/
|
||||||
HTTP_ADDR = 0.0.0.0
|
HTTP_ADDR = 0.0.0.0
|
||||||
HTTP_PORT = 3000
|
HTTP_PORT = 3000
|
||||||
|
; Permission for unix socket
|
||||||
|
UNIX_SOCKET_PERMISSION = 666
|
||||||
; Local (DMZ) URL for Gogs workers (such as SSH update) accessing web service.
|
; Local (DMZ) URL for Gogs workers (such as SSH update) accessing web service.
|
||||||
; In most cases you do not need to change the default value.
|
; In most cases you do not need to change the default value.
|
||||||
; Alter it only if your SSH server node is not the same as HTTP node.
|
; Alter it only if your SSH server node is not the same as HTTP node.
|
||||||
|
|
|
@ -12,6 +12,7 @@ import (
|
||||||
"path"
|
"path"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"runtime"
|
"runtime"
|
||||||
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
@ -31,9 +32,10 @@ import (
|
||||||
type Scheme string
|
type Scheme string
|
||||||
|
|
||||||
const (
|
const (
|
||||||
HTTP Scheme = "http"
|
HTTP Scheme = "http"
|
||||||
HTTPS Scheme = "https"
|
HTTPS Scheme = "https"
|
||||||
FCGI Scheme = "fcgi"
|
FCGI Scheme = "fcgi"
|
||||||
|
UNIX_SOCKET Scheme = "unix"
|
||||||
)
|
)
|
||||||
|
|
||||||
type LandingPage string
|
type LandingPage string
|
||||||
|
@ -58,16 +60,17 @@ var (
|
||||||
AppDataPath string
|
AppDataPath string
|
||||||
|
|
||||||
// Server settings
|
// Server settings
|
||||||
Protocol Scheme
|
Protocol Scheme
|
||||||
Domain string
|
Domain string
|
||||||
HttpAddr, HttpPort string
|
HttpAddr, HttpPort string
|
||||||
LocalURL string
|
LocalURL string
|
||||||
OfflineMode bool
|
OfflineMode bool
|
||||||
DisableRouterLog bool
|
DisableRouterLog bool
|
||||||
CertFile, KeyFile string
|
CertFile, KeyFile string
|
||||||
StaticRootPath string
|
StaticRootPath string
|
||||||
EnableGzip bool
|
EnableGzip bool
|
||||||
LandingPageUrl LandingPage
|
LandingPageUrl LandingPage
|
||||||
|
UnixSocketPermission uint32
|
||||||
|
|
||||||
SSH struct {
|
SSH struct {
|
||||||
Disabled bool `ini:"DISABLE_SSH"`
|
Disabled bool `ini:"DISABLE_SSH"`
|
||||||
|
@ -367,11 +370,19 @@ func NewContext() {
|
||||||
KeyFile = sec.Key("KEY_FILE").String()
|
KeyFile = sec.Key("KEY_FILE").String()
|
||||||
} else if sec.Key("PROTOCOL").String() == "fcgi" {
|
} else if sec.Key("PROTOCOL").String() == "fcgi" {
|
||||||
Protocol = FCGI
|
Protocol = FCGI
|
||||||
|
} else if sec.Key("PROTOCOL").String() == "unix" {
|
||||||
|
Protocol = UNIX_SOCKET
|
||||||
}
|
}
|
||||||
Domain = sec.Key("DOMAIN").MustString("localhost")
|
Domain = sec.Key("DOMAIN").MustString("localhost")
|
||||||
HttpAddr = sec.Key("HTTP_ADDR").MustString("0.0.0.0")
|
HttpAddr = sec.Key("HTTP_ADDR").MustString("0.0.0.0")
|
||||||
HttpPort = sec.Key("HTTP_PORT").MustString("3000")
|
HttpPort = sec.Key("HTTP_PORT").MustString("3000")
|
||||||
LocalURL = sec.Key("LOCAL_ROOT_URL").MustString(string(Protocol) + "://localhost:" + HttpPort + "/")
|
LocalURL = sec.Key("LOCAL_ROOT_URL").MustString(string(Protocol) + "://localhost:" + HttpPort + "/")
|
||||||
|
UnixSocketPermissionRaw := sec.Key("UNIX_SOCKET_PERMISSION").MustString("666")
|
||||||
|
UnixSocketPermissionParsed, err := strconv.ParseUint(UnixSocketPermissionRaw, 8, 32)
|
||||||
|
if err != nil || UnixSocketPermissionParsed > 0777 {
|
||||||
|
log.Fatal(4, "Fail to parse unixSocketPermission: %s", UnixSocketPermissionRaw)
|
||||||
|
}
|
||||||
|
UnixSocketPermission = uint32(UnixSocketPermissionParsed)
|
||||||
OfflineMode = sec.Key("OFFLINE_MODE").MustBool()
|
OfflineMode = sec.Key("OFFLINE_MODE").MustBool()
|
||||||
DisableRouterLog = sec.Key("DISABLE_ROUTER_LOG").MustBool()
|
DisableRouterLog = sec.Key("DISABLE_ROUTER_LOG").MustBool()
|
||||||
StaticRootPath = sec.Key("STATIC_ROOT_PATH").MustString(workDir)
|
StaticRootPath = sec.Key("STATIC_ROOT_PATH").MustString(workDir)
|
||||||
|
|
Loading…
Reference in a new issue