Créez votre fichier .env et .env.example en ligne. Presets Node.js, Laravel, Django, Next.js, Symfony, Vite. Ajoutez vos variables, marquez les secrets, téléchargez. 100% client-side.
Générateur de fichier .env
Charger un preset :
⚙️ Variables
🔒 = variable secrète (masquée dans .env.example)
📄 Aperçu .env
Le fichier .env : principe et fonctionnement
Le fichier .env est devenu l'un des éléments les plus essentiels de toute
application web moderne. Il centralise les variables d'environnement —
ces paramètres qui varient selon le contexte d'exécution (développement, staging,
production) et qui ne doivent jamais être codés en dur dans le code source.
Historique : la méthodologie Twelve-Factor App
En 2012, Adam Wiggins et l'équipe Heroku formalisent les bonnes pratiques du développement cloud-native dans le manifeste 12 Factor App. Le facteur III stipule clairement : "Store config in the environment". La règle d'or : la configuration varie selon les déploiements, le code non.
En 2013, le package dotenv pour Node.js (créé par Brandon Keepers)
popularise le fichier .env comme mécanisme standard. Chaque écosystème
a depuis développé son équivalent : python-dotenv,
vlucas/phpdotenv, godotenv, dotenv-rails…
Fonctionnement technique
Au démarrage de l'application, la bibliothèque dotenv lit le fichier .env
à la racine du projet et injecte chaque paire CLÉ=valeur dans les
variables d'environnement du processus. Ces variables sont ensuite accessibles via :
| Langage / Framework | Bibliothèque | Accès à la variable |
|---|---|---|
| Node.js | dotenv | process.env.MA_VARIABLE |
| PHP (Laravel) | vlucas/phpdotenv | env('MA_VARIABLE') ou $_ENV |
| Python (Django) | python-dotenv | os.environ.get('MA_VARIABLE') |
| Next.js / Vite | Intégré au framework | process.env.NEXT_PUBLIC_X / import.meta.env.VITE_X |
| Go | godotenv | os.Getenv("MA_VARIABLE") |
| Ruby on Rails | dotenv-rails | ENV['MA_VARIABLE'] |
PORT=8080 est défini dans l'environnement OS, il prendra la précédence
sur la valeur du .env.
Syntaxe et règles du format .env
Le format .env semble trivial mais cache plusieurs subtilités importantes
qui varient selon les implémentations.
Structure de base
# Commentaire (ligne entière)
VARIABLE_SIMPLE=valeur
PORT=3000
NODE_ENV=development
# Valeurs avec espaces → guillemets obligatoires
APP_NAME="Mon Application Web"
# Guillemets simples → valeur littérale (pas d'interpolation)
MESSAGE='Hello ${USER}'
# Valeur vide (autorisée)
DB_PASSWORD=
Règles d'échappement et guillemets
Le comportement des guillemets diffère selon les bibliothèques, mais la convention la plus répandue est :
| Syntaxe | Comportement | Exemple |
|---|---|---|
KEY=valeur |
Valeur brute, espaces ignorés | PORT=3000 |
KEY="valeur" |
Guillemets doubles : interpole \n, \t, $VAR |
MSG="Hello\nWorld" |
KEY='valeur' |
Guillemets simples : valeur littérale, pas d'interpolation | REGEX='^\d{4}$' |
# commentaire |
Ligne ignorée entièrement | # Production URL |
Interpolation de variables
Certaines bibliothèques (dotenv-expand, Laravel, Symfony) supportent
la référence de variables définies dans le même fichier :
APP_NAME="MonApp"
APP_URL=http://localhost
# Référence à APP_NAME dans une autre variable
MAIL_FROM_NAME="${APP_NAME} Notifications"
# → Résultat : "MonApp Notifications"
Valeurs multiligne (avancé)
Pour les clés privées RSA ou certificats, le saut de ligne s'encode avec
\n ou avec des guillemets doubles autour d'un vrai saut de ligne :
# Méthode 1 : \n explicite (plus compatible)
PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANB...\n-----END PRIVATE KEY-----"
# Méthode 2 : guillemets double + vrai saut de ligne
PRIVATE_KEY="-----BEGIN PRIVATE KEY-----
MIIEvQIBADANB...
-----END PRIVATE KEY-----"
\n est
recommandée car elle fonctionne avec toutes les implémentations dotenv,
y compris sur CI/CD où le fichier est souvent injecté comme variable de
pipeline.
Variables par écosystème
Chaque framework impose ses conventions sur le nommage et le chargement des variables d'environnement. Voici les spécificités essentielles.
Node.js avec dotenv
# Installation
npm install dotenv
# Chargement (en tout début de app.js / server.js)
require('dotenv').config();
# Ou en ES modules
import 'dotenv/config';
# Accès
const port = process.env.PORT || 3000;
const dbUrl = process.env.DATABASE_URL;
Depuis Node.js 20.6+, vous pouvez charger le .env sans aucune
bibliothèque via le flag natif --env-file :
node --env-file=.env server.js
Laravel (PHP)
Laravel utilise vlucas/phpdotenv et expose les valeurs via
le helper env() et la fonction config() :
# .env Laravel
APP_KEY=base64:votre-cle-generee-par-artisan
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
# Dans le code PHP
$debug = env('APP_DEBUG', false);
$dbHost = config('database.connections.mysql.host');
php artisan config:cache. Après chaque
modification du .env, relancez la commande.
Django (Python)
# Installation
pip install python-dotenv
# settings.py
from dotenv import load_dotenv
import os
load_dotenv() # charge .env depuis la racine
DEBUG = os.environ.get('DEBUG', 'False') == 'True'
SECRET_KEY = os.environ['SECRET_KEY'] # KeyError si manquant
DATABASES = {'default': {'ENGINE': 'django.db.backends.postgresql', 'NAME': os.getenv('DB_NAME')}}
# Alternative : django-environ (plus puissant)
import environ
env = environ.Env()
environ.Env.read_env()
DATABASE_URL = env('DATABASE_URL')
Next.js : NEXT_PUBLIC_ prefix
Next.js distingue les variables côté serveur des variables exposées au
navigateur via le préfixe NEXT_PUBLIC_ :
# Côté serveur uniquement (safe)
DATABASE_URL=postgresql://...
STRIPE_SECRET_KEY=sk_live_...
# Exposé au navigateur (NEXT_PUBLIC_ requis)
NEXT_PUBLIC_API_URL=https://api.example.com
NEXT_PUBLIC_STRIPE_PUBLIC_KEY=pk_live_...
# Accès côté client
const apiUrl = process.env.NEXT_PUBLIC_API_URL;
Vite : VITE_ prefix et import.meta.env
# .env (Vite n'expose QUE les variables VITE_)
VITE_API_BASE_URL=http://localhost:3001
VITE_APP_TITLE=Mon App
# Accès dans React/Vue
const apiUrl = import.meta.env.VITE_API_BASE_URL;
const isDev = import.meta.env.DEV; // built-in
const isProd = import.meta.env.PROD; // built-in
const mode = import.meta.env.MODE; // 'development' | 'production'
Symfony : .env en cascade
Symfony gère plusieurs fichiers .env en cascade avec une
priorité définie :
| Fichier | Commité | Usage |
|---|---|---|
.env | ✅ Oui | Valeurs par défaut du projet |
.env.local | ❌ Non | Surcharges locales (jamais en prod) |
.env.test | ✅ Oui | Valeurs spécifiques aux tests |
.env.prod | ❌ Non | Variables de production (serveur) |
.env.prod.local | ❌ Non | Secrets de production locaux |
Sécurité : ne jamais committer son .env
La règle d'or est absolue : le fichier .env ne doit
jamais être versionné. Les conséquences d'une fuite peuvent être
catastrophiques : accès à vos bases de données, usurpation de votre identité
sur des APIs tierces, frais AWS exorbitants.
Configuration .gitignore obligatoire
# .gitignore
.env
.env.local
.env.*.local
.env.production
!.env.example # Committer UNIQUEMENT le template sans secrets
- Ajouter
.envau.gitignoredèsgit init - Vérifier avec
git statusque le fichier est bien ignoré - Scanner l'historique git :
git log --all -- .env - Si commité par erreur : révoquer tous les secrets immédiatement
- Utiliser
git filter-repopour purger l'historique (jamais git rewrite sans sauvegarde)
Outils de détection de secrets
# git-secrets (AWS)
git secrets --install
git secrets --add 'password\s*=\s*.+'
# truffleHog (scan de l'historique git)
trufflehog git file://. --since-commit HEAD~10
# detect-secrets (Yelp)
detect-secrets scan --update .secrets.baseline
detect-secrets audit .secrets.baseline
Gestionnaires de secrets recommandés
Pour les équipes et la production, préférez un gestionnaire de secrets
centralisé plutôt que des fichiers .env copiés manuellement :
| Outil | Usage | Avantage clé |
|---|---|---|
| HashiCorp Vault | Entreprise, self-hosted | Audit trail, rotation automatique |
| AWS Secrets Manager | AWS-native | Intégration IAM, rotation Lambda |
| Doppler | SaaS multi-env | Sync env vers CI/CD, Teams |
| 1Password Secrets | Équipes dev | Partage sécurisé entre développeurs |
| dotenv-vault | SaaS dotenv | Chiffrement du .env, CLI simple |
Le duo .env / .env.example
La convention du duo .env / .env.example est
un standard de facto dans tous les écosystèmes. Elle résout élégamment
la tension entre sécurité et documentation.
Principe
| Fichier | Commité dans git | Contenu |
|---|---|---|
.env |
❌ JAMAIS | Vraies valeurs, clés API, mots de passe réels |
.env.example |
✅ Toujours | Template avec toutes les clés, valeurs de démo ou placeholders |
Onboarding d'un nouveau développeur
# 1. Cloner le projet
git clone https://github.com/mon-org/mon-projet
# 2. Copier le template
cp .env.example .env
# 3. Remplir les valeurs réelles dans .env
nano .env # ou vim, VS Code…
# 4. Lancer l'application
npm start
Notre générateur inclut un mode "Masquer les valeurs" qui
transforme automatiquement votre .env en .env.example :
les variables marquées comme secrètes (🔒) reçoivent un placeholder du type
your-jwt-secret-here, tandis que les valeurs non-sensibles
(ports, modes, URLs locales) sont conservées intactes.
README.md, documentez
chaque variable du .env.example avec son rôle, sa valeur attendue
et comment l'obtenir. C'est le premier endroit qu'un nouveau collaborateur
consultera.
Gestion des secrets en CI/CD
Sur les pipelines CI/CD, vous ne pouvez pas avoir de fichier .env
physique. Les secrets sont injectés via les mécanismes natifs de chaque plateforme.
GitHub Actions
# Définir les secrets dans : Settings → Secrets and variables → Actions
# .github/workflows/deploy.yml
jobs:
deploy:
steps:
- name: Build
env:
DATABASE_URL: ${{ secrets.DATABASE_URL }}
JWT_SECRET: ${{ secrets.JWT_SECRET }}
NODE_ENV: production
run: npm run build
# Ou générer un .env à la volée
- name: Create .env
run: |
echo "DATABASE_URL=${{ secrets.DATABASE_URL }}" >> .env
echo "JWT_SECRET=${{ secrets.JWT_SECRET }}" >> .env
echo "NODE_ENV=production" >> .env
Docker et docker-compose
# Méthode 1 : --env-file (recommandé)
docker run --env-file .env mon-image
# Méthode 2 : variables individuelles
docker run -e PORT=3000 -e NODE_ENV=production mon-image
# docker-compose.yml
services:
app:
image: mon-image
env_file:
- .env # .env local
environment:
- NODE_ENV=production # surcharge possible
Kubernetes Secrets
# Créer un secret Kubernetes depuis un fichier .env
kubectl create secret generic app-secrets --from-env-file=.env
# Ou depuis des valeurs individuelles
kubectl create secret generic app-secrets \
--from-literal=JWT_SECRET=ma-cle-secrete \
--from-literal=DATABASE_URL=postgresql://...
# Référencer dans un Deployment
env:
- name: JWT_SECRET
valueFrom:
secretKeyRef:
name: app-secrets
key: JWT_SECRET
.env localement :
doppler run -- npm start.
FAQ
Pourquoi mon .env ne se charge-t-il pas en production ?
En production (Heroku, Vercel, Railway, Docker…), les variables d'environnement
sont injectées directement par la plateforme, sans passer par un fichier
.env. C'est intentionnel pour la sécurité. Configurez vos variables
dans le dashboard ou CLI de votre plateforme.
Quelle différence entre .env et .env.local ?
.env contient les valeurs partagées (peut être commité dans
certains frameworks comme Symfony). .env.local est pour les
surcharges personnelles du développeur et n'est jamais commité. Les variables
de .env.local ont priorité sur .env.
Comment générer une clé secrète sécurisée ?
# OpenSSL (universel)
openssl rand -base64 64
# Node.js
node -e "console.log(require('crypto').randomBytes(64).toString('hex'))"
# Python
python -c "import secrets; print(secrets.token_hex(64))"
# PHP
php -r "echo bin2hex(random_bytes(32)) . PHP_EOL;"
Puis-je utiliser des commentaires inline ?
La plupart des implémentations n'supportent pas les
commentaires en fin de ligne (PORT=3000 # commentaire). Le
# sera inclus dans la valeur. Préférez les commentaires
sur des lignes dédiées, au-dessus de la variable.
Comment gérer plusieurs environnements (.env.staging, .env.prod) ?
# Charger un fichier .env spécifique selon l'environnement
NODE_ENV=staging node -r dotenv/config app.js dotenv_config_path=.env.staging
# Ou en code
require('dotenv').config({ path: `.env.${process.env.NODE_ENV}` });
# Avec dotenv-flow (gestion cascade automatique)
npm install dotenv-flow
require('dotenv-flow').config();
# Charge : .env, .env.local, .env.[NODE_ENV], .env.[NODE_ENV].local
Conclusion
Le fichier .env est un pilier fondamental du développement
moderne : il sépare proprement la configuration du code, facilite
l'onboarding des développeurs et protège vos secrets en production.
La pratique du duo .env / .env.example et
l'ajout systématique de .env dans le .gitignore
sont des réflexes à adopter dès le premier commit.
Pour les équipes en croissance, les gestionnaires de secrets comme
Doppler, HashiCorp Vault ou AWS Secrets Manager offrent une solution
centralisée, auditée et sans fichier plat sensible sur les machines
des développeurs. Notre générateur vous aide à démarrer rapidement
avec les conventions de chaque framework et à produire un
.env.example documenté pour vos collaborateurs.