Aller au contenu principal

Reverse proxy et TLS

L’application écoute en HTTP simple, sur le port 3000. Placez devant elle un reverse proxy qui termine le TLS (HTTPS) sur votre domaine. N’exposez pas directement le port 3000 sur Internet : c’est le proxy qui rend les adresses des clients fiables.

Ce que tout proxy doit faire :

  1. Servir HTTPS sur l’hôte de APP_URL et transmettre à http://127.0.0.1:3000.
  2. Transmettre Host et les en-têtes X-Forwarded-Proto / X-Forwarded-Host.
  3. Ajouter l’adresse du client à X-Forwarded-For (et non la remplacer par quelque chose envoyé par le client).
  4. Accepter des corps de requête un peu plus grands que la taille des blocs d’envoi (8 Mo par défaut).
  5. Accepter des réponses longues pour les téléchargements et les exports (pas de délais de lecture courts).

Caddy​

Caddy obtient et renouvelle les certificats tout seul et définit les en-têtes de transmission par défaut.

flow.example.com {
encode zstd gzip
reverse_proxy 127.0.0.1:3000
}

Caddy n’a pas de limite de taille du corps de requête par défaut.

nginx​

server {
listen 443 ssl;
http2 on;
server_name flow.example.com;

ssl_certificate /etc/letsencrypt/live/flow.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/flow.example.com/privkey.pem;

# uploads arrive in chunks (default 8 MB): allow a bit more, and stream them through
client_max_body_size 16m;
proxy_request_buffering off;

location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_read_timeout 300s;
}
}

server {
listen 80;
server_name flow.example.com;
return 301 https://$host$request_uri;
}
La limite de corps par défaut de nginx est de 1 Mo

Sans client_max_body_size, les envois échouent dès qu’un bloc dépasse 1 Mo. Si vous désactivez le découpage dans Admin → Général → Envoi de fichiers, la limite doit être supérieure au plus gros fichier autorisé.

Traefik​

Avec le provider Docker, ajoutez des labels au service app (et retirez son mappage ports:) :

labels:
- traefik.enable=true
- traefik.http.routers.sol2flow.rule=Host(`flow.example.com`)
- traefik.http.routers.sol2flow.entrypoints=websecure
- traefik.http.routers.sol2flow.tls.certresolver=letsencrypt
- traefik.http.services.sol2flow.loadbalancer.server.port=3000

Traefik ajoute l’adresse à X-Forwarded-For et n’a pas de limite de corps par défaut.

Adresses IP des clients​

sol2flow utilise l’adresse IP du client pour les limites de débit (par exemple contre les tentatives de deviner un mot de passe) et l’affiche dans la liste des sessions. Chaque proxy ajoute à X-Forwarded-For l’adresse dont il a reçu la requête ; sol2flow prend l’entrée située à TRUST_PROXY_HOPS positions en partant de la droite. Les entrées plus à gauche viennent du client et peuvent être falsifiées.

ConfigurationTRUST_PROXY_HOPS
Un proxy (Caddy, nginx ou Traefik) devant l’application1 (par défaut)
Un CDN ou un load balancer plus votre propre proxy2

Si la valeur est trop basse, tout le monde semble venir de l’adresse de votre proxy et partage la même limite de débit. Si elle est trop haute, les clients peuvent choisir leur propre adresse.

Sous-chemins​

sol2flow doit tourner à la racine de son propre nom d’hôte (https://flow.example.com/), et non sous un chemin comme https://example.com/flow/.

Après un changement de domaine​

APP_URL doit correspondre à la nouvelle adresse. Deux choses sont liées au nom d’hôte :

  • Les clés d’accès ne fonctionnent que sur l’hôte pour lequel elles ont été créées : il faut les ajouter à nouveau après un changement de domaine (on peut toujours se connecter avec son mot de passe ou l’authentification unique).
  • Authentification unique : mettez à jour l’URI de redirection enregistrée auprès de chaque fournisseur d’identité (affichée dans Admin → Authentification).