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 DNSApointe 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/tcpN'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-v2Ce 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:
YAMLTrois 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. Écrit5678: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 enhttp://…:5678que 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/healthzLe 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 nginxLes 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.maComme 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
587avec SSL/TLS désactivé (la connexion est chiffrée par STARTTLS), ou465avec 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/configCré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 startUne 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 -dPoursuivez 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 -dLes 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.
