00b2c5db85
Config ciblée sur le backend n8n existant — juste le delta à appliquer. Token requis uniquement hors LAN/IP fixe, LAN reste en accès direct. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
97 lines
2.6 KiB
Markdown
97 lines
2.6 KiB
Markdown
# 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
|
|
```
|