Add production dependencies introduced in recent security commits. Add docs/ENVIRONMENT_VARIABLES.md documenting TRUST_PROXY, SECRET, SESSION_SECRET, and ALLOWED_ORIGINS with configuration guidance.
2.9 KiB
Variables d'environnement — Adastra API
Référence pour les variables sensibles ou non-triviales. Pour les valeurs par défaut et la liste exhaustive, voir config/env/.env.example.
TRUST_PROXY
Fichier concerné : src/createApp.js
Utilisé par : express-rate-limit (IP réelle du client), req.ip
Principe
Indique à Express combien de proxies se trouvent entre internet et le process Node. Sans cette valeur, req.ip retourne l'IP du proxy (127.0.0.1) au lieu de l'IP du client réel, ce qui rend le rate limiting inefficace (toutes les requêtes semblent venir de la même IP).
Valeurs selon la topologie
| Environnement | Topologie | Valeur |
|---|---|---|
| Dev local | Node exposé directement, pas de proxy | ne pas setter (variable absente) |
| Prod — serveur seul | nginx → Node sur le même serveur | 1 |
| Prod — cloud avec LB | nginx → load balancer → Node | 2 |
| Confiance totale | Tous les proxies de la chaîne X-Forwarded-For |
true (déconseillé) |
Règle générale :
TRUST_PROXY= nombre de proxies entre internet et Node.
Vérification empirique
Ajouter temporairement cette route et appeler /debug-ip depuis l'extérieur :
app.get('/debug-ip', (req, res) => {
res.json({
ip: req.ip,
ips: req.ips,
xForwardedFor: req.headers['x-forwarded-for']
});
});
req.ipretourne l'IP réelle du client → valeur correctereq.ipretourne127.0.0.1ou l'IP du proxy → augmenter de 1req.ipsest vide malgré un proxy → idem
Supprimer la route après vérification.
Implémentation actuelle
if (process.env.TRUST_PROXY) {
app.set('trust proxy', parseInt(process.env.TRUST_PROXY, 10) || process.env.TRUST_PROXY);
}
Le cast parseInt(...) || process.env.TRUST_PROXY permet de passer soit un entier ("1" → 1) soit la chaîne "true".
SECRET
Fichier concerné : src/config/index.js
Utilisé par : signature JWT, HMAC-SHA256 des API keys, secret de session Express
Valeur obligatoire en production — le process refuse de démarrer si elle est absente. Générer avec :
node -e "console.log(require('crypto').randomBytes(64).toString('hex'))"
SESSION_SECRET
Fichier concerné : src/createApp.js
Utilisé par : express-session
Indépendant de SECRET pour limiter la surface d'impact si l'un des deux est compromis. Même commande de génération que SECRET. Fallback sur SECRET si absent (rétrocompatibilité).
ALLOWED_ORIGINS
Fichier concerné : src/createApp.js
Utilisé par : CORS
Liste d'origines autorisées, séparées par des virgules. Si absente ou vide, CORS refuse toutes les origines cross-domain.
ALLOWED_ORIGINS=http://localhost:4200,http://localhost:4300
En production, indiquer uniquement le domaine du frontend (ex: https://adastra.example.com).