[{"data":1,"prerenderedAt":177},["ShallowReactive",2],{"seo-verification":3,"blog-loki-grafana-logs-centralises-vps-fr":6},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"id":7,"slug":8,"title":9,"excerpt":10,"readTime":11,"views":12,"isPinned":13,"publishedAt":14,"category":15,"categories":21,"featuredImage":23,"bgImage":24,"posterImage":25,"relatedSolution":26,"intro":29,"sections":30,"ctaTitle":138,"ctaBody":139,"ctaButton":140,"ctaUrl":141,"relatedPosts":142},243,"loki-grafana-logs-centralises-vps","Centraliser vos logs Docker sur VPS avec Loki et Grafana","Agrégez les logs de tous vos conteneurs Docker dans un seul tableau de bord Grafana grâce à Loki et Promtail sur votre VPS. Sans Datadog, sans quota.",10,0,false,"2026-08-10T00:00:00+00:00",{"id":16,"name":17,"slug":18,"color":19,"icon":20},8,"Sécurité & Monitoring","securite-monitoring","bg-rose-500\u002F10 text-rose-400","security",[22],{"id":16,"name":17,"slug":18,"color":19,"icon":20},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Floki-grafana-logs-centralises-vps-poster.svg",{"categorySlug":27,"appSlug":28},"monitoring","grafana","Passer de SSH en SSH pour lire les logs de chaque conteneur coûte du temps — celui qu'il faut pour localiser une erreur 502 qui s'est produite sur plusieurs services à la fois. Loki résout ce problème en centralisant tous vos flux de logs dans un seul tableau de bord Grafana, avec une consommation mémoire compatible avec un VPS standard, là où une stack ELK réclamerait un serveur dédié. Ce guide couvre le déploiement complet : Loki, Promtail, Grafana et la configuration post-install.",[31,35,47,50,81,84,87,90,98,101,135],{"type":32,"title":33,"body":34},"h2","Pourquoi centraliser vos logs sur un VPS plutôt que de rester en SSH","Quand une erreur touche plusieurs services simultanément — un timeout côté application, un 502 côté nginx, une exception dans un worker — aucun outil SSH ne permet de corréler ces événements sans les lire un par un. `docker compose logs -f app` puis `docker compose logs -f nginx` puis `docker compose logs -f worker` : c'est le diagnostic en série, sur un seul serveur. Sur deux VPS, la durée double. Sur trois, elle triple.\n\nLoki est un système d'agrégation de logs open source développé par Grafana Labs et référencé au catalogue CNCF. Contrairement à Elasticsearch, qui indexe l'intégralité du contenu de chaque ligne, Loki n'indexe que les **labels** — des métadonnées légères comme le nom du conteneur, le nom du service ou l'environnement. Les logs eux-mêmes sont compressés et stockés tels quels. Ce choix de conception a une conséquence directe : Loki tourne confortablement sur un VPS 2 Go de RAM, là où une stack ELK de base réclame au moins 8 à 16 Go pour rester stable. Pour un développeur ou un sysadmin qui gère plusieurs applications auto-hébergées sans budget APM enterprise, c'est la différence entre une solution faisable et une solution irréaliste.",{"type":36,"title":37,"items":38},"ul","Ce que cette stack apporte concrètement",[39,40,41,42,43,44,45,46],"**Recherche unifiée sur tous les conteneurs** — une seule requête LogQL couvre l'ensemble des services sur tous vos VPS, sans SSH ni `grep` distribué.","**Corrélation temporelle** — Grafana affiche Loki (logs) et Prometheus (métriques) sur le même axe de temps : vous voyez l'erreur 502 et le pic CPU qui l'a précédée en une seule vue.","**Aucun quota d'ingestion** — vous stockez autant de logs que votre disque le permet, sans abonnement ni limite mensuelle imposée par un tiers.","**Empreinte mémoire contenue** — Loki consomme nettement moins de RAM qu'Elasticsearch à volume de logs équivalent, grâce à l'indexation par labels uniquement.","**Rétention configurable** — définissez la durée de conservation par label (`chunk_retain_period`, `retention_period`) selon vos contraintes de disque et de conformité.","**Intégration native Grafana** — Loki est une source de données de première classe dans Grafana : pas de plugin tiers, pas d'API intermédiaire.","**Alertes sur le contenu des logs** — Grafana peut déclencher une alerte quand une expression régulière matche dans un flux Loki, sans passer par un service externe.","**Données hébergées sur votre infrastructure** — les logs restent sur votre VPS, sans transiter par un service cloud.",{"type":32,"title":48,"body":49},"Prérequis avant de déployer","La stack Loki + Promtail + Grafana est légère, mais elle a ses propres exigences. Voici ce qu'il vous faut avant de commencer.\n\n**Ressources VPS recommandées** : 2 vCPU et 2 Go de RAM constituent le minimum raisonnable pour un usage mono-serveur avec quelques dizaines de conteneurs actifs. Si vous collectez les logs de plusieurs VPS ou d'un grand nombre de services, visez 4 Go de RAM. Loki ne garde pas les logs en mémoire : il les compresse et les écrit sur disque, ce qui maintient l'empreinte mémoire stable dans le temps. Prévoyez 20 à 50 Go de stockage SSD selon votre volume de logs et votre durée de rétention.\n\n**Logiciels requis** : Docker et Docker Compose v2 installés sur le VPS, un sous-domaine dédié (`logs.votre-domaine.com`) pointant sur l'IP du VPS, et les ports 3100 (Loki) et 3000 (Grafana) accessibles en interne. Le port 3100 ne doit **pas** être exposé publiquement — Loki n'a pas de couche d'authentification native, seul Grafana est exposé via reverse proxy.",{"type":51,"title":52,"steps":53},"steps","Déploiement étape par étape",[54,57,60,63,66,69,72,75,78],{"title":55,"body":56},"Créer la structure de répertoires","Connectez-vous à votre VPS et créez un répertoire dédié : `mkdir -p \u002Fopt\u002Floki-stack\u002F{loki,promtail} && cd \u002Fopt\u002Floki-stack`. Ce dossier accueillera les fichiers de configuration de Loki et de Promtail ainsi que le `docker-compose.yml`.",{"title":58,"body":59},"Écrire la configuration Loki","Créez `\u002Fopt\u002Floki-stack\u002Floki\u002Floki-config.yaml` avec le contenu suivant :\n\n`auth_enabled: false` — désactive l'authentification multi-tenant, suffisant pour un usage mono-VPS.\n\n`server: { http_listen_port: 3100 }`\n\n`ingester: { lifecycler: { address: 127.0.0.1, ring: { kvstore: { store: inmemory }, replication_factor: 1 } }, chunk_idle_period: 5m, chunk_retain_period: 30s }`\n\n`schema_config: { configs: [ { from: 2020-10-24, store: boltdb-shipper, object_store: filesystem, schema: v11, index: { prefix: index_, period: 24h } } ] }`\n\n`storage_config: { boltdb_shipper: { active_index_directory: \u002Floki\u002Fboltdb-shipper-active, cache_location: \u002Floki\u002Fboltdb-shipper-cache, shared_store: filesystem }, filesystem: { directory: \u002Floki\u002Fchunks } }`\n\n`limits_config: { retention_period: 720h }`",{"title":61,"body":62},"Écrire la configuration Promtail","Créez `\u002Fopt\u002Floki-stack\u002Fpromtail\u002Fpromtail-config.yaml`. Promtail est l'agent qui collecte les logs des conteneurs Docker et les pousse vers Loki :\n\n`server: { http_listen_port: 9080, grpc_listen_port: 0 }`\n\n`positions: { filename: \u002Ftmp\u002Fpositions.yaml }`\n\n`clients: [ { url: http:\u002F\u002Floki:3100\u002Floki\u002Fapi\u002Fv1\u002Fpush } ]`\n\n`scrape_configs: [ { job_name: docker, docker_sd_configs: [ { host: unix:\u002F\u002F\u002Fvar\u002Frun\u002Fdocker.sock, refresh_interval: 5s } ], relabel_configs: [ { source_labels: ['__meta_docker_container_name'], regex: '\u002F(.*)', target_label: container }, { source_labels: ['__meta_docker_container_log_stream'], target_label: stream } ] } ]`\n\nCette configuration utilise la découverte automatique Docker (`docker_sd_configs`), qui détecte chaque conteneur démarré sans intervention manuelle.",{"title":64,"body":65},"Écrire le fichier docker-compose.yml","Créez `\u002Fopt\u002Floki-stack\u002Fdocker-compose.yml` :\n\n`version: '3.8'`\n\n`services:`\n  `loki:` `image: grafana\u002Floki:3.0.0` `ports: ['127.0.0.1:3100:3100']` `volumes: [loki-data:\u002Floki, .\u002Floki\u002Floki-config.yaml:\u002Fetc\u002Floki\u002Flocal-config.yaml]` `command: -config.file=\u002Fetc\u002Floki\u002Flocal-config.yaml` `restart: unless-stopped`\n\n  `promtail:` `image: grafana\u002Fpromtail:3.0.0` `volumes: [\u002Fvar\u002Frun\u002Fdocker.sock:\u002Fvar\u002Frun\u002Fdocker.sock:ro, .\u002Fpromtail\u002Fpromtail-config.yaml:\u002Fetc\u002Fpromtail\u002Fconfig.yml, \u002Fvar\u002Flog:\u002Fvar\u002Flog:ro]` `command: -config.file=\u002Fetc\u002Fpromtail\u002Fconfig.yml` `restart: unless-stopped` `depends_on: [loki]`\n\n  `grafana:` `image: grafana\u002Fgrafana:latest` `ports: ['127.0.0.1:3000:3000']` `volumes: [grafana-data:\u002Fvar\u002Flib\u002Fgrafana]` `environment: [GF_SECURITY_ADMIN_PASSWORD=changez-moi]` `restart: unless-stopped` `depends_on: [loki]`\n\n`volumes:` `loki-data:` `grafana-data:`\n\nNotez que Loki (`3100`) et Grafana (`3000`) sont liés sur `127.0.0.1` uniquement — ils ne sont pas directement accessibles depuis l'extérieur.",{"title":67,"body":68},"Démarrer la stack","Depuis `\u002Fopt\u002Floki-stack`, lancez : `docker compose up -d`. Attendez 20 à 30 secondes puis vérifiez que les trois conteneurs sont en cours d'exécution : `docker compose ps`. Vérifiez ensuite les logs de Loki pour confirmer qu'il a démarré sans erreur : `docker compose logs -f loki`. Vous devez voir une ligne `msg=\"Loki started\"` dans la sortie.",{"title":70,"body":71},"Configurer le reverse proxy pour Grafana","Exposez Grafana via nginx avec un sous-domaine et un certificat TLS. Créez `\u002Fetc\u002Fnginx\u002Fsites-available\u002Fgrafana.conf` :\n\n`server { listen 443 ssl; server_name logs.votre-domaine.com; ssl_certificate \u002Fetc\u002Fletsencrypt\u002Flive\u002Flogs.votre-domaine.com\u002Ffullchain.pem; ssl_certificate_key \u002Fetc\u002Fletsencrypt\u002Flive\u002Flogs.votre-domaine.com\u002Fprivkey.pem; location \u002F { proxy_pass http:\u002F\u002F127.0.0.1:3000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }`\n\nObtenez le certificat avec : `certbot certonly --nginx -d logs.votre-domaine.com`, puis activez le site : `ln -s \u002Fetc\u002Fnginx\u002Fsites-available\u002Fgrafana.conf \u002Fetc\u002Fnginx\u002Fsites-enabled\u002F && nginx -t && systemctl reload nginx`.",{"title":73,"body":74},"Ajouter Loki comme source de données dans Grafana","Ouvrez `https:\u002F\u002Flogs.votre-domaine.com` dans votre navigateur. Connectez-vous avec l'identifiant `admin` et le mot de passe que vous avez défini dans `GF_SECURITY_ADMIN_PASSWORD`. Allez dans **Connections → Data sources → Add data source**, choisissez **Loki**, et renseignez l'URL : `http:\u002F\u002Floki:3100`. Cliquez **Save & test** — vous devez voir le message `Data source connected and labels found`.",{"title":76,"body":77},"Interroger vos premiers logs","Dans Grafana, ouvrez l'onglet **Explore**, sélectionnez la source Loki. Utilisez le Log Browser pour choisir un label `container` et filtrer par nom de conteneur. Par exemple, pour voir tous les logs du conteneur `nginx` : `{container=\"nginx\"}`. Pour filtrer sur une chaîne : `{container=\"nginx\"} |= \"error\"`. Pour compter les erreurs par conteneur sur la dernière heure : `sum by (container) (count_over_time({container=~\".+\"} |= \"error\" [1h]))`.",{"title":79,"body":80},"Collecter les logs d'un second VPS","Pour centraliser les logs d'un second VPS dans la même instance Loki, déployez uniquement Promtail sur ce VPS secondaire. Dans sa configuration, remplacez l'URL cliente par l'adresse interne de votre premier VPS : `url: http:\u002F\u002F\u003CIP-du-VPS-Loki>:3100\u002Floki\u002Fapi\u002Fv1\u002Fpush`. Ouvrez le port 3100 **uniquement** entre les deux VPS (firewall ou réseau privé), jamais publiquement. Ajoutez un label statique pour distinguer les logs par serveur : `static_configs: [ { labels: { host: vps2 } } ]`.",{"type":32,"title":82,"body":83},"Configuration post-install : rétention, sauvegarde et alertes","Une fois la stack démarrée, trois ajustements sont importants avant de considérer le déploiement comme complet.\n\n**Rétention.** La valeur `retention_period: 720h` dans `loki-config.yaml` correspond à 30 jours. Ajustez ce paramètre selon votre disque disponible (`docker system df` pour connaître l'occupation des volumes). Loki applique la rétention en arrière-plan sans impact notable sur les performances.\n\n**Sauvegarde.** Le volume `loki-data` contient les index BoltDB et les chunks compressés — c'est le seul élément à sauvegarder. Un snapshot quotidien du volume Docker (`docker run --rm -v loki-data:\u002Fdata -v \u002Fbackup:\u002Fbackup alpine tar czf \u002Fbackup\u002Floki-$(date +%F).tar.gz \u002Fdata`) suffit pour un usage standard. Ne sauvegardez pas Grafana sans son volume `grafana-data` (il contient vos dashboards et alertes).\n\n**Alertes sur le contenu des logs.** Dans Grafana, créez une alerte de type **Grafana managed alert** sur une requête Loki : par exemple, déclencher une notification quand le nombre de lignes contenant `FATAL` dépasse 0 sur les 5 dernières minutes. Configurez un canal de notification (e-mail, Slack, webhook) dans **Alerting → Contact points** avant de créer la règle.",{"type":85,"body":86},"tip","Loki n'expose aucun mécanisme d'authentification natif sur le port 3100. Si vous devez exposer l'API Loki à un réseau non maîtrisé (pour des Promtail distants, par exemple), placez un reverse proxy nginx avec authentification par certificat client ou basic auth en amont. Ne laissez jamais le port 3100 ouvert sur `0.0.0.0` sur un VPS en production. Côté Grafana, activez l'authentification forte : `GF_AUTH_ANONYMOUS_ENABLED=false` et `GF_USERS_ALLOW_SIGN_UP=false` dans les variables d'environnement du conteneur.",{"type":32,"title":88,"body":89},"Dépannage : erreurs courantes et leur résolution","Voici les problèmes les plus fréquents lors du déploiement de la stack Loki + Promtail + Grafana.",{"type":36,"title":91,"items":92},"Erreurs fréquentes",[93,94,95,96,97],"**`msg=\"error creating ingester\" err=\"context deadline exceeded\"` au démarrage de Loki** — le conteneur Loki n'a pas accès en écriture au volume monté. Vérifiez les permissions du répertoire correspondant au volume Docker (`docker inspect loki-data` pour trouver le chemin réel) et assurez-vous que l'utilisateur du conteneur (UID 10001 pour les images Grafana récentes) peut écrire dedans : `chown -R 10001:10001 \u002Fchemin\u002Fvers\u002Fle\u002Fvolume`.","**`Data source connected and labels found` absent dans Grafana, remplacé par `connection refused`** — Grafana ne peut pas atteindre Loki. Vérifiez que l'URL renseignée dans la source de données est bien `http:\u002F\u002Floki:3100` (nom du service Docker, pas `localhost`) et que les deux conteneurs sont dans le même réseau Docker (`docker inspect loki-grafana-stack_default`).","**Promtail ne collecte aucun log, `docker compose logs -f promtail` montre `component=discovery.docker msg=\"refreshing targets\"` en boucle sans progression** — Promtail n'a pas accès au socket Docker. Vérifiez que le volume `\u002Fvar\u002Frun\u002Fdocker.sock:\u002Fvar\u002Frun\u002Fdocker.sock:ro` est bien déclaré dans le service Promtail et que le socket existe sur l'hôte : `ls -la \u002Fvar\u002Frun\u002Fdocker.sock`.","**`err=\"entry out of order for stream\"` dans les logs Loki** — des logs arrivent avec des horodatages dans le désordre (un conteneur redémarré qui renvoie d'anciens logs, par exemple). Ajoutez `max_stream_label_count: 0` dans `limits_config` et `unordered_writes: true` dans `ingester` de `loki-config.yaml` pour accepter les entrées hors séquence.","**Grafana affiche `no data` sur une requête LogQL pourtant valide** — vérifiez d'abord la plage de temps sélectionnée en haut à droite (le piège le plus courant : plage définie sur `last 5 minutes` alors que Promtail n'a pas encore collecté de logs récents). Vérifiez ensuite que le label utilisé dans votre requête existe bien : `{container=\"nginx\"}` échoue si le conteneur s'appelle `nginx-1` — utilisez le Log Browser pour explorer les labels disponibles.",{"type":32,"title":99,"body":100},"Un tableau de bord pour corréler logs et métriques","L'intérêt principal de Loki dans un environnement Grafana existant est la corrélation avec les métriques Prometheus. Si vous disposez déjà d'une source Prometheus (voir l'article sur le monitoring VPS avec Grafana et Prometheus), vous pouvez créer un dashboard mixte : une rangée de panels métriques (CPU, mémoire, taux de requêtes HTTP) en haut, et un panel de logs Loki filtré sur le même service en bas. Quand un pic CPU apparaît à 14h37, vous voyez immédiatement quels logs ont été émis à cet instant précis, sans changer d'outil ni relancer une commande SSH. Ce type de corrélation est le cas d'usage qui justifie de déployer les deux stacks plutôt que l'une ou l'autre : Prometheus pour « ce qui se mesure », Loki pour « ce qui se raconte ».",{"type":102,"title":103,"headers":104,"rows":109},"comparison","Loki vs ELK vs logs en SSH — quelle approche pour quel cas",[105,106,107,108],"Critère","SSH + docker logs","Stack ELK (Elastic)","Loki + Grafana",[110,115,120,125,130],[111,112,113,114],"RAM requise","Aucune (pas de service)","8–16 Go minimum par nœud","2–4 Go pour un VPS standard",[116,117,118,119],"Indexation","Aucune","Indexation full-text (Elasticsearch)","Indexation par labels uniquement",[121,122,123,124],"Recherche multi-serveurs","Impossible sans script","Oui, nativement","Oui, via Promtail multi-hôtes",[126,127,128,129],"Corrélation avec métriques","Manuelle","Avec Kibana + APM (complexe)","Native dans Grafana",[131,132,133,134],"Coût logiciel","Nul","Licence Basic gratuite, fonctionnalités limitées","Entièrement open source, sans quota",{"type":32,"title":136,"body":137},"Ce que vous venez de mettre en orbite","Vous disposez maintenant d'une stack d'agrégation de logs fonctionnelle : Loki stocke et indexe par labels, Promtail collecte automatiquement les flux de tous vos conteneurs Docker, et Grafana offre une interface de recherche et d'alerte. La stack tourne entièrement sur votre VPS, sans service tiers, sans quota d'ingestion et sans coût logiciel additionnel.\n\nLes prochaines étapes naturelles : connecter cette stack à votre monitoring Prometheus existant pour la corrélation métriques\u002Flogs, activer le traçage distribué avec Tempo si vos applications émettent des traces OpenTelemetry, et explorer les alertes Grafana sur le contenu des logs pour être notifié avant que vos utilisateurs ne signalent un problème.","Un VPS prêt pour votre stack d'observabilité","Déployez Loki, Promtail et Grafana sur un VPS ServOrbit avec accès root complet, IPv4 dédiée et stockage SSD NVMe. Aucune restriction sur les ports, aucun surcoût logiciel.","Voir les VPS Cloud","\u002Fsolutions\u002Fdeveloppeurs",[143,156,167],{"id":144,"slug":145,"title":146,"excerpt":147,"readTime":148,"views":149,"isPinned":13,"publishedAt":150,"category":151,"categories":152,"featuredImage":23,"bgImage":24,"posterImage":154,"relatedSolution":155},106,"monitoring-vps-grafana-prometheus","Monitoring de VPS avec Grafana et Prometheus","Montez une stack Grafana + Prometheus sur votre VPS pour collecter, stocker et visualiser vos métriques système et applicatives.",4,522,"2026-03-06T00:00:00+00:00",{"id":16,"name":17,"slug":18,"color":19,"icon":20},[153],{"id":16,"name":17,"slug":18,"color":19,"icon":20},"\u002Fblog\u002Fcovers\u002Fmonitoring-vps-grafana-prometheus-poster.svg",{"categorySlug":27,"appSlug":28},{"id":157,"slug":158,"title":159,"excerpt":160,"readTime":148,"views":12,"isPinned":13,"publishedAt":161,"category":162,"categories":163,"featuredImage":23,"bgImage":24,"posterImage":165,"relatedSolution":166},220,"opentelemetry-grafana-tempo-vps","Grafana Tempo et OpenTelemetry : traçage distribué sur VPS","Déployez un stack de traçage distribué complet sur votre VPS avec OpenTelemetry et Grafana Tempo, sans vendor lock-in ni coût APM.","2026-08-04T00:00:00+00:00",{"id":16,"name":17,"slug":18,"color":19,"icon":20},[164],{"id":16,"name":17,"slug":18,"color":19,"icon":20},"\u002Fblog\u002Fcovers\u002Fopentelemetry-grafana-tempo-vps-poster.svg",{"categorySlug":27,"appSlug":28},{"id":168,"slug":169,"title":170,"excerpt":171,"readTime":11,"views":12,"isPinned":13,"publishedAt":172,"category":173,"categories":174,"featuredImage":23,"bgImage":24,"posterImage":176,"relatedSolution":23},228,"durcissement-serveur-linux-initial","Durcissement initial d'un serveur Linux","Créez un utilisateur sudo, configurez SSH avec clés, activez UFW et fail2ban sur Ubuntu 22.04 ou Debian 12 en moins d'une heure.","2026-08-06T00:00:00+00:00",{"id":16,"name":17,"slug":18,"color":19,"icon":20},[175],{"id":16,"name":17,"slug":18,"color":19,"icon":20},"\u002Fblog\u002Fcovers\u002Fdurcissement-serveur-linux-initial-poster.svg",1786366653966]