n8n Docker : Guide Complet d'Installation et Configuration (2026)
Installer n8n avec Docker est la façon la plus rapide de déployer votre propre instance d'automatisation. Ce guide pas-à-pas couvre Docker, Docker Compose, HTTPS et les variables d'environnement essentielles.
n8n Docker : Guide Complet d'Installation et Configuration (2026)
Quinze minutes pour passer d'un serveur vide à une instance d'automatisation que vous contrôlez à 100 %.
Installer n8n avec Docker est aujourd'hui la méthode la plus fiable pour héberger votre propre moteur d'automatisation. En quelques commandes, vous obtenez une instance n8n isolée, reproductible et facile à mettre à jour — sans payer l'abonnement cloud et sans confier vos données à un tiers. C'est exactement ce que recherchent les équipes qui veulent garder la maîtrise de leurs workflows, de leurs credentials et de leur conformité.
Ce guide va beaucoup plus loin qu'un simple « copier-coller ». Vous y trouverez un docker-compose.yml complet et commenté (n8n + PostgreSQL + volumes), les variables d'environnement réellement importantes, trois options de reverse proxy HTTPS (Caddy, Nginx, Traefik), une stratégie de sauvegarde, la marche à suivre pour mettre à jour sans perte de données, et le mode queue pour encaisser la montée en charge. Tout est pensé pour une instance prod-ready.
Pourquoi installer n8n avec Docker plutôt qu'en natif ?
Avant de plonger dans les commandes, comprenons pourquoi Docker s'est imposé comme le standard de déploiement de n8n.
- Isolation complète : n8n tourne dans son propre conteneur, avec sa version de Node.js et ses dépendances. Aucun conflit avec les autres services de votre serveur.
- Mise à jour en une commande : remplacer une image par une version plus récente se fait avec
docker compose pullpuisup -d. Pas de gestion manuelle de paquets. - Données persistantes : les volumes Docker conservent vos workflows, vos credentials chiffrés et votre base PostgreSQL, même après un redémarrage ou une recréation du conteneur.
- Reproductible : le même
docker-compose.ymlse déploie à l'identique sur un VPS de développement, de pré-production ou de production. Vous décrivez votre infrastructure dans un fichier versionné en Git. - Gratuit et open source : l'édition Community de n8n n'impose aucune limite sur le nombre de workflows ou d'exécutions actives.
L'alternative — une installation native via npm — fonctionne, mais vous expose aux conflits de versions Node.js, complique les mises à jour et rend la reproductibilité difficile. Pour un usage sérieux, n8n avec Docker reste le choix le plus robuste. Si vous hésitez encore entre Docker et une installation directe sur la machine, notre guide complet pour installer n8n self-hosted sur VPS détaille les deux approches.
Quand le self-hosted Docker devient-il pertinent face à n8n Cloud ?
La question n'est pas « lequel est le meilleur » mais « lequel correspond à votre situation ». n8n Cloud facture en fonction du volume d'exécutions et du nombre de workflows actifs : un modèle confortable au démarrage, mais dont le coût grimpe mécaniquement à mesure que vous automatisez. Une instance Docker auto-hébergée, elle, coûte le prix fixe de votre VPS, quel que soit le nombre d'exécutions. Dès que vous lancez des dizaines de milliers d'exécutions par mois, l'écart devient frappant et joue clairement en faveur du self-hosting.
Le raisonnement ne se limite pas au prix. Trois critères font pencher la balance vers Docker. D'abord la charge : si vos workflows traitent de gros volumes ou des pics, vous voulez pouvoir ajouter des workers sans renégocier un forfait. Ensuite la souveraineté des données : héberger vous-même garantit que les credentials, les payloads et les logs ne quittent jamais une infrastructure que vous contrôlez — un argument décisif pour le secteur médical, juridique ou public. Enfin la liberté technique : variables d'environnement avancées, packages npm personnalisés, accès réseau interne à vos bases. En contrepartie, vous devenez responsable des mises à jour, des sauvegardes et de la sécurité — précisément les sujets que ce guide détaille.
Architecture complète : le reverse proxy termine le SSL, fait proxy vers le conteneur n8n qui écrit en base PostgreSQL via les volumes Docker
Quels sont les prérequis pour installer n8n avec Docker ?
Pour suivre ce tutoriel sans accroc, réunissez les éléments suivants :
- Un VPS Linux (Ubuntu 22.04 LTS recommandé) avec au minimum 1 Go de RAM. Comptez 2 Go si vous prévoyez des workflows lourds ou des agents IA.
- Docker Engine 24.x ou supérieur et Docker Compose V2 (la commande
docker compose, en deux mots, et non l'anciendocker-compose). - Un nom de domaine (ou sous-domaine, par exemple
n8n.votre-domaine.com) dont l'enregistrement DNS de type A pointe vers l'adresse IP publique de votre serveur. Indispensable pour le HTTPS. - Un accès SSH avec un utilisateur disposant des droits Docker.
Vérifiez vos versions avant de commencer :
docker --version
docker compose version
Si Docker n'est pas installé, le script officiel de Docker fait le travail en quelques secondes :
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER
Déconnectez-vous puis reconnectez-vous pour que l'ajout au groupe docker prenne effet.
Comment installer n8n avec Docker Compose étape par étape ?
L'installation tient en huit étapes logiques, du serveur nu jusqu'à une instance sauvegardée. Le schéma ci-dessous résume le parcours complet.
Les 8 étapes pour installer n8n avec Docker : préparer le VPS, écrire docker-compose, définir les variables, lancer, sécuriser en HTTPS et sauvegarder
Étape 1 : créer la structure de dossiers
On regroupe toute la configuration dans un dossier dédié. Le sous-dossier data accueillera les fichiers internes de n8n (dont la clé de chiffrement).
mkdir -p ~/n8n/data
cd ~/n8n
Étape 2 : isoler les secrets dans un fichier .env
Plutôt que d'écrire les mots de passe en clair dans le docker-compose.yml, on les centralise dans un fichier .env que Docker Compose lit automatiquement. Générez d'abord une clé de chiffrement robuste :
openssl rand -hex 32
Créez ensuite le fichier .env :
# ~/n8n/.env — ne jamais committer ce fichier en Git
DOMAIN=n8n.votre-domaine.com
GENERIC_TIMEZONE=Europe/Paris
# Clé de chiffrement des credentials (issue de openssl rand -hex 32)
N8N_ENCRYPTION_KEY=collez-ici-votre-cle-de-64-caracteres
# Base de données PostgreSQL
POSTGRES_DB=n8n
POSTGRES_USER=n8n_user
POSTGRES_PASSWORD=un-mot-de-passe-long-et-aleatoire
Exemple simplifié : adaptez les valeurs à votre environnement. Ajoutez ce fichier à votre
.gitignore.
Étape 3 : écrire le docker-compose.yml complet
Voici un docker-compose.yml commenté qui combine n8n et PostgreSQL, avec persistance et lecture des variables depuis le fichier .env. Chaque bloc est annoté pour que vous compreniez son rôle.
version: '3.8'
services:
n8n:
image: docker.n8n.io/n8nio/n8n:latest # en prod, épinglez une version précise (ex. :1.70.0)
container_name: n8n
restart: unless-stopped
ports:
- "127.0.0.1:5678:5678" # exposé uniquement en local : le reverse proxy s'en charge
environment:
# --- URL publique et webhooks ---
- N8N_HOST=${DOMAIN}
- N8N_PORT=5678
- N8N_PROTOCOL=https
- N8N_EDITOR_BASE_URL=https://${DOMAIN}/
- WEBHOOK_URL=https://${DOMAIN}/
- GENERIC_TIMEZONE=${GENERIC_TIMEZONE}
# --- Sécurité ---
- N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
- N8N_SECURE_COOKIE=true
- N8N_PROXY_HOPS=1 # nombre de reverse proxies devant n8n
# --- Base de données PostgreSQL ---
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgres
- DB_POSTGRESDB_PORT=5432
- DB_POSTGRESDB_DATABASE=${POSTGRES_DB}
- DB_POSTGRESDB_USER=${POSTGRES_USER}
- DB_POSTGRESDB_PASSWORD=${POSTGRES_PASSWORD}
volumes:
- ./data:/home/node/.n8n # workflows internes, clé de chiffrement, config
depends_on:
postgres:
condition: service_healthy
postgres:
image: postgres:16-alpine
container_name: n8n_postgres
restart: unless-stopped
environment:
- POSTGRES_DB=${POSTGRES_DB}
- POSTGRES_USER=${POSTGRES_USER}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
interval: 10s
timeout: 5s
retries: 5
volumes:
postgres_data:
Quelques points importants de cette configuration :
- Le port n8n est lié à
127.0.0.1: il n'est pas accessible directement depuis Internet. Seul le reverse proxy l'expose, en HTTPS. - Le
healthchecksur PostgreSQL combiné àdepends_on: condition: service_healthygarantit que n8n ne démarre qu'une fois la base prête à accepter les connexions. N8N_ENCRYPTION_KEYest fixée explicitement. C'est elle qui chiffre vos credentials : la perdre rend vos identifiants stockés inutilisables.
Étape 4 : lancer n8n et vérifier
docker compose up -d
Vérifiez que les deux conteneurs tournent puis consultez les logs de n8n :
docker compose ps
docker compose logs -f n8n
Au premier démarrage, n8n applique les migrations de base de données puis affiche l'URL de l'éditeur. Comme l'instance utilise désormais la gestion d'utilisateurs intégrée, ouvrez votre domaine dans le navigateur et créez le compte propriétaire (e-mail + mot de passe). Le schéma suivant montre ce qui se passe en coulisses lorsqu'un workflow est déclenché par un webhook.
Le reverse proxy termine le SSL, fait proxy vers n8n sur le port 5678, qui lit et écrit les données dans PostgreSQL
Quelles variables d'environnement n8n sont essentielles ?
La configuration de n8n passe presque entièrement par des variables d'environnement. En voici les plus utiles, regroupées par thème. Toutes sont documentées dans la documentation officielle de n8n.
Authentification et compte propriétaire
Depuis n8n 1.0, la gestion des utilisateurs est intégrée : vous créez un compte propriétaire au premier lancement, et l'ancienne authentification HTTP « Basic Auth » (N8N_BASIC_AUTH_*) est dépréciée. Pour une instance multi-utilisateurs, configurez l'envoi d'e-mails (SMTP) afin d'inviter des collègues. Activez aussi N8N_SECURE_COOKIE=true puisque vous servez n8n en HTTPS.
URL publique, webhooks et fuseau horaire
Ces variables sont critiques quand n8n est derrière un reverse proxy. Si elles sont mal réglées, les webhooks et les URL d'authentification OAuth seront erronés.
| Variable | Description | Exemple |
|---|---|---|
N8N_HOST | Domaine de votre instance | n8n.mondomaine.com |
N8N_PROTOCOL | Protocole exposé | https |
N8N_EDITOR_BASE_URL | URL de base de l'éditeur | https://n8n.mondomaine.com/ |
WEBHOOK_URL | URL publique des webhooks | https://n8n.mondomaine.com/ |
GENERIC_TIMEZONE | Fuseau des déclencheurs planifiés | Europe/Paris |
N8N_PROXY_HOPS | Nombre de proxies devant n8n | 1 |
Clé de chiffrement et rétention des données
| Variable | Description | Exemple |
|---|---|---|
N8N_ENCRYPTION_KEY | Chiffre les credentials | Générer avec openssl rand -hex 32 |
N8N_LOG_LEVEL | Niveau de logs | info ou debug |
EXECUTIONS_DATA_PRUNE | Active la purge des exécutions | true |
EXECUTIONS_DATA_MAX_AGE | Rétention des logs (heures) | 168 (7 jours) |
DB_TYPE | Type de base de données | postgresdb |
La variable N8N_ENCRYPTION_KEY mérite une attention particulière. Si vous ne la définissez pas, n8n en génère une au premier lancement et la stocke dans data/.n8n/config. Tant que ce dossier est persistant, tout va bien. Mais si vous recréez l'instance sur un autre serveur sans récupérer cette clé, tous vos credentials deviennent illisibles. La fixer explicitement et la sauvegarder est donc une règle d'or.
Pourquoi chaque variable critique compte vraiment
Il est tentant de copier-coller une liste de variables sans en comprendre l'effet. C'est une erreur, car chacune a une conséquence concrète en production. Prenons-les une à une. La clé de chiffrement est la plus sensible : elle protège vos identifiants de connexion (API, bases de données, comptes tiers) au repos. Une clé perdue, c'est l'obligation de re-saisir manuellement chaque credential de chaque workflow ; une clé exposée dans un dépôt Git public, c'est un attaquant capable de déchiffrer votre coffre. D'où l'intérêt de la stocker dans un fichier .env hors-Git, voire dans un gestionnaire de secrets.
Les variables d'URL — N8N_HOST, N8N_PROTOCOL, N8N_EDITOR_BASE_URL et WEBHOOK_URL — déterminent l'adresse publique que n8n communique au monde extérieur. Si WEBHOOK_URL est mal réglé, les services tiers (Stripe, GitHub, Telegram…) appelleront une URL erronée et vos automatisations resteront muettes, sans message d'erreur évident. De même, un N8N_EDITOR_BASE_URL incorrect casse les redirections OAuth : impossible de connecter Google, Microsoft ou Slack. Ces pannes sont silencieuses et coûtent souvent des heures de débogage, alors qu'une seule variable est en cause.
Le GENERIC_TIMEZONE semble anodin, mais il pilote l'heure de déclenchement de vos workflows planifiés. Un fuseau mal réglé, et votre rapport « tous les matins à 8 h » part en pleine nuit. Enfin, EXECUTIONS_DATA_MAX_AGE et EXECUTIONS_DATA_PRUNE contrôlent la rétention des historiques d'exécution : sans purge, la table des exécutions de PostgreSQL gonfle indéfiniment, ralentit l'interface et finit par saturer le disque. Régler ces variables n'est pas un détail cosmétique : c'est ce qui distingue une instance stable d'une instance qui se dégrade en quelques semaines.
Comment configurer un reverse proxy et HTTPS pour n8n ?
n8n doit être servi en HTTPS : les webhooks, l'authentification OAuth et les cookies sécurisés l'exigent. Le rôle du reverse proxy est de terminer le SSL (gérer le certificat) et de transmettre le trafic au conteneur n8n. Voici trois options, de la plus simple à la plus avancée.
Option A — Caddy (le plus simple, HTTPS automatique)
Caddy obtient et renouvelle les certificats Let's Encrypt automatiquement, sans configuration manuelle. C'est l'option idéale pour démarrer. Ajoutez un service caddy à votre docker-compose.yml et créez un Caddyfile :
# Caddyfile
n8n.votre-domaine.com {
reverse_proxy n8n:5678
}
Caddy détecte le domaine, demande le certificat et redirige automatiquement le HTTP vers le HTTPS. En trois lignes, votre instance n8n avec Docker est servie en HTTPS valide.
Option B — Nginx + Certbot (le grand classique)
Si vous gérez déjà un Nginx, voici un bloc server fonctionnel. Notez les en-têtes Upgrade / Connection indispensables aux WebSockets de l'éditeur n8n.
server {
listen 443 ssl;
server_name n8n.votre-domaine.com;
ssl_certificate /etc/letsencrypt/live/n8n.votre-domaine.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/n8n.votre-domaine.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:5678;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_buffering off;
# WebSockets (push de l'éditeur n8n)
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
Obtenez le certificat avec Certbot :
certbot --nginx -d n8n.votre-domaine.com
Option C — Traefik (orienté Docker, multi-services)
Traefik se configure par labels directement dans le docker-compose.yml. Pratique si vous exposez plusieurs services derrière un même proxy. Exemple simplifié de labels à ajouter au service n8n :
labels:
- traefik.enable=true
- traefik.http.routers.n8n.rule=Host(`n8n.votre-domaine.com`)
- traefik.http.routers.n8n.tls=true
- traefik.http.routers.n8n.tls.certresolver=letsencrypt
- traefik.http.services.n8n.loadbalancer.server.port=5678
Quel que soit le proxy choisi, pensez à régler N8N_PROXY_HOPS sur le nombre de proxies traversés (1 dans la plupart des cas). Sans cela, n8n peut mal interpréter l'adresse IP réelle du client transmise dans X-Forwarded-For.
Comment gérer la persistance et les sauvegardes de n8n ?
La persistance repose sur deux volumes : le dossier ./data (clé de chiffrement et config internes de n8n) et le volume postgres_data (toutes vos données : workflows, exécutions, credentials chiffrés). Sauvegarder l'un sans l'autre ne suffit pas : sans la clé de chiffrement, une base restaurée ne pourra pas déchiffrer ses credentials.
Script de sauvegarde quotidienne
Ce script exporte la base PostgreSQL, archive le dossier data, et supprime les sauvegardes de plus de 30 jours.
#!/bin/bash
# ~/backup-n8n.sh — exemple simplifié
set -euo pipefail
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR=~/backups
mkdir -p "$BACKUP_DIR"
# 1. Dump de la base PostgreSQL
docker exec n8n_postgres pg_dump -U n8n_user n8n > "$BACKUP_DIR/n8n_db_$DATE.sql"
# 2. Archive du dossier data (contient la clé de chiffrement)
tar czf "$BACKUP_DIR/n8n_data_$DATE.tar.gz" -C ~/n8n data
# 3. Rotation : on garde 30 jours
find "$BACKUP_DIR" -name "n8n_*" -mtime +30 -delete
Planifiez-le via cron pour une exécution chaque nuit à 3 h :
0 3 * * * /bin/bash ~/backup-n8n.sh
Restaurer une sauvegarde
Pour restaurer la base sur une nouvelle instance, recréez le conteneur PostgreSQL vide puis réinjectez le dump :
cat ~/backups/n8n_db_20260603_030000.sql | docker exec -i n8n_postgres psql -U n8n_user -d n8n
N'oubliez pas de restaurer également le dossier data (et donc la clé de chiffrement) avant de redémarrer n8n.
Comment mettre à jour n8n sans perdre de données ?
n8n publie de nouvelles versions très régulièrement. La mise à jour est simple, mais quelques précautions évitent les mauvaises surprises.
cd ~/n8n
docker compose pull # télécharge la nouvelle image
docker compose up -d # recrée les conteneurs avec la nouvelle version
Au redémarrage, n8n applique automatiquement les migrations de base de données nécessaires. Vos workflows et credentials sont conservés car ils vivent dans PostgreSQL et dans le volume data, jamais dans le conteneur lui-même.
Trois bonnes pratiques pour des mises à jour sereines :
- Épinglez la version en production (
docker.n8n.io/n8nio/n8n:1.70.0plutôt que:latest). Vous maîtrisez ainsi le moment où vous montez de version. - Sauvegardez avant chaque montée de version majeure. Une migration de schéma est rarement réversible.
- Lisez les notes de version pour repérer d'éventuels changements de comportement (breaking changes) avant de mettre à jour.
Ces précautions méritent qu'on s'y attarde, car les pièges de mise à jour sont la première cause de panne sur une instance auto-hébergée. Le point le plus délicat concerne les migrations de schéma. Quand n8n démarre sur une version plus récente, il modifie automatiquement la structure de votre base PostgreSQL pour l'adapter au nouveau code. Ces opérations sont conçues pour aller de l'avant, pas pour revenir en arrière : il n'existe pas de bouton « downgrade » propre. Concrètement, si vous tentez de relancer une ancienne image après une migration, l'ancien code ne reconnaîtra pas le schéma transformé et refusera de démarrer. C'est pourquoi un saut de plusieurs versions majeures d'un coup est risqué — mieux vaut progresser par paliers et tester chaque étape.
La compatibilité de version se joue aussi entre composants. En mode queue, l'instance principale et tous les workers doivent tourner sur la même version de n8n : un worker en retard sur le main peut mal interpréter une exécution sérialisée et la faire échouer. La seule stratégie de rollback réellement fiable reste donc la restauration : revenir à l'image précédente et réinjecter la sauvegarde de base prise juste avant la montée de version. C'est exactement pour cela que la règle « sauvegarder avant chaque mise à jour majeure » n'est pas négociable. Prenez l'habitude de tester d'abord la nouvelle version sur une instance de pré-production avec une copie de vos données : vous repérerez un breaking change avant qu'il n'atteigne vos workflows critiques.
Comment faire monter n8n en charge avec le mode queue ?
Par défaut, n8n exécute tous les workflows dans un seul processus (mode regular). Cela suffit pour des dizaines de workflows. Mais si vous traitez un grand volume d'exécutions simultanées, le mode queue distribue la charge sur plusieurs workers.
Le principe : l'instance principale (main) reçoit les déclencheurs et pousse les tâches dans une file Redis. Des conteneurs worker consomment cette file et exécutent les workflows en parallèle. Tous partagent la même base PostgreSQL.
Mode queue : l'instance principale pousse les exécutions dans Redis, qui les distribue à plusieurs workers n8n écrivant dans la même base PostgreSQL
Pour activer le mode queue, ajoutez un service Redis, passez EXECUTIONS_MODE=queue sur le conteneur principal, et déclarez un ou plusieurs services worker lancés avec la commande worker :
# Exemple simplifié — extrait à ajouter à votre docker-compose.yml
redis:
image: redis:7-alpine
restart: unless-stopped
n8n-worker:
image: docker.n8n.io/n8nio/n8n:latest
restart: unless-stopped
command: worker # lance n8n en mode worker
environment:
- EXECUTIONS_MODE=queue
- QUEUE_BULL_REDIS_HOST=redis
- N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgres
- DB_POSTGRESDB_DATABASE=${POSTGRES_DB}
- DB_POSTGRESDB_USER=${POSTGRES_USER}
- DB_POSTGRESDB_PASSWORD=${POSTGRES_PASSWORD}
depends_on:
- postgres
- redis
Tous les workers doivent partager la même N8N_ENCRYPTION_KEY et la même base PostgreSQL que l'instance principale. Pour ajouter de la capacité, augmentez le nombre de réplicas worker. Côté ressources, prévoyez plus de RAM à mesure que vous montez en charge : le graphique ci-dessous donne des ordres de grandeur indicatifs selon le profil d'usage.
Estimation indicative de la RAM à prévoir : 1 Go pour une instance légère, jusqu'à 8 Go pour une configuration en mode queue avec plusieurs workers
Cette montée en charge horizontale est l'une des forces du self-hosting. Si vous construisez des workflows à base d'agents IA particulièrement gourmands, notre article sur la façon de transformer vos workflows n8n en systèmes intelligents explique comment structurer ces traitements.
Comment sécuriser son instance n8n Docker en production ?
Une instance exposée sur Internet doit être durcie. Voici les mesures essentielles :
- N'exposez jamais le port 5678 directement. Liez-le à
127.0.0.1et laissez le reverse proxy gérer l'accès public en HTTPS. - Activez un pare-feu (UFW) qui n'autorise que les ports 22 (SSH), 80 et 443.
- Utilisez des mots de passe longs et aléatoires pour PostgreSQL et le compte propriétaire n8n.
- Sauvegardez la clé de chiffrement dans un gestionnaire de secrets, séparément du serveur.
- Limitez les origines via
N8N_SECURE_COOKIE=trueet un domaine dédié. - Mettez à jour régulièrement l'image n8n et l'OS pour appliquer les correctifs de sécurité.
- Surveillez les logs (
docker compose logs) et configurez une alerte en cas de redémarrage anormal.
Si vous connectez n8n à des services externes via le protocole MCP, lisez aussi notre guide pour connecter n8n à un serveur MCP en toute sécurité, qui détaille les bonnes pratiques d'authentification.
Raisonner en termes de surface d'attaque
Au-delà de la checklist, il est utile de raisonner comme un attaquant. Votre surface d'attaque, c'est l'ensemble des points par lesquels quelqu'un peut interagir avec votre système : le port SSH, le reverse proxy, l'interface n8n, et chaque service que vous exposez. Le principe directeur est simple : tout ce qui n'a pas besoin d'être accessible depuis Internet ne doit pas l'être. C'est précisément pourquoi nous lions le port 5678 à 127.0.0.1 plutôt qu'à 0.0.0.0. Dans le premier cas, n8n n'écoute que les connexions locales et seul le reverse proxy peut l'atteindre ; dans le second, n'importe qui sur Internet pourrait taper votre IP suivie du port et tomber directement sur l'éditeur, sans chiffrement.
L'isolation réseau de Docker est un atout sous-estimé. Par défaut, les conteneurs d'un même fichier Compose communiquent sur un réseau privé, en se désignant par leur nom de service (postgres, redis). Votre base de données n'a donc aucune raison de publier son port 5432 vers l'hôte : n8n y accède par le réseau interne, et le reste du monde n'en voit rien. Réduire ainsi les ports publiés diminue d'autant les portes d'entrée potentielles. Appliquez le même raisonnement à Redis en mode queue : il reste interne, jamais exposé.
Le principe du moindre privilège complète l'isolation. Le compte PostgreSQL utilisé par n8n ne devrait avoir de droits que sur sa propre base, avec un mot de passe long et unique généré aléatoirement — pas un mot de passe réutilisé ailleurs. La gestion des secrets suit la même logique : la clé de chiffrement et les mots de passe vivent dans un .env exclu de Git, idéalement sauvegardés dans un coffre dédié, et jamais inscrits en clair dans un dépôt ou un canal de discussion. Enfin, gardez l'OS et l'image n8n à jour : une faille corrigée mais non appliquée reste une faille ouverte. La sécurité n'est pas un interrupteur, c'est une discipline d'entretien régulier.
Dépannage : problèmes courants avec n8n Docker
| Symptôme | Cause probable | Solution |
|---|---|---|
| Les webhooks renvoient une mauvaise URL | WEBHOOK_URL non défini ou erroné | Fixez WEBHOOK_URL sur votre domaine public complet |
| OAuth échoue à la redirection | N8N_EDITOR_BASE_URL incorrect | Alignez-le sur l'URL HTTPS publique |
| Credentials illisibles après migration | Clé de chiffrement différente | Restaurez la N8N_ENCRYPTION_KEY d'origine |
| L'éditeur ne se met pas à jour en temps réel | En-têtes WebSocket manquants | Ajoutez Upgrade / Connection "upgrade" au proxy |
| n8n démarre avant PostgreSQL | Pas de healthcheck | Utilisez depends_on: condition: service_healthy |
| IP client incorrecte dans les logs | N8N_PROXY_HOPS non réglé | Définissez-le sur le nombre de proxies (souvent 1) |
Quand un comportement vous surprend, la première réflexe doit être docker compose logs -f n8n : la plupart des erreurs de configuration y apparaissent explicitement.
Pour dépanner efficacement, adoptez une démarche méthodique plutôt que de modifier des variables au hasard. Partez toujours du symptôme observé, remontez à la cause probable, puis vérifiez une hypothèse à la fois. Prenons un cas fréquent : un webhook qui ne se déclenche jamais. Le symptôme est clair, mais les causes possibles sont multiples — WEBHOOK_URL mal réglé, reverse proxy qui ne transmet pas le bon chemin, ou pare-feu qui bloque le port 443. La bonne méthode consiste à isoler : testez d'abord l'URL du webhook depuis votre propre machine avec curl, observez si la requête atteint le conteneur dans les logs, et seulement ensuite ajustez la variable suspecte. Cette progression évite de cumuler plusieurs changements et de ne plus savoir lequel a réglé — ou aggravé — le problème.
Si un conteneur redémarre en boucle, capturez le message fatal avec docker compose logs --tail=100 n8n avant qu'il ne reparte. Pour les soucis de connexion à la base, vérifiez que le service postgres est bien « healthy » via docker compose ps, puis que les identifiants de votre .env correspondent exactement à ceux du service n8n. Un nombre étonnant d'instances « cassées » se résument à une faute de frappe dans un mot de passe ou à une variable périmée qu'un docker compose up -d --force-recreate corrige instantanément. La règle d'or du dépannage : ne changez qu'une chose, relancez, observez, recommencez.
Checklist prod-ready pour n8n avec Docker
Avant d'ouvrir votre instance au monde, validez ces points :
- PostgreSQL utilisé comme base (et non SQLite)
-
N8N_ENCRYPTION_KEYfixée et sauvegardée hors-serveur - Port 5678 lié à
127.0.0.1, jamais exposé directement - Reverse proxy HTTPS opérationnel (Caddy, Nginx ou Traefik)
-
N8N_SECURE_COOKIE=trueetN8N_PROXY_HOPSréglés - Pare-feu actif (22, 80, 443 uniquement)
- Sauvegarde quotidienne automatisée (base + dossier
data) - Image n8n épinglée sur une version précise
- Rétention des exécutions configurée (
EXECUTIONS_DATA_MAX_AGE) - Procédure de restauration testée au moins une fois
Conclusion
Vous savez désormais installer n8n avec Docker dans des conditions dignes de la production : un docker-compose.yml propre avec PostgreSQL, des variables d'environnement maîtrisées, un reverse proxy HTTPS, des sauvegardes fiables, une stratégie de mise à jour sans perte de données et le mode queue pour encaisser la charge. Cette base solide vous appartient à 100 % — données, coûts et évolutivité compris.
Si vous ne deviez retenir que trois réflexes, ce seraient ceux-ci : fixer et sauvegarder la clé de chiffrement pour ne jamais perdre l'accès à vos credentials, n'exposer que le strict nécessaire derrière un reverse proxy HTTPS, et sauvegarder avant chaque mise à jour majeure pour pouvoir revenir en arrière. Le reste — mode queue, rétention des exécutions, durcissement réseau — se construit progressivement, au rythme de la montée en charge de vos automatisations. Commencez simple, mais commencez bien : une instance correctement configurée dès le départ vous épargnera des heures de débogage plus tard. Et gardez en tête que l'auto-hébergement est un engagement d'entretien autant qu'un gain de contrôle : quelques minutes de maintenance régulière valent mieux qu'une restauration en urgence.
L'étape suivante consiste à exploiter cette instance pour automatiser réellement votre activité. Pour découvrir comment construire des agents et des workflows avancés, suivez notre tutoriel n8n agent IA 2026, pas à pas, et pour cadrer votre budget, comparez les prix de l'automatisation n8n et Make en 2026. Si vous préférez déléguer le déploiement et la supervision, l'équipe BOVO Digital propose un service complet d'automatisation n8n & Make.
Étiquettes
FAQ
Quelle est la différence entre n8n cloud et n8n Docker ?
n8n cloud est hébergé par n8n.io avec un abonnement mensuel. n8n Docker est self-hosted sur votre propre VPS, gratuit pour l'édition Community, avec contrôle total de vos données. Le code source est identique.
Combien de RAM faut-il pour faire tourner n8n Docker ?
Minimum 1 Go de RAM pour une instance légère. Pour des workflows complexes avec agents IA, comptez 2 à 4 Go. Avec PostgreSQL inclus, ajoutez environ 512 Mo. En mode queue avec plusieurs workers, prévoyez davantage : chaque worker consomme sa propre mémoire, et 8 Go constituent une base confortable pour une instance soumise à de fortes charges.
Peut-on utiliser SQLite à la place de PostgreSQL avec n8n Docker ?
Oui, SQLite est la base de données par défaut si aucune variable DB_TYPE n'est définie. Pour la production, PostgreSQL est fortement recommandé pour les performances et la fiabilité à l'échelle.
Comment migrer mes workflows de n8n cloud vers n8n Docker ?
Dans n8n cloud, exportez vos workflows en JSON (Paramètres > Télécharger les données). Sur votre instance Docker, importez-les via Paramètres > Importer depuis fichier. Les credentials devront être reconfigurés manuellement.
Faut-il définir N8N_ENCRYPTION_KEY manuellement avec Docker ?
Oui, c'est fortement recommandé en production. Si la variable n'est pas définie, n8n génère une clé aléatoire et la stocke dans le fichier .n8n/config. En la fixant explicitement et en la sauvegardant, vos credentials restent déchiffrables après une réinstallation ou une migration vers un autre serveur. Si vous la perdez, il faudra re-saisir manuellement chaque credential de chaque workflow ; si elle fuite dans un dépôt public, un attaquant peut déchiffrer votre coffre. Conservez-la donc hors de Git, dans un gestionnaire de secrets.
Prêt à l'implémenter ?
Réservez un appel stratégique gratuit de 30 min avec nos experts
Nous analyserons votre situation et proposerons un plan d'action concret.

William Aklamavo
Expert en développement web et automatisation, passionné par l'innovation technologique et l'entrepreneuriat digital.
