Nous utilisons des cookies de mesure d'audience et publicitaires (Google Analytics, Google Ads, Microsoft Clarity) pour améliorer votre expérience et mesurer nos campagnes. Vous pouvez accepter ou refuser. Voir notre politique de confidentialité.

Guide technique

n8n self-hosted : guide d'installation, sécurisation et mise en production pour PME

12 mai 2026 Mis à jour le 24 septembre 2026 18 min de lecture
LNLouis NoyaretCofondateur
n8n self-hosted : guide d'installation, sécurisation et mise en... - Guide technique

Self-hoster n8n est une option courante pour les PME qui veulent garder la main sur leurs workflows d'automatisation et sur leurs données. L'édition Community est gratuite, la facture ne dépend ni du nombre d'utilisateurs ni du nombre d'exécutions, et vous choisissez où les données sont hébergées. Mais self-hoster sans méthode expose à trois risques sérieux : perte de données par mauvaise gestion des sauvegardes, intrusion par configuration de sécurité bâclée, et indisponibilité faute de supervision. Ce guide détaille les deux déploiements les plus pertinents pour une PME (Docker Compose sur VPS et Azure Container Apps), avec les configurations concrètes, les bonnes pratiques de sécurisation et les pratiques d'exploitation qui distinguent un n8n bricolé d'un n8n d'entreprise.

Cet article s'adresse aux DSI, lead développeurs, et responsables IT de PME qui ont décidé (ou envisagent) de déployer n8n en self-hosted plutôt que d'utiliser n8n Cloud. Si vous n'êtes pas encore convaincu du choix de n8n, nous avons traité la question dans notre comparatif n8n vs Make vs Zapier vs Power Automate et notre guide d'introduction à n8n pour DSI. Si vous êtes là, c'est que le débat est tranché et que la question concrète est : comment faire ça bien.

On va couvrir : les quatre options d'hébergement réalistes pour une PME et comment choisir, le walkthrough complet sur Docker Compose (cas le plus courant), le walkthrough complet sur Azure Container Apps (pertinent si vous êtes déjà sur Azure), la sécurisation au niveau attendu en production, et les pratiques opérationnelles qui font la différence à 6 et 12 mois.


Le prérequis honnête : self-hoster n8n demande des compétences

La documentation d'hébergement de n8n réserve explicitement le self-hosting aux utilisateurs avertis. Il faut prendre cet avertissement au sérieux. Les compétences réelles requises :

  • Administration Linux de base (utilisateurs, permissions, services systemd, firewall)
  • Docker et Docker Compose au niveau confortable (volumes, networks, environment variables, healthchecks)
  • Configuration d'un reverse proxy (Caddy ou Traefik ou nginx) avec gestion automatique des certificats SSL
  • Configuration d'une base PostgreSQL et compréhension des sauvegardes
  • Notions de sécurité réseau (ports ouverts, fail2ban, audit logs)
  • Lecture de logs et debug sous pression

Si votre équipe IT n'a pas ces compétences en interne et que vous n'avez pas de partenaire technique de confiance, n8n Cloud reste le bon choix. Le coût mensuel plus élevé achète l'absence d'exploitation à votre charge. Si vos compétences sont présentes ou si vous avez un partenaire qui prend la main, continuez la lecture.


Les quatre options d'hébergement réalistes pour une PME

Avant de choisir, voici la matrice de décision honnête.

n8n Cloud

L'option managée, hébergée par n8n. Pas d'installation, pas de maintenance, mise à jour automatique. D'après la grille tarifaire de n8n, le plan Starter coûte 20 € par mois (2 500 exécutions par mois) et le plan Pro 50 € par mois (10 000 exécutions), en facturation annuelle. Le plan Business, qui est une offre auto-hébergée avec licence, démarre à 667 € par mois pour 40 000 exécutions.

Choisir n8n Cloud si : vous n'avez pas de compétences DevOps en interne, vos workflows traitent moins de 10 000 exécutions par mois, vos données ne sont pas particulièrement sensibles, et le budget « par exécution » n'est pas un blocage. C'est aussi la bonne option pour faire un POC sans s'engager sur l'infrastructure.

Docker Compose sur VPS (Hetzner, OVH, Scaleway)

Le déploiement le plus répandu et probablement le mieux documenté. Un serveur virtuel chez un fournisseur cloud européen, Docker Compose pour orchestrer n8n + PostgreSQL + reverse proxy, gestion manuelle (ou semi-automatisée) des sauvegardes et des mises à jour.

Coût indicatif : les prix des VPS ont bougé en 2026, vérifiez la grille du jour avant de budgéter. Hetzner a relevé ses tarifs cloud le 15 juin 2026 (annonce officielle) : en Allemagne et en Finlande, un CX23 (2 vCPU, 4 Go de RAM) passe à 5,49 € HT par mois, un CX33 (4 vCPU, 8 Go) à 8,49 € HT, un CPX22 à 19,49 € HT. OVHcloud et Scaleway proposent des gammes comparables, à comparer sur leurs grilles publiques. Ajoutez le stockage objet S3 pour les sauvegardes, facturé au volume. Pour une instance n8n de PME, l'infrastructure reste de l'ordre de quelques dizaines d'euros par mois au plus.

Choisir cette option si : vous avez les compétences DevOps en interne, vous voulez maîtriser totalement les coûts, vos données doivent rester en Europe, vous n'avez pas besoin d'auto-scaling. C'est le bon choix par défaut pour la plupart des PME qui ont ces compétences.

Azure Container Apps

L'option PaaS de Microsoft pour déployer des conteneurs, avec intégration Azure Key Vault pour les secrets, Azure Database for PostgreSQL Flexible Server pour la base, gestion automatique du certificat SSL et facturation à la consommation.

Coût indicatif : la facture additionne le conteneur n8n (facturé à la consommation sur le profil Consumption), la base PostgreSQL managée et un peu de stockage et de journalisation. Pour la base, la plus petite taille (Burstable B1ms, 1 vCore, 2 Gio de RAM) coûte de l'ordre de 12 dollars par mois pour le calcul seul, hors stockage et sauvegardes, avec des écarts selon la région (grille Azure). Faites le chiffrage dans la calculatrice Azure pour votre région avant de décider.

Choisir cette option si : vous êtes déjà sur Azure pour votre infrastructure, vous voulez profiter de l'intégration native avec Azure Key Vault, Azure Monitor et Azure OpenAI, et vous préférez payer un peu plus pour ne pas gérer l'OS du serveur.

Kubernetes (AKS, GKE, EKS)

L'option pour la haute disponibilité, le déploiement multi-régions et l'intégration GitOps complète. Le coût se compte en nœuds, en stockage, en supervision et surtout en temps d'exploitation.

Choisir cette option si : vous avez déjà un cluster et l'équipe pour l'exploiter, vous faites tourner beaucoup d'autres services à côté de n8n, ou vos workflows sont critiques pour des opérations métier en temps réel. Pour une PME qui n'a qu'une instance n8n à héberger, Kubernetes est presque toujours surdimensionné. Notez aussi que faire tourner plusieurs instances n8n en parallèle suppose le mode queue (voir plus bas), quel que soit l'hébergement.

La matrice de décision synthétique

Critèren8n CloudDocker Compose VPSAzure Container AppsKubernetes
Structure du coût mensuelAbonnement (20 € Starter, 50 € Pro)Serveur + stockage de sauvegardeConsommation + base managéeNœuds + exploitation
Effort initialAucunFaible à moyenMoyenÉlevé
MaintenanceAucuneOS, Docker, sauvegardes, mises à jourMises à jour de l'imageCluster complet
Maîtrise de l'hébergementChoix de n8nTotaleRégion Azure choisieTotale
Montée en chargeGéréeManuelle (mode queue)Mode queueMode queue
Complexité opérationnelleTrès faibleMoyenneFaible-moyenneÉlevée
Recommandé pourPOC, <10k exec/moisMajorité des PMEPME sur AzureETI / haute dispo

Cas 1 : Docker Compose sur VPS, pas à pas

Ce cas couvre l'installation production-ready sur un VPS Linux Ubuntu 24.04 LTS, avec n8n derrière Caddy comme reverse proxy (Caddy gère automatiquement les certificats Let's Encrypt), PostgreSQL en base de données, et sauvegardes automatisées vers un stockage objet S3-compatible.

Étape 1 : provisionnement du VPS

Chez OVHcloud, Hetzner ou Scaleway, créer une instance en Ubuntu 24.04 avec au moins 2 vCPU et 4 Go de RAM, clé SSH ajoutée à la création.

Configurer immédiatement le DNS pour pointer votre sous-domaine vers l'IP du VPS. Par exemple, créer un A record n8n.votreentreprise.com qui pointe vers l'IP publique. Sans DNS correctement propagé, Caddy ne pourra pas obtenir le certificat SSL.

Étape 2 : sécurisation initiale du serveur

Se connecter en SSH puis créer un utilisateur non-root avec sudo, désactiver le login root par mot de passe, n'autoriser que la clé SSH.

## Création utilisateur
adduser deploy
usermod -aG sudo deploy
rsync --archive --chown=deploy:deploy ~/.ssh /home/deploy

## Désactiver login root et password auth dans /etc/ssh/sshd_config
sudo sed -i 's/^#PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config
sudo sed -i 's/^#PasswordAuthentication.*/PasswordAuthentication no/' /etc/ssh/sshd_config
sudo systemctl restart ssh

## Firewall basique
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable

## Installer fail2ban pour limiter le brute-force SSH
sudo apt update && sudo apt install -y fail2ban
sudo systemctl enable fail2ban && sudo systemctl start fail2ban

Étape 3 : installation de Docker et Docker Compose

## Installation officielle Docker pour Ubuntu 24.04
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker deploy
newgrp docker

## Vérification
docker --version
docker compose version

Étape 4 : génération des secrets et création du docker-compose.yml

Tous les secrets doivent être générés une seule fois et stockés en lieu sûr. La clé d'encryption en particulier (N8N_ENCRYPTION_KEY) est critique : si vous la perdez, tous les credentials stockés dans n8n deviennent irrécupérables.

mkdir -p ~/n8n && cd ~/n8n
mkdir -p caddy_data caddy_config n8n_data postgres_data
chmod 700 n8n_data postgres_data

## Génération des secrets
openssl rand -hex 32  # Pour N8N_ENCRYPTION_KEY
openssl rand -hex 32  # Pour POSTGRES_PASSWORD
openssl rand -hex 16  # Pour POSTGRES_NON_ROOT_PASSWORD

Créer un fichier .env (à conserver impérativement en dehors du repo Git si vous versionnez votre stack) :

## Domaine
DOMAIN_NAME=n8n.votreentreprise.com
SUBDOMAIN=n8n
GENERIC_TIMEZONE=Europe/Paris

## Secrets - REMPLACER par les valeurs générées plus haut
N8N_ENCRYPTION_KEY=<32_octets_hex_generes>
POSTGRES_USER=n8n
POSTGRES_PASSWORD=<32_octets_hex_generes>
POSTGRES_DB=n8n

## Email pour Let's Encrypt
SSL_EMAIL=admin@votreentreprise.com

Créer le docker-compose.yml :

services:
  postgres:
    image: postgres:16-alpine
    restart: unless-stopped
    environment:
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DB: ${POSTGRES_DB}
    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

  n8n:
    image: docker.n8n.io/n8nio/n8n:latest  # remplacer par une version fixe en production (voir étape 7)
    restart: unless-stopped
    depends_on:
      postgres:
        condition: service_healthy
    environment:
      - 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}
      - N8N_HOST=${DOMAIN_NAME}
      - N8N_PORT=5678
      - N8N_PROTOCOL=https
      - WEBHOOK_URL=https://${DOMAIN_NAME}/
      - N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
      - GENERIC_TIMEZONE=${GENERIC_TIMEZONE}
      - N8N_LOG_LEVEL=info
      - N8N_SECURE_COOKIE=true
      - N8N_PROXY_HOPS=1
      - EXECUTIONS_DATA_PRUNE=true
      - EXECUTIONS_DATA_MAX_AGE=336  # 14 jours
    volumes:
      - ./n8n_data:/home/node/.n8n

  caddy:
    image: caddy:2-alpine
    restart: unless-stopped
    ports:
      - '80:80'
      - '443:443'
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile
      - ./caddy_data:/data
      - ./caddy_config:/config
    depends_on:
      - n8n

Créer un Caddyfile minimaliste (Caddy gère automatiquement le certificat SSL) :

{$DOMAIN_NAME} {
    reverse_proxy n8n:5678
    encode gzip
    
    header {
        Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
        X-Content-Type-Options "nosniff"
        X-Frame-Options "SAMEORIGIN"
        Referrer-Policy "strict-origin-when-cross-origin"
    }
}

Étape 5 : démarrage et accès initial

docker compose up -d
docker compose logs -f n8n

Une fois les logs stables (chercher la ligne Editor is now accessible via), ouvrir https://n8n.votreentreprise.com dans le navigateur. Créer le compte owner avec un mot de passe fort, c'est l'administrateur global de l'instance.

Étape 6 : sauvegardes automatisées

Sans sauvegarde, vous n'êtes pas en production. Voici un script de sauvegarde quotidienne vers un bucket S3-compatible (exemple Hetzner Object Storage, mais fonctionne avec Scaleway, OVH ou AWS S3) :

## Installer awscli configuré pour le bucket S3-compatible
sudo apt install -y awscli
aws configure  # avec les credentials du bucket

## Créer le script /usr/local/bin/n8n-backup.sh
sudo tee /usr/local/bin/n8n-backup.sh > /dev/null <<'EOF'
#!/bin/bash
set -e
BACKUP_DIR="/tmp/n8n-backup"
DATE=$(date +%Y%m%d_%H%M%S)
BUCKET="votre-bucket-backup"

mkdir -p $BACKUP_DIR
cd /home/deploy/n8n

## Dump PostgreSQL
docker compose exec -T postgres pg_dump -U n8n n8n | gzip > $BACKUP_DIR/n8n_db_$DATE.sql.gz

## Archive du dossier n8n_data (credentials chiffrés, settings)
tar czf $BACKUP_DIR/n8n_data_$DATE.tar.gz n8n_data/

## Upload vers S3
aws s3 cp $BACKUP_DIR/n8n_db_$DATE.sql.gz s3://$BUCKET/db/ --endpoint-url https://fsn1.your-objectstorage.com
aws s3 cp $BACKUP_DIR/n8n_data_$DATE.tar.gz s3://$BUCKET/data/ --endpoint-url https://fsn1.your-objectstorage.com

## Nettoyage local
rm -rf $BACKUP_DIR

## Rotation : garder 30 jours
aws s3 ls s3://$BUCKET/db/ --endpoint-url https://fsn1.your-objectstorage.com | \
  awk '{print $4}' | head -n -30 | xargs -I {} aws s3 rm s3://$BUCKET/db/{} --endpoint-url https://fsn1.your-objectstorage.com
EOF

sudo chmod +x /usr/local/bin/n8n-backup.sh

## Crontab : sauvegarde quotidienne à 3h du matin
echo "0 3 * * * /usr/local/bin/n8n-backup.sh >> /var/log/n8n-backup.log 2>&1" | crontab -

Test de restauration : à faire au moins une fois. Une sauvegarde non testée n'est pas une sauvegarde. Provisionnez un VPS de test, restaurez la dernière sauvegarde, vérifiez que vos workflows s'exécutent. Comptez une demi-journée la première fois : c'est la seule façon de savoir que la restauration fonctionne avant d'en avoir besoin.

Étape 7 : mises à jour

D'après ses notes de version, n8n publie une nouvelle version mineure presque chaque semaine. Procédure de mise à jour propre :

cd ~/n8n
## Sauvegarde manuelle avant montée de version
/usr/local/bin/n8n-backup.sh

## Pull et redémarrage
docker compose pull
docker compose up -d

## Vérifier les logs
docker compose logs -f n8n --tail=100

Notre recommandation : ne pas rester sur l'étiquette latest en production. Fixez une version précise dans le docker-compose.yml (docker.n8n.io/n8nio/n8n:<numéro de version>), testez les montées de version sur un environnement de staging, puis basculez en production. Lisez les notes de version avant chaque changement de version majeure, qui peut demander une action de votre part. n8n est mature, mais des régressions arrivent.


Cas 2 : Azure Container Apps, pas à pas

L'intérêt principal par rapport au VPS Docker Compose : Azure gère l'OS, le SSL, les secrets via Key Vault, et la base PostgreSQL est un service managé. Moins d'opérations, plus de coût en fonctionnement, et une exploitation plus simple sur la durée si votre équipe connaît déjà Azure.

Prérequis

  • Un abonnement Azure actif
  • Azure CLI installé localement (az --version doit fonctionner)
  • Un domaine personnalisé avec accès au DNS

Étape 1 : configuration de base et resource group

## Authentification
az login
az account set --subscription "<votre-subscription-id>"

## Variables
RESOURCE_GROUP="rg-n8n-prod"
LOCATION="francecentral"
ENV_NAME="n8n-env"
APP_NAME="n8n"
KEYVAULT_NAME="kv-n8n-prod"
POSTGRES_NAME="psql-n8n-prod"
DB_NAME="n8n"
DB_ADMIN_USER="n8nadmin"
DB_PASSWORD=$(openssl rand -base64 24)
N8N_ENCRYPTION_KEY=$(openssl rand -hex 32)

## Resource group
az group create --name $RESOURCE_GROUP --location $LOCATION

## Enregistrement des providers nécessaires
az provider register --namespace Microsoft.App
az provider register --namespace Microsoft.OperationalInsights
az provider register --namespace Microsoft.DBforPostgreSQL
az provider register --namespace Microsoft.KeyVault

Étape 2 : Azure Key Vault pour les secrets

az keyvault create \
  --name $KEYVAULT_NAME \
  --resource-group $RESOURCE_GROUP \
  --location $LOCATION \
  --enable-rbac-authorization true

## Stocker les secrets
az keyvault secret set --vault-name $KEYVAULT_NAME --name "db-password" --value "$DB_PASSWORD"
az keyvault secret set --vault-name $KEYVAULT_NAME --name "n8n-encryption-key" --value "$N8N_ENCRYPTION_KEY"

Étape 3 : PostgreSQL Flexible Server

az postgres flexible-server create \
  --resource-group $RESOURCE_GROUP \
  --name $POSTGRES_NAME \
  --location $LOCATION \
  --admin-user $DB_ADMIN_USER \
  --admin-password "$DB_PASSWORD" \
  --sku-name Standard_B1ms \
  --tier Burstable \
  --storage-size 32 \
  --version 16 \
  --public-access 0.0.0.0

az postgres flexible-server db create \
  --resource-group $RESOURCE_GROUP \
  --server-name $POSTGRES_NAME \
  --database-name $DB_NAME

Le Standard_B1ms (1 vCore, 2 Gio de RAM) est la plus petite taille disponible ; elle convient pour démarrer une instance n8n de PME. Surveillez le CPU et la mémoire de la base les premières semaines et montez d'une taille si besoin.

Étape 4 : Container Apps Environment

## Création du Log Analytics workspace (auto par az containerapp env)
az containerapp env create \
  --name $ENV_NAME \
  --resource-group $RESOURCE_GROUP \
  --location $LOCATION

Étape 5 : déploiement du Container App n8n

DB_HOST="${POSTGRES_NAME}.postgres.database.azure.com"

az containerapp create \
  --name $APP_NAME \
  --resource-group $RESOURCE_GROUP \
  --environment $ENV_NAME \
  --image docker.n8n.io/n8nio/n8n:latest \
  --target-port 5678 \
  --ingress external \
  --min-replicas 1 \
  --max-replicas 1 \
  --cpu 1.0 \
  --memory 2.0Gi \
  --env-vars \
    DB_TYPE=postgresdb \
    DB_POSTGRESDB_HOST=$DB_HOST \
    DB_POSTGRESDB_PORT=5432 \
    DB_POSTGRESDB_DATABASE=$DB_NAME \
    DB_POSTGRESDB_USER=$DB_ADMIN_USER \
    DB_POSTGRESDB_PASSWORD=secretref:db-password \
    DB_POSTGRESDB_SSL_ENABLED=true \
    DB_POSTGRESDB_SSL_REJECT_UNAUTHORIZED=false \
    N8N_ENCRYPTION_KEY=secretref:n8n-encryption-key \
    N8N_HOST=n8n.votreentreprise.com \
    N8N_PORT=5678 \
    N8N_PROTOCOL=https \
    WEBHOOK_URL=https://n8n.votreentreprise.com/ \
    N8N_SECURE_COOKIE=true \
    N8N_PROXY_HOPS=1 \
    GENERIC_TIMEZONE=Europe/Paris \
    EXECUTIONS_DATA_PRUNE=true \
    EXECUTIONS_DATA_MAX_AGE=336 \
  --secrets \
    db-password=keyvaultref:https://${KEYVAULT_NAME}.vault.azure.net/secrets/db-password,identityref:system \
    n8n-encryption-key=keyvaultref:https://${KEYVAULT_NAME}.vault.azure.net/secrets/n8n-encryption-key,identityref:system \
  --system-assigned

Une seule réplique, volontairement. En mode normal, le processus n8n principal planifie les déclencheurs et exécute les workflows : plusieurs répliques identiques en parallèle risquent de déclencher deux fois le même workflow planifié. Pour répartir la charge, n8n prévoit le mode queue : un processus principal, des workers qui exécutent, Redis comme file d'attente et PostgreSQL comme base. La configuration à plusieurs processus principaux (multi-main) est réservée à la licence Enterprise. Pour une PME, une réplique bien dimensionnée suffit presque toujours.

Étape 6 : autoriser l'identité managée à lire le Key Vault

PRINCIPAL_ID=$(az containerapp show --name $APP_NAME --resource-group $RESOURCE_GROUP --query identity.principalId -o tsv)

az role assignment create \
  --assignee $PRINCIPAL_ID \
  --role "Key Vault Secrets User" \
  --scope $(az keyvault show --name $KEYVAULT_NAME --query id -o tsv)

Étape 7 : configuration du domaine custom et SSL

Récupérer le hostname par défaut de l'application :

APP_FQDN=$(az containerapp show --name $APP_NAME --resource-group $RESOURCE_GROUP --query properties.configuration.ingress.fqdn -o tsv)
echo "App FQDN: $APP_FQDN"

Créer un CNAME dans votre DNS pour faire pointer n8n.votreentreprise.com vers $APP_FQDN. Puis lier le custom domain à l'app (Azure va automatiquement émettre un certificat) :

az containerapp hostname add \
  --hostname n8n.votreentreprise.com \
  --name $APP_NAME \
  --resource-group $RESOURCE_GROUP

az containerapp hostname bind \
  --hostname n8n.votreentreprise.com \
  --name $APP_NAME \
  --resource-group $RESOURCE_GROUP \
  --environment $ENV_NAME \
  --validation-method CNAME

Étape 8 : sauvegardes managées

PostgreSQL Flexible Server fait des sauvegardes automatiques (7 jours de rétention par défaut, configurable jusqu'à 35 jours). C'est suffisant pour la base au quotidien. Avant une opération risquée (montée de version majeure, migration), déclenchez en plus une sauvegarde à la demande :

az postgres flexible-server backup create \
  --resource-group $RESOURCE_GROUP \
  --server-name $POSTGRES_NAME \
  --backup-name "manual-$(date +%Y%m%d)"

Pour le volume n8n (configurations, custom nodes éventuels), Azure Container Apps ne gère pas nativement la persistance hors base. Si vous installez des custom nodes ou utilisez des fichiers locaux, monter un Azure Files share. Dans la plupart des cas, la base PostgreSQL suffit : workflows et credentials y sont stockés, les credentials chiffrés avec la clé N8N_ENCRYPTION_KEY, que vous conservez dans Key Vault.

Étape 9 : monitoring

Activer Application Insights et lier au Log Analytics workspace du Container Apps Environment. Les logs sont automatiquement collectés. Configurer des alertes sur :

  • Taux d'échec des exécutions n8n > 5 % sur 15 minutes
  • Latence moyenne des webhooks > 2 secondes
  • CPU PostgreSQL > 80 % sur 10 minutes
  • Application indisponible (aucune réplique active pendant plus de 5 minutes)

Ces seuils sont des points de départ à ajuster à votre volume.


Sécurisation : les pratiques attendues en production

Que vous soyez sur Docker Compose ou sur Azure Container Apps, certaines pratiques sont incontournables pour une utilisation en production.

Gestion des secrets

Ne jamais stocker N8N_ENCRYPTION_KEY, mots de passe DB, ou clés API en clair dans le docker-compose.yml ou dans des variables d'environnement non-protégées. Sur VPS Docker Compose, utilisez un fichier .env avec permissions 600 (lecture/écriture propriétaire uniquement) et exclu de tout repo Git. Sur Azure, utilisez Key Vault systématiquement avec des secretref.

Authentification

n8n supporte plusieurs mécanismes d'authentification en self-hosted. Pour une PME, l'authentification email/mot de passe native est suffisante au démarrage, mais activez la double authentification (application TOTP, disponible dans l'édition Community) sur les comptes administrateurs dès la première semaine. L'authentification unique SAML ou LDAP (Microsoft Entra ID, Google Workspace, Okta) n'est pas dans l'édition Community : elle fait partie des plans Business et Enterprise, selon la grille de n8n. Au-delà d'une dizaine d'utilisateurs, c'est un critère à peser dans le choix de licence.

Politique RBAC

n8n Community gère des rôles simples (propriétaire, membres). Pour différencier admin / éditeur / lecteur par projet, il faut une licence Business ou Enterprise, soit organiser via plusieurs instances n8n par périmètre (option viable pour une PME avec 2-3 équipes distinctes mais lourde au-delà).

Audit logs

n8n conserve l'historique des exécutions en base. La traçabilité fine des événements (connexions, modifications de workflows) par envoi vers un outil externe relève des licences payantes. En Community, gardez au minimum N8N_LOG_LEVEL=info, exportez les journaux du conteneur vers un système centralisé (Loki + Grafana sur VPS, Azure Monitor sur Azure) et conservez-les au moins 90 jours.

Restriction réseau

Ne pas exposer n8n publiquement si vos workflows n'ont pas besoin de webhooks externes. Sur Azure Container Apps, configurer ingress internal au lieu d'external et accéder via VPN ou Azure Front Door avec WAF. Sur VPS, placer l'éditeur derrière Cloudflare Access ou un réseau privé type Tailscale (sans Funnel, qui rendrait le service public) pour ne pas exposer le 443 en direct.

Si vous avez besoin de webhooks externes (typique : recevoir des callbacks de Stripe, HubSpot, etc.), gardez l'accès public limité aux chemins de webhook, protégez chaque nœud Webhook par une authentification (en-tête, basic ou JWT) et, quand l'émetteur signe ses appels, vérifiez cette signature dans le workflow concerné.

Mises à jour de sécurité

n8n publie régulièrement des patches de sécurité. Souscrire au GitHub Security Advisory de n8n-io/n8n et appliquer les patches critiques sous 48 heures. Les patches mineurs : à chaque cycle de maintenance (toutes les 2-4 semaines).

Gestion des credentials externes

n8n stocke les credentials des services tiers (API keys Stripe, tokens OAuth, etc.) chiffrés dans sa base avec N8N_ENCRYPTION_KEY. C'est solide, mais ça implique deux choses :

  • La clé d'encryption doit être sauvegardée séparément de la base (sinon un attaquant qui dump la base déchiffre tout)
  • Pour les credentials très sensibles (clés API production, tokens admin), envisager d'externaliser dans un secret manager (Azure Key Vault, HashiCorp Vault, AWS Secrets Manager) et de les passer à n8n en runtime via des variables d'environnement

Mise en production : ce qui distingue un n8n bricolé d'un n8n d'entreprise

Au-delà de l'installation et de la sécurité, voici les pratiques opérationnelles à mettre en place dès le départ.

Versioning des workflows

Versionner les workflows dans Git : chaque modification importante part en commit, relecture possible, retour arrière possible. L'intégration Git native de n8n (environnements, poussée et récupération depuis l'éditeur) est réservée aux plans Business et Enterprise. En Community, un export planifié des workflows en JSON (commande n8n export:workflow ou API REST) vers un dépôt Git remplit l'essentiel du besoin. Indispensable dès que plusieurs personnes éditent des workflows.

Environnement de staging

Une instance n8n production et une instance n8n staging avec la même configuration. Tout nouveau workflow ou modification majeure passe d'abord par staging, est testé, puis poussé en production. Pas négociable pour des workflows qui touchent à la facturation, aux notifications clients, ou à l'envoi d'emails commerciaux.

Healthchecks et alertes proactives

Au-delà du monitoring infrastructure, ajouter des healthchecks au niveau workflow : un workflow planifié qui s'auto-vérifie toutes les 5 minutes et envoie une alerte Slack/Teams si une dépendance critique (base de données, API externe) ne répond pas. Surveillez aussi ce qui ne produit pas d'erreur : une exécution qui ne se termine jamais, un workflow planifié qui ne s'est pas lancé, un nœud configuré pour ignorer ses erreurs. Ces pannes silencieuses échappent aux alertes classiques, qui ne voient que les échecs.

Documentation des workflows

Chaque workflow doit avoir, dans son nom et dans une note interne : son propriétaire métier, sa criticité (P1/P2/P3), la fréquence d'exécution attendue, le contact en cas de problème. Un n8n avec 200 workflows et zéro documentation devient ingérable en 6 mois.

Pruning des données d'exécution

Activer EXECUTIONS_DATA_PRUNE=true et configurer EXECUTIONS_DATA_MAX_AGE (336 heures = 14 jours dans les exemples ci-dessus) pour éviter que la base PostgreSQL grossisse sans contrôle. Pour les exécutions critiques, exporter avant pruning vers un stockage de log dédié.

Plan de continuité

Documenter le RTO (Recovery Time Objective) et le RPO (Recovery Point Objective) cibles. Pour une PME avec n8n en production :

  • RPO acceptable : 24 heures (sauvegarde quotidienne)
  • RTO acceptable : 4 heures (restauration depuis backup + redémarrage)

Si vos workflows sont critiques au point où ces objectifs ne suffisent pas, vous avez probablement besoin d'une architecture haute disponibilité (mode queue, plusieurs processus principaux sous licence Enterprise, PostgreSQL en haute disponibilité), et l'arbitrage économique devient celui d'une ETI, pas d'une PME.


Ce que nous faisons tourner chez Lumivi

Notre propre n8n ne tourne ni sur un VPS isolé ni sur Azure Container Apps. Il fait partie d'un ensemble de quarante-quatre services (sourcing, envoi, capture des réponses, génération documentaire, intranet) hébergés sur un cluster Kubernetes chez OVH, décrit en Terraform et livré par une seule chaîne d'intégration continue. À cette échelle, Kubernetes se justifie ; pour une seule instance n8n, ce serait surdimensionné.

La leçon utile pour une PME porte sur la supervision. Avant de mettre en place un contrôleur dédié à nos automatisations n8n, nous avons mesuré 85 exécutions figées depuis douze jours sans aucune alerte, et 16,6 % des nœuds configurés pour ignorer leurs erreurs. Le contrôleur passe désormais chaque matin et cherche aussi les pannes qui ne produisent aucun message d'erreur. Le détail est sur la fiche surveillance de l'infrastructure et des automatisations.


Conclusion : la production, c'est l'exploitation

L'installation de n8n self-hosted est l'étape facile : quelques heures de Docker Compose ou d'Azure CLI suffisent pour avoir un n8n qui répond. Ce qui distingue un déploiement amateur d'un déploiement professionnel, c'est ce qui se passe les mois suivants : sauvegardes testées, supervision active, mises à jour disciplinées, versioning des workflows, alertes calibrées, documentation tenue, plan de continuité documenté.

Une PME qui prend le temps d'une installation propre, puis consacre un créneau régulier à l'exploitation, aura un n8n fiable sur plusieurs années. Une PME qui installe en deux heures et n'y revient qu'en cas de panne s'expose à des pertes de données et à des indisponibilités, et conclura à tort que « le self-hosted ne marche pas » alors que c'est l'exploitation qui n'a pas suivi.

Le coût de l'infrastructure n'est pas le coût total. Le temps d'exploitation (mises à jour, sauvegardes, supervision, incidents) pèse souvent plus lourd que la facture du serveur. C'est ce temps qu'il faut comparer entre un VPS, où vous gérez l'OS, et un service managé comme Azure Container Apps, qui coûte plus cher mais en retire une partie.


Par où commencer dans une PME

  1. Listez les workflows que vous voulez faire tourner et leur criticité : cela décide entre n8n Cloud, un VPS ou un service managé.
  2. Vérifiez qui, en interne ou chez un prestataire, tiendra l'exploitation dans la durée. Sans cette personne, restez sur n8n Cloud.
  3. Si vous self-hostez, commencez par les sauvegardes et le test de restauration, avant le premier workflow en production.

Pour aller plus loin sur l'arbitrage d'hébergement, lisez self-hoster n8n sur un cloud souverain ou sur Azure et notre page intégration d'outils. Pour un avis sur votre architecture cible, le diagnostic gratuit est le bon point de départ.

À lire également : n8n : qu'est-ce que c'est ? Le guide complet pour DSI et responsables IT · n8n vs Make vs Zapier vs Power Automate · n8n self-hosted ou SaaS : le vrai coût pour une PME

Article rédigé par Louis Noyaret, cofondateur de Lumivi.

#n8n self-hosted#n8n docker compose#n8n azure container apps#n8n installation pme#n8n sécurisation production#n8n vps hetzner#n8n postgresql#n8n backup#n8n production guide
Questions fréquentes

On vous éclaire.

Quelle taille de VPS choisir pour démarrer avec n8n en self-hosted ?

Un serveur de 2 vCPU et 4 Go de RAM est un bon point de départ pour une instance n8n de PME avec PostgreSQL. Chez Hetzner, après la hausse de tarifs du 15 juin 2026, un CX23 (2 vCPU, 4 Go) coûte 5,49 € HT par mois et un CX33 (4 vCPU, 8 Go) 8,49 € HT en Allemagne et en Finlande. Montez d'une taille si vos workflows font du traitement lourd (gros fichiers, nombreux appels à des modèles de langage en parallèle). Au-delà, la bonne réponse est souvent le mode queue de n8n, avec des workers séparés, plutôt qu'un serveur toujours plus gros.

SQLite ou PostgreSQL pour la base de données n8n ?

PostgreSQL en production. SQLite suffit pour un usage personnel ou un POC, mais dès que vous avez plusieurs workflows concurrents et des données à conserver, PostgreSQL est préférable pour la concurrence d'accès et la fiabilité des sauvegardes. n8n le recommande aussi pour le mode queue. La configuration via Docker Compose ou via Azure Database for PostgreSQL Flexible Server se fait en quelques heures.

Que se passe-t-il si je perds la clé N8N_ENCRYPTION_KEY ?

Tous les credentials stockés dans n8n deviennent irrécupérables. Vous devrez les ressaisir un par un, ce qui peut représenter plusieurs jours de travail sur une instance mature. Cette clé doit être sauvegardée séparément de la base de données, dans un gestionnaire de secrets d'entreprise (1Password, Bitwarden, Azure Key Vault), et ne jamais être stockée dans un dépôt Git. C'est probablement le secret le plus critique de toute votre installation n8n.

Faut-il une licence n8n payante pour une PME ?

Pour la plupart des PME, non. L'édition Community est gratuite, sans limite de workflows ni d'exécutions, et inclut la double authentification. Les licences Business et Enterprise ajoutent l'authentification unique (SAML, LDAP), les rôles par projet, l'intégration Git native avec environnements séparés et un support officiel ; la configuration à plusieurs processus principaux est réservée à l'Enterprise. Elles se justifient quand le nombre d'utilisateurs rend la gestion des accès lourde, ou dans les secteurs régulés avec des exigences d'audit fortes.

Comment gérer les mises à jour n8n sans interruption de service ?

Sur Docker Compose, prévoyez quelques minutes d'interruption à chaque mise à jour, en heures creuses (la nuit ou le week-end), ce qui convient à la plupart des PME. Viser zéro interruption suppose le mode queue avec plusieurs processus principaux, une configuration réservée à la licence Enterprise, et une base PostgreSQL en haute disponibilité. Cette architecture n'est justifiée que pour des workflows critiques en temps réel. Pour une PME, une fenêtre de maintenance planifiée et une sauvegarde avant chaque mise à jour suffisent le plus souvent.