#Homelab #Docker #Veille #Supervision

Veille auto-hébergée : FreshRSS et ma page de lecture

⏱ oct. 2026 → en cours lecture 1 min · dossier détaillé 7 min

ContexteMa veille n'avait pas d'outil dédié, et la page Veille de ce portfolio dépendait d'un service externe pour afficher une seule alerte du CERT-FR.

Mon rôleSeul : choix de l'outil, déploiement sur mon serveur personnel, sécurisation, organisation des sources, page de lecture et liaison avec le portfolio.

RésultatUne veille quotidienne triée automatiquement, consultable de partout par VPN, et un portfolio alimenté par mes vrais favoris, sans aucune dépendance externe.

L’essentiel

  • Le besoin : un lecteur unique, à moi, qui rassemble les alertes de sécurité et l’actualité de mon périmètre, et fait remonter ce qui me concerne.
  • Le déploiement : FreshRSS en conteneur Docker sur ma VM Debian (Proxmox), publié derrière le reverse proxy Caddy en HTTPS, accessible uniquement depuis chez moi ou par VPN.
  • L’organisation : neuf sources en trois dossiers, une règle qui étiquette automatiquement ce qui touche mon périmètre, des favoris pour ce que je retiens, et une politique d’archivage.
  • Une page de lecture : « Ma veille », une interface plus claire que celle de FreshRSS, pensée pour le tri du matin et branchée sur son API.
  • Le lien avec le portfolio : un script relève mes favoris et la dernière alerte du CERT-FR ; la page Veille se construit à partir de ce relevé, même hors connexion.
  • Supervisé : le service et la page de lecture sont surveillés par Uptime Kuma, avec une alerte en cas de panne.
Page Ma veille : relevé des sept derniers jours en barres, filtres par dossier et étiquette, liste des articles du jour
« Ma veille » avec mes données réelles : le relevé de la semaine (en rouge, la part d'alertes), les filtres, et les articles du jour avec favori, étiquette et « lu » en un clic.
Dossier détaillé : choix de l'outil, déploiement, sécurité, organisation, tests, difficultés

Contexte

La veille est une compétence évaluée au BTS SIO, et c’est surtout une nécessité en administration systèmes : une faille publiée aujourd’hui peut être exploitée demain. Jusqu’ici, je consultais des sites un par un, sans outil pour trier. Côté portfolio, la page Veille interrogeait un service externe gratuit pour afficher la dernière alerte du CERT-FR : une dépendance fragile, et une seule source.

Comme j’administre déjà un serveur personnel (homelab), j’ai choisi d’y héberger mon propre lecteur de flux RSS, et d’en faire la source unique de ma veille et de la page Veille du portfolio.

Environnement technologique

  • Hyperviseur : Proxmox, sur un ancien PC reconverti en serveur
  • Système : VM Debian 13 avec Docker et Docker Compose
  • Lecteur de flux : FreshRSS (base SQLite intégrée)
  • Publication : reverse proxy Caddy, certificat wildcard Let’s Encrypt
  • Accès distant : VPN Tailscale (aucun port ouvert sur Internet)
  • Supervision : Uptime Kuma, alertes sur Discord
  • Page de lecture : HTML, CSS et JavaScript sans dépendance, servis par nginx
  • Liaison portfolio : script Node.js (API compatible Google Reader)

Architecture

Sources RSS (CERT-FR, ANSSI, Microsoft, Debian…)
        │  actualisation toutes les 30 min
        ▼
FreshRSS ─ conteneur Docker, VM Debian, Proxmox
        │  API (Google Reader)            ▲ HTTPS (Caddy)
        ├──────────────┐                  │ réseau local ou VPN
        ▼              ▼                  │
  Ma veille       npm run veille ──▶ portfolio (relevé statique)
 (navigateur)        (mon PC)

Actions réalisées

1. Choisir l’outil

J’ai comparé les deux lecteurs auto-hébergés les plus utilisés :

Critère FreshRSS Miniflux
Base de données SQLite intégrée PostgreSQL à ajouter
Tri Dossiers, étiquettes, filtres automatiques Catégories, règles
API pour applis et scripts Oui (Google Reader, Fever) Oui
Interface Complète, un peu datée Minimaliste

FreshRSS l’a emporté : un seul conteneur à maintenir, et surtout des filtres capables d’étiqueter automatiquement les articles, ce qui répondait directement à mon besoin de tri.

2. Déployer le service

FreshRSS tourne dans un conteneur Docker, décrit dans un fichier Compose, sur le réseau Docker partagé avec Caddy. Aucun port n’est publié : seul le reverse proxy peut le joindre. J’ai ajouté un sous-domaine dans la configuration de Caddy, validé la configuration avant de la recharger, puis vérifié la réponse HTTP. L’assistant d’installation a contrôlé ses prérequis (PHP, extensions, droits sur les dossiers) avant la création du compte.

Assistant d'installation de FreshRSS : toutes les vérifications PHP et de droits sur les fichiers sont au vert
L'assistant d'installation : les 18 vérifications (PHP, extensions, droits sur les dossiers) sont validées.

3. Sécuriser les accès

  • Réseau : le service n’est joignable que depuis le réseau de la maison ou par le VPN Tailscale ; rien n’est exposé sur Internet.
  • Comptes : un compte nominatif, protégé par un mot de passe généré et rangé dans mon gestionnaire de mots de passe.
  • Moindre privilège : l’API utilise un mot de passe distinct, qui permet de lire et de marquer les articles mais pas de se connecter à l’interface. Le script du portfolio ne connaît que lui.
  • Pas de secret dans le code : les identifiants du script sont dans un fichier .env, exclu du dépôt Git.

4. Organiser la veille

  • Neuf sources en trois dossiers : Alertes (CERT-FR, ANSSI, Microsoft Security Update Guide, Debian Security), Systèmes & Réseau (IT-Connect, LeMagIT, Proxmox, Docker) et Maintenance (les nouvelles versions de FreshRSS lui-même). Les adresses ont été vérifiées une à une puis importées d’un coup, par un fichier OPML.
  • Étiquetage automatique : tout nouvel article dont le titre contient un mot de mon périmètre (Windows, Microsoft, Edge, Outlook, Debian, Linux, Proxmox, Docker, pfSense) reçoit l’étiquette « Mon périmètre ». Sur les 89 alertes reçues en une semaine, je vois tout de suite celles qui me concernent.
  • Favoris et étiquettes manuelles : je mets en favori ce que je retiens, et j’étiquette « À tester au labo » ce que je veux essayer sur mon serveur.
  • Archivage : au plus 200 articles et un mois par flux, sans jamais supprimer les favoris ni les articles étiquetés.
Gestion des abonnements de FreshRSS : dossiers Alertes, Maintenance et Systèmes & Réseau avec leurs flux
Les sources, rangées en dossiers.
Réglage de l'étiquette Mon périmètre : une règle par ligne, intitle:Windows, intitle:Microsoft…
La règle d'étiquetage automatique : une recherche par ligne, limitée au titre pour éviter les faux positifs.

5. Une page de lecture pensée pour le tri du matin

L’interface de FreshRSS est complète mais peu agréable pour un tri rapide. J’ai donc ajouté une page de lecture, « Ma veille », qui utilise uniquement son API :

  • un relevé des sept derniers jours, jour par jour, avec la part d’alertes ;
  • les articles regroupés par jour, avec la couleur de leur dossier ;
  • favori, étiquettes et « lu » en un clic, ou au clavier ;
  • des filtres par dossier, par étiquette et sur les favoris, et une recherche.

FreshRSS reste le moteur : abonnements, actualisation et règles automatiques. La page n’est qu’une interface, servie par un petit conteneur nginx.

6. Relier le portfolio

Un script (npm run veille) se connecte à l’API, relève la dernière alerte du CERT-FR et mes favoris avec leurs étiquettes, et enregistre le tout dans un fichier de données du portfolio. Le site reste statique : il se construit à partir de ce relevé, sans aucun appel réseau, ce qui permet de le présenter hors connexion. Si le serveur est injoignable, le script s’arrête sans toucher au relevé précédent.

7. Superviser et maintenir

  • Disponibilité : Uptime Kuma surveille FreshRSS et la page de lecture, et envoie une alerte sur Discord en cas de panne.
  • Redémarrage automatique des conteneurs, y compris après un redémarrage de la VM.
  • Mises à jour : le flux des nouvelles versions de FreshRSS fait partie de ma veille, dans le dossier Maintenance.
Page de statut Uptime Kuma : tous les systèmes opérationnels, moniteurs Veille et Actu à 100 %
La page de statut d'Uptime Kuma : FreshRSS (Veille) et la page de lecture (Actu) disponibles à 100 %.

Tests réalisés

Test Résultat attendu Résultat
Validation de la configuration Caddy « Valid configuration » Conforme
Réponse HTTP du nouveau sous-domaine, et d’un service existant 302 / 200, pas de 404 Conforme
Prérequis de l’assistant d’installation 18 vérifications au vert Conforme
Test de l’API (Google Reader et Fever) PASS Conforme
Relevé du portfolio Alertes et favoris enregistrés 5 alertes, 5 favoris
Script avec un mauvais mot de passe, puis serveur injoignable Message clair, relevé précédent conservé Conforme
Mot de passe API absent des journaux du serveur Aucune occurrence Conforme (après correction)
Terminal : validation de la configuration Caddy puis codes HTTP 302 et 200
Validation de la configuration du reverse proxy, puis contrôle des codes HTTP.

Difficultés rencontrées & Solutions

Problème constaté Cause identifiée Solution
Le nouveau sous-domaine répondait « Service inconnu » une fois ajouté au Caddyfile Le bloc d’un service existant n’était jamais refermé : le nouveau bloc s’est retrouvé imbriqué dedans Bloc refermé, sauvegarde de la configuration avant toute modification, test HTTP des services voisins
Flux en erreur juste après l’import « database is locked » : SQLite n’accepte qu’une écriture à la fois, et l’import a lancé l’actualisation simultanée de sept flux, dont un de près de 600 articles Diagnostic par le journal et un test de connectivité depuis le conteneur (tous les sites répondaient), puis actualisation flux par flux
Mot de passe API envoyé dans l’adresse FreshRSS avertit qu’une adresse peut finir dans les journaux du serveur Connexion du script passée en POST, vérifiée dans les journaux
Purge sans effet malgré la politique d’archivage FreshRSS ne supprime jamais un article encore présent dans le flux d’origine ; le flux Microsoft republie tout son historique Comportement compris et accepté (base de 5 Mo) ; la page de lecture filtre sur la date de publication
Terminal : journal FreshRSS avec l'erreur database is locked, puis test de chaque flux depuis le conteneur, tous en 200
Le diagnostic : le journal pointe un verrou de la base, et le test depuis le conteneur écarte une panne réseau.

Prochaine étape : la sauvegarde

Tout l’état du service (base, comptes, réglages) tient dans un seul dossier. La prochaine étape est une sauvegarde planifiée de ce dossier, hors de la VM, et un test de restauration pour vérifier qu’elle est réellement exploitable.

Compétences BTS SIO

Tableau E5 Réalisation en cours de formation · oct. 2026 → en cours

  • Mettre en place son environnement d'apprentissage personnel (Organiser son développement professionnel)
    Homelab personnel (Proxmox, VM Debian, Docker) utilisé comme environnement d'apprentissage
  • Mettre en œuvre des outils et stratégies de veille informationnelle (Organiser son développement professionnel)
    Veille quotidienne outillée : sources en dossiers, étiquetage automatique du périmètre, favoris
  • Réaliser les tests d'intégration et d'acceptation d'un service (Mettre à disposition des utilisateurs un service informatique)
    Tests d'intégration : configuration du reverse proxy, codes HTTP, prérequis, API, script de relevé
  • Déployer un service (Mettre à disposition des utilisateurs un service informatique)
    Déploiement d'un service conteneurisé derrière un reverse proxy HTTPS (Caddy)
  • Mettre en place et vérifier les niveaux d'habilitation associés à un service (Gérer le patrimoine informatique)
    Habilitations : compte nominatif, mot de passe API distinct (moindre privilège), accès limité au réseau local et au VPN
  • Vérifier les conditions de la continuité d'un service informatique (Gérer le patrimoine informatique)
    Continuité : redémarrage automatique des conteneurs, supervision Uptime Kuma avec alerte
  • Participer à l'évolution d'un site Web exploitant les données de l'organisation (Développer la présence en ligne de l'organisation)
    Le portfolio exploite les données du service par son API (page Veille alimentée par les favoris)

Voir le tableau de synthèse complet →

← Projet Précédent Support N1/N2 et exploitation du parc informatique
johan@lybernet: ~ — palette Échap
↑ ↓ choisir Entrée ouvrir