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 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.

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.

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.

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
- Pourquoi crée-t-on un volume avant de lancer n8n ?
- Que contient le fichier
configdu volume, et pourquoi doit-on le sauvegarder avec la base ? - Quelle différence y a-t-il entre le mode interne et le mode externe des runners ?
- Que vérifie
/healthz/readinessde plus que/healthz? - (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
runnerssé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.
- Vérifiez que
docker --versionetdocker compose versionrépondent. - Créez le dossier
~/n8n, écrivez-y lecompose.yamldu chapitre et un.envavec la version 2.41.6 et un jeton tiré au hasard. Protégez.env. - Lancez l'ensemble. Vérifiez que les deux services tournent et que le journal de n8n annonce deux runners, JavaScript et Python.
- 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. - 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. - Arrêtez puis relancez l'ensemble, et vérifiez que vous retrouvez votre compte.
Vérifier
curl -s localhost:5678/healthz/readinessrépond{"status":"ok"}.curl -s localhost:5678/rest/settings | jq .data.userManagement.showSetupOnFirstLoadrépondfalse.- Depuis une autre machine du réseau local,
http://<adresse du poste>:5678ne 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.
- 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.
- 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.
- 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é.
- Que la base de données est prête.
/healthzrépond dès que le processus écoute. - 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 24quandopensslest 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 parfail(), qui affiche le message, propose d'envoyer un rapport anonyme (sauf avecDO_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.