Pivert's Blog

FrugalSentinel — Monitoring serverless à 0€


Reading Time: 6 minutes

FrugalSentinel est un système de monitoring serverless complet, écrit en Python 3.13 avec la bibliothèque standard uniquement (zéro dépendance pip), exécuté sur le free tier Scaleway Functions, stockant son état sur Scaleway Object Storage (S3), et alertant via ntfy.sh. Résultat : monitoring professionnel pour exactement 0€ par mois.

Le problème que FrugalSentinel résout

Toutes les solutions de monitoring modernes suivent le même schéma : un tier gratuit séduisant, puis un mur de facturation. Datadog, UptimeRobot, Uptime Kuma autohébergé (mais qui nécessite Docker et une VM), Grafana Cloud — toutes imposent soit un coût mensuel, soit une infrastructure dédiée à maintenir.

FrugalSentinel part d’une hypothèse différente : si votre cloud fournit un tier gratuit serverless avec stockage S3, vous pouvez y faire tourner un monitoring complet sans sortir la carte bleue. L’astuce n’est pas dans l’optimisation des coûts — elle est dans l’absence totale de coût, par construction.

Ce que ça change concrètement :

  • Aucune VM à maintenir — pas de Docker, pas de systemd, pas de mises à jour de système
  • Aucune dépendance externe — pas de pip install qui casse six mois plus tard
  • Aucune base de données — l’état est du JSON sur S3, avec rotation automatique
  • Aucune facture — tout tient dans le free tier Scaleway (256 MB, 75 GB S3)

Architecture et choix techniques

FrugalSentinel est un monolithe minimaliste conçu pour l’immobilité : une fois déployé, il ne nécessite aucune maintenance.

Python 3.13, stdlib uniquement

Le runtime est volontairement réduit à l’os : urllib pour les requêtes HTTP, json pour la sérialisation, concurrent.futures pour le parallélisme, ssl pour l’analyse des certificats. Aucun framework, aucune bibliothèque tierce. Le code que vous écrivez aujourd’hui fonctionnera dans 5 ans sans modification.

Le choix de Python a un tradeoff : les cold starts sont légèrement plus lents qu’avec Go ou Rust. Mais l’avantage est considérable : Python permet d’écrire des probes complexes en quelques lignes — comme l’API de liste des serveurs Luanti, qui nécessite du parsing JSON et de la logique de matching. Si vous avez besoin d’un notifier autre que ntfy.sh (email, webhook, Slack), l’implémentation est un module de 20 lignes, pas un conteneur complet.

S3 comme seule base de données

L’état est stocké sous forme de fichiers JSON sur Scaleway Object Storage. Le client S3 est pur Python, implémentant AWS Signature Version 4 avec urllib uniquement. Pas de boto3, pas de libcurl. Cela élimine un point de défaillance majeur : si une dépendance externe devient obsolète ou incompatible, le monitoring continue de fonctionner.

Rotation des données : fenêtre temps réel → quotidien → mensuel gz

Les données ne s’accumulent pas indéfiniment. Le système utilise une rotation en trois niveaux :

Niveau Contenu Durée de rétention Taille (19 checks)
Temps réel 48 dernières mesures (window glissante) Écrasé à chaque run ~70 KB
Quotidien Résumé par jour (moyennes, statuts) 30 jours ~15 KB/jour
Mensuel gzip Archive compressée des données brutes 18 mois+ ~200 KB/mois

À l’échelle de l’infrastructure pivert.org (19 services, toutes les 5 minutes), l’empreinte totale sur S3 est d’environ 2 MB/mois. Le free tier Scaleway Object Storage offre 75 GB — soit théoriquement plus de 30 ans de monitoring avant d’atteindre la limite.

Dashboard statique sur S3 : zéro latence, zéro coût

Le dashboard est une page HTML/CSS/JS vanilla hébergée sur le même bucket S3 que les données. Il charge dashboard.json (snapshot régénéré à chaque run) via une requête statique — aucun appel à la fonction Scaleway n’est nécessaire pour consulter le dashboard.

C’est un détail architectural crucial : la visualisation ne coûte rien, même si vous rafraîchissez la page toutes les 10 secondes. Le fichier JSON fait ~23 KB et se charge en moins de 500 ms sur un PC standard. L’auto-refresh est activé par défaut car le nombre de clients est sans importance — il n’y a aucun re-processing, seuls des fichiers statiques (JSON/JS/HTML) sont servis depuis S3.

→ Voir le dashboard en direct

Modularité : ajouter un check en 4 lignes

Le système de checks est conçu pour l’extensibilité. Chaque protocole vit dans son propre module sous monitoring/modules/. Pour ajouter un nouveau type de surveillance, il suffit de créer un fichier check_{protocole}.py avec une fonction unique :

def check(config: dict) -> dict:
return {"success": bool, "msg": str, ...champs_optionnels}

Les modules existants couvrent déjà les cas les plus courants :

Module Ce qu’il vérifie Extras
check_https.py HTTPS + keyword Certificat TLS AVANT la requête HTTP — même si le backend renvoie 401 ou 502. Auth basique supportée.
check_http.py HTTP statut + keyword Vérification de contenu par mot-clé
check_tcp.py Connectivité TCP brute Timeout configurable, port arbitraire
check_smtp.py SMTP HELO Port 587 (STARTTLS) car 25/465 bloqués en serverless
check_luanti.py API serveur de jeu Luanti Joueurs, lag, version, uptime

L’exemple de check_https.py mérite une attention particulière : le certificat TLS est vérifié avant la requête HTTP. Si votre backend renvoie une erreur 502 Bad Gateway, le certificat est quand même analysé et son expiration rapportée. Cela évite les faux positifs où un service est marqué “certificat expiré” simplement parce que le check HTTP a échoué avant d’atteindre la couche TLS.

Le dashboard : conçu pour tous les écrans

Le dashboard n’est pas une console d’administration — c’est un tableau de bord d’information conçu pour être consulté rapidement sur n’importe quel appareil.

  • Multi-langue (EN/FR) avec détection automatique du navigateur
  • Responsive — de la smart TV au téléphone portable
  • Mode TV — interface simplifiée avec tailles de police agrandies, lisible de loin sans interaction
  • Plein écran au clic — chaque carte s’ouvre en modal avec URL cliquable, historique, métriques détaillées
  • Auto-refresh activé par défaut avec compte à rebours visible
  • Sparkline — mini-graphique des 48 dernières mesures sur chaque carte
  • Groupes — organisation par catégories (gaming, wordpress, infra, web-apps…)

→ Voir le dashboard en direct

Alertes : confirmation progressive + récupération

Le système d’alerting évite le bruit. Une notification n’est envoyée que si un service échoue sur 2 checks consécutifs sur 3 (required=2, sample=3). Cela filtre les micro-coupures réseau sans perdre les vrais incidents.

Quand un service revient en ligne après une panne, une notification de récupération est automatiquement envoyée. Vous savez exactement quand le problème a commencé et quand il s’est terminé, sans avoir à constamment surveiller le dashboard.

Le notifier par défaut utilise ntfy.sh, mais le système supporte n’importe quel endpoint ntfy compatible : il suffit de renseigner ntfy_url dans le profil d’alerte pour pointer vers votre instance auto-hébergée.

Souveraineté et versatility : n’importe quel cloud

FrugalSentinel n’est pas lié à Scaleway. Il fonctionne sur tout cloud serverless fournissant une exécution Python + un stockage S3-compatible : AWS Lambda + S3, Google Cloud Functions + Cloud Storage, Azure Functions + Blob Storage, ou des clouds souverains français comme Scaleway ou OVHcloud.

L’absence de dépendance externe est un avantage de souveraineté : vous n’êtes pas verrouillé par un écosystème npm, pip, ou Docker. Un fichier ZIP de quelques dizaines de kilo-octets contient tout le code nécessaire. Déployé sur un cloud souverain, vos données de monitoring (URLs, historique, alertes) ne quittent jamais le territoire européen si vous ne le souhaitez pas.

Coût : 0€, et scalable à ~1€ par nouveau service

Le free tier Scaleway Functions offre 1 million de requêtes/mois et 400 000 GB-s/mois. À 256 MB et 3 secondes par run, cela représente :

  • 533 333 checks à 5 minutes d’intervalle avant d’atteindre la limite
  • Soit ~62 services surveillés toutes les 5 minutes avant le premier centime

Quand vous dépassez le free tier, le coût marginal est dérisoire :

Scénario Invocations/mois GB-s/mois Coût réel
19 checks toutes les 5 min 8 640 6 480 0.00 €
50 checks toutes les 5 min 22 680 17 010 0.00 €
100 checks toutes les 1 min 43 200 32 400 0.00 €
1 nouveau service (5 min, 256MB, 3s) +8 640 +6 480 ~0.03 € (hors free tier)

L’Object Storage est également gratuit jusqu’à 75 GB. Avec une empreinte de ~2 MB/mois, la limite est théoriquement inatteignable. Vous pouvez donc augmenter la fréquence de monitoring (toutes les 1 minute, voire 30 secondes) sans crainte — le coût marginal reste inférieur à 1€ par dizaine de services supplémentaires.

Démarrer en 3 commandes

FrugalSentinel est conçu pour être opérationnel en quelques minutes :

  • cp .env.example .env — renseigner vos credentials S3 Scaleway
  • python3 handler.py — test local (mode filesystem si pas de S3 configuré)
  • ./package.sh — génère frugalsentinel.zip prêt pour Scaleway Functions

Le fichier config.json (template fourni via config.json.example) définit les targets, les profils d’alerte, et les groupes d’affichage. Il couvre tous les cas d’usage : HTTPS avec ou sans keyword, avec ou sans auth basique, HTTP simple, TCP brut, SMTP, et l’API Luanti. Aucune recompilation, aucun schéma de base de données à migrer.

→ Voir le README complet et le code source sur GitLab (architecture détaillée, configuration S3/IAM, endpoints API, ajout de checks personnalisés, ntfy.sh auto-hébergé)

Un exemple d’utilisation : pivert.org

FrugalSentinel est utilisé en production pour surveiller l’infrastructure de pivert.org : 4 sites WordPress, 5 applications web (Wekan, Grafana, MyGentext…), 3 hyperviseurs Proxmox, un NAS, la connectivité email (IMAP/SMTP), un serveur de jeu Luanti, et un site externe d’association. 18 services OK, 1 en FAIL — toutes les informations sont visibles en un coup d’œil sur le dashboard.

C’est un exemple concret, pas une démonstration. Le système tourne 24/7 depuis plusieurs semaines, consomme une fraction du free tier Scaleway, et n’a nécessité aucune intervention de maintenance.

Licence et code source

FrugalSentinel est publié sous licence GNU GPL, dépôt public :

gitlab.com/pivert/FrugalSentinel

Le dépôt contient le code Python complet, le dashboard HTML/JS, les templates de configuration (.env.example, config.json.example avec exemples pour tous les protocoles), les scripts de packaging/déploiement, et la documentation technique.

En résumé

FrugalSentinel prouve qu’un monitoring professionnel n’a pas besoin de :

  • Docker, Kubernetes, ou serveurs dédiés
  • pip install et gestion de dépendances
  • Base de données ou stack complexe
  • Budget mensuel

Python 3.13 + stdlib + n’importe quel cloud serverless + ntfy.sh = monitoring complet pour 0€, scalable à moins de 1€ par dizaine de services supplémentaires.

→ Voir le code sur GitLab · → Voir le dashboard en direct

Like it ?

Get notified on new posts (max 1 / month)
Soyez informés lors des prochains articles

Leave a Reply

Your email address will not be published. Required fields are marked *