diff --git a/internal/config/room.go b/internal/config/room.go index e66deb0..6fffccd 100644 --- a/internal/config/room.go +++ b/internal/config/room.go @@ -13,6 +13,15 @@ import ( "github.com/spf13/viper" ) +type Traefik struct { + Enabled bool + Domain string + Entrypoint string + Certresolver string + Network string + Port string // deprecated +} + type Room struct { Mux bool EprMin uint16 @@ -33,12 +42,7 @@ type Room struct { InstanceName string InstanceUrl *url.URL - TraefikEnabled bool // TODO: now set from Server config, needed refactor - TraefikDomain string - TraefikEntrypoint string - TraefikCertresolver string - TraefikNetwork string - TraefikPort string // deprecated + Traefik Traefik } func (Room) Init(cmd *cobra.Command) error { @@ -125,6 +129,11 @@ func (Room) Init(cmd *cobra.Command) error { // Traefik + cmd.PersistentFlags().Bool("traefik.enabled", true, "traefik: enabled or disabled") + if err := viper.BindPFlag("traefik.enabled", cmd.PersistentFlags().Lookup("traefik.enabled")); err != nil { + return err + } + cmd.PersistentFlags().String("traefik.domain", "", "traefik: domain on which will be container hosted (if empty or '*', match all; for neko-rooms as subdomain use '*.domain.tld')") if err := viper.BindPFlag("traefik.domain", cmd.PersistentFlags().Lookup("traefik.domain")); err != nil { return err @@ -225,14 +234,15 @@ func (s *Room) Set() { } } - s.TraefikDomain = viper.GetString("traefik.domain") - s.TraefikEntrypoint = viper.GetString("traefik.entrypoint") - s.TraefikCertresolver = viper.GetString("traefik.certresolver") - s.TraefikNetwork = viper.GetString("traefik.network") + s.Traefik.Enabled = viper.GetBool("traefik.enabled") + s.Traefik.Domain = viper.GetString("traefik.domain") + s.Traefik.Entrypoint = viper.GetString("traefik.entrypoint") + s.Traefik.Certresolver = viper.GetString("traefik.certresolver") + s.Traefik.Network = viper.GetString("traefik.network") // deprecated - s.TraefikPort = viper.GetString("traefik.port") - if s.TraefikPort != "" { + s.Traefik.Port = viper.GetString("traefik.port") + if s.Traefik.Port != "" { if s.InstanceUrl != nil { log.Warn().Msg("deprecated `traefik.port` config item is ignored when `instance.url` is set") } else { @@ -252,17 +262,21 @@ func (s *Room) GetInstanceUrl() url.URL { Path: "/", } - if s.TraefikCertresolver != "" { + if !s.Traefik.Enabled { + return instanceUrl + } + + if s.Traefik.Certresolver != "" { instanceUrl.Scheme = "https" } - if s.TraefikDomain != "" && s.TraefikDomain != "*" { - instanceUrl.Host = s.TraefikDomain + if s.Traefik.Domain != "" && s.Traefik.Domain != "*" { + instanceUrl.Host = s.Traefik.Domain } // deprecated - if s.TraefikPort != "" { - instanceUrl.Host += ":" + s.TraefikPort + if s.Traefik.Port != "" { + instanceUrl.Host += ":" + s.Traefik.Port } return instanceUrl diff --git a/internal/config/server.go b/internal/config/server.go index 9cd47ca..1f119f9 100644 --- a/internal/config/server.go +++ b/internal/config/server.go @@ -13,7 +13,6 @@ type Server struct { Proxy bool PProf bool - InternalProxy bool AdminPathPrefix string } @@ -48,12 +47,6 @@ func (Server) Init(cmd *cobra.Command) error { return err } - // WIP. - cmd.PersistentFlags().Bool("internal_proxy", false, "use internal proxy instead of traefik") - if err := viper.BindPFlag("internal_proxy", cmd.PersistentFlags().Lookup("internal_proxy")); err != nil { - return err - } - cmd.PersistentFlags().String("admin_path_prefix", "/", "set custom path prefix for admin") if err := viper.BindPFlag("admin_path_prefix", cmd.PersistentFlags().Lookup("admin_path_prefix")); err != nil { return err @@ -70,6 +63,5 @@ func (s *Server) Set() { s.Proxy = viper.GetBool("proxy") s.PProf = viper.GetBool("pprof") - s.InternalProxy = viper.GetBool("internal_proxy") s.AdminPathPrefix = viper.GetString("admin_path_prefix") } diff --git a/internal/room/labels.go b/internal/room/labels.go index 25e2abb..9d8ea96 100644 --- a/internal/room/labels.go +++ b/internal/room/labels.go @@ -97,7 +97,7 @@ func (manager *RoomManagerCtx) serializeLabels(labels RoomLabels) map[string]str } // Only when using traefik is the URL fixed with the room itself and not with neko-rooms. - if manager.config.TraefikEnabled { + if manager.config.Traefik.Enabled { labelsMap["m1k1o.neko_rooms.url"] = manager.config.GetRoomUrl(labels.Name) } diff --git a/internal/room/manager.go b/internal/room/manager.go index ba26a15..452feb8 100644 --- a/internal/room/manager.go +++ b/internal/room/manager.go @@ -180,21 +180,21 @@ func (manager *RoomManagerCtx) Create(settings types.RoomSettings) (string, erro // Set traefik labels // - if manager.config.TraefikEnabled { + if t := manager.config.Traefik; t.Enabled { pathPrefix := path.Join("/", manager.config.PathPrefix, roomName) // create traefik rule traefikRule := "PathPrefix(`" + pathPrefix + "`)" - if manager.config.TraefikDomain != "" && manager.config.TraefikDomain != "*" { + if t.Domain != "" && t.Domain != "*" { // match *.domain.tld as subdomain - if strings.HasPrefix(manager.config.TraefikDomain, "*.") { + if strings.HasPrefix(t.Domain, "*.") { traefikRule = fmt.Sprintf( "Host(`%s.%s`)", roomName, - strings.TrimPrefix(manager.config.TraefikDomain, "*."), + strings.TrimPrefix(t.Domain, "*."), ) } else { - traefikRule += " && Host(`" + manager.config.TraefikDomain + "`)" + traefikRule += " && Host(`" + t.Domain + "`)" } } else { traefikRule += " && HostRegexp(`{host:.+}`)" @@ -202,7 +202,7 @@ func (manager *RoomManagerCtx) Create(settings types.RoomSettings) (string, erro labels["traefik.enable"] = "true" labels["traefik.http.services."+containerName+"-frontend.loadbalancer.server.port"] = fmt.Sprintf("%d", frontendPort) - labels["traefik.http.routers."+containerName+".entrypoints"] = manager.config.TraefikEntrypoint + labels["traefik.http.routers."+containerName+".entrypoints"] = t.Entrypoint labels["traefik.http.routers."+containerName+".rule"] = traefikRule labels["traefik.http.middlewares."+containerName+"-rdr.redirectregex.regex"] = pathPrefix + "$$" labels["traefik.http.middlewares."+containerName+"-rdr.redirectregex.replacement"] = pathPrefix + "/" @@ -211,9 +211,9 @@ func (manager *RoomManagerCtx) Create(settings types.RoomSettings) (string, erro labels["traefik.http.routers."+containerName+".service"] = containerName + "-frontend" // optional HTTPS - if manager.config.TraefikCertresolver != "" { + if t.Certresolver != "" { labels["traefik.http.routers."+containerName+".tls"] = "true" - labels["traefik.http.routers."+containerName+".tls.certresolver"] = manager.config.TraefikCertresolver + labels["traefik.http.routers."+containerName+".tls.certresolver"] = t.Certresolver } } else { labels["m1k1o.neko_rooms.host"] = fmt.Sprintf("%s:%d", containerName, frontendPort) @@ -224,8 +224,11 @@ func (manager *RoomManagerCtx) Create(settings types.RoomSettings) (string, erro // replace dynamic values in labels label = strings.Replace(label, "{containerName}", containerName, -1) label = strings.Replace(label, "{roomName}", roomName, -1) - label = strings.Replace(label, "{traefikEntrypoint}", manager.config.TraefikEntrypoint, -1) - label = strings.Replace(label, "{traefikCertresolver}", manager.config.TraefikCertresolver, -1) + + if t := manager.config.Traefik; t.Enabled { + label = strings.Replace(label, "{traefikEntrypoint}", t.Entrypoint, -1) + label = strings.Replace(label, "{traefikCertresolver}", t.Certresolver, -1) + } v := strings.SplitN(label, "=", 2) if len(v) != 2 { @@ -434,7 +437,7 @@ func (manager *RoomManagerCtx) Create(settings types.RoomSettings) (string, erro networkingConfig := &network.NetworkingConfig{ EndpointsConfig: map[string]*network.EndpointSettings{ - manager.config.TraefikNetwork: {}, + manager.config.Traefik.Network: {}, // TODO: Refactor if not using traefik. }, } diff --git a/internal/server/manager.go b/internal/server/manager.go index c8a589f..50b74f2 100644 --- a/internal/server/manager.go +++ b/internal/server/manager.go @@ -23,7 +23,7 @@ type ServerManagerCtx struct { config *config.Server } -func New(ApiManager types.ApiManager, pathPrefix string, config *config.Server, proxyHandler http.Handler) *ServerManagerCtx { +func New(ApiManager types.ApiManager, roomConfig *config.Room, config *config.Server, proxyHandler http.Handler) *ServerManagerCtx { logger := log.With().Str("module", "server").Logger() router := chi.NewRouter() @@ -72,8 +72,8 @@ func New(ApiManager types.ApiManager, pathPrefix string, config *config.Server, }) // rooms page - router.Route(pathPrefix, func(r chi.Router) { - if config.InternalProxy { + router.Route(roomConfig.PathPrefix, func(r chi.Router) { + if !roomConfig.Traefik.Enabled { r.Handle("/*", proxyHandler) } else { // add simple lobby room diff --git a/neko.go b/neko.go index 5eadb2f..9840d81 100644 --- a/neko.go +++ b/neko.go @@ -129,9 +129,6 @@ func (main *MainCtx) Start() { main.logger.Info().Msg("successfully connected to docker client") } - // TODO: Refactor. - main.Configs.Room.TraefikEnabled = !main.Configs.Server.InternalProxy - main.roomManager = room.New( client, main.Configs.Room, @@ -156,7 +153,7 @@ func (main *MainCtx) Start() { main.serverManager = server.New( main.apiManager, - main.Configs.Room.PathPrefix, + main.Configs.Room, main.Configs.Server, main.proxyManager, )