From 443beb2ccea54e0f360f4f9f27ae65d38f87c9c2 Mon Sep 17 00:00:00 2001 From: Geoff Bourne Date: Fri, 25 Jul 2025 17:13:07 -0600 Subject: [PATCH] Add support for requesting ngrok remote address (#436) --- README.md | 12 ++++++++++++ server/configs.go | 7 ++++++- server/connector.go | 20 ++++++++++++++------ server/server.go | 4 ++-- 4 files changed, 34 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 2de2e71..31eb82b 100644 --- a/README.md +++ b/README.md @@ -66,6 +66,8 @@ Routes Minecraft client connections to backend servers based upon the requested any extra tags to be included with all reported metrics (env METRICS_BACKEND_CONFIG_INFLUXDB_TAGS) -metrics-backend-config-influxdb-username string (env METRICS_BACKEND_CONFIG_INFLUXDB_USERNAME) + -ngrok-remote-addr string + If set, the TCP address to request for this edge (env NGROK_REMOTE_ADDR) -ngrok-token string If set, an ngrok tunnel will be established. It is HIGHLY recommended to pass as an environment variable. (env NGROK_TOKEN) -port port @@ -353,6 +355,16 @@ metadata: name: mc-forge spec: serviceName: mc-forge + selector: + matchLabels: + app: mc-forge + template: + metadata: + labels: + app: mc-forge + spec: + containers: + - name: mc ``` ## REST API diff --git a/server/configs.go b/server/configs.go index 0084cb4..9e4b108 100644 --- a/server/configs.go +++ b/server/configs.go @@ -17,6 +17,11 @@ type RoutesConfig struct { ConfigWatch bool `usage:"Watch for config file changes"` } +type NgrokConfig struct { + Token string `usage:"If set, an ngrok tunnel will be established. It is HIGHLY recommended to pass as an environment variable."` + RemoteAddr string `usage:"If set, the TCP address to request for this edge"` +} + type Config struct { Port int `default:"25565" usage:"The [port] bound to listen for Minecraft client connections"` Default string `usage:"host:port of a default Minecraft server to use when mapping not found"` @@ -39,7 +44,7 @@ type Config struct { TrustedProxies []string `usage:"Comma delimited list of CIDR notation IP blocks to trust when receiving PROXY protocol"` RecordLogins bool `default:"false" usage:"Log and generate metrics on player logins. Metrics only supported with influxdb or prometheus backend"` Routes RoutesConfig - NgrokToken string `usage:"If set, an ngrok tunnel will be established. It is HIGHLY recommended to pass as an environment variable."` + Ngrok NgrokConfig AutoScale AutoScale ClientsToAllow []string `usage:"Zero or more client IP addresses or CIDRs to allow. Takes precedence over deny."` diff --git a/server/connector.go b/server/connector.go index 3f8e4bc..1cd3744 100644 --- a/server/connector.go +++ b/server/connector.go @@ -80,6 +80,11 @@ func NewConnector(ctx context.Context, metrics *ConnectorMetrics, sendProxyProto } } +type NgrokConnector struct { + token string + remoteAddr string +} + type Connector struct { ctx context.Context state mcproto.State @@ -91,7 +96,7 @@ type Connector struct { totalActiveConnections int32 activeConnections *ActiveConnections connectionsCond *sync.Cond - ngrokToken string + ngrok NgrokConnector clientFilter *ClientFilter autoScaleUpAllowDenyConfig *AllowDenyConfig connectionNotifier ConnectionNotifier @@ -117,10 +122,12 @@ func (c *Connector) StartAcceptingConnections(listenAddress string, connRateLimi } func (c *Connector) createListener(listenAddress string) (net.Listener, error) { - if c.ngrokToken != "" { + if c.ngrok.token != "" { ngrokTun, err := ngrok.Listen(c.ctx, - config.TCPEndpoint(), - ngrok.WithAuthtoken(c.ngrokToken), + config.TCPEndpoint( + config.WithRemoteAddr(c.ngrok.remoteAddr), + ), + ngrok.WithAuthtoken(c.ngrok.token), ) if err != nil { logrus.WithError(err).Fatal("Unable to start ngrok tunnel") @@ -608,8 +615,9 @@ func (c *Connector) pumpFrames(incoming io.Reader, outgoing io.Writer, errors ch } } -func (c *Connector) UseNgrok(token string) { - c.ngrokToken = token +func (c *Connector) UseNgrok(config NgrokConfig) { + c.ngrok.token = config.Token + c.ngrok.remoteAddr = config.RemoteAddr } func (c *Connector) UseReceiveProxyProto(trustedProxyNets []*net.IPNet) { diff --git a/server/server.go b/server/server.go index e939305..059fbba 100644 --- a/server/server.go +++ b/server/server.go @@ -99,8 +99,8 @@ func NewServer(ctx context.Context, config *Config) (*Server, error) { NewWebhookNotifier(config.Webhook.Url, config.Webhook.RequireUser)) } - if config.NgrokToken != "" { - connector.UseNgrok(config.NgrokToken) + if config.Ngrok.Token != "" { + connector.UseNgrok(config.Ngrok) } if config.ReceiveProxyProtocol {