Pour une PME ouest-africaine qui héberge plusieurs services sur un même VPS, la centralisation des logs applicatifs devient indispensable dès la deuxième application. Sans logs centralisés, le diagnostic d’un incident à 3h du matin se transforme en chasse au trésor sur trois conteneurs Docker. Grafana Loki résout ce problème : c’est le moteur de logs léger conçu par Grafana Labs pour stocker, indexer et requêter des millions de lignes de logs avec un coût d’infrastructure très faible. Couplé à Grafana pour la visualisation et l’alerting, et déployé via Coolify pour simplifier l’exploitation, le combo offre une stack d’observabilité production-grade en moins d’une heure d’installation.
Le parcours suppose une instance Coolify v4 fonctionnelle sur un VPS Hetzner ou Contabo. À la fin, vous disposez de Grafana et Loki tournant en conteneurs séparés, avec Loki exposé en interne sur le réseau Docker, Grafana exposé en HTTPS public via Traefik, et un premier dashboard de logs configuré. Toutes les commandes ont été vérifiées sur la documentation officielle grafana.com/docs/loki/latest/.
📍 Guide associé : ClickHouse + Grafana dashboards — pour intégrer Grafana avec une stack analytique ClickHouse en parallèle de Loki.
Pourquoi Loki plutôt qu’Elasticsearch pour les logs PME
Elasticsearch reste le standard historique pour la recherche full-text dans les logs, mais sa consommation mémoire élevée et la complexité d’opération du cluster en font un choix discutable pour une PME. Loki adopte une approche radicalement différente : il n’indexe pas le contenu des logs (seulement les labels associés), ce qui réduit la consommation mémoire d’un facteur 10 à 20 et le coût de stockage d’un facteur 5 à 10. La contrepartie est une recherche full-text plus lente, mais sur des cas d’usage PME (5 à 20 services qui produisent quelques millions de lignes par jour), la différence n’est pas perceptible.
Le second avantage de Loki tient à son intégration native avec Grafana et Prometheus. Les labels Loki utilisent la même syntaxe que Prometheus, ce qui permet de corréler logs et métriques sur les mêmes sélecteurs (par exemple {app="api", env="production"}). Pour la corrélation logs-métriques-traces avancée, le tutoriel sur la corrélation Grafana détaille les patterns de référence.
Prérequis avant de commencer
- Un VPS Linux récent (Debian 12 ou Ubuntu 24.04 LTS) avec 4 vCPU et 8 Go de RAM minimum. Hetzner CX32 (≈ 6,80 EUR/mois, environ 4 500 FCFA) suffit pour 5-20 services.
- Coolify v4 installé et accessible via son interface web HTTPS.
- Un nom de domaine pointant vers l’IP publique du VPS, avec deux sous-domaines dédiés (
grafana.exemple.com, et optionnellementloki.exemple.comsi vous voulez exposer Loki en push API externe). - Au moins une application déjà déployée sur le serveur dont les logs Docker sont disponibles via le démon Docker.
- Accès SSH avec clé Ed25519 et pare-feu
ufwactivé avec ports 80, 443 ouverts.
Si Coolify n’est pas encore en place, suivre la procédure d’installation détaillée dans le tutoriel d’installation ClickHouse sur Coolify qui couvre la même mécanique de prérequis VPS, DNS et certificat TLS automatique.
Étape 1 — Déployer Loki via Coolify
Coolify v4 inclut Loki dans son catalogue de services. La création se fait via le formulaire structuré, ce qui évite la configuration manuelle d’un docker-compose.yml. Loki tournera en mode mono-binaire (single-binary mode) avec stockage local sur volume Docker — suffisant pour 50 Go de logs avec rétention 30 jours, soit largement assez pour une PME.
Dans le projet observability-prod → environnement production, cliquez + New Resource → Service, cherchez Loki dans la liste et sélectionnez. Nommez l’instance loki-main. Acceptez les valeurs par défaut pour le volume persistant (/loki dans le conteneur, monté sur un volume Docker nommé). La configuration local-config.yaml sera générée automatiquement avec les valeurs sensées par défaut. Cliquez Deploy.
Coolify télécharge l’image officielle grafana/loki:latest depuis Docker Hub et démarre le conteneur. La phase de bootstrap dure 30 à 60 secondes le temps que Loki initialise son stockage local et expose le port 3100. Inspectez les logs Docker dans l’onglet Logs pour vérifier les messages level=info component=server msg="server listening on addresses" qui confirment que Loki écoute correctement.
Étape 2 — Vérifier l’endpoint Loki en interne
Loki expose deux endpoints HTTP principaux : le port 3100 pour l’API d’ingestion (push) et de requêtes (query), et le port 9095 pour gRPC (interne au cluster Loki distribué, non utilisé en single-binary). Pour une PME, exposer Loki uniquement sur le réseau Docker interne et le requêter depuis Grafana via le DNS du conteneur est la configuration la plus sécurisée.
# Depuis le conteneur Coolify ou un autre service du même réseau Docker
curl http://loki-main:3100/ready
# Sortie attendue : "ready"
curl http://loki-main:3100/metrics | head -20
# Sortie attendue : métriques Prometheus de Loki (loki_request_duration_seconds, etc.)
Si /ready renvoie un 503, Loki n’a pas encore terminé son initialisation — patientez 30 secondes et retentez. Si /ready est introuvable, vérifiez que le conteneur tourne (Running dans Coolify) et que le réseau Docker entre les services est correctement configuré. Le DNS interne loki-main est résolu automatiquement par Docker au sein du même projet Coolify.
Étape 3 — Déployer Grafana via Coolify
Grafana s’installe également depuis le catalogue Coolify avec le service Grafana. Nommez l’instance grafana-main. Configurez les variables d’environnement essentielles dans la section Environment Variables :
GF_SECURITY_ADMIN_PASSWORD: mot de passe administrateur initial (long, généré aléatoirement)GF_USERS_ALLOW_SIGN_UP:falsepour interdire l’auto-inscriptionGF_AUTH_ANONYMOUS_ENABLED:falsepour exiger l’authentificationGF_SERVER_ROOT_URL:https://grafana.exemple.compour les liens externes correctsGF_INSTALL_PLUGINS: optionnel, par exemplegrafana-clickhouse-datasourcepour pré-installer le plugin ClickHouse
Cliquez Deploy. Grafana démarre en moins d’une minute, accessible en interne sur le port 3000. Avant d’activer la publication HTTPS via Traefik, vérifiez que la console est joignable depuis un autre conteneur du même réseau Docker avec curl http://grafana-main:3000/api/health — la réponse JSON doit contenir "database":"ok".
Étape 4 — Exposer Grafana en HTTPS via Traefik
Dans la fiche grafana-main → onglet Network, ajoutez le domaine grafana.exemple.com sur le port 3000. Cochez Generate SSL Certificate. Coolify met à jour la configuration Traefik en quelques secondes, génère le certificat Let’s Encrypt automatiquement et publie l’endpoint HTTPS. Vérifiez l’accès via le navigateur — la console Grafana doit s’afficher avec son écran de connexion.
Connectez-vous avec admin et le mot de passe défini via GF_SECURITY_ADMIN_PASSWORD. Grafana proposera de changer le mot de passe au premier login — acceptez. Désactivez immédiatement les inscriptions anonymes si elles étaient activées, et créez un compte utilisateur dédié pour chaque membre de votre équipe (Settings → Users → New user) plutôt que de partager le compte admin.
Étape 5 — Configurer Loki comme datasource dans Grafana
Grafana doit savoir où requêter Loki. Dans Connections → Data sources → Add data source, sélectionnez Loki. Configurez l’URL avec le DNS interne du conteneur Loki : http://loki-main:3100. Aucune authentification n’est nécessaire en réseau Docker interne — Loki ne demande pas de credentials par défaut. Cliquez Save & Test. Le message Data source is working confirme que Grafana joint Loki correctement.
Si vous obtenez une erreur de connexion, vérifiez que les deux conteneurs sont bien dans le même projet Coolify (et donc le même réseau Docker). Si Grafana et Loki sont dans des projets séparés, exposez Loki via Traefik sur un sous-domaine privé avec basic auth, ou créez un réseau Docker partagé manuellement.
Étape 6 — Envoyer les logs Docker vers Loki
Reste à brancher les logs des autres conteneurs vers Loki. Trois patterns fonctionnent. Premier pattern : utiliser le driver Docker logging loki qui pousse directement chaque log container vers Loki au format attendu. Deuxième pattern : déployer Promtail, l’agent officiel Grafana Labs qui scrape les fichiers de log Docker (/var/lib/docker/containers/*/*.log) et les pousse vers Loki avec des labels enrichis. Troisième pattern : utiliser Grafana Alloy, le successeur unifié de Promtail (collecte logs, métriques et traces dans un seul agent).
Pour démarrer rapidement avec un effort minimal, le pattern Promtail reste le plus documenté. Coolify v4 inclut Promtail dans son catalogue : ajoutez le service, configurez la connexion à http://loki-main:3100/loki/api/v1/push, montez le volume Docker socket pour que Promtail détecte les conteneurs automatiquement. En 5 minutes, tous les logs des conteneurs Docker du serveur arrivent dans Loki avec les labels {container="grafana-main", service="observability-prod"}.
Étape 7 — Créer un premier dashboard de logs
Dans Grafana → Explore, sélectionnez la datasource Loki, puis exécutez votre première requête LogQL. Par exemple {container="grafana-main"} renvoie tous les logs du conteneur Grafana. {container=~".+"} |= "error" renvoie tous les logs contenant le mot « error » sur tous les conteneurs. La syntaxe LogQL est expressive et documentée dans grafana.com/docs/loki/latest/query/.
Pour créer un dashboard permanent, allez dans Dashboards → New → Add visualization, sélectionnez Loki, et configurez vos requêtes LogQL préférées. Un panel « Erreurs des dernières 24h » avec sum(count_over_time({container=~".+"} |= "error" [24h])) donne un coup d’œil rapide sur la santé des services. Sauvegardez le dashboard et partagez le lien avec votre équipe d’astreinte.
Erreurs fréquentes en déploiement Grafana + Loki Coolify
| Symptôme | Cause probable | Correctif |
|---|---|---|
| Loki en boucle Restarting | Volume permission denied ou config invalide | Vérifier les permissions du volume /loki et la config YAML |
| Grafana datasource « no data » | Promtail non déployé ou push URL incorrecte | Vérifier que Promtail tourne et pousse vers loki-main:3100 |
| Logs Docker absents | Driver Docker logging non configuré | Activer Promtail avec montage du socket Docker |
| Disque saturé après 30 jours | Pas de rétention configurée sur Loki | Définir retention_period: 720h dans la config Loki |
| Latence Grafana > 10 s sur grosses requêtes LogQL | Pas de filtre par label ou range trop large | Toujours filtrer par label avant |= ou |~ |
Comprendre LogQL en cinq minutes
LogQL est le langage de requête de Loki, inspiré de PromQL mais adapté aux logs. La syntaxe tient en deux étapes : un sélecteur de logs basé sur les labels (entre accolades), puis des opérateurs de filtrage et d’agrégation. Maîtriser ces deux étapes couvre 95 % des besoins quotidiens d’une équipe d’astreinte.
Le sélecteur de base utilise des matchers de labels comme Prometheus : {container="api", env="production"} sélectionne tous les logs des conteneurs marqués avec ces deux labels. Les matchers acceptent l’égalité (=), la négation (!=), la regex (=~, !~). Une fois le flux sélectionné, on enchaîne avec des filtres sur le contenu : |= "error" (contient), != "healthcheck" (ne contient pas), |~ "5\d\d" (regex match). Pour une dashboard d’erreurs serveur, la requête type est {container=~"api.*"} |= "error" != "healthcheck".
Pour les agrégations, Loki propose des fonctions comme rate(), count_over_time(), sum by() qui transforment les logs en métriques exploitables dans des graphes. Par exemple sum by (container) (count_over_time({env="production"} |= "error" [5m])) compte les erreurs par conteneur sur les 5 dernières minutes — exactement ce qu’il faut pour un panel « Top contributeurs aux erreurs ».
Promtail vs Grafana Alloy en 2026
Grafana Labs a annoncé fin 2024 la convergence de Promtail vers Grafana Alloy, l’agent unifié qui gère logs, métriques et traces dans un même binaire. Promtail reste maintenu en parallèle pour les utilisateurs existants, mais les nouveaux déploiements en 2026 sont encouragés à démarrer directement sur Alloy pour bénéficier d’un seul agent à exploiter au lieu de trois (Promtail + node_exporter + une solution traces séparée).
Pour une PME qui démarre une stack d’observabilité from scratch en 2026, Alloy est le choix recommandé. Pour une équipe avec une infrastructure Promtail existante qui fonctionne, la migration vers Alloy peut attendre une refonte plus large — Promtail continuera de recevoir des correctifs de sécurité et de bugs jusqu’au moins 2026-2027.
Adaptation au contexte ouest-africain
Pour une PME basée à Dakar, Abidjan, Bamako ou Cotonou, le coût de la stack Grafana + Loki self-hosted tient sous 7 EUR par mois (environ 4 500 FCFA) sur Hetzner CX32. C’est l’équivalent de quelques cafés et la fonction d’observabilité que cela apporte vaut largement la dépense — un incident production diagnostiqué en 5 minutes plutôt qu’en 2 heures représente des dizaines de milliers de FCFA d’économie en astreinte développeur.
Côté souveraineté, héberger les logs sur un VPS Hetzner Falkenstein ou un datacenter africain (Africa Data Centres, Raxio Côte d’Ivoire ouvert en septembre 2024) plutôt que chez Datadog ou Grafana Cloud aux US simplifie les audits de conformité OHADA et locale. Pour la stack analytique en complément, voir le tutoriel ClickHouse + Grafana.
Dans la continuité
Cette stack mono-VPS couvre 80 % des besoins d’observabilité PME. Trois extensions naturelles selon les besoins : ajouter Prometheus pour les métriques système et applicatives en complément des logs ; ajouter Grafana Tempo pour les traces distribuées si votre architecture devient microservices ; ajouter une règle d’alerting dans Grafana qui notifie sur Slack ou WhatsApp en cas d’erreurs critiques détectées dans Loki.
Mots-clés associés : Grafana 12, Loki 3, Promtail, Coolify catalog, observabilité PME, logs centralisés, LogQL, Hetzner Cloud, OHADA souveraineté.