# Configuration HAProxy pour n8n Pilot ## Contexte n8n est déjà exposé via HAProxy à `https://n8n.gyozamancave.fr`. Il suffit d'ajouter la validation du `X-App-Token` dans le backend existant **sans toucher au frontend**. --- ## Modification à apporter — backend n8n uniquement Remplacer le backend `n8n-backend` actuel par : ```haproxy backend n8n-backend mode http balance source # IPs qui ne nécessitent pas le X-App-Token (LAN + IP fixe perso) acl is_local src 192.168.1.0/24 192.168.2.0/24 82.67.3.126/32 # Validation du token pour les accès extérieurs (mobile app) acl valid_app_token req.hdr(X-App-Token) -m str "VOTRE_TOKEN_ICI" http-request deny deny_status 403 if !is_local !valid_app_token # Supprimer le token avant de forwarder à n8n (n8n ne doit pas le voir) http-request del-header X-App-Token http-request set-header X-Forwarded-Proto https if { ssl_fc } http-request set-header X-Real-IP %[src] http-request set-header X-Forwarded-For %[src] http-request set-header Host %[req.hdr(host)] option forwardfor server n8n 192.168.1.56:5678 ``` **Logique** : - Depuis le LAN (`192.168.1/2.x`) ou ton IP fixe → accès direct, pas de token requis (navigation normale dans n8n) - Depuis l'extérieur (mobile app 4G/5G) → `X-App-Token` obligatoire, sinon 403 --- ## Appliquer la modification ```bash # Valider la syntaxe avant rechargement haproxy -f /etc/haproxy/haproxy.cfg -c # Rechargement gracieux (sans coupure) systemctl reload haproxy ``` --- ## Générer un token solide ```bash openssl rand -hex 32 ``` Copier la valeur générée dans : 1. La config HAProxy (`VOTRE_TOKEN_ICI` ci-dessus) 2. L'app Android : Paramètres > Token HAProxy > Sauvegarder --- ## Rotation du token 1. Générer un nouveau token (`openssl rand -hex 32`) 2. Ajouter temporairement les **deux** ACLs dans HAProxy pour éviter les coupures : ```haproxy acl valid_app_token req.hdr(X-App-Token) -m str "ANCIEN_TOKEN" acl valid_app_token_new req.hdr(X-App-Token) -m str "NOUVEAU_TOKEN" http-request deny deny_status 403 if !is_local !valid_app_token !valid_app_token_new ``` 3. Mettre à jour le token dans l'app (Paramètres > Token HAProxy) 4. Retirer l'ancien token de la config HAProxy 5. `systemctl reload haproxy` --- ## Troubleshooting **403 depuis l'app** → token absent ou incorrect. Tester : ```bash curl -v -H "X-App-Token: VOTRE_TOKEN" https://n8n.gyozamancave.fr/api/v1/workflows ``` **403 depuis le navigateur** → vérifier que l'IP source est bien dans `is_local`. Depuis un VPN ou tethering, l'IP peut ne pas matcher. **Logs HAProxy en direct** : ```bash journalctl -u haproxy -f ```