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