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 :
- Servir HTTPS sur l’hôte de
APP_URLet transmettre àhttp://127.0.0.1:3000. - Transmettre
Hostet les en-têtesX-Forwarded-Proto/X-Forwarded-Host. - Ajouter l’adresse du client à
X-Forwarded-For(et non la remplacer par quelque chose envoyé par le client). - Accepter des corps de requête un peu plus grands que la taille des blocs d’envoi (8 Mo par défaut).
- 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;
}
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.
| Configuration | TRUST_PROXY_HOPS |
|---|---|
| Un proxy (Caddy, nginx ou Traefik) devant l’application | 1 (par défaut) |
| Un CDN ou un load balancer plus votre propre proxy | 2 |
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).