Pourquoi self-héberger Prometheus et Grafana sur un VPS
Contrairement à un outil tout-en-un, la stack Prometheus + Grafana sépare clairement la collecte (Prometheus scrape les métriques exposées par des exporters), le stockage (base de séries temporelles intégrée) et la visualisation (Grafana). Cette modularité est précisément ce qui en fait un standard : vous surveillez le VPS lui-même avec Node Exporter, vos conteneurs avec cAdvisor, votre base PostgreSQL ou MySQL avec l'exporter dédié, et vous instrumentez vos propres applications au format Prometheus.
Tout cela sur un VPS que vous contrôlez, ce qui vous évite d'envoyer des métriques d'infrastructure sensibles vers un SaaS facturé à l'ingestion. Vous conservez l'historique aussi longtemps que votre disque le permet, vous construisez des dashboards spécifiques à votre stack, et vous définissez vos propres règles d'alerte via Alertmanager.
Avec la sortie de Prometheus 3.x (dernière version stable : v3.15.0, septembre 2026), le moteur de stockage TSDB a été optimisé pour réduire la consommation mémoire de 15 à 20 % sur des parcs de machines modestes — un avantage direct pour les VPS. Grafana 13.x (v13.2.3, fin septembre 2026) apporte un compositeur de dashboards revu et un système d'alertes unifié qui remplace l'ancienne alerte Grafana héritée. C'est l'approche à privilégier quand vous dépassez le simple « est-ce que le site répond ? » pour entrer dans l'analyse fine des tendances de charge.
Ce que cette stack apporte sur votre VPS
- Métriques système détaillées (CPU, RAM, I/O disque, réseau) via Node Exporter v1.12.1, historisées sur le long terme.
- Surveillance des conteneurs Docker avec cAdvisor : consommation par conteneur en temps réel.
- Dashboards Grafana sur mesure, importables depuis une bibliothèque communautaire de milliers de modèles.
- Alerting puissant via Alertmanager v0.34.1 : seuils, regroupement, silences et routage multi-canaux (e-mail, Slack, PagerDuty…).
- Surveillance de la disponibilité HTTP/TCP avec Blackbox Exporter : détection de temps de réponse et d'expiration de certificat TLS.
- Collecte de logs applicatifs avec Loki (même éditeur que Grafana) : corrélation logs/métriques dans un seul dashboard.
- Langage de requête PromQL pour créer des indicateurs dérivés et des taux d'évolution.
- Instrumentation de vos propres applications au format Prometheus, sans coût d'ingestion externe.
Prérequis VPS et ressources à prévoir
Cette stack est plus gourmande qu'un moniteur simple car Prometheus garde les séries temporelles en mémoire avant de les écrire sur disque. Comptez un VPS 2 vCPU et 2 à 4 Go de RAM pour superviser un à plusieurs serveurs. Ajoutez Loki et Alertmanager et visez 4 Go minimum — l'ingestion de logs est beaucoup plus légère que Elasticsearch mais exige de la RAM pour le compactage des blocs.
Le stockage est le point critique : Prometheus génère environ 1 à 2 Mo par série temporelle et par jour selon la fréquence de scrape (15 s par défaut). Pour 500 séries sur 30 jours, comptez 15 à 30 Go. Prévoyez 40 Go de SSD en partant, et ajustez --storage.tsdb.retention.time selon vos besoins.
Prérequis logiciels : Docker 26+ et Docker Compose v2, un nom de domaine pointant vers votre VPS (pour le reverse proxy HTTPS de Grafana), et ufw ou équivalent pour restreindre les ports.
Déployer la stack avec Docker Compose
Créer l'arborescence du projet
Sur votre VPS, créez un dossier dédié et la structure de fichiers :
mkdir -p ~/monitoring/{prometheus,alertmanager,loki} cd ~/monitoringCette organisation isole chaque configuration dans son répertoire, ce qui simplifie les mises à jour.
Écrire le fichier docker-compose.yml
Définissez les services suivants dans un fichier
docker-compose.yml:prometheus(imageprom/prometheus:v3.15.0),grafana(imagegrafana/grafana:13.2.3),node-exporter(imageprom/node-exporter:v1.12.1),cadvisor(imagegcr.io/cadvisor/cadvisor:latest),alertmanager(imageprom/alertmanager:v0.34.1).Montez les fichiers de configuration en volumes bind-mount et créez des volumes nommés pour persister les données :
prometheus_data,grafana_data. Exemple de bindnode-exporter:volumes: - /proc:/host/proc:ro - /sys:/host/sys:ro - /:/rootfs:roLancez ensuite
docker compose up -dpour démarrer la stack.Configurer prometheus.yml avec tous les jobs de scrape
Dans
prometheus/prometheus.yml, déclarez les cibles dans la sectionscrape_configs. Quatre jobs essentiels :scrape_configs: - job_name: 'node' static_configs: - targets: ['node-exporter:9100'] - job_name: 'cadvisor' static_configs: - targets: ['cadvisor:8080'] - job_name: 'alertmanager' static_configs: - targets: ['alertmanager:9093'] - job_name: 'prometheus' static_configs: - targets: ['localhost:9090']Rechargez la configuration sans redémarrage :
curl -X POST http://localhost:9090/-/reload(à condition d'avoir activé--web.enable-lifecycle).Configurer Alertmanager (alertmanager.yml)
Créez
alertmanager/alertmanager.yml. Une configuration minimale qui route les alertes vers Slack :route: receiver: 'slack-notifications' group_wait: 30s group_interval: 5m repeat_interval: 4h receivers: - name: 'slack-notifications' slack_configs: - api_url: 'https://hooks.slack.com/services/VOTRE/WEBHOOK' channel: '#alertes-vps' title: '{{ .CommonAnnotations.summary }}'Pour l'e-mail, remplacez
slack_configsparemail_configsavec les champsto,from,smarthost,auth_usernameetauth_password.Créer les règles d'alerte Prometheus
Dans
prometheus/rules.yml, définissez les règles. Trois incontournables pour un VPS :groups: - name: vps rules: - alert: CPUElevee expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 85 for: 5m annotations: summary: 'CPU > 85% depuis 5 min' - alert: MemFaible expr: node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes < 0.10 for: 5m annotations: summary: 'Mémoire disponible < 10%' - alert: DisqueCharge expr: (node_filesystem_size_bytes - node_filesystem_avail_bytes) / node_filesystem_size_bytes > 0.85 for: 10m annotations: summary: 'Disque > 85%'Référencez ce fichier dans
prometheus.ymlsousrule_files: ['rules.yml'].Connecter Grafana à Prometheus (et Loki)
Ouvrez Grafana sur le port 3000. Identifiants par défaut : admin / admin — changez-les immédiatement.
Ajoutez une source de données Prometheus avec l'URL
http://prometheus:9090. Testez la connexion : elle doit retourner « Data source is working ».Si vous avez ajouté Loki dans le Compose (
grafana/loki:3.3.2), ajoutez une seconde source de données Loki avec l'URLhttp://loki:3100. Vous pourrez ensuite corréler les pics de CPU dans un dashboard Prometheus avec les logs applicatifs dans Loki, sans changer d'outil.Exposer Grafana en HTTPS via un reverse proxy
Grafana ne doit jamais être exposé en HTTP nu. Configurez Nginx comme reverse proxy :
server { listen 443 ssl; server_name grafana.votre-domaine.com; ssl_certificate /etc/letsencrypt/live/grafana.votre-domaine.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/grafana.votre-domaine.com/privkey.pem; location / { proxy_pass http://127.0.0.1:3000; proxy_set_header Host $host; } }Bloquez les ports internes au pare-feu :
ufw deny 9090,ufw deny 9093,ufw deny 3000. Seul le port 443 (Nginx) doit être ouvert publiquement.Vérifier que Prometheus scrape bien toutes les cibles
Accédez à
http://localhost:9090/targets(en SSH ou via le reverse proxy). Toutes les cibles déclarées doivent afficher l'état UP en vert. Un état DOWN indique un problème de réseau Docker (mauvais nom de service), de port ou de configuration. Corrigez avant de continuer : un Grafana connecté à un Prometheus sans données rend des dashboards vides, et rien dans l'interface ne dit explicitement pourquoi.
Importer les dashboards communautaires Grafana
Grafana propose une bibliothèque de dashboards prêts à l'emploi sur grafana.com/grafana/dashboards. Deux identifiants indispensables pour un VPS :
ID 1860 — Node Exporter Full : le dashboard de référence pour les métriques système. Il affiche en temps réel et sur la durée : charge CPU par cœur, usage mémoire (buffers/cache inclus), I/O disque par device, saturation réseau et file d'attente. Filtrable par instance, ce qui le rend utilisable pour superviser plusieurs VPS depuis un seul Grafana.
ID 893 — cAdvisor : métriques par conteneur Docker — CPU throttling, usage mémoire, I/O et erreurs réseau. Utile pour détecter un conteneur qui consomme anormalement sans ralentir le VPS dans son ensemble.
Pour importer un dashboard : dans Grafana, allez dans Dashboards → Import, entrez l'ID, sélectionnez votre source de données Prometheus et validez. Le dashboard est importé en quelques secondes, sans rien construire à la main.
Configurer les alertes avec Alertmanager
Alertmanager est le composant qui reçoit les alertes de Prometheus et décide quoi en faire : les regrouper, les silencer pendant une maintenance, les router vers différents canaux selon la sévérité.
Regroupement : plusieurs alertes déclenchées au même moment (panne réseau → CPU haut + disque inaccessible + service down) sont regroupées en une seule notification, pas trois e-mails séparés. C'est le champ group_by: ['alertname', 'instance'] dans alertmanager.yml.
Silences : avant une maintenance planifiée, créez un silence dans l'interface Alertmanager (http://localhost:9093) ou via l'API : amtool silence add --duration=2h alertname=~'.*'. Les alertes continuent d'être évaluées par Prometheus mais ne sont pas envoyées pendant la fenêtre.
Routage multi-canaux : les alertes critiques (CPU > 95%) vont vers PagerDuty ou Slack avec mention @channel, les avertissements (CPU > 85%) vers un canal de surveillance moins urgent. Configurez cela avec routes imbriqués et match_re dans alertmanager.yml.
Après chaque modification de alertmanager.yml, rechargez sans redémarrage : curl -X POST http://localhost:9093/-/reload.
Prometheus vs InfluxDB vs Zabbix : lequel choisir ?
Faites défiler le tableau
| Critère | Prometheus | InfluxDB | Zabbix |
|---|---|---|---|
| Modèle de collecte | Pull (scrape actif) | Push (agents ou API) | Agent + SNMP + JMX |
| Stockage | TSDB embarqué, efficace sur VPS | InfluxDB OSS ou Cloud | PostgreSQL / MySQL, lourd |
| Langage de requête | PromQL (puissant, courbe raide) | Flux / InfluxQL (syntaxe SQL-like) | Macros Zabbix (limité) |
| Alerting | Alertmanager dédié, flexible | Intégré (OSS limité) | Intégré, riche mais complexe |
| Courbe d'apprentissage | Modérée (PromQL) | Faible (SQL-like) | Élevée (UI dense, agents) |
| Cas d'usage idéal | Infra conteneurisée, applis instrumentées | IoT, séries à haute fréquence | Réseaux d'entreprise, SNMP |
Durcissement : ne jamais exposer Prometheus publiquement
Prometheus n'a pas de système d'authentification natif. Son interface web expose la liste de toutes vos cibles, vos labels d'infrastructure et vos règles d'alerte — des informations précieuses pour un attaquant qui cartographie votre infra.
Trois règles non négociables :
1. Lier Prometheus sur 127.0.0.1:9090 uniquement (--web.listen-address=127.0.0.1:9090 dans le Compose).
2. Bloquer les ports 9090, 9093, 9100 et 8080 au pare-feu (ufw deny 9090).
3. Protéger Grafana avec un mot de passe fort et désactiver le compte anonyme (GF_AUTH_ANONYMOUS_ENABLED=false en variable d'environnement).
Si vous devez accéder à l'interface Prometheus depuis l'extérieur pour le débogage, utilisez un tunnel SSH (ssh -L 9090:localhost:9090 [email protected]) plutôt qu'un reverse proxy public.
Ajouter la surveillance des conteneurs Docker avec cAdvisor
cAdvisor (Container Advisor) expose les métriques de chaque conteneur Docker au format Prometheus : usage CPU en proportion du quota alloué, consommation mémoire avec et sans cache, I/O réseau et disque, et redémarrages.
Dans le docker-compose.yml, ajoutez le service :
cadvisor:
image: gcr.io/cadvisor/cadvisor:latest
volumes:
- /:/rootfs:ro
- /var/run:/var/run:ro
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
ports:
- '127.0.0.1:8080:8080'
restart: unless-stoppedPuis ajoutez le job correspondant dans prometheus.yml. Le dashboard Grafana ID 893 (cAdvisor) affiche alors une vue par conteneur, avec un filtre sur le nom du service Docker — utile pour comparer la consommation entre vos applications et détecter les fuites mémoire.
Dépannage : les erreurs les plus fréquentes
Target DOWN dans Prometheus (/targets) : vérifiez d'abord le nom du service dans docker-compose.yml — Prometheus résout les noms par DNS Docker interne. Si le service s'appelle node-exporter dans le Compose, l'URL de scrape doit être node-exporter:9100, pas localhost:9100. Vérifiez aussi que tous les services sont sur le même réseau Docker (networks: monitoring).
Dashboards vides après import : la cause la plus fréquente est un job de scrape dont le label ne correspond pas à celui attendu par le dashboard. Le Node Exporter Full (ID 1860) s'attend à un job nommé node — si vous l'avez nommé node_exporter dans prometheus.yml, filtrez manuellement dans les variables du dashboard ou renommez le job.
Alertmanager ne reçoit pas les alertes : vérifiez que Prometheus peut joindre Alertmanager. Dans prometheus.yml, la section alerting doit pointer vers alertmanager:9093 (nom de service Docker). Testez avec curl http://alertmanager:9093/-/healthy depuis le conteneur Prometheus : docker compose exec prometheus curl http://alertmanager:9093/-/healthy.
Erreur « context deadline exceeded » au rechargement : Prometheus met plus de 30 s à recharger si les règles sont nombreuses ou si un target est lent. Augmentez le timeout de scrape dans prometheus.yml : scrape_timeout: 20s sous global.
Pour aller plus loin
Cette stack couvre l'essentiel du monitoring d'un VPS. Pour des besoins plus avancés :
Rétention longue durée : Prometheus stocke les données localement, idéal pour 30 à 90 jours. Pour un historique de 1 à 2 ans sans saturer le disque, branchez Thanos (objet-store S3-compatible) ou VictoriaMetrics en remplacement drop-in du stockage. VictoriaMetrics est particulièrement adapté aux VPS modestes : il consomme 5 à 10× moins de mémoire que Prometheus pour le même volume de séries.
Surveillance des endpoints HTTP : ajoutez Blackbox Exporter au Compose pour tester la disponibilité de vos URLs, le code HTTP retourné, la latence et la date d'expiration du certificat TLS — sans instrumenter l'application.
Logs avec Loki : si vous voulez corréler les métriques avec les logs applicatifs (erreurs Nginx, exceptions PHP…), ajoutez Loki + Promtail au Compose. Grafana affiche métriques et logs dans le même panneau, ce qui réduit le temps de diagnostic.
Pour toutes les options de configuration avancées, référez-vous à la documentation officielle de Grafana et à la documentation Prometheus. ServOrbit propose un template Docker préconfigurés pour lancer cette stack en un clic sur un VPS Cloud — Grafana, Prometheus, Node Exporter et Alertmanager montés et prêts, sans configuration initiale.