Monitoring self-hosted : construire une stack avec des outils open-source

Guide étape par étape pour déployer une stack de monitoring : Prometheus, Grafana, Loki, Node Exporter et Uptime Kuma.

Surveiller ses serveurs, ses services et ses sites est indispensable. Mais payer Datadog 15 $ par hôte et par mois — c’est douloureux, surtout quand vous avez cinq VPS et une dizaine d’applications self-hosted. Bonne nouvelle : une stack de monitoring open-source se met en place en une heure et couvre 90 % des besoins d’un projet moyen.

Dans ce guide, nous allons assembler la stack : Prometheus (métriques), Grafana (tableaux de bord), Loki (logs), Node Exporter (métriques système), Uptime Kuma (statut des sites). Le tout en Docker Compose, avec persistance et alertes.

Étape 1 : Docker Compose

Créez un répertoire monitoring et un fichier docker-compose.yml :

version: "3.8"
services:
  prometheus:
    image: prom/prometheus:latest
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
      - prometheus_data:/prometheus
    command:
      - "--config.file=/etc/prometheus/prometheus.yml"
      - "--storage.tsdb.path=/prometheus"
      - "--storage.tsdb.retention.time=30d"
    ports:
      - "9090:9090"
    restart: unless-stopped

  node-exporter:
    image: prom/node-exporter:latest
    volumes:
      - /proc:/host/proc:ro
      - /sys:/host/sys:ro
      - /:/rootfs:ro
    command:
      - "--path.procfs=/host/proc"
      - "--path.sysfs=/host/sys"
      - "--path.rootfs=/rootfs"
    ports:
      - "9100:9100"
    restart: unless-stopped

  grafana:
    image: grafana/grafana:latest
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=changeme
    volumes:
      - grafana_data:/var/lib/grafana
    ports:
      - "3000:3000"
    restart: unless-stopped

volumes:
  prometheus_data:
  grafana_data:

Étape 2 : Prometheus — collecte des métriques

Créez prometheus.yml :

global:
  scrape_interval: 15s

scrape_configs:
  - job_name: "node"
    static_configs:
      - targets: ["node-exporter:9100"]

  - job_name: "prometheus"
    static_configs:
      - targets: ["localhost:9090"]

Node Exporter collecte CPU, RAM, disque, réseau — tout ce qui est système. Pour surveiller plusieurs serveurs, lancez Node Exporter sur chacun d’eux et ajoutez leurs IP dans targets.

Étape 3 : Grafana — visualisation

Rendez-vous sur http://votre-serveur:3000 (identifiant : admin, mot de passe : changeme). Ajoutez Prometheus comme source de données (URL http://prometheus:9090).

Importez le tableau de bord 1860 (Node Exporter Full) — c’est le template le plus populaire pour les métriques système. Après l’importation, vous verrez de beaux graphiques.

Étape 4 : Loki — logs

Ajoutez Loki et Promtail dans docker-compose.yml :

  loki:
    image: grafana/loki:latest
    volumes:
      - loki_data:/loki
    ports:
      - "3100:3100"
    command: -config.file=/etc/loki/local-config.yaml
    restart: unless-stopped

  promtail:
    image: grafana/promtail:latest
    volumes:
      - /var/log:/var/log:ro
      - /var/lib/docker/containers:/var/lib/docker/containers:ro
      - ./promtail.yml:/etc/promtail/config.yml
    command: -config.file=/etc/promtail/config.yml
    restart: unless-stopped

Dans Grafana, ajoutez Loki comme source de données et utilisez Explore pour rechercher dans les logs. Tous les logs de conteneurs et les logs système — en un seul endroit, avec recherche et filtrage.

Étape 5 : Uptime Kuma — statut des sites

Pour surveiller la disponibilité des sites et des API, lancez Uptime Kuma dans un conteneur séparé :

  uptime-kuma:
    image: louislam/uptime-kuma:latest
    volumes:
      - uptime_kuma_data:/app/data
    ports:
      - "3001:3001"
    restart: unless-stopped

Uptime Kuma peut pinger, vérifier les statuts HTTP, les certificats SSL, les ports TCP, les enregistrements DNS. Configurez les notifications vers Telegram, Discord ou Email.

Étape 6 : Alertes

Prometheus prend en charge Alertmanager pour les notifications. Configuration minimale — une règle dans prometheus.yml :

rule_files:
  - "alert.rules.yml"

Et dans alert.rules.yml :

groups:
  - name: node
    rules:
      - alert: HighCPU
        expr: 100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "CPU supérieur à 80% sur {{ $labels.instance }}"

Alertmanager peut être connecté à Telegram, Email, Slack.

Combien ça coûte en ressources

Toute la stack sur un VPS avec 2 Go de RAM :

  • Prometheus : ~200 Mo de RAM + disque pour les données (selon la rétention)
  • Grafana : ~150 Mo de RAM
  • Loki : ~200 Mo de RAM
  • Node Exporter : ~50 Mo de RAM
  • Promtail : ~100 Mo de RAM
  • Uptime Kuma : ~100 Mo de RAM

Total : environ 800 Mo de RAM pour une stack de monitoring complète. Les 1,2 Go restants suffiront pour vos applications.

Et ensuite

Avec cette stack, vous obtenez :

  • Métriques de tous les serveurs en temps réel
  • Logs centralisés avec recherche
  • De beaux tableaux de bord dans Grafana
  • Des alertes en cas de problème
  • Surveillance de la disponibilité des sites

Quand le projet grandira, vous pourrez ajouter : cAdvisor (métriques de conteneurs), Blackbox Exporter (vérifications HTTP/DNS/TCP), Grafana Tempo (tracing).

Fini les 15 $ par hôte. Seulement vos données sur votre serveur.

Site officiel de Prometheus | Site officiel de Grafana | Uptime Kuma sur GitHub