feat(server): Optimize configuration priority processing logic

This commit is contained in:
Gouryella
2026-01-15 17:32:08 +08:00
parent 37d1bfc089
commit 5459d952be
5 changed files with 48 additions and 48 deletions

View File

@@ -38,7 +38,7 @@
### Install
```bash
bash <(curl -sL https://raw.githubusercontent.com/Gouryella/drip/main/scripts/install.sh)
bash <(curl -sL https://driptunnel.app/install.sh)
```
### Basic Usage

View File

@@ -38,7 +38,7 @@
### 安装
```bash
bash <(curl -sL https://raw.githubusercontent.com/Gouryella/drip/main/scripts/install.sh)
bash <(curl -sL https://driptunnel.app/install.sh)
```
### 基本使用

View File

@@ -96,29 +96,23 @@ func runServer(cmd *cobra.Command, _ []string) error {
cfg = &config.ServerConfig{}
}
// Configuration priority: flag > env > config file > default
// Note: flag variables already contain env defaults from init()
// We need to check if flag was explicitly set, or if env var exists
// Port: flag > env > config > default(8443)
// Port
if cmd.Flags().Changed("port") {
cfg.Port = serverPort
} else if os.Getenv("DRIP_PORT") != "" {
cfg.Port = serverPort // serverPort already has env value
cfg.Port = serverPort
} else if cfg.Port == 0 {
cfg.Port = serverPort // use default
cfg.Port = serverPort
}
// PublicPort: flag > env > config > default(0)
// Note: 0 is a valid value meaning "same as port"
// PublicPort
if cmd.Flags().Changed("public-port") {
cfg.PublicPort = serverPublicPort
} else if os.Getenv("DRIP_PUBLIC_PORT") != "" {
cfg.PublicPort = serverPublicPort
}
// else keep config file value (including 0)
// Domain: flag > env > config > default
// Domain
if cmd.Flags().Changed("domain") {
cfg.Domain = serverDomain
} else if os.Getenv("DRIP_DOMAIN") != "" {
@@ -127,38 +121,33 @@ func runServer(cmd *cobra.Command, _ []string) error {
cfg.Domain = serverDomain
}
// TunnelDomain: flag > env > config > default("")
// TunnelDomain
if cmd.Flags().Changed("tunnel-domain") {
cfg.TunnelDomain = serverTunnelDomain
} else if os.Getenv("DRIP_TUNNEL_DOMAIN") != "" {
cfg.TunnelDomain = serverTunnelDomain
}
// else keep config file value
// AuthToken: flag > env > config > default("")
// AuthToken
if cmd.Flags().Changed("token") {
cfg.AuthToken = serverAuthToken
} else if os.Getenv("DRIP_TOKEN") != "" {
cfg.AuthToken = serverAuthToken
}
// else keep config file value
// MetricsToken: flag > env > config > default("")
// MetricsToken
if cmd.Flags().Changed("metrics-token") {
cfg.MetricsToken = serverMetricsToken
} else if os.Getenv("DRIP_METRICS_TOKEN") != "" {
cfg.MetricsToken = serverMetricsToken
}
// else keep config file value
// Debug: flag > config > default(false)
// Note: debug has no env var
// Debug
if cmd.Flags().Changed("debug") {
cfg.Debug = serverDebug
}
// else keep config file value
// TCPPortMin: flag > env > config > default
// TCPPortMin
if cmd.Flags().Changed("tcp-port-min") {
cfg.TCPPortMin = serverTCPPortMin
} else if os.Getenv("DRIP_TCP_PORT_MIN") != "" {
@@ -167,7 +156,7 @@ func runServer(cmd *cobra.Command, _ []string) error {
cfg.TCPPortMin = serverTCPPortMin
}
// TCPPortMax: flag > env > config > default
// TCPPortMax
if cmd.Flags().Changed("tcp-port-max") {
cfg.TCPPortMax = serverTCPPortMax
} else if os.Getenv("DRIP_TCP_PORT_MAX") != "" {
@@ -176,32 +165,28 @@ func runServer(cmd *cobra.Command, _ []string) error {
cfg.TCPPortMax = serverTCPPortMax
}
// TLSCertFile: flag > env > config > default("")
// TLSCertFile
if cmd.Flags().Changed("tls-cert") {
cfg.TLSCertFile = serverTLSCert
} else if os.Getenv("DRIP_TLS_CERT") != "" {
cfg.TLSCertFile = serverTLSCert
}
// else keep config file value
// TLSKeyFile: flag > env > config > default("")
// TLSKeyFile
if cmd.Flags().Changed("tls-key") {
cfg.TLSKeyFile = serverTLSKey
} else if os.Getenv("DRIP_TLS_KEY") != "" {
cfg.TLSKeyFile = serverTLSKey
}
// else keep config file value
// PprofPort: flag > env > config > default(0)
// Note: 0 is valid meaning "disabled"
// PprofPort
if cmd.Flags().Changed("pprof") {
cfg.PprofPort = serverPprofPort
} else if os.Getenv("DRIP_PPROF_PORT") != "" {
cfg.PprofPort = serverPprofPort
}
// else keep config file value
// AllowedTransports: flag > env > config > default
// AllowedTransports
if cmd.Flags().Changed("transports") {
cfg.AllowedTransports = parseCommaSeparated(serverTransports)
} else if os.Getenv("DRIP_TRANSPORTS") != "" {
@@ -210,7 +195,7 @@ func runServer(cmd *cobra.Command, _ []string) error {
cfg.AllowedTransports = parseCommaSeparated(serverTransports)
}
// AllowedTunnelTypes: flag > env > config > default
// AllowedTunnelTypes
if cmd.Flags().Changed("tunnel-types") {
cfg.AllowedTunnelTypes = parseCommaSeparated(serverTunnelTypes)
} else if os.Getenv("DRIP_TUNNEL_TYPES") != "" {
@@ -219,15 +204,22 @@ func runServer(cmd *cobra.Command, _ []string) error {
cfg.AllowedTunnelTypes = parseCommaSeparated(serverTunnelTypes)
}
// TLS is always enabled for server
cfg.TLSEnabled = true
// Validate required fields
if cfg.TLSCertFile == "" {
return fmt.Errorf("TLS certificate path is required (use --tls-cert flag, DRIP_TLS_CERT environment variable, or config file)")
// TLSEnabled
if os.Getenv("DRIP_TLS_ENABLED") != "" {
cfg.TLSEnabled = os.Getenv("DRIP_TLS_ENABLED") == "true" || os.Getenv("DRIP_TLS_ENABLED") == "1"
} else if cfg.TLSCertFile != "" && cfg.TLSKeyFile != "" {
if !cfg.TLSEnabled {
cfg.TLSEnabled = true
}
}
if cfg.TLSKeyFile == "" {
return fmt.Errorf("TLS private key path is required (use --tls-key flag, DRIP_TLS_KEY environment variable, or config file)")
if cfg.TLSEnabled {
if cfg.TLSCertFile == "" {
return fmt.Errorf("TLS certificate path is required when TLS is enabled (use --tls-cert flag, DRIP_TLS_CERT environment variable, or config file)")
}
if cfg.TLSKeyFile == "" {
return fmt.Errorf("TLS private key path is required when TLS is enabled (use --tls-key flag, DRIP_TLS_KEY environment variable, or config file)")
}
}
if err := utils.InitServerLogger(cfg.Debug); err != nil {
@@ -275,10 +267,14 @@ func runServer(cmd *cobra.Command, _ []string) error {
logger.Fatal("Failed to load TLS configuration", zap.Error(err))
}
logger.Info("TLS 1.3 configuration loaded",
zap.String("cert", cfg.TLSCertFile),
zap.String("key", cfg.TLSKeyFile),
)
if cfg.TLSEnabled {
logger.Info("TLS 1.3 configuration loaded",
zap.String("cert", cfg.TLSCertFile),
zap.String("key", cfg.TLSKeyFile),
)
} else {
logger.Info("TLS disabled - running in plain TCP mode (for reverse proxy)")
}
tunnelManager := tunnel.NewManager(logger)
@@ -301,11 +297,16 @@ func runServer(cmd *cobra.Command, _ []string) error {
logger.Fatal("Failed to start TCP listener", zap.Error(err))
}
protocol := "TCP (plain)"
if cfg.TLSEnabled {
protocol = "TCP over TLS 1.3"
}
logger.Info("Drip Server started",
zap.String("address", listenAddr),
zap.String("domain", cfg.Domain),
zap.String("tunnel_domain", cfg.TunnelDomain),
zap.String("protocol", "TCP over TLS 1.3"),
zap.String("protocol", protocol),
zap.Strings("transports", cfg.AllowedTransports),
zap.Strings("tunnel_types", cfg.AllowedTunnelTypes),
)

View File

@@ -641,7 +641,7 @@ func (h *Handler) serveHomePage(w http.ResponseWriter, r *http.Request) {
<h2>Install</h2>
<div class="code-wrap">
<pre>bash &lt;(curl -fsSL https://raw.githubusercontent.com/Gouryella/drip/main/scripts/install.sh)</pre>
<pre>bash &lt;(curl -fsSL https://driptunnel.app/install.sh)</pre>
<button class="copy-btn" onclick="copy(this)">
<svg class="copy" viewBox="0 0 16 16" fill="currentColor"><path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path></svg>
<svg class="check" viewBox="0 0 16 16" fill="currentColor"><path d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z"></path></svg>

View File

@@ -76,7 +76,6 @@ func (p *BufferPool) Put(buf *[]byte) {
case SizeXLarge:
p.xlarge.Put(buf)
}
// Note: buffers with non-standard sizes are not pooled (let GC handle them)
}
var globalBufferPool = NewBufferPool()