Skip to content

Commit

Permalink
add optional path prefix.
Browse files Browse the repository at this point in the history
  • Loading branch information
m1k1o committed Feb 27, 2022
1 parent 6f4a942 commit 8e0623e
Show file tree
Hide file tree
Showing 5 changed files with 35 additions and 17 deletions.
8 changes: 8 additions & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,11 @@ All clients visit `https://neko-rooms/room-name/`. Once they logged in, they get
## Connection timeout

Neko room loads but you don't see the screen and it gives you `connection timeout` or `disconnected error`? [Validate](https://neko.m1k1o.net/#/getting-started/troubleshooting?id=validate-udp-ports-reachability) that your UDP ports are reachable.

## path prefix

Room names are by default put to root directory. If you want to have custom path prefix, you can specify it using evn variable:

```
NEKO_ROOMS_INSTANCE_PATH_PREFIX=/test/
```
11 changes: 9 additions & 2 deletions internal/config/room.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,9 @@ type Room struct {

MountsWhitelist []string

InstanceName string
InstanceUrl string
InstanceName string
InstanceUrl string
InstancePathPrefix string

TraefikDomain string
TraefikEntrypoint string
Expand Down Expand Up @@ -95,6 +96,11 @@ func (Room) Init(cmd *cobra.Command) error {
return err
}

cmd.PersistentFlags().String("instance.path_prefix", "", "path prefix that is added to a room path")
if err := viper.BindPFlag("instance.path_prefix", cmd.PersistentFlags().Lookup("instance.path_prefix")); err != nil {
return err
}

// Traefik

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')")
Expand Down Expand Up @@ -184,6 +190,7 @@ func (s *Room) Set() {
}

s.InstanceUrl = viper.GetString("instance.url")
s.InstancePathPrefix = viper.GetString("instance.path_prefix")

s.TraefikDomain = viper.GetString("traefik.domain")
s.TraefikEntrypoint = viper.GetString("traefik.entrypoint")
Expand Down
7 changes: 4 additions & 3 deletions internal/http/manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"context"
"net/http"
"os"
"path"

"github.com/go-chi/chi"
"github.com/go-chi/chi/middleware"
Expand All @@ -22,7 +23,7 @@ type HttpManagerCtx struct {
conf *config.Server
}

func New(ApiManager types.ApiManager, conf *config.Server) *HttpManagerCtx {
func New(ApiManager types.ApiManager, pathPrefix string, conf *config.Server) *HttpManagerCtx {
logger := log.With().Str("module", "http").Logger()

router := chi.NewRouter()
Expand Down Expand Up @@ -54,8 +55,8 @@ func New(ApiManager types.ApiManager, conf *config.Server) *HttpManagerCtx {
}

// add simple lobby room
router.Get("/{roomName}", ApiManager.RoomLobby)
router.Get("/{roomName}/", ApiManager.RoomLobby)
router.Get(path.Join("/", pathPrefix, "{roomName}"), ApiManager.RoomLobby)
router.Get(path.Join("/", pathPrefix, "{roomName}")+"/", ApiManager.RoomLobby)

router.NotFound(http.HandlerFunc(http.NotFound))

Expand Down
25 changes: 13 additions & 12 deletions internal/room/manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -149,9 +149,10 @@ func (manager *RoomManagerCtx) Create(settings types.RoomSettings) (string, erro
//

containerName := manager.config.InstanceName + "-" + roomName
pathPrefix := path.Join("/", manager.config.InstancePathPrefix, roomName)

// create traefik rule
traefikRule := "PathPrefix(`/" + roomName + "`)"
traefikRule := "PathPrefix(`" + pathPrefix + "`)"
if manager.config.TraefikDomain != "" && manager.config.TraefikDomain != "*" {
// match *.domain.tld as subdomain
if strings.HasPrefix(manager.config.TraefikDomain, "*.") {
Expand All @@ -172,9 +173,9 @@ func (manager *RoomManagerCtx) Create(settings types.RoomSettings) (string, erro
"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": "/" + roomName + "$$",
"traefik.http.middlewares." + containerName + "-rdr.redirectregex.replacement": "/" + roomName + "/",
"traefik.http.middlewares." + containerName + "-prf.stripprefix.prefixes": "/" + roomName + "/",
"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",
}

Expand All @@ -189,7 +190,6 @@ func (manager *RoomManagerCtx) Create(settings types.RoomSettings) (string, erro
//

instanceUrl := manager.config.InstanceUrl
instanceSuffix := roomName + "/"
if instanceUrl == "" {
urlProto := "http"
if manager.config.TraefikCertresolver != "" {
Expand All @@ -205,19 +205,20 @@ func (manager *RoomManagerCtx) Create(settings types.RoomSettings) (string, erro
if manager.config.TraefikDomain != "" && manager.config.TraefikDomain != "*" {
// match *.domain.tld as subdomain
if strings.HasPrefix(manager.config.TraefikDomain, "*.") {
instanceUrl = urlProto + "://" + roomName + "." + strings.TrimPrefix(manager.config.TraefikDomain, "*.") + port + "/"
instanceSuffix = ""
instanceUrl = urlProto + "://" + roomName + "." + strings.TrimPrefix(manager.config.TraefikDomain, "*.") + port
pathPrefix = ""
} else {
instanceUrl = urlProto + "://" + manager.config.TraefikDomain + port + "/"
instanceUrl = urlProto + "://" + manager.config.TraefikDomain + port
}
} else {
// domain is not known
instanceUrl = urlProto + "://127.0.0.1" + port + "/"
instanceUrl = urlProto + "://127.0.0.1" + port
}
} else if !strings.HasSuffix(instanceUrl, "/") {
instanceUrl = instanceUrl + "/"
}

// remove last slash
instanceUrl = strings.TrimSuffix(instanceUrl, "/")

var browserPolicyLabels *BrowserPolicyLabels
if settings.BrowserPolicy != nil {
browserPolicyLabels = &BrowserPolicyLabels{
Expand All @@ -228,7 +229,7 @@ func (manager *RoomManagerCtx) Create(settings types.RoomSettings) (string, erro

labels := manager.serializeLabels(RoomLabels{
Name: roomName,
URL: instanceUrl + instanceSuffix,
URL: instanceUrl + pathPrefix + "/",
Epr: epr,
NekoImage: settings.NekoImage,

Expand Down
1 change: 1 addition & 0 deletions neko.go
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,7 @@ func (main *MainCtx) Start() {

main.httpManager = http.New(
main.apiManager,
main.Configs.Room.InstancePathPrefix,
main.Configs.Server,
)
main.httpManager.Start()
Expand Down

0 comments on commit 8e0623e

Please sign in to comment.