Utiliser n8n comme agrégateur de veille perso
Pour faire ma veille, j’ai plein de sources d’informations différentes. Jusqu’à 2024 j’utilisais Inoreader, excellent service même dans sa version gratuite. En version payante, il dispose de quelques moyens de capter le contenu de réseaux sociaux, ce qui peut être un vrai plus, en comparaison à une veille uniquement basée sur le RSS. Dans la version pro il est également possible d’avoir accès à des résumés, du filtrage de contenu, et est même intégré à Zapier ou IFTTT. C’est chouette, mais ça ne capte pas tout type de contenu, par exemple les sites qui n’ont pas de RSS.
n8n d’un autre côté, c’est un outil qui sert à de l’automatisation. En soi, ça ressemble à Node-RED, Talend ou tous les outils de workflow qui permettent de faire du low-code. Sa philosophie à lui, c’est d’interconnecter des applications entre elles. C’est donc un concurrent à Zapier, open-source, avec un bon paquet de connecteurs disponibles vers plein d’outils. J’avais d’abord testé Automatisch, similaire mais moins complet, mon choix s’est donc arrêté depuis début 2025 sur n8n.
Décomposition d’un workflow
Un workflow typique de veille est pour moi composé de la façon suivante
Détection d’une nouvelle info
Jusqu’ici je me basais surtout sur des articles de blog, qui ont tous un flux RSS. Pour les récupérer, il faut démarrer un nouveau workflow avec un RSS Feed Trigger node qui permet de lancer un workflow à chaque nouvelle entrée, qu’il y en ait une ou tout plein.
Parfois (souvent) le flux RSS ne dispose que de l’introduction de l’article. C’est dommage car on aimerait potentiellement accéder à son contenu complet - mais les auteurs ont souvent de bonnes raisons, notamment publicitaires, de ne vous donner accès qu’à l’introduction. L’astuce ici quand c’est autorisé, c’est de parcourir avec n8n l’article et d’en extraire le contenu. Pour ce faire, on va suivre le lien du RSS avec le node HTTP Request node, puis utiliser le node Extract HTML Content de la page récupérée, potentiellement en utilisant un sélecteur CSS pour limiter la récupération au contenu qui nous intéresse.
À chaque fois, dans notre workflow, cela ajoute des variables ayant le contenu récupéré à l’étape précédente. Tout ceci pourrait être développé manuellement, mais tout le principe est là : on ne code que ce qui est spécifique à notre besoin, toutes les autres briques et opérations techniques sont déjà disponibles, c’est toute la promesse des outils low-code.
Résumer le contenu
Sur les articles un peu longs, on a souvent envie d’un petit résumé synthétique pour capter les idées principales. Là il faut utiliser le Basic LLM Chain node couplé à un Ollama Model node pour interroger Ollama, très utile pour une utilisation locale, pour des données privées ou sensibles, ou encore le Google Gemini Chat Model node qui dispose de pas mal de modèles en utilisation gratuite, mais qui elles doivent être publiques.
Poster le résumé sur Discord
Enfin, il est possible d’envoyer toutes ces données sur le média de son choix. Perso j’ai choisi de me créer mon propre groupe Discord, avec un bot piloté par n8n, qui poste tout le contenu dans des channels qui correspondent à mes catégories de veilles. Pour envoyer vers Discord, il y a tout simplement le Discord node. Evidemment il faut un peu de paramétrage, mais la documentation est très bien faite.
Factorisation
La génération de résumés et l’envoi vers Discord sont des fonctionnalités de base de l’ensemble de mes workflows. Elles sont donc centralisées, et pour cela j’utilise le mécanisme de sous-workflow via le Execute Sub-workflow Trigger node. C’est vraiment propre, et ça permet de bien séparer et paramétrer les tâches.
Pour aller plus loin ?
n8n propose énormément de nodes, il faut simplement passer un peu de temps dans l’outil en fonction de ses besoins. Vous pouvez parser régulièrement du contenu avec un trigger Schedule Trigger node, et extraire le contenu du site en question via des sélecteurs CSS, puis ne conserver que les résultats que vous n’aviez pas encore rencontrés lors d’une exécution précedente via l’utilisation du Remove Duplicates node avec son option Remove Items Processed in Previous Executions.
Enfin vous pouvez trouver et installer facilement des nodes issus de la communauté sur votre instance, en parcourant tout simplement npmjs avec le filtre qui va bien.
Mise en place technique
n8n via Docker
Comme souvent je souhaite pouvoir lancer ce service via Docker. Mon conteneur démarre avec les paramètres suivants :
1docker run -d --name n8n -p 5678:5678 -e N8N_CONCURRENCY_PRODUCTION_LIMIT=2 --add-host=host.docker.internal:host-gateway -v /home/debian/n8n/data:/home/node/.n8n --restart unless-stopped docker.n8n.io/n8nio/n8n
Le port utilisé est le port 5678, par défaut sur n8n. Le paramètre N8N_CONCURRENCY_PRODUCTION_LIMIT
permet de limiter le nombre d’exécutions en production à 2 en même temps. Pratique pour une petite configuration. Par défaut sous Debian l’IP de l’hôte docker ne dispose pas de résolution DNS, et peut varier en fonction du réseau docker dans lequel il est démarré. L’ajout de --add-host=host.docker.internal:host-gateway
règle ce problème. C’est d’ailleurs un paramètre pré-configuré par Docker Desktop. La mise à jour du conteneur nécessitera régulièrement de stopper et puller une version plus récente, avec un arrêt de service. C’est scriptable, mais ça reste limitant, l’idéal serait de se tourner vers un cluster avec rolling update.
Mise en place de Ollama
On va se servir de n8n pour récupérer plein de contenu, mais je suis fainéant, je ne veux pas toujours tout lire. Pour résumer du contenu, utiliser un LLM c’est vraiment top. Et cela permet très rapidement de savoir si l’on souhaite lire l’article. Pour ce faire, il faut installer Ollama. Sous Debian, la documentation par défaut propose de l’installer via le script fourni, ce qui marche très bien. À noter tout de même que pour que par défaut il n’écoute que sur localhost, donc pas accessible sur l’interface Docker. Pour y pallier plusieurs solutions, tout dépend du niveau de sécurité recherché. On peut lui spécifier l’IP sur le réseau docker recherché, ou le faire écouter sur toutes les interfaces si un firewall est positionné en frontal - ⚠️ autrement il sera accessible sur votre réseau / internet selon votre config.
1sudo systemctl edit ollama.service
Puis ajouter les lignes dans la zone éditable
1[Service]
2Environment="OLLAMA_HOST=0.0.0.0"
Puis enfin redémarrer le service avec
1sudo systemctl daemon-reload && sudo systemctl restart ollama
Au niveau des modèles, c’est selon ses besoins. Sur mon petit serveur je n’ai pas de GPU, et peu de RAM (6 Go), donc je choisis des petits modèles. Pas besoin d’un texte ultra qualitatif, tant que la capacité à résumer est là. Récemment Gemma 3 est sorti avec une version à 2 milliards de paramètres que je trouve franchement efficace.