Skip to content
WSC DIGITAL

Mastering n8n · Chapter 2

This chapter is in French. Installing n8n to learn

Chapitre 2

Installer n8n pour apprendre

Pour apprendre n8n, il faut un n8n à soi, qu'on peut casser et recommencer sans crainte. Ce chapitre en installe un sur votre poste, avec Docker, en trois variantes de plus en plus soignées, et passe en revue ce qu'on voit au premier lancement.

Dans ce chapitre

  • Choisir entre un essai sur n8n Cloud et une installation sur son poste.
  • Lancer n8n avec une seule commande docker run, et comprendre chacune de ses options.
  • Savoir où n8n range ses données, et pourquoi la clé de chiffrement compte autant que la base.
  • Créer le compte propriétaire et traverser les écrans du premier lancement.
  • Décrire la même installation dans un fichier Docker Compose, avec le conteneur qui exécute le code.
  • Connaître l'installateur officiel en une ligne, ce qu'il installe et ce qu'il faut en penser.
  • Mettre à jour, arrêter et supprimer une installation.

Avant de commencer

Un ordinateur sous Linux, macOS ou Windows avec 4 Go de mémoire au moins, et Docker. Si Docker n'est pas encore installé, la documentation officielle, docs.docker.com/get-docker, donne la marche à suivre pour chaque système : Docker Desktop sur macOS et Windows, Docker Engine sur Linux. Savoir ouvrir un terminal et taper une commande suffit pour le reste.

2.1Deux façons de commencer

La plus rapide est de ne rien installer. n8n Cloud propose un essai gratuit de 14 jours, sans carte bancaire, avec les fonctions de la formule Pro. L'essai a ses limites : 1 000 exécutions, cinq exécutions à la fois au plus, trois minutes par exécution, un seul projet d'équipe. C'est assez pour découvrir l'éditeur, pas pour suivre tout ce livre : les parties V et VI demandent la main sur l'installation elle-même, ce que n8n Cloud ne donne pas.

L'autre façon est d'installer n8n sur son poste. C'est celle de ce chapitre. Elle ne coûte rien, elle n'expire pas, et elle apprend déjà beaucoup sur le fonctionnement de n8n. On utilise Docker, pour trois raisons. C'est la méthode que recommande l'éditeur. C'est la seule qui survivra à la version 3.0 : l'installation par npm, le gestionnaire de paquets de Node.js, ne sera plus possible. Enfin, Docker isole n8n du reste du poste : on le supprime sans laisser de trace.

Note · Sous Windows

Utilisez Docker Desktop avec WSL 2, le sous-système Linux de Windows, et placez vos dossiers de travail dans le système de fichiers de WSL (par exemple ~/n8n), pas sous /mnt/c/…. La documentation de n8n signale que les montages qui traversent cette frontière sont lents et posent des problèmes de droits.

Les exemples de ce chapitre ont été joués sur un poste Ubuntu 24.04 nommé poste, avec Docker 29.8.2, au nom de l'utilisateur gary. Commençons par vérifier que Docker répond :

gary@poste:~$ docker --version
Docker version 29.8.2, build 7fc2dff
gary@poste:~$ docker compose version
Docker Compose version v5.6.0

2.2Premier lancement avec docker run

n8n range tout ce qu'il produit dans un dossier, /home/node/.n8n, à l'intérieur de son conteneur. Or ce qu'un conteneur écrit disparaît avec lui. On crée donc d'abord un volume, un espace de stockage géré par Docker, qui survivra au conteneur :

gary@poste:~$ docker volume create n8n_data
n8n_data

Puis on lance n8n :

gary@poste:~$ docker run -d --name n8n -p 5678:5678 \
    -e GENERIC_TIMEZONE="Africa/Douala" -e TZ="Africa/Douala" \
    -v n8n_data:/home/node/.n8n docker.n8n.io/n8nio/n8n:2.41.6
707b372b7842f71be833c0303c60c2d3fdcbf3dfde1a6565ad1014ac086199a6
Option Rôle
-d Lancer en arrière-plan et rendre la main
--name n8n Nommer le conteneur, pour le désigner ensuite
-p 5678:5678 Relier le port 5678 du poste au port 5678 du conteneur, celui où n8n écoute
-e GENERIC_TIMEZONE=… Le fuseau horaire de n8n, celui que suivent les déclencheurs planifiés
-e TZ=… Le fuseau horaire du système du conteneur
-v n8n_data:/home/node/.n8n Monter le volume là où n8n range ses données
docker.n8n.io/n8nio/n8n:2.41.6 L'image officielle, dans une version précise

Indiquez votre propre fuseau, sous la forme Continent/Ville : Europe/Paris, Africa/Abidjan, America/Montreal. Sans lui, n8n se règle sur New York, et un workflow programmé « tous les jours à 8 heures » partira à 8 heures de New York.

Astuce · Toujours une version précise

L'image s'appelle aussi n8nio/n8n tout court, sans numéro : Docker prend alors l'étiquette latest. C'est commode pour un essai, mais la version change à chaque téléchargement, et n8n publie une version mineure presque chaque semaine. En écrivant 2.41.6, vous savez ce qui tourne, et vous choisissez quand passer à la suivante. Les numéros des versions stables sont sur la page des publications du dépôt, github.com/n8n-io/n8n/releases.

Au premier lancement, Docker télécharge l'image : 270 Mo compressés, 1,75 Go une fois décompressée. Sur une connexion mobile facturée au mégaoctet, faites ce premier téléchargement sur un réseau Wi-Fi : Docker garde ensuite l'image sur le poste. Quelques secondes plus tard, n8n tourne :

gary@poste:~$ docker ps --format 'table {{.Names}}\t{{.Image}}\t{{.Status}}\t{{.Ports}}'
NAMES     IMAGE                            STATUS          PORTS
n8n       docker.n8n.io/n8nio/n8n:2.41.6   Up 30 seconds   0.0.0.0:5678->5678/tcp, [::]:5678->5678/tcp

Lire le journal de démarrage

Ce que n8n écrit en démarrant mérite un coup d'œil. Voici l'essentiel de ce que montre docker logs n8n :

gary@poste:~$ docker logs n8n
No encryption key found - Auto-generating and saving to: /home/node/.n8n/config
Initializing n8n process
n8n ready on ::, port 5678
Migrations in progress, please do NOT stop the process.
Starting migration InitialMigration1588102412422
Finished migration InitialMigration1588102412422
[…]
n8n Task Broker ready on 127.0.0.1, port 5679
Failed to start Python task runner in internal mode. because Python 3 is missing
from this system. […]
There are deprecations related to your n8n setup. […]
 - N8N_RUNNERS_MODE -> Internal task runner mode is deprecated and will be removed
in a future version. […]
Registered runner "JS Task Runner" (pwoxIJFhFDX69NHBnQ6yU)
Version: 2.41.6
[…]
Editor is now accessible via:
http://localhost:5678

Quatre choses s'y lisent.

Une clé de chiffrement a été créée. n8n chiffre les mots de passe et les jetons d'accès qu'on lui confie. Faute de clé fournie, il en a tiré une au hasard et l'a rangée dans le volume.

La base a été préparée. n8n crée ses tables par une suite de migrations, des scripts appliqués dans l'ordre. Il y en a eu 266 à ce premier lancement. Il en jouera quelques nouvelles à chaque mise à jour, d'où l'avertissement : ne pas l'interrompre pendant ce temps.

Le code des nœuds Code s'exécute à part. n8n confie le code JavaScript et Python que vous écrirez à un runner, un exécuteur de tâches. Lancé seul, il le démarre lui-même comme un processus enfant : c'est le mode interne. Le runner JavaScript est là, mais pas le runner Python, faute de Python dans l'image. Et le journal prévient que ce mode interne est déprécié. On verra plus bas comment faire mieux.

L'éditeur est prêt, à l'adresse http://localhost:5678. On peut aussi le vérifier sans navigateur, par le point de contrôle de santé de n8n :

gary@poste:~$ curl -s localhost:5678/healthz; echo
{"status":"ok"}

Ce qu'il y a dans le volume

gary@poste:~$ docker exec n8n ls -la /home/node/.n8n
total 5584
drwxr-xr-x    4 node     node          4096 Oct  5 04:06 .
drwxr-xr-x    1 node     node          4096 Oct  5 04:06 ..
-rw-------    1 node     node            56 Oct  5 04:06 config
-rw-r--r--    1 node     node             0 Oct  5 04:06 crash.journal
-rw-r--r--    1 node     node       1519616 Oct  5 04:06 database.sqlite
-rw-r--r--    1 node     node         32768 Oct  5 04:06 database.sqlite-shm
-rw-r--r--    1 node     node       4136512 Oct  5 04:06 database.sqlite-wal
-rw-r--r--    1 node     node           526 Oct  5 04:06 n8nEventLog.log
drwxr-xr-x    2 node     node          4096 Oct  5 04:06 nodes
drwxr-xr-x    2 node     node          4096 Oct  5 04:06 storage
Élément Contenu
config La clé de chiffrement, lisible par le seul compte node
database.sqlite et ses deux compagnons La base de données : workflows, identifiants chiffrés, comptes, historique des exécutions
n8nEventLog.log Le journal des événements de n8n
nodes Les nœuds communautaires qu'on installera (chapitre 14)
storage Les fichiers produits par les exécutions (chapitre 4), vide à ce stade
crash.journal Un témoin qui permet à n8n de savoir, au démarrage suivant, s'il s'est arrêté proprement

Sans réglage particulier, n8n range ses données dans SQLite, une base de données qui tient dans un fichier. C'est parfait pour apprendre. En production, on lui préfère PostgreSQL (chapitre 21).

La clé, enfin :

gary@poste:~$ docker exec n8n cat /home/node/.n8n/config
{
	"encryptionKey": "6Vo27jN7t+h8K+Tq4xrmpGHCuN2vwNu6"
}

Danger · La clé vaut autant que la base

Tous les identifiants enregistrés dans la base sont chiffrés avec cette clé. Une sauvegarde de database.sqlite sans le fichier config contient vos workflows, mais des identifiants que personne ne pourra plus déchiffrer. Et qui obtient les deux obtient tous vos mots de passe. Sur ce poste d'apprentissage, le volume garde les deux ensemble ; en production, on fournira la clé soi-même et on la rangera à part (chapitre 26). La clé affichée ici est celle d'un banc d'essai détruit depuis : ne publiez jamais la vôtre.

2.3Les écrans du premier lancement

Ouvrez http://localhost:5678 dans votre navigateur. n8n demande d'abord de créer le compte propriétaire (Set up owner account) : le premier compte de l'instance, qui en a tous les droits.

Le formulaire du compte propriétaire, premier écran d'une instance neuve.
Figure 2.1 Le formulaire du compte propriétaire, premier écran d'une instance neuve.

Le mot de passe doit compter au moins huit caractères, dont un chiffre et une majuscule. La case du bas inscrit l'adresse aux annonces de sécurité et de produit de n8n ; elle est décochée par défaut.

Attention · Le premier arrivé devient propriétaire

Tant que ce compte n'existe pas, quiconque ouvre l'adresse de l'instance peut le créer et prendre la main sur elle. Sur votre poste, avec un port qui ne sort pas de la machine, le risque est nul. Sur un serveur joignable depuis Internet, créez ce compte dans la minute qui suit le démarrage : c'est ce qui a été fait pour l'instance de ce livre, juste après son premier déploiement.

Viennent ensuite trois écrans facultatifs.

Le questionnaire Customize n8n to you (n8n à votre mesure) demande le secteur de votre entreprise, votre rôle, sa taille et comment vous avez connu n8n. On peut laisser tous les champs vides et cliquer sur Get started.

La fenêtre Get paid features for free (forever) propose une clé de licence gratuite, envoyée à l'adresse saisie. C'est elle qui fait passer l'instance en édition Registered Community (chapitre 1) : elle débloque le débogage avancé, la recherche et l'étiquetage des exécutions, et les dossiers. Les fonctions sont acquises à vie, même si la liste des fonctions offertes change par la suite. On peut le faire maintenant ou plus tard depuis Settings › Usage and plan.

L'offre de clé gratuite qui fait passer l'instance en édition Registered Community.
Figure 2.2 L'offre de clé gratuite qui fait passer l'instance en édition Registered Community.

La clé arrive par courriel. Pour l'activer, ouvrez Settings › Usage and plan, cliquez sur Enter activation key et collez-la. n8n répond License activated, et demande un redémarrage pour rendre toutes les fonctions disponibles. Avec Docker Compose, docker compose restart n8n suffit. L'écran indique ensuite que l'instance est en édition Community, avec la mention Registered.

La clé acceptée : n8n demande un redémarrage.
Figure 2.3 La clé acceptée : n8n demande un redémarrage.

Enfin, une page présente n8n Assistant, l'assistant qui construit des workflows à partir d'une description en langage courant. Il demande un fournisseur de modèle de langage et un environnement isolé pour exécuter du code : on le verra au chapitre 15. Set up later in Settings remet sa configuration à plus tard.

On arrive alors sur l'accueil, presque vide.

L'accueil d'une instance neuve. La barre de gauche donne accès à tout le reste.
Figure 2.4 L'accueil d'une instance neuve. La barre de gauche donne accès à tout le reste.

Deux cartes proposent de construire un agent ou un workflow. La barre de gauche, réduite à des icônes, mène à tout le reste :

  • en haut, ajouter un élément (Add new item), ouvrir la palette de commandes (Open command palette) et déplier la barre ;
  • puis n8n Assistant et l'accueil (Overview) ;
  • en bas, les modèles de workflows (Templates), les statistiques d'utilisation (Insights), l'aide (Help) et les réglages (Settings).

Le chapitre 3 commence là.

2.4La persistance, vérifiée

Le volume est censé garder les données quand le conteneur disparaît. Vérifions-le plutôt que de le croire. L'API interne de n8n dit si l'écran de création du propriétaire doit encore s'afficher : true avant la création du compte, false après.

gary@poste:~$ curl -s localhost:5678/rest/settings | jq .data.userManagement.showSetupOnFirstLoad
false
gary@poste:~$ docker stop n8n
n8n
gary@poste:~$ docker rm n8n
n8n
gary@poste:~$ docker volume ls
DRIVER    VOLUME NAME
local     n8n_data
gary@poste:~$ docker run -d --name n8n -p 5678:5678 \
    -e GENERIC_TIMEZONE="Africa/Douala" -e TZ="Africa/Douala" \
    -v n8n_data:/home/node/.n8n docker.n8n.io/n8nio/n8n:2.41.6
7a8999eaebefd2943a8a0da4d86719549ab7a9519a10c608c6d1acdcd4d8a98d
gary@poste:~$ docker logs n8n 2>&1 | head -n 4
Initializing n8n process
n8n ready on ::, port 5678
n8n Task Broker ready on 127.0.0.1, port 5679
Failed to start Python task runner in internal mode. […]
gary@poste:~$ curl -s localhost:5678/rest/settings | jq .data.userManagement.showSetupOnFirstLoad
false

Le conteneur a été détruit et recréé ; le compte est toujours là. Le journal ne parle plus de nouvelle clé ni de migrations : n8n a retrouvé sa clé et sa base dans le volume. C'est aussi la façon de mettre à jour n8n : arrêter et supprimer le conteneur, puis le recréer avec le numéro de la nouvelle version. Les migrations de la nouvelle version s'appliquent au démarrage.

Attention · Avant toute mise à jour

Une migration ne se défait pas : une base passée à une version plus récente ne s'ouvre plus avec l'ancienne. Avant de changer de version, copiez le volume, et lisez les notes de version, en particulier pour un saut de version majeure comme le passage à la 3.0. Le chapitre 24 donne la méthode complète.

2.5Mieux : un fichier Docker Compose

Une commande docker run à rallonge s'oublie, se recopie mal, et ne dit pas comment ajouter un second conteneur. Or on en veut un : celui qui exécute le code des nœuds Code. Il fait sortir du mode interne déprécié et apporte Python. Docker Compose décrit tout cela dans un fichier qu'on garde, qu'on relit et qu'on modifie.

On repart de zéro, dans un dossier à soi :

gary@poste:~$ docker rm -f n8n
n8n
gary@poste:~$ docker volume rm n8n_data
n8n_data
gary@poste:~$ mkdir -p ~/n8n && cd ~/n8n

Le fichier compose.yaml :

# n8n pour apprendre, sur son poste : l'éditeur et un conteneur qui exécute le code des nœuds Code.
services:
  n8n:
    image: docker.io/n8nio/n8n:${N8N_VERSION}
    restart: unless-stopped
    ports:
      - "127.0.0.1:5678:5678"
    environment:
      GENERIC_TIMEZONE: Africa/Douala
      TZ: Africa/Douala
      N8N_RUNNERS_MODE: external
      N8N_RUNNERS_BROKER_LISTEN_ADDRESS: 0.0.0.0
      N8N_RUNNERS_AUTH_TOKEN: ${N8N_RUNNERS_AUTH_TOKEN}
      N8N_NATIVE_PYTHON_RUNNER: "true"
    volumes:
      - n8n_data:/home/node/.n8n

  runners:
    image: docker.io/n8nio/runners:${N8N_VERSION}
    restart: unless-stopped
    environment:
      N8N_RUNNERS_TASK_BROKER_URI: http://n8n:5679
      N8N_RUNNERS_AUTH_TOKEN: ${N8N_RUNNERS_AUTH_TOKEN}
    depends_on:
      - n8n

volumes:
  n8n_data:

Il décrit deux services. Le premier, n8n, reprend les réglages de la commande précédente, avec trois différences. Le port est publié sur 127.0.0.1 seulement : n8n n'est joignable que depuis le poste lui-même, pas depuis le réseau local. Le runner passe en mode externe : n8n ne lance plus d'exécuteur lui-même, il attend qu'un exécuteur vienne se présenter sur son port 5679, à condition de connaître un jeton partagé, N8N_RUNNERS_AUTH_TOKEN. Enfin, N8N_NATIVE_PYTHON_RUNNER active Python.

Le second service, runners, est cet exécuteur. Son image, n8nio/runners, porte le même numéro de version que n8n, et c'est obligatoire : la documentation exige que les deux concordent.

Attention · Deux registres

L'image de n8n est publiée sur le registre de l'éditeur, docker.n8n.io, et sur Docker Hub, docker.io. Celle des runners ne l'est pas sur docker.n8n.io : la demander là donne not found. Elle existe sur Docker Hub et sur le registre de GitHub, ghcr.io/n8n-io/runners. Le fichier ci-dessus prend donc les deux images sur Docker Hub.

Les deux valeurs variables, la version et le jeton, vont dans un fichier .env placé à côté, que Compose lit tout seul. Le jeton est tiré au hasard par openssl, et le fichier n'est lisible que par vous :

gary@poste:~/n8n$ printf 'N8N_VERSION=2.41.6\nN8N_RUNNERS_AUTH_TOKEN=%s\n' \
    "$(openssl rand -hex 32)" > .env
gary@poste:~/n8n$ chmod 600 .env
gary@poste:~/n8n$ ls -la
total 16
drwxr-xr-x 2 gary gary 4096 Oct  5 03:07 .
drwxr-x--- 1 gary gary 4096 Oct  5 03:07 ..
-rw------- 1 gary gary  107 Oct  5 03:07 .env
-rw-r--r-- 1 gary gary  801 Oct  5 03:07 compose.yaml

On lance l'ensemble :

gary@poste:~/n8n$ docker compose up -d
[+] up 4/4
 ✔ Volume n8n_n8n_data     Created                                                    0.0s
 ✔ Network n8n_default     Created                                                    0.0s
 ✔ Container n8n-n8n-1     Started                                                    0.2s
 ✔ Container n8n-runners-1 Started                                                    0.2s
gary@poste:~/n8n$ docker compose ps --format 'table {{.Service}}\t{{.Image}}\t{{.Status}}'
SERVICE   IMAGE                            STATUS
n8n       docker.io/n8nio/n8n:2.41.6       Up 30 seconds
runners   docker.io/n8nio/runners:2.41.6   Up 30 seconds
gary@poste:~/n8n$ docker compose logs n8n | grep -E 'n8n-1  \| (Registered runner|Version:|Editor)'
n8n-1  | Registered runner "launcher-python" (df3d1f2d6d6205f1)
n8n-1  | Registered runner "launcher-javascript" (f859866b0b1e4b6e)
n8n-1  | Version: 2.41.6
n8n-1  | Editor is now accessible via:
gary@poste:~/n8n$ curl -s localhost:5678/healthz/readiness; echo
{"status":"ok"}

Compose a créé un réseau privé pour les deux conteneurs, et un volume dont il a préfixé le nom par celui du dossier : n8n_n8n_data. Deux exécuteurs se sont présentés à n8n, l'un pour JavaScript, l'autre pour Python. Le point de contrôle /healthz/readiness, plus exigeant que /healthz, ne répond « ok » que si la base est prête.

Au repos, l'ensemble est sobre : 288 Mo de mémoire pour n8n et 10 Mo pour le conteneur des runners, qui ne démarre ses exécuteurs qu'au moment où un nœud Code en a besoin.

Pour… Taper, dans ~/n8n
Arrêter n8n docker compose down
Le relancer docker compose up -d
Suivre son journal docker compose logs -f n8n
Changer de version modifier N8N_VERSION dans .env, puis docker compose up -d
Tout supprimer, données comprises docker compose down -v

C'est cette installation qui servira, sur votre poste, aux exercices des chapitres 3 à 19.

2.6L'installateur officiel en une ligne

La documentation de n8n met en avant une autre méthode, qui fait tout en une commande :

curl -fsSL https://get.n8n.io | sh

Elle télécharge un script et l'exécute aussitôt. Ce réflexe, très répandu, revient à faire confiance à un programme qu'on n'a pas lu. Le script le reconnaît lui-même dans ses premières lignes, et propose la variante prudente :

gary@poste:~/essai$ curl -fsSL https://get.n8n.io -o get-n8n.sh
gary@poste:~/essai$ head -n 12 get-n8n.sh
#!/bin/sh
# 
# get-n8n.sh — one-script setup for a self-hosted n8n instance (docker compose).
# 
# Usage:
#   curl -fsSL https://get.n8n.io | sh
#   curl -fsSL https://get.n8n.io | sh -s -- --upgrade
# 
# Prefer to inspect before running?
#   curl -fsSL https://get.n8n.io -o get-n8n.sh && less get-n8n.sh && sh get-n8n.sh
# 
# Source: https://github.com/n8n-io/n8n/blob/master/docker/get-n8n.sh

Une fois lu, on le lance :

gary@poste:~/essai$ sh get-n8n.sh
✔ Docker found (29.8.2)
✔ Docker Compose found (5.6.0)
✔ Created ./n8n/compose.yml
✔ Created ./n8n/searxng-settings.yml
✔ Created ./n8n/.env (unique secrets generated)
[…]
✔ Started n8n 2.41.6 and sandbox services
n8n is running at: http://localhost:5678
[…]
Security notes:
  - Only port 5678 (n8n) should ever be reachable from the internet.
  - The sandbox runner is privileged Docker-in-Docker — never publish its ports.
This setup is meant to try n8n locally. For production (TLS, Postgres, queue
mode) see https://docs.n8n.io/hosting/
[…]
gary@poste:~/essai$ docker compose -f ./n8n/compose.yml ps --format 'table {{.Service}}\t{{.Image}}\t{{.Status}}'
SERVICE            IMAGE                                                  STATUS
n8n                docker.io/n8nio/n8n:2.41.6                             Up 4 seconds
runners            ghcr.io/n8n-io/runners:2.41.6                          Up 4 seconds
sandbox-api        ghcr.io/n8n-io/n8n-sandbox-service-api:1.3.4           Up 10 seconds (healthy)
sandbox-runner-1   ghcr.io/n8n-io/n8n-sandbox-service-runner-dind:1.3.4   Up 4 seconds
searxng            ghcr.io/searxng/searxng:latest                         Up 10 seconds

Le script a vérifié Docker, cherché la dernière version stable, écrit trois fichiers dans un dossier n8n et démarré cinq services. On reconnaît n8n et ses runners. Les trois autres servent n8n Assistant. Les deux premiers forment un bac à sable (sandbox) où l'assistant exécute le code qu'il écrit : une API, et un « runner » qui fait tourner Docker à l'intérieur de Docker. Le dernier, SearXNG, est un moteur de recherche que l'assistant interroge.

Pour essayer, c'est parfait, et le script le dit lui-même. Mais il faut savoir ce qu'on installe. Le conteneur sandbox-runner-1 est privilégié : il a sur la machine des droits proches de ceux de root, et la documentation demande de le traiter comme tel. SearXNG est pris dans sa version latest, qui change sans prévenir. Et l'ensemble se justifie surtout si l'on active l'assistant. Pour apprendre n8n lui-même, le fichier Compose de la section précédente fait la même chose avec deux conteneurs qu'on comprend entièrement.

Pour désinstaller ce qu'a mis le script :

gary@poste:~/essai$ docker compose -f ./n8n/compose.yml down -v
[…]
 ✔ Volume n8n_n8n-data              Removed                                           0.0s
 ✔ Volume n8n_sandbox-tls           Removed                                           0.0s
gary@poste:~/essai$ rm -rf ./n8n

Note · Et npm ?

Pendant des années, on installait n8n avec npm install n8n -g ou on le lançait avec npx n8n. Cela fonctionne encore avec la version 2.41.6, mais la documentation est claire : à partir de la 3.0, n8n ne sera plus distribué que sous forme d'image Docker. Si vous trouvez ces commandes dans un tutoriel, passez votre chemin.

2.7Erreurs fréquentes

Lancer n8n sans volume. Tout ce que le conteneur a écrit disparaît avec lui : comptes, workflows, identifiants. Montez toujours un volume sur /home/node/.n8n.

Prendre l'étiquette latest. La version change au gré des téléchargements, et une migration ne se défait pas. Écrivez toujours un numéro de version.

Régler TZ et oublier GENERIC_TIMEZONE. La commande date affiche alors la bonne heure, mais n8n reste sur le fuseau de New York, et ses planifications avec lui. L'exercice 1 le montre.

Sauvegarder la base sans la clé. Sans le fichier config, n8n refuse de démarrer, et les identifiants ne se déchiffrent plus. L'exercice 2 le montre.

Donner aux runners une autre version que n8n. Les deux images doivent porter le même numéro.

2.8Testez-vous

  1. Pourquoi crée-t-on un volume avant de lancer n8n ?
  2. Que contient le fichier config du volume, et pourquoi doit-on le sauvegarder avec la base ?
  3. Quelle différence y a-t-il entre le mode interne et le mode externe des runners ?
  4. Que vérifie /healthz/readiness de plus que /healthz ?
  5. (Chapitre 1) Dans quelle édition la clé gratuite fait-elle passer l'instance, et que débloque-t-elle ?

En résumé

  • n8n Cloud s'essaie 14 jours sans rien installer ; pour suivre ce livre, il faut une installation à soi.
  • Docker est la méthode recommandée, et la seule qui restera avec la 3.0.
  • Toujours une version précise d'image, toujours un volume monté sur /home/node/.n8n, toujours un fuseau horaire.
  • Le volume contient la base SQLite et la clé de chiffrement : l'une ne sert à rien sans l'autre, et les deux ensemble donnent accès à tous les identifiants.
  • Le premier compte créé est propriétaire de l'instance. Sur un serveur exposé, on le crée sans attendre.
  • La clé gratuite de l'édition Registered Community débloque le débogage avancé, la recherche d'exécutions et les dossiers.
  • Un fichier Compose avec un conteneur runners séparé est la bonne installation d'apprentissage : JavaScript et Python, plus de mode interne déprécié.
  • L'installateur en une ligne ajoute le bac à sable de n8n Assistant, dont un conteneur privilégié. On le lit avant de le lancer.

Atelier — Votre n8n d'apprentissage

Objectif : disposer, sur votre poste, de l'installation qui servira à tous les exercices du livre. Comptez une demi-heure.

  1. Vérifiez que docker --version et docker compose version répondent.
  2. Créez le dossier ~/n8n, écrivez-y le compose.yaml du chapitre et un .env avec la version 2.41.6 et un jeton tiré au hasard. Protégez .env.
  3. Lancez l'ensemble. Vérifiez que les deux services tournent et que le journal de n8n annonce deux runners, JavaScript et Python.
  4. Ouvrez http://localhost:5678, créez le compte propriétaire. Demandez la clé gratuite avec votre adresse, collez la clé reçue dans Settings › Usage and plan › Enter activation key, puis redémarrez n8n.
  5. Notez l'emplacement du volume et sauvegardez une copie de la clé de chiffrement dans un endroit sûr : docker compose exec n8n cat /home/node/.n8n/config.
  6. Arrêtez puis relancez l'ensemble, et vérifiez que vous retrouvez votre compte.

Vérifier

  • curl -s localhost:5678/healthz/readiness répond {"status":"ok"}.
  • curl -s localhost:5678/rest/settings | jq .data.userManagement.showSetupOnFirstLoad répond false.
  • Depuis une autre machine du réseau local, http://<adresse du poste>:5678 ne répond pas.

Exercices

Exercice 1 — Le fuseau

Lancez un conteneur n8n sans GENERIC_TIMEZONE ni TZ, puis tapez docker exec n8n date. Recommencez avec TZ seulement. Que donne la commande dans chaque cas ? Pourquoi n8n a-t-il besoin des deux variables ?

Exercice 2 — La clé perdue

Sur une installation d'essai, créez un compte, puis supprimez seulement le fichier config du volume et relancez n8n. Que dit le journal ? Que deviendraient des identifiants enregistrés avant la suppression ?

Exercice 3 — Le port

Remplacez 127.0.0.1:5678:5678 par 5678:5678 dans le fichier Compose et relancez. Depuis un téléphone sur le même réseau Wi-Fi, ouvrez l'adresse du poste sur le port 5678. Que voyez-vous ? Quel risque cela ferait-il courir sur un réseau public, et avant la création du compte propriétaire en particulier ?

Exercice 4 — Lire un installateur

Ouvrez get-n8n.sh et trouvez : la fonction qui détermine la version à installer, la façon dont les secrets sont générés, et ce que fait le script quand il échoue. Que se passe-t-il si vous le relancez dans un dossier où n8n est déjà installé ?

Corrigés

Testez-vous.

  1. Parce que ce qu'un conteneur écrit disparaît avec lui. Le volume, géré par Docker, survit au conteneur : on peut supprimer et recréer celui-ci, pour une mise à jour par exemple, sans rien perdre.
  2. La clé de chiffrement des identifiants. Sans elle, les identifiants de la base ne se déchiffrent plus ; avec elle et la base, on a tous les mots de passe. Les deux se sauvegardent ensemble, et se protègent ensemble.
  3. En mode interne, n8n lance lui-même l'exécuteur de code comme un processus enfant ; ce mode est déprécié. En mode externe, l'exécuteur tourne dans son propre conteneur et se présente à n8n sur le port 5679, avec un jeton partagé.
  4. Que la base de données est prête. /healthz répond dès que le processus écoute.
  5. L'édition Registered Community. Elle débloque les dossiers, le débogage dans l'éditeur et les données d'exécution personnalisées.

Exercice 1. Sans aucune variable, date affiche l'heure en UTC ; avec TZ seule, en heure de Douala (WAT). Mais date ne dit rien du fuseau de n8n lui-même. Pour le voir, le fichier exemples/ch02/fuseau.json contient un petit workflow qui renvoie {{ $now.zoneName }}. On l'importe et on l'exécute en ligne de commande, dans un conteneur éphémère (n8n refuse d'en lancer un second dans un conteneur qui tourne déjà) :

gary@poste:~$ docker run --rm -e TZ=Africa/Douala -v /tmp/fuseau.json:/tmp/fuseau.json \
    --entrypoint sh docker.n8n.io/n8nio/n8n:2.41.6 \
    -c 'n8n import:workflow --input=/tmp/fuseau.json; n8n execute --id=ch02fuseau000001'

Voici ce qu'ont donné les trois réglages, le 16 octobre 2026 à 8 h 41, heure de Douala :

Réglage date Fuseau de n8n Heure vue par n8n
aucun 07:41 UTC America/New_York 03:41
TZ seule 08:41 WAT America/New_York 03:41
GENERIC_TIMEZONE seule 07:41 UTC Africa/Douala 08:41

TZ règle l'horloge du système du conteneur : la commande date, les heures des journaux. GENERIC_TIMEZONE règle celle de n8n : $now, et surtout les déclencheurs planifiés. Il faut les deux pour que tout parle de la même heure.

Exercice 2. Le journal annonce d'abord une nouvelle clé, puis n8n s'arrête aussitôt :

No encryption key found - Auto-generating and saving to: /home/node/.n8n/config
[…]
Error: Deployment key 'signing.hmac' cannot be read with this instance encryption key

Le conteneur passe à l'état Exited (1). Les identifiants enregistrés avant ne se déchiffrent plus. L'export de la base répond :

Credentials could not be decrypted. The likely reason is that a different
"encryptionKey" was used to encrypt the data.

Remettre l'ancien fichier config suffit pour que n8n redémarre normalement. D'où la règle : la clé se sauvegarde avec la base.

Exercice 3. Le téléphone affiche n8n. Si le compte propriétaire n'existe pas encore, c'est l'écran de sa création : n'importe qui sur le même réseau pourrait le créer et prendre la main sur l'instance, avec tous les identifiants qu'on y mettra. Sur le banc d'essai, l'API de l'instance publiée sur toutes les interfaces a répondu showSetupOnFirstLoad: true depuis l'adresse réseau du poste. Celle qui était publiée sur 127.0.0.1 n'a pas répondu du tout : curl a échoué avec le code 7, « connexion impossible ». Sur un réseau public, un café, un hôtel ou un espace de coworking, le risque est réel.

Exercice 4. Dans le script du 5 octobre 2026 (version 1.4.0 du script) :

  • la version vient de la fonction resolve_n8n_version(), qui lit la dernière publication stable sur l'API de GitHub. En cas d'échec, elle se rabat sur une version écrite dans le script, FALLBACK_N8N_VERSION="2.32.0" ;
  • les secrets viennent de gen_secret() : openssl rand -hex 24 quand openssl est présent, sinon 24 octets tirés de /dev/urandom ;
  • le script s'arrête à la première erreur (set -eu). Ses échecs prévus passent par fail(), qui affiche le message, propose d'envoyer un rapport anonyme (sauf avec DO_NOT_TRACK=1) et sort avec le code 1.

Relancé dans un dossier qui contient déjà n8n/compose.yml ou n8n/.env, il ne touche à rien. Il affiche Found an existing install in ./n8n — leaving it untouched., puis les commandes pour démarrer, mettre à jour (--upgrade) ou désinstaller.

Pour aller plus loin

Sur la machine. docker compose config affiche le fichier Compose tel que Docker le comprend, variables remplacées : c'est le premier réflexe quand une variable semble ignorée. docker compose exec n8n n8n --help liste les commandes de n8n en ligne de commande, que l'annexe C détaille.

En ligne. Dans la documentation, la section « Deploy › Host n8n › Install options » décrit toutes les méthodes d'installation. La page « Set up task runners » explique le fonctionnement des exécuteurs de code. Le dépôt github.com/n8n-io/n8n-hosting rassemble des fichiers Compose d'exemple, avec PostgreSQL notamment.

Have your business automated

No time to learn it all? We build your n8n automations, on your own server, and you stay in control. Describe your problem: within 48 hours you know whether it can be done, what it costs and how long it takes.

n8n is a trademark of n8n GmbH. This book is not published or endorsed by n8n GmbH.