N8N est l’outil d’automatisation de workflows le plus puissant du marché pour les TPE/PME qui veulent garder le contrôle de leurs données. Mais son vrai avantage se révèle en self-hosted : déployé sur votre propre serveur, N8N devient gratuit, illimité et 100% sous votre maîtrise. Ce guide vous explique comment l’installer correctement, le sécuriser et créer vos premiers workflows opérationnels.
Pourquoi self-héberger N8N ?
Les avantages concrets
Données sur votre serveur. Vos workflows traitent souvent des données sensibles : emails clients, informations CRM, données financières. En self-hosted, ces données ne quittent jamais votre infrastructure. C’est un argument décisif pour les secteurs réglementés (santé, juridique, finance) soumis au RGPD.
Coût maîtrisé et prévisible. Un VPS Hetzner à 6€/mois suffit pour la plupart des PME. Que vous lanciez 500 ou 500 000 automatisations par mois, le coût ne varie pas. Comparez avec le cloud N8N où les exécutions sont facturées à l’usage.
Pas de limite de workflows. La version cloud impose des limites selon le plan souscrit. En self-hosted, vous créez autant de workflows que votre serveur peut en supporter — en pratique, plusieurs centaines sans problème sur un VPS standard.
Open source et extensible. N8N est open source (licence Sustainable Use License). Vous pouvez créer des nœuds personnalisés, modifier le comportement par défaut et ne dépendez d’aucun éditeur pour la continuité de service.
Comparatif self-hosted vs N8N Cloud
| Critère | Self-hosted | N8N Cloud Starter | N8N Cloud Pro |
|---|
| Prix mensuel | ~6-15€ (VPS) | 20€ | 50€+ |
| Exécutions/mois | Illimitées | 2 500 | 10 000 |
| Workflows actifs | Illimités | 5 | 15 |
| Confidentialité | Données chez vous | Serveurs N8N (UE) | Serveurs N8N (UE) |
| Maintenance | À votre charge | Gérée | Gérée |
| Mises à jour | Manuelles (ou Watchtower) | Automatiques | Automatiques |
| Personnalisation | Totale | Limitée | Limitée |
| RGPD strict | Optimal | Acceptable | Acceptable |
Conclusion du tableau : pour une PME avec plus de 2 500 exécutions/mois ou des exigences de confidentialité, le self-hosted s’impose. En deçà, le cloud N8N est une option valable pour démarrer vite.
Prérequis
Le serveur
Vous avez besoin d’un VPS avec :
- Minimum : 2 vCPU, 4 Go RAM, 40 Go SSD
- Recommandé : 2 vCPU, 8 Go RAM, 80 Go SSD pour 10+ workflows actifs en parallèle
Fournisseurs recommandés :
- Hetzner Cloud (Allemagne) — CX22 à 4,35€/mois ou CX32 à 7,56€/mois — excellent rapport qualité/prix, datacenter UE
- Scaleway (France) — DEV1-S à 9,99€/mois — hébergement 100% français pour les plus exigeants sur la souveraineté
- OVHcloud (France) — VPS Starter à 4,99€/mois — fiable, datacenter France
Pour Ubuntu 22.04 LTS (recommandé) ou Debian 12.
Logiciels requis
- Docker 24.x+ et Docker Compose v2.x installés sur le serveur
- Un nom de domaine pointant vers l’IP du serveur (ex :
n8n.votreentreprise.fr)
- Accès SSH root ou sudo
Installation Docker sur Ubuntu :
# Désinstaller les anciennes versions
sudo apt remove docker docker-engine docker.io containerd runc
# Installer les dépendances
sudo apt update && sudo apt install -y ca-certificates curl gnupg
# Ajouter le dépôt officiel Docker
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Installer Docker et Docker Compose
sudo apt update && sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
# Vérifier l'installation
docker --version && docker compose version
Installation avec Docker Compose
Structure des fichiers
Créez un répertoire dédié sur votre serveur :
mkdir -p /opt/n8n && cd /opt/n8n
Le fichier docker-compose.yml complet
version: '3.8'
services:
postgres:
image: postgres:15-alpine
container_name: n8n_postgres
restart: always
environment:
POSTGRES_DB: n8n
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 n8n"]
interval: 10s
timeout: 5s
retries: 5
networks:
- n8n_network
n8n:
image: n8nio/n8n:latest
container_name: n8n_app
restart: always
depends_on:
postgres:
condition: service_healthy
environment:
# Base de données
DB_TYPE: postgresdb
DB_POSTGRESDB_HOST: postgres
DB_POSTGRESDB_PORT: 5432
DB_POSTGRESDB_DATABASE: n8n
DB_POSTGRESDB_USER: ${POSTGRES_USER}
DB_POSTGRESDB_PASSWORD: ${POSTGRES_PASSWORD}
# URL et accès
N8N_HOST: ${N8N_HOST}
N8N_PORT: 5678
N8N_PROTOCOL: https
WEBHOOK_URL: https://${N8N_HOST}/
N8N_EDITOR_BASE_URL: https://${N8N_HOST}/
# Authentification
N8N_BASIC_AUTH_ACTIVE: "true"
N8N_BASIC_AUTH_USER: ${N8N_BASIC_AUTH_USER}
N8N_BASIC_AUTH_PASSWORD: ${N8N_BASIC_AUTH_PASSWORD}
# Timezone et localisation
GENERIC_TIMEZONE: Europe/Paris
TZ: Europe/Paris
# Sécurité
N8N_SECURE_COOKIE: "true"
N8N_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY}
# Logs
N8N_LOG_LEVEL: info
N8N_LOG_OUTPUT: console
# Performance
EXECUTIONS_DATA_PRUNE: "true"
EXECUTIONS_DATA_MAX_AGE: 336 # 14 jours en heures
EXECUTIONS_DATA_PRUNE_MAX_COUNT: 10000
volumes:
- n8n_data:/home/node/.n8n
ports:
- "127.0.0.1:5678:5678" # Exposé uniquement en local (Nginx reverse proxy)
networks:
- n8n_network
volumes:
postgres_data:
n8n_data:
networks:
n8n_network:
driver: bridge
Le fichier .env
Créez le fichier .env dans /opt/n8n/ :
# Base de données
POSTGRES_USER=n8nuser
POSTGRES_PASSWORD=MotDePasseTresLong2026! # Changez absolument cette valeur
# N8N
N8N_HOST=n8n.votreentreprise.fr
N8N_BASIC_AUTH_USER=admin
N8N_BASIC_AUTH_PASSWORD=AutreMotDePasseSecurise! # Changez cette valeur
# Clé de chiffrement (générez avec : openssl rand -hex 32)
N8N_ENCRYPTION_KEY=votre_cle_generee_ici
Générer une clé de chiffrement sécurisée :
openssl rand -hex 32
Démarrage
cd /opt/n8n
docker compose up -d
# Vérifier que les conteneurs tournent
docker compose ps
# Suivre les logs N8N au démarrage
docker compose logs -f n8n
N8N est maintenant accessible sur http://localhost:5678 depuis le serveur. Il faut maintenant le rendre accessible depuis l’extérieur via Nginx + HTTPS.
Configuration HTTPS avec Let’s Encrypt
Installation de Nginx et Certbot
sudo apt update
sudo apt install -y nginx certbot python3-certbot-nginx
Configuration Nginx initiale (HTTP)
Créez le fichier /etc/nginx/sites-available/n8n :
server {
listen 80;
server_name n8n.votreentreprise.fr;
location / {
proxy_pass http://127.0.0.1:5678;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
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_cache_bypass $http_upgrade;
proxy_read_timeout 300s;
proxy_connect_timeout 75s;
}
}
sudo ln -s /etc/nginx/sites-available/n8n /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
Obtenir le certificat SSL
sudo certbot --nginx -d n8n.votreentreprise.fr --non-interactive --agree-tos -m contact@votreentreprise.fr
Certbot modifie automatiquement la configuration Nginx pour activer HTTPS et la redirection HTTP → HTTPS. Votre instance N8N est maintenant accessible sur https://n8n.votreentreprise.fr.
Configuration Nginx finale (générée par Certbot, à vérifier)
Le fichier final doit ressembler à ceci :
server {
listen 80;
server_name n8n.votreentreprise.fr;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name n8n.votreentreprise.fr;
ssl_certificate /etc/letsencrypt/live/n8n.votreentreprise.fr/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/n8n.votreentreprise.fr/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
# Taille max upload pour les workflows avec fichiers
client_max_body_size 50M;
location / {
proxy_pass http://127.0.0.1:5678;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
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 https;
proxy_cache_bypass $http_upgrade;
proxy_read_timeout 300s;
}
}
Le renouvellement automatique du certificat est configuré par Certbot dans les crontabs système. Vérifiez avec :
sudo certbot renew --dry-run
Sécurisation de l’instance
Authentification et accès
L’authentification basique configurée dans le docker-compose.yml (variables N8N_BASIC_AUTH_*) est un premier niveau. Pour une sécurité renforcée, utilisez également le système de comptes utilisateurs intégré à N8N (disponible depuis N8N 0.223+), qui permet de créer des utilisateurs avec des rôles distincts (Admin, Member).
Règles de mot de passe à respecter :
- Minimum 16 caractères
- Mélange de majuscules, minuscules, chiffres et caractères spéciaux
- Jamais de mot de passe partagé entre plusieurs services
Restriction par IP avec Nginx
Si votre équipe travaille depuis des IPs fixes (bureau, VPN d’entreprise), restreignez l’accès à ces seules IPs :
location / {
# Autoriser uniquement l'IP de bureau et le VPN
allow 203.0.113.10; # IP bureau
allow 198.51.100.0/24; # Plage VPN
deny all;
proxy_pass http://127.0.0.1:5678;
# ... reste de la config
}
Désactiver les endpoints publics inutiles
N8N expose par défaut un endpoint de santé public. Si vous n’en avez pas besoin en dehors du réseau local, bloquez-le dans Nginx :
location /healthz {
allow 127.0.0.1;
deny all;
}
Sauvegardes automatiques de PostgreSQL
Créez le script /opt/n8n/backup.sh :
#!/bin/bash
BACKUP_DIR="/opt/n8n/backups"
DATE=$(date +%Y%m%d_%H%M%S)
RETENTION_DAYS=30
mkdir -p "$BACKUP_DIR"
# Dump de la base PostgreSQL
docker exec n8n_postgres pg_dump -U n8nuser n8n | gzip > "$BACKUP_DIR/n8n_$DATE.sql.gz"
# Nettoyage des sauvegardes anciennes
find "$BACKUP_DIR" -name "*.sql.gz" -mtime +$RETENTION_DAYS -delete
echo "[$DATE] Sauvegarde terminée : $BACKUP_DIR/n8n_$DATE.sql.gz"
chmod +x /opt/n8n/backup.sh
Ajoutez une entrée cron pour exécuter la sauvegarde chaque nuit à 2h :
crontab -e
# Ajouter la ligne suivante :
0 2 * * * /opt/n8n/backup.sh >> /var/log/n8n-backup.log 2>&1
Pensez aussi à sauvegarder le volume n8n_data qui contient les credentials chiffrés :
# Ajouter dans backup.sh
docker run --rm -v n8n_data:/data -v "$BACKUP_DIR":/backup alpine tar czf "/backup/n8n_volume_$DATE.tar.gz" /data
Mises à jour automatiques avec Watchtower
Watchtower surveille vos conteneurs Docker et les met à jour automatiquement quand une nouvelle image est publiée. Ajoutez-le à votre docker-compose.yml :
watchtower:
image: containrrr/watchtower
container_name: n8n_watchtower
restart: always
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
WATCHTOWER_SCHEDULE: "0 0 4 * * *" # Chaque nuit à 4h
WATCHTOWER_CLEANUP: "true"
WATCHTOWER_NOTIFICATIONS: email
WATCHTOWER_NOTIFICATION_EMAIL_FROM: alertes@votreentreprise.fr
WATCHTOWER_NOTIFICATION_EMAIL_TO: admin@votreentreprise.fr
WATCHTOWER_NOTIFICATION_EMAIL_SERVER: smtp.votreentreprise.fr
WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT: 587
WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER: alertes@votreentreprise.fr
WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD: ${SMTP_PASSWORD}
networks:
- n8n_network
Note : si vous préférez contrôler manuellement les mises à jour (recommandé en production), omettez Watchtower et mettez à jour avec :
cd /opt/n8n
docker compose pull n8n
docker compose up -d n8n
Premiers workflows à créer
Une fois N8N accessible et sécurisé, voici trois workflows concrets pour démarrer.
Ce workflow valide que votre instance fonctionne de bout en bout.
Étapes dans N8N :
- Trigger : nœud
Webhook (méthode POST, chemin /test)
- Transformation : nœud
Set — créez un champ message avec Bonjour, le webhook fonctionne ! Données reçues : {{$json.body}}
- Email : nœud
Send Email — configurez votre SMTP et envoyez le message
Test depuis le terminal :
curl -X POST https://n8n.votreentreprise.fr/webhook/test \
-H "Content-Type: application/json" \
-d '{"source": "test", "timestamp": "2026-03-23"}'
Vous devriez recevoir un email de confirmation. Si c’est le cas, votre instance est pleinement opérationnelle.
2. Notification Slack sur nouvel email important
Cas d’usage : recevoir une alerte Slack instantanée quand un email contient le mot “urgent” ou “devis” dans l’objet — sans rester vissé sur votre boîte mail.
Étapes dans N8N :
- Trigger : nœud
Email Trigger (IMAP) — connectez votre boîte (Gmail, Outlook, etc.)
- Filtre : nœud
IF — condition : {{$json.subject}} contient urgent OU devis (expression régulière)
- Notification : nœud
Slack — message : 📬 Nouvel email urgent de {{$json.from}} : *{{$json.subject}}*
- Branche else : nœud
NoOp — les autres emails sont ignorés silencieusement
Fréquence de vérification : réglez l’IMAP trigger sur toutes les 5 minutes pour un bon équilibre réactivité/charge serveur.
Cas d’usage : chaque nouveau lead issu d’un formulaire Typeform est automatiquement créé dans HubSpot, tagué et assigné au bon commercial. Zéro ressaisie manuelle.
Étapes dans N8N :
- Trigger : nœud
Typeform Trigger (webhook Typeform)
- Transformation : nœud
Set — mappez les champs Typeform vers les champs HubSpot (firstName, lastName, email, company, phone)
- Déduplication : nœud
HubSpot — action Search Contact avec l’email pour éviter les doublons
- Branchement : nœud
IF — si le contact existe → mettre à jour, sinon → créer
- Création : nœud
HubSpot — action Create Contact avec les données mappées
- Tag : nœud
HubSpot — ajoutez le tag source:typeform et assignez à un commercial
- Confirmation : nœud
Send Email — email de bienvenue automatique au lead
ROI concret : pour une PME qui reçoit 50 leads/mois, ce workflow économise environ 2h de saisie manuelle et élimine les erreurs de copier-coller.
Maintenance et monitoring
Vérifier l’état de santé
# Statut des conteneurs
docker compose -f /opt/n8n/docker-compose.yml ps
# Logs en temps réel
docker compose -f /opt/n8n/docker-compose.yml logs -f n8n
# Utilisation des ressources
docker stats n8n_app n8n_postgres
Alertes si N8N tombe
Ajoutez un healthcheck Nginx + une surveillance externe basique avec curl et cron :
# Script /opt/n8n/healthcheck.sh
#!/bin/bash
RESPONSE=$(curl -s -o /dev/null -w "%{http_code}" https://n8n.votreentreprise.fr/healthz)
if [ "$RESPONSE" != "200" ]; then
echo "N8N DOWN - Code HTTP: $RESPONSE - $(date)" | mail -s "ALERTE N8N" admin@votreentreprise.fr
fi
chmod +x /opt/n8n/healthcheck.sh
# Cron toutes les 5 minutes
*/5 * * * * /opt/n8n/healthcheck.sh
Pour une surveillance plus robuste, des outils gratuits comme UptimeRobot ou Freshping pinglent votre URL toutes les minutes et envoient une alerte SMS/email si le service ne répond plus — sans aucune configuration serveur supplémentaire.
Logs et supervision des exécutions
N8N conserve un historique de toutes les exécutions dans PostgreSQL. Consultez-le directement depuis l’interface sous Executions. Configurez EXECUTIONS_DATA_MAX_AGE (14 jours recommandés) pour éviter que la base ne grossisse indéfiniment.
Pour les PME avec des volumes importants (> 10 000 exécutions/mois), envisagez d’augmenter la RAM PostgreSQL et d’activer la surveillance des requêtes lentes via pg_stat_statements.
Conclusion
Héberger N8N sur votre propre infrastructure n’est plus réservé aux DSI des grandes entreprises. Avec un VPS à 6€/mois, Docker Compose et ce guide, une PME peut disposer en quelques heures d’une plateforme d’automatisation illimitée, sécurisée et conforme au RGPD.
Les bénéfices sont immédiats : contrôle total des données, coût prévisible quel que soit le volume, et liberté de créer autant de workflows N8N que votre activité le réclame — synchronisation CRM, alertes intelligentes, traitement de documents, agents IA et bien plus.
La prochaine étape ? Si vous souhaitez être accompagné dans la mise en place de votre infrastructure N8N et la création de workflows adaptés à vos processus métier, nos experts sont là pour vous. L’audit initial est gratuit et sans engagement.
Demander un audit gratuit →