Search code examples
dockerdocker-composetraefik

Treafik addPrefix/replacePathRegex


I'm trying to set up geoserver and traefik with docker, but having an issue with the paths.

Geoserver's main entrypoint is at /geoserver, but I want to make it accessible at the root path of my domain, let's say example.com. Here's the docker-compose file I put together:

version: "3"

services:
  traefik:
    image: traefik:2.4
    restart: unless-stopped
    networks:
      - web
    ports:
      - 80:80
      - 443:443
    command:
      - --log.level=DEBUG
      - --providers=docker
      - --providers.docker.network=geoserver_web
      - --entrypoints.websecure.address=:443
      - --entrypoints.web.address=:80
      - --entrypoints.web.http.redirections.entrypoint.to=websecure
      - --entrypoints.web.http.redirections.entrypoint.scheme=websecure
      # - --api.dashboard=true
      - --certificatesresolvers.lets-encrypt.acme.email=admin@example.com
      - --certificatesresolvers.lets-encrypt.acme.storage=acme.json
      - --certificatesresolvers.lets-encrypt.acme.tlschallenge=true
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./letsencrypt:/letsencrypt
  
  geoserver:
    image: oscarfonts/geoserver:latest
    restart: unless-stopped
    networks:
      - web
    labels:
      - traefik.port=8080
      - traefik.http.routers.geoserver.rule=Host(`example.com`)
      - traefik.http.routers.geoserver.entrypoints=websecure
      - traefik.http.routers.geoserver.tls=true
      - traefik.http.routers.geoserver.tls.certresolver=lets-encrypt
      - traefik.http.middlewares.geoserver.replacepathregex.regex=(.*)
      - traefik.http.middlewares.geoserver.replacepathregex.replacement=/geoserver/$$1

networks:
  web:

After going through the traefik docs, I thought using replacepathregex on geoserver service should prepend /geoserver to the paths for all the requests passed to geoserver and should make the service available at example.com, instead of example.com/geoserver, but it didn't work.

I also tried addPrefix, but that didn't work either.

Is my configuration incorrect? Or my understanding of what those middlewares do? Is there a way to configure my service to be accessible at example.com, instead of example.com/geoserver?


Solution

  • Turned out the issue was my traefik config! I needed to add the middleware to the geoserver router. Here's the updated docker-compose.yml (I went with addprefix instead of replacepathregex because the latter was an overkill):

    version: "3"
    
    services:
      traefik:
        image: traefik:2.4
        restart: unless-stopped
        networks:
          - web
        ports:
          - 80:80
          - 443:443
        command:
          - --log.level=DEBUG
          - --providers=docker
          - --providers.docker.network=geoserver_web
          - --entrypoints.websecure.address=:443
          - --entrypoints.web.address=:80
          - --entrypoints.web.http.redirections.entrypoint.to=websecure
          - --entrypoints.web.http.redirections.entrypoint.scheme=websecure
          # - --api.dashboard=true
          - --certificatesresolvers.lets-encrypt.acme.email=admin@example.com
          - --certificatesresolvers.lets-encrypt.acme.storage=acme.json
          - --certificatesresolvers.lets-encrypt.acme.tlschallenge=true
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock:ro
          - ./letsencrypt:/letsencrypt
      
      geoserver:
        image: oscarfonts/geoserver:latest
        restart: unless-stopped
        networks:
          - web
        labels:
          - traefik.http.middlewares.add-geoserver-prefix.addprefix.prefix=/geoserver
          - traefik.port=8080
          - traefik.http.routers.geoserver.rule=Host(`example.com`)
          - traefik.http.routers.geoserver.entrypoints=websecure
          - traefik.http.routers.geoserver.tls=true
          - traefik.http.routers.geoserver.tls.certresolver=lets-encrypt
          - traefik.http.routers.geoserver.middlewares=add-geoserver-prefix@docker
    
    networks:
      web: