En bref
| Prérequis | SWAG + Authelia fonctionnels, serveur Docker |
| Résultat | n8n accessible derrière reverse proxy, workflow de réponse automatique aux mails |
| Ressources | Docs n8n · Licence faircode · GitHub n8n |
Le problème : 82 mails en attente
Je reçois beaucoup de messages via ma chaîne YouTube. Au moment du tournage de cette vidéo, j’avais 82 mails en attente auxquels je voulais répondre, mais pour lesquels je n’avais pas encore trouvé le temps. Et ce n’est pas une situation catastrophique — c’est normal quand on a une communauté de plusieurs dizaines de milliers de personnes.
Le problème, c’est que ces sollicitations sont de deux natures très différentes. D’un côté, il y a les messages de spectateurs qui posent des questions, font des retours, partagent leurs expériences — là , j’aimerais vraiment prendre le temps de répondre, même si c’est juste pour dire de passer par les commentaires publics. De l’autre côté, il y a un volume considérable de sollicitations commerciales : des marques, souvent chinoises, qui proposent de tester leurs produits en échange d’une “review”, des propositions de partenariat, des demandes de promotion, etc. Et là , la grande majorité ne mérite tout simplement pas de temps. Les produits sont souvent bas de gamme, les propositions n’entrent pas dans ce que je fais.
Ma chaîne YouTube n’est pas mon activité principale, et j’en fais une règle : c’est un loisir, pas un deuxième boulot. Je ne la monétise pas vraiment — il y a de la publicité en début de vidéo, mais uniquement pour ne pas être pénalisé par l’algorithme YouTube. L’argent généré est bloqué aux États-Unis, et je n’ai aucune intention de me lancer dans toute la gestion fiscale que ça impliquerait avec mon emploi principal. Donc zéro revenu de la chaîne, zéro budget pour déléguer la gestion des mails à quelqu’un.
Il me fallait une solution technique. Quelque chose qui puisse lire les mails, comprendre de quoi il s’agit, et générer une première réponse adaptée — que je n’aurais plus qu’à relire et envoyer, ou ignorer selon le cas.
C’est là qu’arrive n8n avec un LLM.
Pourquoi pas Ollama en local ?
Spoiler immédiat : je n’utilise pas un modèle local. Dans la vidéo, j’ai eu l’opportunité de montrer comment brancher Ollama sur n8n, mais pour mon cas d’usage personnel, j’ai choisi Gemini (le service de Google).
La raison est pragmatique : interpréter des mails et rédiger des réponses de qualité demande un modèle sérieux. Or, faire tourner un tel modèle en local nécessite du matériel dédié — un GPU Nvidia ou équivalent. Je n’ai pas envie de consacrer une machine entière à ça, ni d’en acheter une. C’est trop coûteux pour ce que je veux faire.
Et puis, soyons honnêtes : mes mails viennent de Gmail, donc je suis déjà chez Google. Autant utiliser Gemini pour les traiter. Le volume est raisonnable — quelques dizaines de messages par mois — donc on reste largement dans les quotas gratuits.
Cela dit, si vous avez la puissance de calcul, brancher Ollama sur n8n se fait exactement de la même manière. Dans l’interface, on choisit simplement “Ollama Chat Model” à la place de Gemini, on renseigne l’URL locale du serveur Ollama, et on sélectionne le modèle voulu. Le reste du workflow est identique.
n8n : open source ? Faircode.
Avant d’aller plus loin sur le déploiement, une mise en garde importante sur la licence.
n8n est souvent présenté comme un projet open source. C’est inexact. n8n utilise une licence faircode — le code source est disponible sur GitHub, il est auditable, mais ce n’est pas de l’open source au sens strict. Il y a des restrictions commerciales : si vous générez de l’argent avec n8n, ou si vous dépassez certains seuils d’utilisation, vous êtes dans un territoire légal différent.
Pour un particulier qui auto-héberge n8n chez soi pour ses propres besoins, ce n’est pas un problème en pratique. Mais il faut savoir ce qu’on fait. C’est un outil commercial avant tout, qui mise sur un modèle où les grandes entreprises paient et les particuliers peuvent l’utiliser gratuitement. C’est “open but pragmatic”, selon leur propre formulation.
Concrètement, ça a un impact visible dès le premier démarrage : n8n vous demande de créer un compte sur ses serveurs pour obtenir une clé de licence Community Edition. Ce n’est pas grand-chose, mais ça veut dire que vous avez une dépendance à l’infrastructure n8n — au moins pour ce premier contact. Ce point me chagrine un peu, même si je comprends la démarche commerciale.
Déploiement Docker
n8n s’installe proprement avec Docker. Le docker-compose de base démarre le conteneur depuis l’image officielle docker.n8n.io/n8nio/n8n, avec plusieurs variables d’environnement importantes : l’hôte et le port d’écoute (5678), le protocole HTTPS, l’URL de webhook, le fuseau horaire (Europe/Paris), et une option pour forcer les permissions sur le système de fichiers. Le stockage se fait dans un volume monté sur un répertoire de l’hôte, et le conteneur doit être relié à un réseau Docker externe dédié.
Quelques points Ă noter sur cette configuration :
N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true: s’assure que les permissions sur le système de fichiers sont correctement appliquées.N8N_SECURE_COOKIE=false: j’ai dû le désactiver parce que je n’arrivais pas à faire fonctionner l’accès aux services Google avec le secure cookie activé. C’est probablement réactivable chez vous.- Le stockage se fait dans un répertoire sur mon SSD local — par défaut en SQLite, ce qui est suffisant pour un usage personnel. Pour un déploiement plus sérieux, la documentation n8n décrit comment passer à PostgreSQL.
restart: unless-stoppedsignifie que le conteneur redémarre automatiquement en cas de crash ou de redémarrage de Docker, mais reste éteint si on l’a stoppé volontairement.
La documentation officielle n8n est vraiment très complète. Il y a notamment une section “Scaling” qui couvre tout ce dont vous auriez besoin si vous voulez monter en charge.
Intégration SWAG et Authelia
n8n doit être accessible depuis internet, puisqu’il va interagir avec Gmail et Gemini — deux services externes. Il me fallait donc l’exposer via mon reverse proxy SWAG, avec Authelia devant pour l’authentification.
Côté SWAG, c’est simple : il y a déjà un fichier d’exemple n8n.subdomain.conf.sample dans le dossier proxy-confs. On le copie, on le renomme en .conf, et on l’adapte si besoin. Dans mon cas, j’ai juste rajouté le réseau Docker n8n comme réseau externe dans le docker-compose de SWAG pour que les deux conteneurs se voient.
Pour les permissions sur le répertoire de données, il faut ajuster propriétaire et droits (chown récursif vers l’UID 1000 et chmod 755) avant le premier démarrage — la variable d’environnement de contrôle des permissions se charge ensuite du reste.
Au premier démarrage, n8n affiche une page d’inscription où il demande nom, prénom, email et mot de passe. C’est pour créer le compte sur l’infrastructure n8n et recevoir la clé de licence Community. On ne peut pas vraiment passer outre si on veut que ça tourne correctement. Après avoir saisi ces infos et reçu la clé par mail, on la rentre dans l’écran suivant, et on accède à l’interface principale.
L’interface n8n
L’interface est en anglais — je ne crois pas qu’il soit possible de changer la langue. Trois sections principales :
- Workflows : la liste des automatisations définies. On peut les activer, désactiver, dupliquer, supprimer.
- Credentials : les connexions à des services externes. C’est là qu’on stocke les accès Gmail (OAuth), Gemini (clé API), et tout autre service.
- Executions : l’historique de toutes les exécutions de workflows. Indispensable pour déboguer quand quelque chose ne se passe pas comme prévu.
La Community Edition est suffisante pour un usage personnel, mais les fonctionnalités multi-utilisateurs, SSO, LDAP, variables d’environnement partagées — tout ça est réservé aux plans payants Enterprise. On ne peut avoir qu’un seul utilisateur admin en Community. C’est une limitation réelle, dommage.
Par contre, n8n a une API propre — on peut créer une clé API et interagir avec l’instance par programmation, même en Community. Et bien sûr, on peut gérer les mots de passe et activer le double facteur d’authentification (Authelia le fait déjà pour moi, donc j’en ai moins besoin directement dans n8n).
Construire un workflow : les bases
L’éditeur de workflow fonctionne par blocs connectés les uns aux autres. On ajoute un premier bloc “trigger” — soit déclenché manuellement, soit sur un événement (réception d’un mail, timer, webhook), soit à intervalle régulier (toutes les heures, tous les jours, etc.). Puis on enchaîne des blocs de traitement.
Chaque bloc a une entrée et une sortie. On peut chaîner, brancher, diviser selon des conditions. n8n propose des blocs pour :
- Récupérer et envoyer des mails (Gmail, IMAP, SMTP)
- Appeler des LLM (Gemini, OpenAI, Ollama, Anthropic, etc.)
- Transformer des données (JSON, texte, tableaux)
- Faire des tests conditionnels (IF, Switch)
- Faire des boucles, des fusions de branches
- Exécuter du code JavaScript directement
Le bloc “LLM Chain” est particulièrement intéressant. On lui passe un prompt, on choisit le modèle, et il retourne la réponse. Le prompt peut être fixe ou dynamique — on peut injecter des variables issues des étapes précédentes du workflow.
Exemple : si j’ai récupéré le prénom de l’expéditeur dans l’étape précédente, je peux construire le prompt en insérant ce prénom directement. On glisse-dépose le champ depuis le panneau d’exploration du contexte d’exécution, n8n génère automatiquement le code d’interpolation.
Pour tester chaque bloc individuellement, on clique sur “Test” directement dans le bloc. n8n exécute uniquement ce bloc avec les données d’entrée disponibles et affiche la sortie. C’est très pratique pour comprendre ce qui se passe à chaque étape sans devoir relancer tout le workflow.
Mon workflow de réponse aux mails
Voici ce que j’ai mis en place pour gérer mes sollicitations YouTube.
Déclenchement manuel. Je ne veux pas que ce soit automatique. Quand j’ai une vingtaine de minutes à consacrer aux mails, je déclenche le workflow à la main. Il traite un lot, je lis les brouillons générés, j’en envoie quelques-uns, et c’est tout pour ce jour-là .
Étape 1 — Récupération des mails. Un bloc Gmail “Get Many Messages” récupère les 10 derniers messages qui ont une étoile (donc ceux que j’ai marqués comme importants) et qui n’ont pas encore le label n8n (pour ne pas retraiter les mails déjà traités).
Étape 2 — Catégorisation par le LLM. Je passe chaque mail à Gemini avec un prompt de catégorisation. Je lui explique le contexte : j’ai une chaîne YouTube qui s’appelle “j’ai testé”, je m’appelle Guillaume, je reçois beaucoup de mails de marques qui proposent des tests produits et des collaborations. Le LLM doit classifier chaque mail dans une de ces quatre catégories :
deny: proposition de collaboration à refuser (test en échange de paiement, marque pas intéressante)more_info: proposition potentiellement intéressante, demander plus d’informationsdo_not_reply: mail pour lequel il ne faut pas répondredo_not_contact: quelqu’un qui m’a contacté en direct alors qu’il ne devrait pas (la chaîne n’est pas une adresse de support)
Le LLM me ressort aussi un résumé du mail et l’action recommandée. Pour s’assurer que la sortie est toujours dans un format JSON structuré exploitable, j’ai ajouté un bloc “Structure Parser” après le LLM — on lui donne le schéma JSON attendu, et il s’assure que la sortie est toujours dans ce format même si le LLM divague un peu.
Étape 3 — Switch selon la catégorie. Un bloc Switch dispatche vers différentes branches selon le résultat de la catégorisation. Pour l’instant, j’ai principalement configuré la branche do_not_contact — c’est le cas le plus fréquent.
Étape 4 — Génération de la réponse. Sur la branche do_not_contact, je rappelle le LLM avec un second prompt plus spécifique. Je lui explique qu’il faut répondre à quelqu’un qui m’a contacté en direct alors que mon adresse n’est faite que pour les contacts professionnels. Je lui donne des instructions précises : répondre en français (avec attention particulière au tutoiement vs vouvoiement selon le registre du mail reçu), mentionner le Discord public et les commentaires des vidéos, encadrer les occurrences de “j’ai testé” avec l’URL de la chaîne YouTube.
Étape 5 — Création du brouillon Gmail. Le bloc Gmail “Create Draft” crée un brouillon en réponse au mail original, avec le sujet prefixé de “Re:” et le corps généré par le LLM. Je précise l’ID du mail original pour que la réponse soit bien attachée au fil de conversation.
Étape 6 — Nettoyage. Après traitement, j’ajoute le label n8n sur le mail et je le marque comme lu. Comme ça, la prochaine exécution du workflow ne le traitera plus.
Ce que ça donne en pratique
Sur les 10 mails traités lors d’une démonstration en direct :
- 7 ont été catégorisés dans une branche
- 3 dans une autre
- Le workflow a créé un brouillon de réponse pour le cas qui le nécessitait
Le brouillon généré était globalement bon. Il avait bien détecté le type de message (un spectateur qui posait une question sur la fibre), avait bien intégré l’URL de la chaîne dans le message, et avait rédigé une réponse polie expliquant que cette adresse n’est pas pour le support.
Un problème identifié : la gestion du tutoiement / vouvoiement n’était pas parfaite. Un spectateur qui m’avait tutoié a reçu un brouillon en vouvoiement. J’avais pourtant précisé cette règle dans le prompt, mais le LLM ne l’a pas toujours respectée. C’est un point de friction réel qui demandera quelques itérations supplémentaires sur le prompt.
Mais dans l’ensemble : le workflow a identifié clairement le type de chaque message. Je n’ai même pas besoin de lire les mails dans leur intégralité — le résumé généré par le LLM suffit pour savoir si le brouillon est bon ou s’il faut l’ajuster. Le gain de temps est réel.
Templates et communauté n8n
Un des points forts de n8n c’est l’écosystème de templates. Sur le site n8n, on peut rechercher des workflows prédéfinis par cas d’usage. Par exemple, “schedule meeting with AI” ou “email triage” — on clique dessus, on explore les blocs dans l’interface web interactive, et si ça nous plaît, on peut importer directement le template dans son instance n8n.
La communauté est aussi active sur un forum en anglais où les gens posent des questions et partagent leurs workflows. Pour chaque bloc, il y a une documentation intégrée avec des exemples. C’est vraiment bien foutu pour apprendre progressivement.
Auto-hébergement et vie privée
Pour finir, un mot sur le contexte plus large. Je fais tourner n8n en auto-hébergé parce que c’est cohérent avec ma démarche générale : garder mes données chez moi, ne pas dépendre d’un service cloud externe pour mes automatisations.
n8n n’est pas parfaitement local dans mon cas — j’utilise Gemini et Gmail, qui sont chez Google. Mais au moins la logique d’automatisation, les workflows, les données traitées transitent par mon serveur. C’est déjà un pas dans la bonne direction.
Et dans un contexte où on parle de plus en plus d’ingérence des États-Unis dans la législation des autres pays et dans la gestion des données, je trouve qu’il est de plus en plus important de rapatrier chez soi ce qui est vital. Le self-hosting n’est pas nouveau — c’est même la norme de l’informatique pendant longtemps, avant que les services cloud ne deviennent hégémoniques. Y revenir, même partiellement, ça a du sens.
En quelques heures de prise en main, on arrive à quelque chose d’exploitable. C’est vraiment là l’intérêt du no-code / low-code : des chaînes de traitement assez puissantes sans avoir besoin de coder, accessibles à des gens qui n’ont pas les compétences de développement logiciel — et qui font gagner du temps là où on en a vraiment besoin.