diff --git a/internal/config/room.go b/internal/config/room.go index 272f524..e66deb0 100644 --- a/internal/config/room.go +++ b/internal/config/room.go @@ -33,6 +33,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 diff --git a/internal/proxy/manager.go b/internal/proxy/manager.go index 13c8ed4..75a061d 100644 --- a/internal/proxy/manager.go +++ b/internal/proxy/manager.go @@ -73,8 +73,7 @@ func (p *ProxyManagerCtx) Start() { case err := <-errs: p.logger.Info().Interface("err", err).Msg("eee") case msg := <-msgs: - host := msg.ID[:12] - name, port, ok := p.parseLabels(msg.Actor.Attributes) + name, host, ok := p.parseLabels(msg.Actor.Attributes) if !ok { break } @@ -92,7 +91,7 @@ func (p *ProxyManagerCtx) Start() { case "start": p.handlers[name] = httputil.NewSingleHostReverseProxy(&url.URL{ Scheme: "http", - Host: host + ":" + port, + Host: host, }) case "stop": p.handlers[name] = nil @@ -128,16 +127,15 @@ func (p *ProxyManagerCtx) Refresh() error { p.handlers = map[string]*httputil.ReverseProxy{} for _, cont := range containers { - name, port, ok := p.parseLabels(cont.Labels) + name, host, ok := p.parseLabels(cont.Labels) if !ok { continue } if cont.State == "running" { - host := cont.ID[:12] p.handlers[name] = httputil.NewSingleHostReverseProxy(&url.URL{ Scheme: "http", - Host: host + ":" + port, + Host: host, }) } else { p.handlers[name] = nil @@ -147,14 +145,13 @@ func (p *ProxyManagerCtx) Refresh() error { return nil } -func (p *ProxyManagerCtx) parseLabels(labels map[string]string) (name string, port string, ok bool) { +func (p *ProxyManagerCtx) parseLabels(labels map[string]string) (name string, host string, ok bool) { name, ok = labels["m1k1o.neko_rooms.name"] if !ok { return } - // TODO: Do not use trafik for this. - port, ok = labels["traefik.http.services.neko-rooms-"+name+"-frontend.loadbalancer.server.port"] + host, ok = labels["m1k1o.neko_rooms.host"] return } diff --git a/internal/room/manager.go b/internal/room/manager.go index f8c89d7..f1fb693 100644 --- a/internal/room/manager.go +++ b/internal/room/manager.go @@ -112,6 +112,8 @@ func (manager *RoomManagerCtx) Create(settings types.RoomSettings) (string, erro } } + containerName := manager.config.InstanceName + "-" + roomName + // // Allocate ports // @@ -154,48 +156,6 @@ func (manager *RoomManagerCtx) Create(settings types.RoomSettings) (string, erro exposedPorts[port] = struct{}{} } - // - // Set traefik labels - // - - containerName := manager.config.InstanceName + "-" + roomName - pathPrefix := path.Join("/", manager.config.PathPrefix, roomName) - - // create traefik rule - traefikRule := "PathPrefix(`" + pathPrefix + "`)" - if manager.config.TraefikDomain != "" && manager.config.TraefikDomain != "*" { - // match *.domain.tld as subdomain - if strings.HasPrefix(manager.config.TraefikDomain, "*.") { - traefikRule = fmt.Sprintf( - "Host(`%s.%s`)", - roomName, - strings.TrimPrefix(manager.config.TraefikDomain, "*."), - ) - } else { - traefikRule += " && Host(`" + manager.config.TraefikDomain + "`)" - } - } else { - traefikRule += " && HostRegexp(`{host:.+}`)" - } - - traefikLabels := map[string]string{ - "traefik.enable": "true", - "traefik.http.services." + containerName + "-frontend.loadbalancer.server.port": fmt.Sprintf("%d", frontendPort), - "traefik.http.routers." + containerName + ".entrypoints": manager.config.TraefikEntrypoint, - "traefik.http.routers." + containerName + ".rule": traefikRule, - "traefik.http.middlewares." + containerName + "-rdr.redirectregex.regex": pathPrefix + "$$", - "traefik.http.middlewares." + containerName + "-rdr.redirectregex.replacement": pathPrefix + "/", - "traefik.http.middlewares." + containerName + "-prf.stripprefix.prefixes": pathPrefix + "/", - "traefik.http.routers." + containerName + ".middlewares": containerName + "-rdr," + containerName + "-prf", - "traefik.http.routers." + containerName + ".service": containerName + "-frontend", - } - - // optional HTTPS - if manager.config.TraefikCertresolver != "" { - traefikLabels["traefik.http.routers."+containerName+".tls"] = "true" - traefikLabels["traefik.http.routers."+containerName+".tls.certresolver"] = manager.config.TraefikCertresolver - } - // // Set internal labels // @@ -217,8 +177,47 @@ func (manager *RoomManagerCtx) Create(settings types.RoomSettings) (string, erro BrowserPolicy: browserPolicyLabels, }) - for k, v := range traefikLabels { - labels[k] = v + // + // Set traefik labels + // + + if manager.config.TraefikEnabled { + pathPrefix := path.Join("/", manager.config.PathPrefix, roomName) + + // create traefik rule + traefikRule := "PathPrefix(`" + pathPrefix + "`)" + if manager.config.TraefikDomain != "" && manager.config.TraefikDomain != "*" { + // match *.domain.tld as subdomain + if strings.HasPrefix(manager.config.TraefikDomain, "*.") { + traefikRule = fmt.Sprintf( + "Host(`%s.%s`)", + roomName, + strings.TrimPrefix(manager.config.TraefikDomain, "*."), + ) + } else { + traefikRule += " && Host(`" + manager.config.TraefikDomain + "`)" + } + } else { + traefikRule += " && HostRegexp(`{host:.+}`)" + } + + 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+".rule"] = traefikRule + labels["traefik.http.middlewares."+containerName+"-rdr.redirectregex.regex"] = pathPrefix + "$$" + labels["traefik.http.middlewares."+containerName+"-rdr.redirectregex.replacement"] = pathPrefix + "/" + labels["traefik.http.middlewares."+containerName+"-prf.stripprefix.prefixes"] = pathPrefix + "/" + labels["traefik.http.routers."+containerName+".middlewares"] = containerName + "-rdr," + containerName + "-prf" + labels["traefik.http.routers."+containerName+".service"] = containerName + "-frontend" + + // optional HTTPS + if manager.config.TraefikCertresolver != "" { + labels["traefik.http.routers."+containerName+".tls"] = "true" + labels["traefik.http.routers."+containerName+".tls.certresolver"] = manager.config.TraefikCertresolver + } + } else { + labels["m1k1o.neko_rooms.host"] = fmt.Sprintf("%s:%d", containerName, frontendPort) } // add custom labels diff --git a/neko.go b/neko.go index 9543751..5eadb2f 100644 --- a/neko.go +++ b/neko.go @@ -129,6 +129,9 @@ 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,