traefik enable in config.

This commit is contained in:
Miroslav Šedivý
2022-07-31 18:47:23 +02:00
parent 91805fcaab
commit bb97bb75d2
4 changed files with 53 additions and 53 deletions
+1
View File
@@ -33,6 +33,7 @@ type Room struct {
InstanceName string InstanceName string
InstanceUrl *url.URL InstanceUrl *url.URL
TraefikEnabled bool // TODO: now set from Server config, needed refactor
TraefikDomain string TraefikDomain string
TraefikEntrypoint string TraefikEntrypoint string
TraefikCertresolver string TraefikCertresolver string
+6 -9
View File
@@ -73,8 +73,7 @@ func (p *ProxyManagerCtx) Start() {
case err := <-errs: case err := <-errs:
p.logger.Info().Interface("err", err).Msg("eee") p.logger.Info().Interface("err", err).Msg("eee")
case msg := <-msgs: case msg := <-msgs:
host := msg.ID[:12] name, host, ok := p.parseLabels(msg.Actor.Attributes)
name, port, ok := p.parseLabels(msg.Actor.Attributes)
if !ok { if !ok {
break break
} }
@@ -92,7 +91,7 @@ func (p *ProxyManagerCtx) Start() {
case "start": case "start":
p.handlers[name] = httputil.NewSingleHostReverseProxy(&url.URL{ p.handlers[name] = httputil.NewSingleHostReverseProxy(&url.URL{
Scheme: "http", Scheme: "http",
Host: host + ":" + port, Host: host,
}) })
case "stop": case "stop":
p.handlers[name] = nil p.handlers[name] = nil
@@ -128,16 +127,15 @@ func (p *ProxyManagerCtx) Refresh() error {
p.handlers = map[string]*httputil.ReverseProxy{} p.handlers = map[string]*httputil.ReverseProxy{}
for _, cont := range containers { for _, cont := range containers {
name, port, ok := p.parseLabels(cont.Labels) name, host, ok := p.parseLabels(cont.Labels)
if !ok { if !ok {
continue continue
} }
if cont.State == "running" { if cont.State == "running" {
host := cont.ID[:12]
p.handlers[name] = httputil.NewSingleHostReverseProxy(&url.URL{ p.handlers[name] = httputil.NewSingleHostReverseProxy(&url.URL{
Scheme: "http", Scheme: "http",
Host: host + ":" + port, Host: host,
}) })
} else { } else {
p.handlers[name] = nil p.handlers[name] = nil
@@ -147,14 +145,13 @@ func (p *ProxyManagerCtx) Refresh() error {
return nil 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"] name, ok = labels["m1k1o.neko_rooms.name"]
if !ok { if !ok {
return return
} }
// TODO: Do not use trafik for this. host, ok = labels["m1k1o.neko_rooms.host"]
port, ok = labels["traefik.http.services.neko-rooms-"+name+"-frontend.loadbalancer.server.port"]
return return
} }
+43 -44
View File
@@ -112,6 +112,8 @@ func (manager *RoomManagerCtx) Create(settings types.RoomSettings) (string, erro
} }
} }
containerName := manager.config.InstanceName + "-" + roomName
// //
// Allocate ports // Allocate ports
// //
@@ -154,48 +156,6 @@ func (manager *RoomManagerCtx) Create(settings types.RoomSettings) (string, erro
exposedPorts[port] = struct{}{} 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 // Set internal labels
// //
@@ -217,8 +177,47 @@ func (manager *RoomManagerCtx) Create(settings types.RoomSettings) (string, erro
BrowserPolicy: browserPolicyLabels, 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 // add custom labels
+3
View File
@@ -129,6 +129,9 @@ func (main *MainCtx) Start() {
main.logger.Info().Msg("successfully connected to docker client") main.logger.Info().Msg("successfully connected to docker client")
} }
// TODO: Refactor.
main.Configs.Room.TraefikEnabled = !main.Configs.Server.InternalProxy
main.roomManager = room.New( main.roomManager = room.New(
client, client,
main.Configs.Room, main.Configs.Room,