Compare commits

...

5 Commits

Author SHA1 Message Date
bcmmbaga
bb5671afd4 Merge branch 'main' into refactor-combined 2026-05-28 18:16:11 +03:00
bcmmbaga
ccabf59baa Merge branch 'main' into refactor-combined 2026-05-26 18:28:15 +03:00
bcmmbaga
0bcc5b617d Refactor 2026-05-12 23:26:02 +03:00
bcmmbaga
449a80d5ff Use injected base server for combined 2026-05-12 23:24:31 +03:00
bcmmbaga
fc5540926f add server bootstrap 2026-05-12 17:24:01 +03:00
3 changed files with 48 additions and 27 deletions

View File

@@ -67,6 +67,10 @@ func init() {
rootCmd.AddCommand(newTokenCommands()) rootCmd.AddCommand(newTokenCommands())
} }
func RootCmd() *cobra.Command {
return rootCmd
}
func Execute() error { func Execute() error {
return rootCmd.Execute() return rootCmd.Execute()
} }
@@ -168,7 +172,7 @@ func initializeConfig() error {
// serverInstances holds all server instances created during startup. // serverInstances holds all server instances created during startup.
type serverInstances struct { type serverInstances struct {
relaySrv *relayServer.Server relaySrv *relayServer.Server
mgmtSrv *mgmtServer.BaseServer mgmtSrv mgmtServer.Server
signalSrv *signalServer.Server signalSrv *signalServer.Server
healthcheck *healthcheck.Server healthcheck *healthcheck.Server
stunServer *stun.Server stunServer *stun.Server
@@ -324,19 +328,24 @@ func setupServerHooks(servers *serverInstances, cfg *CombinedConfig) {
return return
} }
servers.mgmtSrv.AfterInit(func(s *mgmtServer.BaseServer) { if s, ok := servers.mgmtSrv.GetContainer(mgmtServer.ContainerKeyBaseServer); ok {
grpcSrv := s.GRPCServer() if baseServer, ok := s.(*mgmtServer.BaseServer); ok {
baseServer.AfterInit(func(s *mgmtServer.BaseServer) {
grpcSrv := s.GRPCServer()
if servers.signalSrv != nil { if servers.signalSrv != nil {
proto.RegisterSignalExchangeServer(grpcSrv, servers.signalSrv) proto.RegisterSignalExchangeServer(grpcSrv, servers.signalSrv)
log.Infof("Signal server registered on port %s", cfg.Server.ListenAddress) log.Infof("Signal server registered on port %s", cfg.Server.ListenAddress)
} }
s.SetHandlerFunc(createCombinedHandler(grpcSrv, s.APIHandler(), s.IDPHandler(), servers.relaySrv, servers.metricsServer.Meter, cfg)) s.SetHandlerFunc(createCombinedHandler(grpcSrv, s.APIHandler(), s.IDPHandler(), servers.relaySrv, servers.metricsServer.Meter, cfg))
if servers.relaySrv != nil { if servers.relaySrv != nil {
log.Infof("Relay WebSocket handler added (path: /relay)") log.Infof("Relay WebSocket handler added (path: /relay)")
}
})
} }
}) }
} }
func startServers(wg *sync.WaitGroup, srv *relayServer.Server, httpHealthcheck *healthcheck.Server, stunServer *stun.Server, metricsServer *sharedMetrics.Metrics) { func startServers(wg *sync.WaitGroup, srv *relayServer.Server, httpHealthcheck *healthcheck.Server, stunServer *stun.Server, metricsServer *sharedMetrics.Metrics) {
@@ -346,38 +355,32 @@ func startServers(wg *sync.WaitGroup, srv *relayServer.Server, httpHealthcheck *
log.Infof("Relay WebSocket multiplexed on management port (no separate relay listener)") log.Infof("Relay WebSocket multiplexed on management port (no separate relay listener)")
} }
wg.Add(1) wg.Go(func() {
go func() {
defer wg.Done()
log.Infof("running metrics server: %s%s", metricsServer.Addr, metricsServer.Endpoint) log.Infof("running metrics server: %s%s", metricsServer.Addr, metricsServer.Endpoint)
if err := metricsServer.ListenAndServe(); !errors.Is(err, http.ErrServerClosed) { if err := metricsServer.ListenAndServe(); !errors.Is(err, http.ErrServerClosed) {
log.Fatalf("failed to start metrics server: %v", err) log.Fatalf("failed to start metrics server: %v", err)
} }
}() })
wg.Add(1) wg.Go(func() {
go func() {
defer wg.Done()
if err := httpHealthcheck.ListenAndServe(); !errors.Is(err, http.ErrServerClosed) { if err := httpHealthcheck.ListenAndServe(); !errors.Is(err, http.ErrServerClosed) {
log.Fatalf("failed to start healthcheck server: %v", err) log.Fatalf("failed to start healthcheck server: %v", err)
} }
}() })
if stunServer != nil { if stunServer != nil {
wg.Add(1) wg.Go(func() {
go func() {
defer wg.Done()
if err := stunServer.Listen(); err != nil { if err := stunServer.Listen(); err != nil {
if errors.Is(err, stun.ErrServerClosed) { if errors.Is(err, stun.ErrServerClosed) {
return return
} }
log.Errorf("STUN server error: %v", err) log.Errorf("STUN server error: %v", err)
} }
}() })
} }
} }
func shutdownServers(ctx context.Context, srv *relayServer.Server, httpHealthcheck *healthcheck.Server, stunServer *stun.Server, mgmtSrv *mgmtServer.BaseServer, metricsServer *sharedMetrics.Metrics) error { func shutdownServers(ctx context.Context, srv *relayServer.Server, httpHealthcheck *healthcheck.Server, stunServer *stun.Server, mgmtSrv mgmtServer.Server, metricsServer *sharedMetrics.Metrics) error {
var errs error var errs error
if err := httpHealthcheck.Shutdown(ctx); err != nil { if err := httpHealthcheck.Shutdown(ctx); err != nil {
@@ -491,7 +494,7 @@ func handleTLSConfig(cfg *CombinedConfig) (*tls.Config, bool, error) {
return nil, false, nil return nil, false, nil
} }
func createManagementServer(cfg *CombinedConfig, mgmtConfig *nbconfig.Config) (*mgmtServer.BaseServer, error) { func createManagementServer(cfg *CombinedConfig, mgmtConfig *nbconfig.Config) (mgmtServer.Server, error) {
mgmt := cfg.Management mgmt := cfg.Management
// Extract port from listen address // Extract port from listen address
@@ -502,7 +505,7 @@ func createManagementServer(cfg *CombinedConfig, mgmtConfig *nbconfig.Config) (*
} }
mgmtPort, _ := strconv.Atoi(portStr) mgmtPort, _ := strconv.Atoi(portStr)
mgmtSrv := mgmtServer.NewServer( mgmtSrv := newServer(
&mgmtServer.Config{ &mgmtServer.Config{
NbConfig: mgmtConfig, NbConfig: mgmtConfig,
DNSDomain: "", DNSDomain: "",

13
combined/cmd/server.go Normal file
View File

@@ -0,0 +1,13 @@
package cmd
import (
mgmtServer "github.com/netbirdio/netbird/management/internals/server"
)
var newServer = func(cfg *mgmtServer.Config) mgmtServer.Server {
return mgmtServer.NewServer(cfg)
}
func SetNewServer(fn func(*mgmtServer.Config) mgmtServer.Server) {
newServer = fn
}

View File

@@ -34,6 +34,8 @@ const (
ManagementLegacyPort = 33073 ManagementLegacyPort = 33073
// DefaultSelfHostedDomain is the default domain used for self-hosted fresh installs. // DefaultSelfHostedDomain is the default domain used for self-hosted fresh installs.
DefaultSelfHostedDomain = "netbird.selfhosted" DefaultSelfHostedDomain = "netbird.selfhosted"
ContainerKeyBaseServer = "baseServer"
) )
type Server interface { type Server interface {
@@ -91,7 +93,7 @@ type Config struct {
// NewServer initializes and configures a new Server instance // NewServer initializes and configures a new Server instance
func NewServer(cfg *Config) *BaseServer { func NewServer(cfg *Config) *BaseServer {
return &BaseServer{ s := &BaseServer{
Config: cfg.NbConfig, Config: cfg.NbConfig,
container: make(map[string]any), container: make(map[string]any),
dnsDomain: cfg.DNSDomain, dnsDomain: cfg.DNSDomain,
@@ -104,6 +106,9 @@ func NewServer(cfg *Config) *BaseServer {
mgmtMetricsPort: cfg.MgmtMetricsPort, mgmtMetricsPort: cfg.MgmtMetricsPort,
autoResolveDomains: cfg.AutoResolveDomains, autoResolveDomains: cfg.AutoResolveDomains,
} }
s.container[ContainerKeyBaseServer] = s
return s
} }
func (s *BaseServer) AfterInit(fn func(s *BaseServer)) { func (s *BaseServer) AfterInit(fn func(s *BaseServer)) {