N8N & Workflows Automatisation IA

N8N self-hosted : installation, sécurisation et premiers workflows

MC
Maxime Choinet
N8N self-hosted : installation, sécurisation et premiers workflows

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èreSelf-hostedN8N Cloud StarterN8N Cloud Pro
Prix mensuel~6-15€ (VPS)20€50€+
Exécutions/moisIllimitées2 50010 000
Workflows actifsIllimités515
ConfidentialitéDonnées chez vousServeurs N8N (UE)Serveurs N8N (UE)
MaintenanceÀ votre chargeGéréeGérée
Mises à jourManuelles (ou Watchtower)AutomatiquesAutomatiques
PersonnalisationTotaleLimitéeLimitée
RGPD strictOptimalAcceptableAcceptable

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.

1. Workflow de test : webhook → transformation → email

Ce workflow valide que votre instance fonctionne de bout en bout.

Étapes dans N8N :

  1. Trigger : nœud Webhook (méthode POST, chemin /test)
  2. Transformation : nœud Set — créez un champ message avec Bonjour, le webhook fonctionne ! Données reçues : {{$json.body}}
  3. 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 :

  1. Trigger : nœud Email Trigger (IMAP) — connectez votre boîte (Gmail, Outlook, etc.)
  2. Filtre : nœud IF — condition : {{$json.subject}} contient urgent OU devis (expression régulière)
  3. Notification : nœud Slack — message : 📬 Nouvel email urgent de {{$json.from}} : *{{$json.subject}}*
  4. 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.

3. Synchronisation CRM : Typeform → HubSpot

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 :

  1. Trigger : nœud Typeform Trigger (webhook Typeform)
  2. Transformation : nœud Set — mappez les champs Typeform vers les champs HubSpot (firstName, lastName, email, company, phone)
  3. Déduplication : nœud HubSpot — action Search Contact avec l’email pour éviter les doublons
  4. Branchement : nœud IF — si le contact existe → mettre à jour, sinon → créer
  5. Création : nœud HubSpot — action Create Contact avec les données mappées
  6. Tag : nœud HubSpot — ajoutez le tag source:typeform et assignez à un commercial
  7. 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 →

🚀

Partagez cette page

Faites découvrir nos conseils experts à votre réseau

💡 Partagez nos conseils d'experts avec votre réseau professionnel

🎯
Découvrez votre potentiel d'automatisation

Répondez à 5 questions — obtenez votre score et 3 recommandations personnalisées en 2 minutes

⚡ Résultat immédiat 🔒 Sans engagement
Lancer l'audit express

Passez à l'action

Prêt à automatiser votre entreprise ?

Audit gratuit en 48h — ROI estimé, plan d'action personnalisé, sans engagement.