Installer et sécuriser

Automatiser ses workflows avec n8n sur un VPS

Installer n8n avec Docker derrière Nginx et HTTPS sur un VPS Ubuntu : exécutions illimitées, données sur votre serveur, commandes testées sur Ubuntu 26.04 LTS.

Publié le

n8n relie vos applications entre elles : un formulaire qui alimente un tableur, une commande qui déclenche un email, un agent d'IA qui trie vos messages. Hébergé sur votre propre VPS, il n'a pas de limite d'exécutions et vos données restent sur votre serveur. Ce guide l'installe avec Docker, derrière Nginx et un certificat HTTPS. Toutes les commandes ont été exécutées sur Ubuntu 26.04.1 LTS le 27 septembre 2026, en environnement de test puis sur un VPS QuantylCloud.

Avant de commencer

  • un VPS sous Ubuntu, sécurisé en suivant Sécuriser son VPS Linux ;
  • 2 vCPU et 4 Go de mémoire : n8n tourne sur moins, mais des workflows chargés ou des nœuds d'IA consomment vite la mémoire (voir Créer un VPS au Maroc) ;
  • un sous-domaine, par exemple n8n.exemple.ma, dont l'enregistrement DNS A pointe vers l'adresse IP du serveur. Remplacez-le par le vôtre dans toutes les commandes ;
  • pour le premier workflow de l'étape 7, un compte SMTP : celui de votre messagerie professionnelle ou d'un service d'envoi d'emails.

Étape 1 — Ouvrir les ports du web

Ouvrez les ports 80 et 443 dans l'onglet Pare-feu de la fiche du serveur, dans la console, puis dans ufw :

sudo ufw allow 80,443/tcp

N'ouvrez pas le port 5678 de n8n : il ne sera joignable qu'à travers Nginx.

Étape 2 — Installer Docker

sudo apt update
sudo apt install -y docker.io docker-compose-v2

Ce sont les paquets Docker d'Ubuntu, mis à jour avec le reste du système. Vérifiez avec docker compose version.

Étape 3 — Décrire le service n8n

sudo mkdir -p /opt/n8n
sudo tee /opt/n8n/compose.yaml >/dev/null <<'YAML'
services:
  n8n:
    image: docker.n8n.io/n8nio/n8n
    restart: unless-stopped
    ports:
      - "127.0.0.1:5678:5678"
    environment:
      - N8N_HOST=n8n.exemple.ma
      - N8N_PROTOCOL=https
      - N8N_WEBHOOK_URL=https://n8n.exemple.ma/
      - N8N_PROXY_HOPS=1
      - N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true
      - GENERIC_TIMEZONE=Africa/Casablanca
      - TZ=Africa/Casablanca
    volumes:
      - n8n_data:/home/node/.n8n

volumes:
  n8n_data:
YAML

Trois lignes méritent qu'on s'y arrête :

  • 127.0.0.1:5678:5678 : n8n n'écoute que sur la machine elle-même. Écrit 5678:5678, le port serait ouvert sur Internet malgré ufw, car Docker pose ses propres règles de pare-feu, qui passent avant celles d'ufw. Nous l'avons vérifié en test.
  • N8N_WEBHOOK_URL : l'adresse publique de vos webhooks. Sans elle, n8n afficherait des URL en http://…:5678 que personne ne peut joindre.
  • GENERIC_TIMEZONE : l'heure de vos déclencheurs planifiés. Un workflow « tous les jours à 9 h » partira à 9 h, heure de Casablanca.

Étape 4 — Démarrer n8n

cd /opt/n8n
sudo docker compose up -d
curl -s http://127.0.0.1:5678/healthz

Le premier démarrage télécharge l'image et prépare la base : comptez une à deux minutes avant que la dernière commande réponde {"status":"ok"}. Les journaux se lisent avec sudo docker compose logs. Un avertissement sur le mode des « task runners » peut y figurer : il ne gêne pas une instance individuelle.

Étape 5 — Publier n8n derrière Nginx, en HTTPS

sudo apt install -y nginx
sudo tee /etc/nginx/sites-available/n8n >/dev/null <<'CONF'
server {
    listen 80;
    listen [::]:80;
    server_name n8n.exemple.ma;
    client_max_body_size 16M;

    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-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_buffering off;
        proxy_read_timeout 3600s;
    }
}
CONF
sudo ln -s /etc/nginx/sites-available/n8n /etc/nginx/sites-enabled/
sudo rm /etc/nginx/sites-enabled/default
sudo nginx -t
sudo systemctl reload nginx

Les lignes Upgrade et Connection laissent passer les WebSockets : sans elles, l'éditeur de n8n s'ouvre mais ne voit pas vos exécutions en direct. Obtenez ensuite le certificat :

sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d n8n.exemple.ma

Comme dans le guide Déployer WordPress sur un VPS, certbot demande une adresse email, redirige HTTP vers HTTPS et renouvelle le certificat tout seul. En test, le certificat venait de l'autorité de test de Let's Encrypt ; face au vrai, le DNS doit déjà pointer vers le serveur et le port 80 être ouvert aux deux pare-feu.

Étape 6 — Créer le compte propriétaire, tout de suite

Ouvrez https://n8n.exemple.ma. n8n demande de créer le compte propriétaire : faites-le immédiatement. Tant que ce compte n'existe pas, le premier visiteur de l'adresse peut le créer à votre place et prendre la main sur l'instance. Choisissez un mot de passe long, puis activez l'authentification à deux facteurs dans les paramètres de votre compte.

Étape 7 — Un premier workflow : recevoir un formulaire par email

Exemple concret : le formulaire de contact de votre site envoie ses champs à n8n, qui vous les transmet par email. Dans l'éditeur, cliquez sur Create workflow, puis copiez ce texte et collez-le dans la zone de travail avec Ctrl+V (Cmd+V sur Mac) :

{
  "nodes": [
    {
      "name": "Webhook",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [0, 0],
      "parameters": { "httpMethod": "POST", "path": "contact", "options": {} }
    },
    {
      "name": "Envoyer l'email",
      "type": "n8n-nodes-base.emailSend",
      "typeVersion": 2.1,
      "position": [220, 0],
      "parameters": {
        "fromEmail": "n8n@exemple.ma",
        "toEmail": "vous@exemple.ma",
        "subject": "=Nouveau message de {{ $json.body.nom }}",
        "emailFormat": "text",
        "text": "=De : {{ $json.body.nom }} <{{ $json.body.email }}>\n\n{{ $json.body.message }}",
        "options": { "appendAttribution": false }
      }
    }
  ],
  "connections": {
    "Webhook": { "main": [[{ "node": "Envoyer l'email", "type": "main", "index": 0 }]] }
  }
}

n8n peut demander si le texte vient d'un outil d'IA : répondez Skip. Deux nœuds apparaissent, reliés. Ouvrez Envoyer l'email d'un double clic, remplacez les deux adresses par les vôtres, puis, sous Credential, cliquez sur Connect to SMTP (si vous avez déjà des identifiants, ouvrez la liste et choisissez Create new credential). Renseignez votre compte SMTP :

  • User et Password : l'identifiant et le mot de passe de votre compte ;
  • Host : le serveur SMTP ;
  • Port 587 avec SSL/TLS désactivé (la connexion est chiffrée par STARTTLS), ou 465 avec SSL/TLS activé, selon ce qu'indique votre fournisseur.

Enregistrez avec Save : n8n teste la connexion et signale une erreur si les réglages ne conviennent pas. Refermez le nœud, puis cliquez sur Publish et donnez un nom à cette version : tant que l'identifiant manque, ce bouton reste grisé. Le workflow est en service. Testez-le depuis votre ordinateur :

curl -X POST https://n8n.exemple.ma/webhook/contact -H 'Content-Type: application/json' -d '{"nom":"Salma","email":"salma@exemple.ma","message":"Bonjour, je voudrais un devis."}'

La réponse {"message":"Workflow was started"} arrive tout de suite, et l'email « Nouveau message de Salma » dans la minute. Votre formulaire n'a plus qu'à envoyer ses champs nom, email et message à cette adresse. Elle est publique : pour qu'un inconnu ne puisse pas s'en servir, activez l'authentification dans les paramètres du nœud Webhook avant de la mettre en production.

Sauvegarder, et savoir restaurer

Vos workflows, vos identifiants de connexion et la clé qui les chiffre sont dans le volume Docker n8n_n8n_data : Compose préfixe le nom du volume par celui du dossier, n8n. Ils survivent aux mises à jour, pas à la perte du serveur. Sans la clé, des identifiants restaurés sont illisibles : notez-la d'abord dans votre gestionnaire de mots de passe.

cd /opt/n8n
sudo docker compose exec n8n cat /home/node/.n8n/config

Créez ensuite une archive complète, n8n arrêté quelques secondes pour qu'elle soit cohérente :

cd /opt/n8n
sudo docker compose stop
sudo tar -czf ~/n8n-sauvegarde-$(date +%F).tar.gz -C /var/lib/docker/volumes/n8n_n8n_data/_data .
sudo docker compose start

Une sauvegarde restée sur le serveur disparaît avec lui : rapatriez-la sur votre ordinateur, par exemple avec scp gestion@ADRESSE_IP:n8n-sauvegarde-*.tar.gz .. L'option de sauvegarde quotidienne de la fiche du serveur, dans la console, ajoute une copie du serveur entier.

Pour restaurer sur un serveur neuf, suivez les étapes 1 à 3, copiez l'archive dans le dossier de gestion, puis, en remplaçant la date par celle de votre archive :

cd /opt/n8n
sudo docker compose create
sudo tar -xzf ~/n8n-sauvegarde-AAAA-MM-JJ.tar.gz -C /var/lib/docker/volumes/n8n_n8n_data/_data
sudo docker compose up -d

Poursuivez avec l'étape 5. En test, après suppression du volume puis restauration, le compte, le workflow et l'identifiant SMTP sont revenus, et l'email est reparti. Faites cet essai une fois de votre côté : une sauvegarde jamais restaurée reste une hypothèse.

Mettre à jour

n8n publie une nouvelle version presque chaque semaine. Sauvegardez, puis :

cd /opt/n8n
sudo docker compose pull
sudo docker compose up -d

Les mises à jour automatiques d'Ubuntu ne touchent pas n8n : c'est cette commande qui le fait évoluer. Telle quelle, elle prend toujours la dernière version, y compris un changement de version majeure qui peut demander d'adapter vos workflows. Pour choisir le moment, fixez la version dans compose.yaml, par exemple image: docker.n8n.io/n8nio/n8n:2.40.7 : vous changerez ce numéro après avoir lu les notes de version.

Questions fréquentes

Pourquoi héberger n8n soi-même plutôt que sur n8n Cloud ?

Sur votre VPS, le nombre d'exécutions n'est limité que par la puissance du serveur, et vos données comme vos identifiants restent chez vous. En contrepartie, les mises à jour et les sauvegardes sont à votre charge.

Quel plan choisir pour n8n ?

2 vCPU et 4 Go de mémoire conviennent à la plupart des usages. Des workflows très fréquents, de gros fichiers ou des nœuds d'IA peuvent demander davantage.

Mes webhooks affichent une adresse en http://…:5678, pourquoi ?

La variable N8N_WEBHOOK_URL manque ou est mal écrite dans compose.yaml. Corrigez-la avec votre adresse en https, puis relancez sudo docker compose up -d.

Faut-il ouvrir le port 5678 ?

Non. n8n n'écoute que sur la machine elle-même et Nginx le publie en HTTPS sur le port 443. Ouvrir 5678 exposerait n8n sans chiffrement.