Aller au contenu

Derrière un proxy

Pointez votre proxy vers le WEB_PORT publié et laissez-le terminer HTTPS. Deux variables doivent alors suivre dans .env, et la pile être redémarrée : PUBLIC_URL est l’adresse publique sur laquelle vous servez l’application, et COOKIE_SECURE=true marque le cookie de session comme réservé à HTTPS.

L’endroit où tourne le proxy lui-même décide de l’amont.

Le port publié s’atteint à 127.0.0.1:8080, la seule adresse où BIND_ADDRESS=127.0.0.1 le laisse et le réglage qui ferme l’instance à tout sauf au proxy.

L’application accepte des requêtes jusqu’à 25 Mo, qui est la taille qu’atteint l’export JSON d’une instance pleine et à laquelle il doit être réimporté. nginx accepte 1 Mo par défaut et répond à tout ce qui dépasse par sa propre page 413 Request Entity Too Large. La requête n’atteint jamais Badlen, donc le journal de l’application n’en garde rien. Mettez client_max_body_size 25m; dans le bloc location proxifié pour accorder les deux.

Dire à l’application combien de proxies sont devant

Section intitulée « Dire à l’application combien de proxies sont devant »

Derrière un proxy, chaque requête arrive du proxy, et deux choses lisent une adresse sur une requête. Les limites de débit se comptent par adresse, si bien que la limite de dix par minute sur les routes qui vérifient un mot de passe devient dix par minute pour tout le foyer, et qu’une personne qui se trompe deux fois de frappe verrouille tous les autres. Et chaque session sous Réglages → Sécurité est montrée à l’adresse depuis laquelle elle a été ouverte, si bien que chaque appareil de la maison est listé à la même.

TRUSTED_PROXY_HOPS=1 rend aux deux leur lecteur. Le nombre est un pour un seul nginx ou Caddy, deux si quelque chose comme un CDN se tient devant celui-là. Il se lit comme un décompte depuis la fin de l’en-tête X-Forwarded-For, parce que chaque proxy y ajoute l’adresse dont il a reçu la requête : avec un proxy devant, la dernière adresse de cet en-tête est celle qu’a écrite votre proxy. Un client qui invente un en-tête à lui ne fait que pousser cette invention plus à gauche, et c’est toute la raison pour laquelle le décompte vient de vous et non de l’en-tête. Trop bas, et c’est le proxy extérieur qui est compté ; trop haut, et il n’existe pas d’adresse à ce rang, si bien que les deux retombent sur l’adresse de connexion et que le journal le dit, une fois par minute :

Fenêtre de terminal
docker compose logs app | grep TRUSTED_PROXY_HOPS

COOKIE_SECURE=true est le seul réglage qui puisse vous renvoyer indéfiniment à la page de connexion. Le navigateur garde un cookie marqué ainsi sur une origine HTTPS et le jette sur une origine en clair, localhost excepté. Atteindre la même instance directement à http://<lan-ip>:8080 pendant qu’il est posé vous connecte et perd la session sur-le-champ : la connexion répond 201, l’application s’ouvre, la première navigation retombe sur la page de connexion, et rien nulle part ne dit pourquoi. Passez par le proxy, ou posez COOKIE_SECURE=false tant qu’il n’y a pas d’HTTPS devant.

Une dernière chose que le navigateur décide seul : un certificat auquel il ne fait pas confiance, y compris auto-signé, coûte l’application installable. Il refuse d’enregistrer le service worker et imprime une erreur SSL dans la console. L’interface et les données n’en souffrent pas.

Confidentialité