mirror of
https://github.com/m1k1o/neko-rooms.git
synced 2026-11-03 07:01:35 -06:00
traefik enable in config.
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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
@@ -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
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user