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
?
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: