From 0a8bb7eae50966030f4adbad270948afd822f245 Mon Sep 17 00:00:00 2001 From: yusing Date: Fri, 14 Feb 2025 03:26:25 +0800 Subject: [PATCH] improved default port selection --- .../ports.go => route/port_selection.go} | 45 ++++++++++++++----- internal/route/route.go | 44 +++++++++--------- 2 files changed, 56 insertions(+), 33 deletions(-) rename internal/{common/ports.go => route/port_selection.go} (59%) diff --git a/internal/common/ports.go b/internal/route/port_selection.go similarity index 59% rename from internal/common/ports.go rename to internal/route/port_selection.go index b567675..a417bda 100644 --- a/internal/common/ports.go +++ b/internal/route/port_selection.go @@ -1,15 +1,6 @@ -//nolint:misspell -package common +package route var ( - WellKnownHTTPPorts = map[string]bool{ - "80": true, - "8000": true, - "8008": true, - "8080": true, - "3000": true, - } - ImageNamePortMapTCP = map[string]int{ "mssql": 1433, "mysql": 3306, @@ -42,8 +33,6 @@ var ( "nginx-proxy-manager": 81, "open-webui": 8080, "plex": 32400, - "portainer-be": 9443, - "portainer-ce": 9443, "prometheus": 9090, "prowlarr": 9696, "radarr": 7878, @@ -55,4 +44,36 @@ var ( "uptime-kuma": 3001, "whisparr": 6969, } + ImageNamePortMapHTTPS = map[string]int{ + "portainer-be": 9443, + "portainer-ce": 9443, + } + AliasPortMapHTTP = map[string]int{} + AliasPortMapHTTPS = map[string]int{ + "portainer": 9443, + "crafty": 8080, + } ) + +func getSchemePortByImageName(imageName string, port int) (scheme string, portNum int, ok bool) { + if port, ok := ImageNamePortMapHTTP[imageName]; ok { + return "http", port, true + } + if port, ok := ImageNamePortMapHTTPS[imageName]; ok { + return "https", port, true + } + if port, ok := ImageNamePortMapTCP[imageName]; ok { + return "tcp", port, true + } + return +} + +func getSchemePortByAlias(alias string, port int) (scheme string, portNum int, ok bool) { + if port, ok := AliasPortMapHTTP[alias]; ok { + return "http", port, true + } + if port, ok := AliasPortMapHTTPS[alias]; ok { + return "https", port, true + } + return +} diff --git a/internal/route/route.go b/internal/route/route.go index 0b5980e..2b9412d 100644 --- a/internal/route/route.go +++ b/internal/route/route.go @@ -2,7 +2,6 @@ package route import ( "fmt" - "strconv" "strings" "github.com/yusing/go-proxy/agent/pkg/agent" @@ -262,20 +261,23 @@ func (r *Route) Finalize() { lp, pp := r.Port.Listening, r.Port.Proxy if isDocker { - if port, ok := common.ImageNamePortMapTCP[cont.ImageName]; ok { + scheme, port, ok := getSchemePortByImageName(cont.ImageName, pp) + if ok { + if r.Scheme == "" { + r.Scheme = types.Scheme(scheme) + } if pp == 0 { pp = port } - if r.Scheme == "" { - r.Scheme = "tcp" - } - } else if port, ok := common.ImageNamePortMapHTTP[cont.ImageName]; ok { - if pp == 0 { - pp = port - } - if r.Scheme == "" { - r.Scheme = "http" - } + } + } + + if scheme, port, ok := getSchemePortByAlias(r.Alias, pp); ok { + if r.Scheme == "" { + r.Scheme = types.Scheme(scheme) + } + if pp == 0 { + pp = port } } @@ -294,6 +296,14 @@ func (r *Route) Finalize() { } if isDocker { + if r.Scheme == "" { + for _, p := range cont.PublicPortMapping { + if p.PrivatePort == uint16(pp) && p.Type == "udp" { + r.Scheme = "udp" + break + } + } + } // replace private port with public port if using public IP. if r.Host == cont.PublicHostname { if p, ok := cont.PrivatePortMapping[pp]; ok { @@ -305,21 +315,13 @@ func (r *Route) Finalize() { pp = int(p.PrivatePort) } } - if r.Scheme == "" { - for _, p := range cont.PublicPortMapping { - if p.Type == "udp" { - r.Scheme = "udp" - break - } - } - } } if r.Scheme == "" { switch { case lp != 0: r.Scheme = "tcp" - case strings.HasSuffix(strconv.Itoa(pp), "443"): + case pp%1000 == 443: r.Scheme = "https" default: // assume its http r.Scheme = "http"