Aller au contenu principal

Reverse Proxy

Un reverse proxy doit être placé devant le backend et le frontend d'OpenVLE. Il prend en charge la terminaison SSL, redirige les requêtes vers les bons services et peut optionnellement fournir un équilibrage de charge.

Prérequis

  • Trois services doivent être accessibles via le reverse proxy :
    • Backend API (port 8000) — chemin /v1/
    • Frontend (port 80) — tous les autres chemins
    • Apache Guacamole (port 8080) — sous-domaine séparé (par ex. desktop.example.com) (optionnel, uniquement si Guacamole doit être accessible via ce reverse proxy)
  • Deux noms d'hôte doivent être configurés (par ex. openvle.example.com et desktop.example.com) — sans Guacamole, un seul nom d'hôte suffit
  • Certificats SSL pour les deux noms d'hôte (par ex. via Let's Encrypt)
  • Support WebSocket pour Guacamole (nécessaire pour les connexions bureau à distance) (uniquement lors de la connexion à Guacamole)
Guacamole optionnel

La configuration de Guacamole dans les exemples suivants est optionnelle. Si vous n'utilisez pas Guacamole ou si Guacamole fonctionne via son propre reverse proxy sur un serveur séparé, vous pouvez omettre les sections relatives à Guacamole (sous-domaine desktop.example.com, port 8080).

Configuration

Nous recommandons Traefik, car il peut fonctionner nativement comme conteneur Docker et se configure dynamiquement via des labels Docker — idéal pour un déploiement basé sur Docker Compose comme OpenVLE. Alternativement, HAProxy, Caddy, Nginx ou Apache sont également possibles.

Traefik peut être exploité comme service supplémentaire directement dans le stack Docker Compose. La configuration se fait via des labels sur les différents services — aucun fichier de configuration séparé n'est nécessaire.

remarque

Il s'agit d'un fichier docker-compose.override.yml — le fichier docker-compose.yml du backend et du frontend reste nécessaire.

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

# Optionnel : uniquement nécessaire si Guacamole doit être accessible via ce reverse proxy
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
Adaptations
  • Remplacez openvle.example.com et desktop.example.com par vos noms d'hôte
  • Remplacez admin@example.com par votre adresse e-mail pour Let's Encrypt
  • La priority du routeur backend doit être supérieure à celle du frontend, afin que les requêtes /v1/ soient correctement routées

Vérification

Après la configuration du reverse proxy :

  1. Vérifier l'accès HTTPShttps://openvle.example.com devrait afficher le frontend
  2. Vérifier l'accès à l'APIhttps://openvle.example.com/v1/system/settings devrait renvoyer une réponse JSON contenant les paramètres système actuels. Une réponse vide ou erronée indique une configuration de routage incorrecte.
  3. Vérifier l'accès à Guacamole (si configuré)https://desktop.example.com devrait afficher la page de connexion de Guacamole
  4. Vérifier la redirection HTTPhttp://openvle.example.com devrait rediriger vers HTTPS

Dépannage

ProblèmeSolution
Erreur de certificat SSLAssurez-vous que les chemins des certificats sont correctement configurés et que les certificats sont valides. Avec Let's Encrypt : vérifiez que le port 80 est accessible depuis l'extérieur.
502 Bad GatewayLe service cible n'est pas accessible. Vérifiez que les conteneurs sont en cours d'exécution (docker ps -a) et que les adresses IP/ports dans la configuration du proxy sont corrects.
Erreur WebSocket avec GuacamoleAssurez-vous que les en-têtes WebSocket (Upgrade, Connection) sont définis dans la configuration du proxy (voir l'exemple Nginx).
Frontend accessible, les appels API échouentVérifiez que les règles de routage pour /v1/ redirigent correctement vers le backend et non vers le frontend. Avec Traefik : la priority du routeur backend doit être supérieure à celle du frontend.