Zum Hauptinhalt springen

Reverse Proxy

Vor dem OpenVLE-Backend und -Frontend sollte ein Reverse Proxy eingesetzt werden. Dieser übernimmt die SSL-Terminierung, leitet Anfragen an die richtigen Dienste weiter und kann optional Load Balancing bereitstellen.

Voraussetzungen

  • Drei Dienste müssen über den Reverse Proxy erreichbar sein:
    • Backend API (Port 8000) — Pfad /v1/
    • Frontend (Port 80) — alle übrigen Pfade
    • Apache Guacamole (Port 8080) — separate Subdomain (z. B. desktop.example.com) (optional, nur wenn Guacamole über diesen Reverse Proxy erreichbar sein soll)
  • Zwei Hostnamen müssen konfiguriert sein (z. B. openvle.example.com und desktop.example.com) — ohne Guacamole reicht ein einzelner Hostname
  • SSL-Zertifikate für beide Hostnamen (z. B. via Let's Encrypt)
  • WebSocket-Support für Guacamole (erforderlich für Remote-Desktop-Verbindungen) (nur bei Guacamole-Anbindung)
Guacamole optional

Die Guacamole-Konfiguration in den folgenden Beispielen ist optional. Falls du Guacamole nicht verwendest oder Guacamole über einen eigenen Reverse Proxy auf einem separaten Server betreibst, kannst du die Guacamole-bezogenen Abschnitte (Subdomain desktop.example.com, Port 8080) weglassen.

Konfiguration

Wir empfehlen Traefik, da es nativ als Docker-Container betrieben werden kann und sich dynamisch über Docker-Labels konfigurieren lässt — ideal für ein Docker-Compose-basiertes Setup wie OpenVLE. Alternativ sind auch HAProxy, Caddy, Nginx oder Apache möglich.

Traefik lässt sich als zusätzlicher Service direkt im Docker-Compose-Stack betreiben. Die Konfiguration erfolgt über Labels an den einzelnen Services — es sind keine separaten Konfigurationsdateien nötig.

hinweis

Dies ist eine docker-compose.override.yml — die eigentliche docker-compose.yml des Backends und Frontends wird weiterhin benötigt.

---
services:

traefik:
image: traefik:v3.1
container_name: traefik
restart: unless-stopped
ports:
- 0.0.0.0:80:80
- 0.0.0.0:443:443
command:
# Provider
- --providers.docker=true
- --providers.docker.exposedbydefault=false
# EntryPoints
- --entrypoints.web.address=:80
- --entrypoints.websecure.address=:443
# HTTP → HTTPS Redirect
- --entrypoints.web.http.redirections.entrypoint.to=websecure
- --entrypoints.web.http.redirections.entrypoint.scheme=https
# ACME (Let's Encrypt)
- --certificatesresolvers.letsencrypt.acme.email=admin@example.com
- --certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json
- --certificatesresolvers.letsencrypt.acme.httpchallenge=true
- --certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./certs:/letsencrypt
labels:
- traefik.enable=true

backend:
labels:
- traefik.enable=true
- traefik.http.routers.backend.rule=Host(`openvle.example.com`) && PathPrefix(`/v1/`)
- traefik.http.routers.backend.entrypoints=websecure
- traefik.http.routers.backend.tls=true
- traefik.http.routers.backend.tls.certresolver=letsencrypt
- traefik.http.routers.backend.priority=200
- traefik.http.services.backend.loadbalancer.server.port=8000

frontend:
labels:
- traefik.enable=true
- traefik.http.routers.frontend.rule=Host(`openvle.example.com`) && PathPrefix(`/`)
- traefik.http.routers.frontend.entrypoints=websecure
- traefik.http.routers.frontend.tls=true
- traefik.http.routers.frontend.tls.certresolver=letsencrypt
- traefik.http.routers.frontend.priority=100
- traefik.http.services.frontend.loadbalancer.server.port=80

# Optional: Nur erforderlich wenn Guacamole über diesen Reverse Proxy erreichbar sein soll
guacamole:
labels:
- traefik.enable=true
- traefik.http.routers.guacamole.rule=Host(`desktop.example.com`)
- traefik.http.routers.guacamole.entrypoints=websecure
- traefik.http.routers.guacamole.tls=true
- traefik.http.routers.guacamole.tls.certresolver=letsencrypt
- traefik.http.services.guacamole.loadbalancer.server.port=8080
Anpassungen
  • Ersetze openvle.example.com und desktop.example.com mit deinen Hostnamen
  • Ersetze admin@example.com mit deiner E-Mail-Adresse für Let's Encrypt
  • Die priority des Backend-Routers muss höher sein als die des Frontends, damit /v1/-Anfragen korrekt geroutet werden

Verifizierung

Nach der Konfiguration des Reverse Proxys:

  1. HTTPS-Zugang prüfenhttps://openvle.example.com sollte das Frontend anzeigen
  2. API-Zugang prüfenhttps://openvle.example.com/v1/system/settings sollte eine JSON-Antwort mit den aktuellen Systemeinstellungen zurückgeben. Eine leere oder fehlerhafte Antwort deutet auf eine falsche Routing-Konfiguration hin.
  3. Guacamole-Zugang prüfen (falls konfiguriert)https://desktop.example.com sollte die Guacamole-Anmeldeseite anzeigen
  4. HTTP-Redirect prüfenhttp://openvle.example.com sollte auf HTTPS umleiten

Fehlerbehebung

ProblemLösung
SSL-ZertifikatsfehlerStelle sicher, dass die Zertifikatspfade korrekt konfiguriert sind und die Zertifikate gültig sind. Bei Let's Encrypt: prüfe ob Port 80 von außen erreichbar ist.
502 Bad GatewayDer Zieldienst ist nicht erreichbar. Prüfe ob die Container laufen (docker ps -a) und die IP-Adressen/Ports in der Proxy-Konfiguration stimmen.
WebSocket-Fehler bei GuacamoleStelle sicher, dass die WebSocket-Headers (Upgrade, Connection) in der Proxy-Konfiguration gesetzt sind (siehe Nginx-Beispiel).
Frontend erreichbar, API-Calls schlagen fehlPrüfe ob die Routing-Regeln für /v1/ korrekt zum Backend weiterleiten und nicht ans Frontend. Bei Traefik: die priority des Backend-Routers muss höher sein als die des Frontends.