EUR
european

EUR

usa

USD

Ex. VAT Ex. VAT 0%

Installation de n8n avec Docker et PostgreSQL

n8n est une plateforme d'automatisation des flux de travail que vous pouvez exécuter sur votre propre serveur. Une instance auto-hébergée garde vos flux de travail, vos identifiants et vos données d'exécution sous votre contrôle et n'a aucune limite sur le nombre de flux de travail ou d'exécutions, au-delà de ce que le serveur peut gérer.

Ce guide configure n8n sur un serveur dédié avec PostgreSQL, HTTPS et des sauvegardes. Il utilise trois conteneurs gérés par Docker Compose :

  • n8n, la plateforme d'automatisation elle-même ;
  • PostgreSQL, la base de données pour les flux de travail, les identifiants et l'historique d'exécution ;
  • Caddy, un proxy inverse qui obtient et renouvelle automatiquement un certificat HTTPS.

Par défaut, n8n stocke ses données dans SQLite. Ce guide utilise PostgreSQL à la place : il peut être sauvegardé pendant que n8n est en cours d'exécution, et c'est la base de données que n8n recommande pour l'auto-hébergement.

Les étapes ont été testées sur Ubuntu 24.04 LTS avec n8n 2.46.7, PostgreSQL 17, Docker 29 et Docker Compose v5.

Avant de commencer

Vous aurez besoin de :

  • un serveur exécutant Ubuntu 24.04 LTS avec un accès root via SSH ;
  • un domaine ou un sous-domaine pour n8n, par exemple n8n.example.com ;
  • un enregistrement A pour ce nom pointant vers l'adresse IPv4 du serveur.

Si le domaine a également un enregistrement AAAA, le serveur doit être accessible via IPv6 à cette adresse. Sinon, Let's Encrypt peut essayer IPv6 en premier et échouer à émettre le certificat.

Vérifiez que l'enregistrement se résout sur votre serveur avant de continuer :

dig +short n8n.example.com

La commande devrait renvoyer l'adresse IP du serveur. L'émission du certificat dans Caddy en dépend, alors attendez que le DNS se soit propagé.

Toutes les commandes ci-dessous sont exécutées en tant que root. Si vous travaillez en tant qu'utilisateur normal avec des droits sudo, ajoutez sudo avant chaque commande.

Installer Docker

Installez Docker Engine et le plugin Compose à partir du dépôt officiel Docker. Le paquet docker.io du dépôt Ubuntu est plus ancien et n'inclut pas Compose v2.

apt update && apt install -y ca-certificates curl install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc chmod a+r /etc/apt/keyrings/docker.asc

Ajoutez le dépôt :

echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo $VERSION_CODENAME) stable" > /etc/apt/sources.list.d/docker.list

Installez les paquets :

apt update apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Vérifiez que les deux outils sont disponibles :

docker --version docker compose version

Créer le répertoire du projet et les secrets

Tous les fichiers n8n seront dans /opt/n8n :

mkdir -p /opt/n8n && cd /opt/n8n

Créez le fichier .env avec votre domaine, votre fuseau horaire et les secrets générés. Remplacez n8n.example.com et le fuseau horaire par vos propres valeurs :

cat > .env <<EOF DOMAIN=n8n.example.com GENERIC_TIMEZONE=Europe/Amsterdam POSTGRES_USER=n8n POSTGRES_DB=n8n POSTGRES_PASSWORD=$(openssl rand -hex 24) N8N_ENCRYPTION_KEY=$(openssl rand -hex 32) EOF chmod 600 .env

GENERIC_TIMEZONE définit le fuseau horaire utilisé par le nœud Schedule Trigger et d'autres nœuds basés sur le temps. Sans cela, n8n utilise America/New_York.

N8N_ENCRYPTION_KEY est la clé que n8n utilise pour chiffrer les identifiants que vous y enregistrez : jetons API, mots de passe, secrets OAuth. Si cette clé est perdue, les identifiants dans une base de données restaurée ne peuvent pas être déchiffrés et chacun d'eux doit être saisi à nouveau.

Warning

Copiez immédiatement le fichier .env dans un endroit sûr en dehors du serveur, par exemple un gestionnaire de mots de passe. Une sauvegarde de la base de données sans N8N_ENCRYPTION_KEY restaure vos flux de travail, mais pas vos identifiants.

Créer le fichier Docker Compose

Créez /opt/n8n/compose.yaml :

services: postgres: image: postgres:17 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 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_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY} N8N_HOST: ${DOMAIN} N8N_PROTOCOL: https N8N_PROXY_HOPS: 1 N8N_WEBHOOK_URL: https://${DOMAIN}/ GENERIC_TIMEZONE: ${GENERIC_TIMEZONE} TZ: ${GENERIC_TIMEZONE} ports: - "127.0.0.1:5678:5678" volumes: - n8n_data:/home/node/.n8n caddy: image: caddy:2 restart: unless-stopped ports: - "80:80" - "443:443" volumes: - ./Caddyfile:/etc/caddy/Caddyfile:ro - caddy_data:/data - caddy_config:/config volumes: postgres_data: n8n_data: caddy_data: caddy_config:

Quelques détails dans ce fichier sont importants pour la sécurité et la stabilité.

PostgreSQL n'a pas de section ports. La base de données n'est accessible que par les autres conteneurs du projet, jamais depuis internet.

Le port n8n est publié en tant que 127.0.0.1:5678. Les utilisateurs n'atteignent n8n que via Caddy en HTTPS, tandis que vous pouvez toujours vérifier n8n localement sur le serveur.

Warning

Ne raccourcissez pas la ligne du port n8n en 5678:5678. Docker ajoute ses propres règles de pare-feu pour les ports publiés, et elles contournent UFW. Sans le préfixe 127.0.0.1, n8n devient accessible via HTTP simple de n'importe où, même si UFW bloque le port 5678.

La condition depends_on avec un healthcheck fait en sorte que n8n attende que PostgreSQL soit prêt à accepter des connexions. Sans cela, n8n peut démarrer en premier lors d'un démarrage à froid et échouer à se connecter à la base de données.

N8N_PROXY_HOPS indique à n8n qu'il s'exécute derrière un proxy inverse, il lit donc l'adresse réelle du client à partir des en-têtes du proxy. N8N_WEBHOOK_URL définit l'adresse publique que n8n affiche pour les URL des webhooks. Dans les versions de n8n antérieures à 2.30, cette variable s'appelle WEBHOOK_URL.

Configurer HTTPS avec Caddy

Créez /opt/n8n/Caddyfile avec votre domaine :

n8n.example.com { reverse_proxy n8n:5678 }

C'est toute la configuration. Au premier démarrage, Caddy demande un certificat Let's Encrypt pour le domaine, redirige HTTP vers HTTPS et renouvelle le certificat avant qu'il n'expire. Les ports 80 et 443 doivent être ouverts pour que cela fonctionne.

Configurer le pare-feu

Autorisez d'abord SSH, puis HTTP et HTTPS, et activez UFW :

ufw allow OpenSSH ufw allow 80/tcp ufw allow 443/tcp ufw --force enable ufw status

Info

Si UFW était déjà activé avec vos propres règles, exécutez ufw status avant d'apporter des modifications et conservez les règles dont vous avez besoin. Autoriser OpenSSH avant d'activer UFW empêche votre session SSH actuelle d'être coupée.

Démarrer n8n

Démarrez les conteneurs en arrière-plan :

cd /opt/n8n docker compose up -d

Le premier démarrage télécharge les images et prend une minute ou deux. Vérifiez que les trois conteneurs sont en cours d'exécution et que PostgreSQL est en bonne santé (healthy) :

docker compose ps

Regardez le journal de n8n :

docker compose logs n8n --tail 50

Le journal devrait se terminer par une ligne comme :

Editor is now accessible via: https://n8n.example.com

Vérifiez que n8n répond localement et via Caddy :

curl -s http://127.0.0.1:5678/healthz curl -s https://n8n.example.com/healthz

Les deux commandes devraient renvoyer {"status":"ok"}.

Si la deuxième commande échoue, vérifiez le journal de Caddy avec docker compose logs caddy. La cause la plus fréquente est un enregistrement DNS qui ne pointe pas encore vers ce serveur, ou les ports 80 et 443 étant fermés.

Créer le compte propriétaire

Ouvrez https://n8n.example.com dans votre navigateur. Lors de la première visite, n8n vous demande de créer le compte propriétaire. Ce compte a des droits complets sur l'instance et gère tous les autres utilisateurs.

Entrez votre e-mail, votre prénom et votre nom, ainsi qu'un mot de passe, puis cliquez sur Suivant (Next). Le mot de passe doit comporter au moins 8 caractères et contenir au moins un chiffre et une lettre majuscule. Utilisez-en un fort : l'éditeur n8n est ouvert sur internet, et quiconque y accède peut exécuter des commandes sur le serveur via vos flux de travail.

Après la première connexion, n8n affiche un court sondage : Customize n8n to you. Les questions sont facultatives. Cliquez sur Commencer (Get started) pour le fermer, avec ou sans réponse.

Ensuite, n8n propose une clé de licence gratuite pour plusieurs fonctionnalités de l'édition Community : débogage avancé, recherche et étiquetage des exécutions, et dossiers pour les flux de travail. La clé est envoyée à l'e-mail que vous saisissez. Cliquez sur Send me a free license key pour l'obtenir, ou sur Ignorer (Skip) si vous n'avez pas besoin de ces fonctionnalités.

La page de vue d'ensemble s'ouvre. L'installation est terminée et vous pouvez créer votre premier flux de travail.

Sauvegarder n8n

Une sauvegarde n8n se compose de deux parties : un dump PostgreSQL avec vos flux de travail, identifiants, utilisateurs et historique d'exécution, et le fichier .env avec N8N_ENCRYPTION_KEY. Aucune des deux parties n'est utile sans l'autre.

Dans cette configuration, n8n conserve tout son état dans PostgreSQL. Le volume n8n_data n'a pas besoin d'être sauvegardé : une restauration complète fonctionne uniquement à partir du dump de la base de données et du fichier .env.

Créez un répertoire de sauvegarde et effectuez un dump de la base de données :

mkdir -p /opt/n8n-backup cd /opt/n8n docker compose exec -T postgres pg_dump -U n8n -d n8n -Fc > /opt/n8n-backup/n8n-db.dump cp .env compose.yaml Caddyfile /opt/n8n-backup/

Le dump est effectué pendant que n8n est en cours d'exécution, donc aucun temps d'arrêt n'est nécessaire.

Une sauvegarde qui reste sur le même serveur n'aidera pas si le disque du serveur tombe en panne. Copiez /opt/n8n-backup vers un stockage externe selon un calendrier régulier. Vous pouvez utiliser INTROSERV Cloud Storage pour cela, comme décrit dans le guide Connexion du stockage en nuage INTROSERV au serveur.

Restaurer à partir d'une sauvegarde

Pour restaurer n8n sur un nouveau serveur, installez Docker comme décrit ci-dessus et copiez le répertoire de sauvegarde dans /opt/n8n-backup sur ce serveur. Ensuite, mettez les fichiers de configuration en place :

mkdir -p /opt/n8n cp /opt/n8n-backup/.env /opt/n8n-backup/compose.yaml /opt/n8n-backup/Caddyfile /opt/n8n/ chmod 600 /opt/n8n/.env

Si le nouveau serveur a une adresse IP différente, mettez d'abord à jour l'enregistrement A du domaine.

Démarrez uniquement la base de données :

cd /opt/n8n docker compose up -d postgres

Attendez que docker compose ps indique que PostgreSQL est en bonne santé (healthy), puis restaurez le dump :

docker compose exec -T postgres pg_restore -U n8n -d n8n --clean --if-exists < /opt/n8n-backup/n8n-db.dump

Démarrez le reste de la pile :

docker compose up -d

Connectez-vous avec le même compte propriétaire et vérifiez que vos flux de travail et vos identifiants sont en place. Les identifiants enregistrés sont déchiffrés avec N8N_ENCRYPTION_KEY à partir du fichier .env restauré, ils fonctionnent donc sans avoir à être saisis à nouveau.

Mettre à jour n8n

n8n publie souvent des mises à jour. Pour mettre à jour vers la dernière version, tirez les nouvelles images et recréez les conteneurs :

cd /opt/n8n docker compose pull docker compose up -d docker image prune -f

La dernière commande supprime les anciennes images qui ne sont plus utilisées.

Vérifiez la nouvelle version :

docker compose exec n8n n8n --version

Tip

Faites une sauvegarde avant chaque mise à jour. Au démarrage, une nouvelle version de n8n peut migrer le schéma de la base de données, donc le moyen fiable de revenir à la version précédente est de restaurer un dump effectué avant la mise à jour.

L'image PostgreSQL est épinglée à la version majeure 17, donc docker compose pull n'installe que des mises à jour mineures de PostgreSQL. Le passage à une nouvelle version majeure nécessite un dump et une restauration et n'est pas effectué automatiquement.

Et ensuite ?

Votre instance n8n est prête à fonctionner. À partir de là, vous pouvez :

  1. inviter d'autres utilisateurs sur l'instance ;
  2. configurer SMTP pour que n8n puisse envoyer des invitations et des e-mails de réinitialisation de mot de passe ;
  3. connecter vos services et construire vos premiers flux de travail.

Si vous prévoyez d'exécuter des flux de travail d'IA avec des modèles de langage locaux, consultez le guide Installation du kit de démarrage n8n AI avec Ollama .

VAT

  • Other

    Ex. VAT

    0%
  • austria

    Austria

    20%
  • Belgium

    Belgium

    21%
  • Bulgaria

    Bulgaria

    20%
  • Croatia

    Croatia

    25%
  • Cyprus

    Cyprus

    19%
  • Czech Republic

    Czech Republic

    21%
  • Denmark

    Denmark

    25%
  • Estonia

    Estonia

    22%
  • France

    France

    20%
  • Finland

    Finland

    24%
  • Germany

    Germany

    19%
  • Greece

    Greece

    24%
  • Hungary

    Hungary

    27%
  • Ireland

    Ireland

    23%
  • Italy

    Italy

    22%
  • Latvia

    Latvia

    21%
  • Lithuania

    Lithuania

    21%
  • Luxembourg

    Luxembourg

    17%
  • Malta

    Malta

    18%
  • Netherlands

    Netherlands

    21%
  • Poland

    Poland

    23%
  • Portugal

    Portugal

    23%
  • Romania

    Romania

    19%
  • Slovakia

    Slovakia

    20%
  • Slovenia

    Slovenia

    22%
  • Spain

    Spain

    21%
  • Sweden

    Sweden

    25%
  • USA

    USA

    0%
european
states
  • kingdom
  • germany
  • Español
  • French
  • Hrvatska
  • Italiano
  • Poland
  • Slovenski
  • ukraine
  • Türkçe
  • Other
  • Austria
  • Belgium
  • Bulgaria
  • Croatia
  • Cyprus
  • Czech Republic
  • Denmark
  • Estonia
  • Finland
  • France
  • Germany
  • Greece
  • Hungary
  • Ireland
  • Italy
  • Latvia
  • Lithuania
  • Luxembourg
  • Malta
  • Netherlands
  • Poland
  • Portugal
  • Romania
  • Slovakia
  • Slovenia
  • Spain
  • Sweden
  • USA