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.
Vers quoi pointe le proxy
Section intitulée « Vers quoi pointe le proxy »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.
Un proxy en conteneur a sa propre boucle locale, si bien que 127.0.0.1 n’y atteint
rien : chaque requête répond 502 et le journal du proxy dit connect() failed (111: Connection refused). Mettez plutôt le conteneur sur le réseau de la pile et atteignez
l’application par son nom :
docker network connect badlen_default my-proxy # avant de le démarrerL’amont est alors http://app:3001. Connectez le conteneur avant qu’il ne démarre :
nginx résout un nom d’amont une seule fois, au démarrage, et sort avec
host not found in upstream "app" s’il n’est pas encore sur le réseau. Rien n’a besoin
d’être publié sur l’hôte dans cette disposition.
Relever la taille du corps
Section intitulée « Relever la taille du corps »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 :
docker compose logs app | grep TRUSTED_PROXY_HOPSLa boucle de connexion
Section intitulée « La boucle de connexion »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.