GeoServer mit Docker hinter Nginx-Proxy-Manager

2 Minuten Lesedauer

Docker und der Nginx Proxy Manager sind für mich ein Match made in Heaven. Die Möglichkeit, per Docker nahezu beliebige Dienste auf meine Server zu packen und dabei das Grundsystem nicht mit unübersichtlichen und schwer zu dokumentierenden Konfigurationen zu verändern, ist an sich schon großartig. Diese ganzen Dienste aber mit einer aufgeräumten und gut funktionierenden Weboberfläche nach außen verfügbar zu machen, erleichtert einiges an Arbeit.

Für unser Forschungsprojekt gibt es Bedarf, räumliche Daten zu visualisieren. Um das dienstebasiert zu erreichen, gibt es u.a. Projekte wie den GeoServer, um die Daten standardisiert als WMS- oder WFS-Dienst zu veröffentlichen. Bisher war ich mehr der Freund des QGIS-Servers, für Endanwender scheint mit der GeoServer aber komfortabler zu sein, also sollte es dieser werden.

Das Unternehmen Kartoza stellt auf GitHub viele Dockerfiles und docker-compose.yml-Dateien zur Verfügung, um unkompliziert die gängigen FOSS-GIS-Tools zu verwenden, auch für den GeoServer.

Per Docker Compose und der angepassten .env-Datei ist das Ganze dann innerhalb weniger Minuten gestartet und einsatzbereit. Die Einbindung einer passenden Subdomain über den Nginx Proxy Manager funktionierte augenscheinlich reibungslos, bis dann doch einige Problemchen aufgetreten sind:

  1. Obwohl eine aktive SSL-Verschlüsselung im Browser angezeigt wurde, gibt u.a. das Login-Formularfeld die Warnung an, dass die Daten unverschlüsselt versendet werden.
  2. Das Wechseln von Menü-Reitern im GeoServer mündet in einem 404-Fehler, die entsprechenden JavaScript-Skripte um die Reiter zu wechseln, können nicht geladen werden.

Es hat ein wenig gedauert bis eine Lösung gefunden war. Wäre ich fitter bei der Konfiguration vom GeoServer, wäre das vermutlich schneller gegangen, die Problematik wird in der (ansonsten recht umfangreichen) Dokumentation des Dockerfiles und der möglichen Umgebungsvariablen von Kartoza nicht thematisiert. Die Lösung des Ganzen? Die Umgebungsvariablen GEOSERVER_CSRF_WHITELIST und PROXY_BASE_URL mit passenden Werten der entsprechenden Domain egänzen. In der docker-compose.yml sieht der Abschnitt dann wie folgt aus:

 1geoserver:
 2  image: kartoza/geoserver:${GS_VERSION}
 3  container_name: geoserver
 4  volumes:
 5    - geoserver-data:/opt/geoserver/data_dir
 6  restart: on-failure
 7  environment:
 8    - GEOSERVER_DATA_DIR=${GEOSERVER_DATA_DIR}
 9    - GEOWEBCACHE_CACHE_DIR=${GEOWEBCACHE_CACHE_DIR}
10    - GEOSERVER_ADMIN_PASSWORD=${GEOSERVER_ADMIN_PASSWORD}
11    - GEOSERVER_ADMIN_USER=${GEOSERVER_ADMIN_USER}
12    - INITIAL_MEMORY=${INITIAL_MEMORY}
13    - MAXIMUM_MEMORY=${MAXIMUM_MEMORY}
14    - GEOSERVER_CSRF_WHITELIST=geoserver.example.com
15    - PROXY_BASE_URL=https://geoserver.example.com/geoserver
16  depends_on:
17    db:
18      condition: service_healthy
19  healthcheck:
20    test: curl --fail -s http://localhost:8080/ || exit 1
21    interval: 1m30s
22    timeout: 10s
23    retries: 3
24  networks:
25    - nginx-proxy-manager_default

Damit mich das in Zukunft nicht noch einmal Lebenszeit kostet, dient das hier auch als Dokumentation für mich selbst. 😄