📚 À lire en complément : notre guide pilier self-hosting pour PME africaines 2026 qui couvre le choix du VPS, Coolify, la sécurité serveur, le monitoring Grafana/Loki et les coûts réels en F CFA.
L’observabilité en 2026 (informations vérifiées en avril 2026, susceptibles d’évoluer) — voir ce qui se passe vraiment dans votre infrastructure et applications — est devenue une compétence essentielle. La stack Grafana + Loki + Prometheus est l’option open-source de référence : Loki pour les logs (économique grâce au design « log indexer free »), Prometheus pour les métriques, Grafana pour visualiser tout. Voici le guide pratique pour PME africaines.
Ce guide général couvre tout. Les articles connexes détaillent : installer Grafana + Loki sur Coolify, collecter logs avec Promtail, Prometheus et node-exporter pour métriques VPS, alertes Grafana vers Discord/Slack.
Pourquoi cette stack en 2026
- Open-source AGPLv3 (Grafana, Loki) — gratuit illimité
- Loki : indexe les labels uniquement (pas le full text), 10x moins de stockage qu’Elasticsearch
- Prometheus : standard de fait pour métriques pull-based
- Grafana : best-in-class pour dashboards
- Self-hosted : données chez vous
- Alertes natives : email, Slack, Discord, PagerDuty
Architecture type
- Promtail sur chaque VPS : collecte les logs systemd, Docker, fichiers
- node-exporter sur chaque VPS : expose métriques système
- cAdvisor : métriques par conteneur Docker
- Loki central : reçoit les logs
- Prometheus central : scrape les exporters
- Grafana : interface de query et dashboards
Cas d’usage
- Voir tous les logs Caddy / nginx / app dans une UI unique
- Recherche full-text par label (pod, app, host, level)
- Dashboard CPU/RAM/disk de tous les VPS sur une page
- Alerte si CPU > 80 % pendant 5 min
- Alerte si app retourne 500 errors
- Audit logs centralisés pour conformité
Stack via Docker Compose
# compose.yml minimal
services:
loki:
image: grafana/loki:3
ports: ["127.0.0.1:3100:3100"]
volumes:
- ./loki-config.yaml:/etc/loki/local-config.yaml
- loki-data:/loki
command: -config.file=/etc/loki/local-config.yaml
prometheus:
image: prom/prometheus:latest
ports: ["127.0.0.1:9090:9090"]
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- prom-data:/prometheus
command: --config.file=/etc/prometheus/prometheus.yml
grafana:
image: grafana/grafana:latest
ports: ["127.0.0.1:3000:3000"]
environment:
GF_SECURITY_ADMIN_PASSWORD: SECRET
volumes:
- grafana-data:/var/lib/grafana
volumes:
loki-data:
prom-data:
grafana-data:
Premier dashboard
- Grafana → Data Sources → Add Loki (URL
http://loki:3100) - Add Prometheus (URL
http://prometheus:9090) - Dashboards → Import → 1860 (Node Exporter Full) ou 893 (Docker)
- Sélectionner data source → Import
Adaptation Afrique de l’Ouest
Pour PME africaine de 5-10 VPS, un seul VPS Hetzner CX33 (8 €/mois) héberge Loki + Prometheus + Grafana confortablement. Coût total observabilité : ~10 €/mois pour visibilité complète. Bien moins qu’un Datadog ou New Relic à 50-200 USD/mois.
Sur le même thème
- Installer Grafana Loki Coolify
- Promtail logs
- Prometheus VPS
- Alertes Grafana
- Documentation : grafana.com/docs
À lire aussi : remplacer Prometheus par VictoriaMetrics.
Etape 1 : pourquoi assembler Grafana, Loki et Prometheus en 2026
Cette stack open-source LGTM allegee couvre les trois piliers de l’observabilite moderne : metriques numeriques avec Prometheus 2.55, journaux structures avec Loki 3.3 et visualisation unifiee avec Grafana 11.4. A Dakar ou Abidjan, elle remplace Datadog (15 USD / host / mois soit environ 9850 FCFA) par un combo auto-heberge a moins de 5000 FCFA par VPS.
Le secret de Loki : il indexe uniquement les labels (job, level, instance) et stocke les lignes brutes compressees. Resultat : 10 fois moins cher qu’Elasticsearch pour le meme volume de logs et requetes LogQL similaires a PromQL pour la coherence cognitive.
Etape 2 : provisionner le VPS et installer Docker Compose v2
Un Hetzner CCX13 (4 vCPU, 8 Go RAM, 13,10 EUR HT soit environ 8590 FCFA) tient 50 cibles Prometheus et 5 Go de logs Loki par jour. Installe Docker Engine 27 et Compose v2 en une commande.
curl -fsSL https://get.docker.com | sh && sudo usermod -aG docker $USER
Deconnecte-toi puis verifie avec docker compose version. Tu dois voir Docker Compose version v2.32 ou plus. Cree ensuite un dossier /opt/observability avec sous-dossiers prometheus, loki, grafana et alertmanager pour les volumes persistants.
Etape 3 : ecrire le docker-compose.yml LGTM minimal
Le fichier ci-dessous orchestre Prometheus, Loki, Promtail (collecteur de logs), Grafana et Alertmanager. Les ports sont fermes sauf 3000 pour Grafana, expose derriere Caddy ou Traefik avec TLS Let’s Encrypt.
services:
prometheus:
image: prom/prometheus:v2.55.0
volumes: ["./prometheus:/etc/prometheus", "prom_data:/prometheus"]
command: --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.retention.time=30d
loki:
image: grafana/loki:3.3.0
volumes: ["./loki:/etc/loki", "loki_data:/loki"]
command: -config.file=/etc/loki/loki.yml
promtail:
image: grafana/promtail:3.3.0
volumes: ["/var/log:/var/log:ro", "./promtail:/etc/promtail"]
grafana:
image: grafana/grafana:11.4.0
ports: ["3000:3000"]
volumes: ["graf_data:/var/lib/grafana"]
volumes: { prom_data:, loki_data:, graf_data: }
Lance docker compose up -d. Le signal de reussite : docker compose ps affiche cinq services en etat running et Grafana repond sur http://IP:3000 avec admin / admin.
Etape 4 : configurer prometheus.yml et scrute le node_exporter
Cree prometheus/prometheus.yml avec deux jobs : prometheus lui-meme et un node_exporter sur chaque hote a monitorer. Pour Dakar, ajoute aussi le routeur Mikrotik via le snmp_exporter.
global: { scrape_interval: 15s }
scrape_configs:
- job_name: prometheus
static_configs: [{ targets: ["localhost:9090"] }]
- job_name: node
static_configs: [{ targets: ["10.0.0.5:9100", "10.0.0.6:9100"] }]
Recharge Prometheus avec docker compose kill -s SIGHUP prometheus. Va sur http://IP:9090/targets : les deux jobs doivent etre UP en vert. Si un node est DOWN, verifie d’abord le firewall ufw allow from PROM_IP to any port 9100.
Etape 5 : configurer Loki en mode monolithic et envoyer les logs nginx
Loki 3.3 propose un fichier de config minimal en mode all-in-one : ingester, distributor et querier dans le meme binaire. Adapte pour 5 Go / jour, conservation 14 jours, stockage filesystem.
auth_enabled: false
server: { http_listen_port: 3100 }
common: { path_prefix: /loki, replication_factor: 1, ring: { kvstore: { store: inmemory } } }
schema_config: { configs: [{ from: 2026-01-01, store: tsdb, object_store: filesystem, schema: v13 }] }
limits_config: { retention_period: 336h }
Cote Promtail, ajoute un job qui suit /var/log/nginx/access.log avec un parser regex pour extraire status, method et path comme labels. Recharge et verifie dans Grafana > Explore > Loki la requete {job= »nginx »} | json. Tu dois voir tes logs en temps reel.
Etape 6 : creer trois dashboards Grafana indispensables
Importe les dashboards officiels par leur ID : 1860 (Node Exporter Full), 13639 (Logs Dashboard pour Loki), 12559 (Cadvisor Docker). Va sur Grafana > Dashboards > New > Import et colle l’ID. Selectionne ta source de donnees Prometheus ou Loki au prompt.
Le signal de reussite : le dashboard 1860 affiche le CPU, la RAM, le reseau et le disque de tous tes nodes en moins de 5 secondes. Si certains panels sont vides, c’est probablement un label job mal nomme dans prometheus.yml.
Etape 7 : alerter sur Slack via Alertmanager avec des regles realistes
Cree prometheus/rules.yml avec trois regles critiques : CPU > 90 % pendant 5 min, disk full > 85 %, et instance down > 2 min. Alertmanager route vers un webhook Slack ou Discord avec deduplication 4 heures pour eviter le spam.
groups:
- name: critical
rules:
- alert: HighCPU
expr: 100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 90
for: 5m
labels: { severity: critical }
Test : stress –cpu 4 –timeout 360 sur un node. Au bout de 5 minutes, ton canal Slack #alertes doit recevoir un message rouge avec le nom de l’instance. Confirme aussi la resolution automatique apres la fin du stress.
Etape 8 : retention longue duree avec Mimir et S3-compatible Minio
Pour conserver les metriques 1 an au lieu de 30 jours, branche Grafana Mimir 2.14 derriere Prometheus en remote_write. Mimir stocke les blocks TSDB sur Minio (S3 auto-heberge) ou Backblaze B2. A 1000 series actives, le cout disque est d’environ 200 Mo / mois, soit 1 FCFA / mois sur B2.
Pour approfondir : construire un SOC avec SIEM open-source et analytique privacy avec Umami sur Coolify.
Etape 9 : instrumenter une application Node.js avec prom-client
Les metriques systeme ne suffisent pas : il faut aussi mesurer le metier. Pour une API Node.js Express, ajoute le package prom-client (version 15.1) et expose un endpoint /metrics que Prometheus scrappera toutes les 15 secondes. Tu obtiens des histogrammes de latence par route et par status code.
const client = require('prom-client');
const register = new client.Registry();
client.collectDefaultMetrics({ register });
const httpDuration = new client.Histogram({
name: 'http_request_duration_seconds',
labelNames: ['method', 'route', 'code'],
buckets: [0.05, 0.1, 0.3, 0.5, 1, 2, 5]
});
register.registerMetric(httpDuration);
Le signal de reussite : curl http://localhost:3001/metrics retourne plusieurs centaines de lignes au format text/plain dont http_request_duration_seconds_bucket. Importe ensuite le dashboard 11159 dans Grafana pour visualiser p50, p95 et p99 par endpoint.
Etape 10 : tracer les requetes distribuees avec Tempo et OpenTelemetry
Pour completer le triangle metriques + logs + traces, ajoute Grafana Tempo 2.6 a la stack. Tempo stocke les traces OpenTelemetry au meme endroit que Loki et permet le saut direct d’un log vers la trace correspondante via le trace_id. Configure le SDK OTel dans ton appli pour exporter en OTLP gRPC vers tempo:4317.
Active le Service Graph dans Grafana pour visualiser automatiquement les dependances entre microservices, leur latence et leur taux d’erreur. Pour une stack a Dakar avec frontend, API et Postgres, tu detectes en quelques minutes une N+1 query qui ralentit ton checkout.
Etape 11 : alimenter un panneau de cout cloud en USD et FCFA
Cree un dashboard Cloud Cost qui multiplie les metriques d’usage par les tarifs Hetzner et S3. Une variable Grafana $rate_eur_xof = 655.957 convertit a la volee EUR vers FCFA. Tu obtiens un panel « Cout VPS aujourd’hui » qui affiche par exemple 156 FCFA et alerte si le cumul mensuel depasse 5000 FCFA.
sum(rate(node_cpu_seconds_total[1h])) * on() group_left scalar(vps_eur_per_hour) * 655.957
Cette astuce te permet de presenter ta facture cloud en monnaie locale a un comptable a Abidjan ou Lome sans tableur Excel manuel. Les ecarts de change sont negligeables sur un mois si tu mets a jour le scalaire chaque trimestre.
Etape 12 : sauvegarder Grafana en Git via Grizzly
Grafana stocke ses dashboards en SQLite par defaut. Une perte de VPS = perte de tes dashboards si tu n’as pas de backup. Grizzly est un outil officiel Grafana qui exporte tous les dashboards et datasources en YAML versionable dans Git. Lance grr pull -d ./dashboards puis git commit chaque vendredi.
Le signal de reussite : ton repo git contient un fichier YAML par dashboard, l’historique git montre qui a modifie quel panel et quand. En cas de migration ou de crash, grr push restaure tout en moins de 30 secondes sur une nouvelle instance Grafana.
Etape 13 : dimensionner et budgeter la stack pour 200 hosts
Pour 200 cibles Prometheus avec 200 series par cible (40 000 series actives), Prometheus consomme environ 4 Go de RAM et 30 Go de disque sur 30 jours de retention. Pour Loki avec 20 Go de logs par jour et 14 jours de retention, prevois 300 Go de disque et 4 Go de RAM. Total VPS Hetzner CCX23 (8 vCPU, 16 Go, 320 Go SSD) a 25,90 EUR HT soit environ 17 000 FCFA mensuels.
Compare avec Datadog : 200 hosts a 18 USD soit environ 2 360 000 FCFA mensuels. La stack auto-hebergee divise la facture par 138. Le retour sur investissement de la mise en place (8 a 12 heures de travail) est immediat des le premier mois pour toute organisation a partir de 5 hosts.
Etape 14 : checklist de production avant mise en ligne
Avant d’ouvrir Grafana au monde, valide ces sept points : TLS Let’s Encrypt actif sur le port 443, mot de passe admin Grafana change et 2FA active, Alertmanager teste avec une regle artificielle, backup Grizzly hebdomadaire en cron, retention Prometheus a 30 jours minimum, retention Loki a 14 jours, et un dashboard « Stack health » qui surveille la stack elle-meme. Si un seul point manque, n’ouvre pas l’acces externe.
Etape 15 : industrialiser la stack avec Ansible et IaC
Une stack LGTM deployee a la main est fragile : un docker compose pull rate, un fichier YAML edite a chaud sans commit, et la prochaine restauration prendra des heures. Ecris un role Ansible observability qui copie prometheus.yml, loki.yml, promtail.yml et le docker-compose.yml depuis Git, lance docker compose up -d et verifie le code retour HTTP 200 sur chaque service. Tu redeploies une stack identique sur un nouveau VPS Hetzner ou Contabo en moins de 8 minutes, sans regression.
Versionne aussi les regles d’alerte sous prometheus/rules.yml dans le meme repo. Une pull request qui ajoute une regle « API 5xx > 1 % sur 10 min » passe en revue par un pair, est mergee, puis Ansible recharge automatiquement Prometheus avec un kill -SIGHUP. Cette boucle GitOps elimine 90 % des erreurs humaines en production.
Etape 16 : federation multi-region pour Dakar et Abidjan
Pour une societe avec un site a Dakar et un autre a Abidjan, la latence transatlantique vers Hetzner Falkenstein peut depasser 180 ms. Deploie un Prometheus local par region qui scrape les cibles proches, puis un Prometheus central qui federe via /federate uniquement les series agregees critiques (job:up, http_requests_total). Le Prometheus central reste a Falkenstein, expose le dashboard Grafana et envoie les alertes Slack avec moins de 5 % du trafic.
Le signal de reussite : la requete count(up) dans le Prometheus central renvoie la somme des cibles des deux regions, et la latence p95 des graphes Grafana reste sous 1 seconde meme depuis Cotonou. Cette architecture federee remplace avantageusement Datadog multi-region a une fraction du prix.