diff --git a/README.md b/README.md index fe9e756..4814b27 100644 --- a/README.md +++ b/README.md @@ -31,10 +31,10 @@ You only need `.env.example`, `docker-compose.yml` and `traefik/`. #### Do I need to use traefik? - Traefik needs to be used to forward traffic to the rooms. You can put nginx in front of it, but not replace it. -- Your domain name specified for traefik must match domain name, that your proxy connects to. -- Currently, there is no support for custom paths. You cannot host your `neko-rooms` on `example.com/neko-rooms/` but it needs own subdomain e.g. `neko-rooms.example.com`. +- Your domain name specified for traefik must match domain name, that your proxy connects to. In docker-compose it is service name. +- See example configuration for [nginx](docs/nginx). -You can use `docker-compose.http.yml` that will expose this service to `APP_PORT`. See example configuration for [nginx](docs/nginx). +You can use `docker-compose.http.yml` that will expose this service to `8080` or any port. ### Step 1 diff --git a/docker-compose.http.yml b/docker-compose.http.yml index c952c88..5cfc3c3 100644 --- a/docker-compose.http.yml +++ b/docker-compose.http.yml @@ -16,9 +16,9 @@ services: - "--providers.docker.watch=true" - "--providers.docker.exposedbydefault=false" - "--providers.docker.network=${NEKO_ROOMS_TRAEFIK_NETWORK}" - - "--entrypoints.${NEKO_ROOMS_TRAEFIK_ENTRYPOINT}.address=:${APP_PORT-8080}" + - "--entrypoints.${NEKO_ROOMS_TRAEFIK_ENTRYPOINT}.address=:80" ports: - - "${APP_PORT-8080}:${APP_PORT-8080}" + - "8080:80" volumes: - "/var/run/docker.sock:/var/run/docker.sock:ro" @@ -32,7 +32,7 @@ services: - "NEKO_ROOMS_TRAEFIK_DOMAIN" - "NEKO_ROOMS_TRAEFIK_ENTRYPOINT" - "NEKO_ROOMS_TRAEFIK_NETWORK" - - "NEKO_ROOMS_TRAEFIK_PORT=${APP_PORT-8080}" + - "NEKO_ROOMS_INSTANCE_URL=http://${NEKO_ROOMS_TRAEFIK_DOMAIN}:8080/" # external URL volumes: - "/var/run/docker.sock:/var/run/docker.sock" labels: diff --git a/internal/config/room.go b/internal/config/room.go index cf29e2d..fcfaca2 100644 --- a/internal/config/room.go +++ b/internal/config/room.go @@ -4,6 +4,7 @@ import ( "strconv" "strings" + "github.com/rs/zerolog/log" "github.com/spf13/cobra" "github.com/spf13/viper" @@ -17,12 +18,13 @@ type Room struct { NekoImages []string InstanceName string + InstanceUrl string TraefikDomain string TraefikEntrypoint string TraefikCertresolver string TraefikNetwork string - TraefikPort string + TraefikPort string // deprecated } func (Room) Init(cmd *cobra.Command) error { @@ -46,6 +48,11 @@ func (Room) Init(cmd *cobra.Command) error { return err } + cmd.PersistentFlags().String("instance_url", "", "instance url that is prefixing room names (if different from `http(s)://{traefik_domain}/`)") + if err := viper.BindPFlag("instance_url", cmd.PersistentFlags().Lookup("instance_url")); err != nil { + return err + } + cmd.PersistentFlags().String("traefik_domain", "neko.lan", "traefik: domain on which will be container hosted") if err := viper.BindPFlag("traefik_domain", cmd.PersistentFlags().Lookup("traefik_domain")); err != nil { return err @@ -66,7 +73,7 @@ func (Room) Init(cmd *cobra.Command) error { return err } - cmd.PersistentFlags().String("traefik_port", "", "traefik: external port (if different than 80 or 443)") + cmd.PersistentFlags().String("traefik_port", "", "traefik: external port (deprecated)") if err := viper.BindPFlag("traefik_port", cmd.PersistentFlags().Lookup("traefik_port")); err != nil { return err } @@ -111,10 +118,20 @@ func (s *Room) Set() { s.NekoImages = viper.GetStringSlice("neko_images") s.InstanceName = viper.GetString("instance_name") + s.InstanceUrl = viper.GetString("instance_url") s.TraefikDomain = viper.GetString("traefik_domain") s.TraefikEntrypoint = viper.GetString("traefik_entrypoint") s.TraefikCertresolver = viper.GetString("traefik_certresolver") s.TraefikNetwork = viper.GetString("traefik_network") + + // deprecated s.TraefikPort = viper.GetString("traefik_port") + if s.TraefikPort != "" { + if s.InstanceUrl != "" { + log.Warn().Msg("deprecated `traefik_port` config item is ignored when `instance_url` is set") + } else { + log.Warn().Msg("you are using deprecated `traefik_port` config item, you should consider moving to `instance_url`") + } + } } diff --git a/internal/room/manager.go b/internal/room/manager.go index 14093ee..39742e3 100644 --- a/internal/room/manager.go +++ b/internal/room/manager.go @@ -122,20 +122,28 @@ func (manager *RoomManagerCtx) Create(settings types.RoomSettings) (string, erro containerName := manager.config.InstanceName + "-" + roomName - urlProto := "http" - if manager.config.TraefikCertresolver != "" { - urlProto = "https" - } + instanceUrl := manager.config.InstanceUrl + if instanceUrl == "" { + urlProto := "http" + if manager.config.TraefikCertresolver != "" { + urlProto = "https" + } - port := "" - if manager.config.TraefikPort != "" { - port = ":" + manager.config.TraefikPort + // deprecated + port := "" + if manager.config.TraefikPort != "" { + port = ":" + manager.config.TraefikPort + } + + instanceUrl = urlProto + "://" + manager.config.TraefikDomain + port + "/" + } else if !strings.HasSuffix(instanceUrl, "/") { + instanceUrl = instanceUrl + "/" } labels := map[string]string{ // Set internal labels "m1k1o.neko_rooms.name": roomName, - "m1k1o.neko_rooms.url": urlProto + "://" + manager.config.TraefikDomain + port + "/" + roomName + "/", + "m1k1o.neko_rooms.url": instanceUrl + roomName + "/", "m1k1o.neko_rooms.instance": manager.config.InstanceName, "m1k1o.neko_rooms.epr.min": fmt.Sprintf("%d", epr.Min), "m1k1o.neko_rooms.epr.max": fmt.Sprintf("%d", epr.Max),