Supervision du VPS avec Prometheus et Grafana
Prometheus et Grafana auto-hébergés sur mon VPS ARM64 pour suivre l'état du serveur et de chaque conteneur Docker. Les dashboards ne sont accessibles que par le VPN.
- L'objectif
- Superviser mon VPS et tous ses conteneurs, en comprenant chaque maillon plutôt qu'en installant un dashboard tout fait.
- Ma démarche
- Prometheus collecte les métriques (Node Exporter, cAdvisor) toutes les 15 s, Grafana les affiche, le tout accessible par VPN uniquement.
- Le résultat
- Des tableaux de bord temps réel de la santé du serveur, avec 30 jours de rétention.
Contexte
Mon VPS héberge plusieurs services : ce portfolio, un VPN WireGuard, Umami, Wazuh, une landing page. Tant que tout tourne, on ne se pose pas de questions. Mais quand un conteneur consomme trop de RAM ou qu'un disque se remplit, je voulais le voir venir au lieu de le découvrir quand le serveur rame.
J'ai monté une stack d'observabilité classique : Prometheus pour collecter les métriques, Grafana pour les visualiser. Je voulais comprendre chaque maillon de la chaîne plutôt qu'installer un dashboard tout fait.
Architecture
Chaque brique a un rôle précis :
- Node Exporter expose les métriques de la machine hôte
- cAdvisor lit le démon Docker et expose les métriques de chaque conteneur
- Prometheus interroge ces deux sources à intervalle régulier et stocke tout
- Grafana lit Prometheus et trace les graphiques
Le rôle de Prometheus
Prometheus fonctionne en pull : ce n'est pas Node Exporter qui envoie ses données, c'est Prometheus qui vient les chercher. Sa configuration liste simplement les cibles à scraper :
scrape_configs:
- job_name: node
static_configs:
- targets: [node-exporter:9100]
- job_name: cadvisor
static_configs:
- targets: [cadvisor:8080]Toutes les 15 secondes, Prometheus interroge ces endpoints, récupère les métriques et les stocke. La page Target health permet de vérifier d'un coup d'œil que chaque source répond bien.
Visualisation dans Grafana
Une fois Prometheus branché comme source de données, Grafana affiche tout. La capture montre le dashboard Node Exporter Full sur mon serveur : pression CPU, charge système, RAM utilisée, swap, espace disque, trafic réseau.

Pour les conteneurs, un second dashboard branché sur cAdvisor donne la consommation CPU/RAM/réseau de chaque service Docker individuellement : je vois précisément ce que coûte le portfolio, Umami ou Wazuh.
Accès réservé via VPN
Comme le reste de mon homelab, les dashboards ne sont pas exposés sur Internet. Grafana et Prometheus passent par Traefik, avec un middleware qui n'autorise que le sous-réseau WireGuard :
traefik.http.middlewares.monitoring-vpn.ipwhitelist.sourcerange=10.8.0.0/24,127.0.0.1/32Sans être connecté au VPN, une requête sur grafana.sinoro.fr reçoit un 403. Les exporters (Node Exporter, cAdvisor) ne sont eux jamais exposés du tout : seul Prometheus les joint, sur un réseau Docker interne.
Un détail qui m'a appris quelque chose
Au premier déploiement, Grafana renvoyait des 504 Gateway Timeout. Le certificat était bon, le DNS correct, Grafana répondait en interne, mais Traefik n'arrivait pas à l'atteindre.
La cause : Grafana était sur deux réseaux Docker (un interne pour parler à Prometheus, un pour Traefik). Quand un conteneur est sur plusieurs réseaux, Traefik utilise le premier de la liste pour le joindre, et il tombait sur le réseau interne où Traefik n'est pas présent. Mettre le réseau Traefik en premier dans la déclaration a réglé le problème.
C'est typiquement le genre de bug qu'on ne comprend qu'en lisant les logs étape par étape, et qui apprend beaucoup sur la façon dont Traefik route réellement le trafic.
Projets proches
Ce portfolio : Next.js, MDX et déploiement continu
Le site que vous lisez : Next.js 16 et fichiers MDX, redéployé automatiquement sur un VPS ARM64 à chaque push, avec des contrôles de sécurité dans le pipeline.
2026Next.jsTypeScriptTailwindMDX
Indian Food : pipeline DevSecOps pour un site vitrine
Site vitrine statique d'un restaurant, déployé sur Oracle Cloud ARM64 derrière une chaîne DevSecOps : analyse statique, scan de dépendances, tests dynamiques et déploiement automatisé.
2026DevSecOpsDockerNginxCI/CD
Mon budget : une application de prévision de solde
Application web qui répond à "combien j'aurai à telle date ?" et "quand est-ce que ça coince ?", avec un moteur de calcul testé, plusieurs budgets étanches et une authentification à double vérification. Déployée sur mon VPS ARM64.
2026Next.jsTypeScriptSQLiteargon2id