traefik enabled.

This commit is contained in:
Miroslav Šedivý
2022-07-31 20:07:18 +02:00
parent 8046607742
commit edc53b879a
6 changed files with 50 additions and 44 deletions
+31 -17
View File
@@ -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
-8
View File
@@ -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")
}
+1 -1
View File
@@ -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)
}
+14 -11
View File
@@ -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.
},
}
+3 -3
View File
@@ -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
+1 -4
View File
@@ -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,
)