## Table des matières 1. [Introduction et Architecture](#introduction-et-architecture) 2. [Composants du Stack](#composants-du-stack) 3. [Prérequis](#prérequis) 4. [Installation de Node Exporter](#installation-de-node-exporter) 5. [Installation de Prometheus](#installation-de-prometheus) 6. [Installation de Grafana](#installation-de-grafana) 7. [Configuration de Grafana](#configuration-de-grafana) 8. [Tableaux de Bord](#tableaux-de-bord) 9. [Alertes](#alertes) 10. [Sécurisation](#sécurisation) 11. [Dépannage](#dépannage) 12. [Bonnes Pratiques](#bonnes-pratiques) --- ## Introduction et Architecture ### Pourquoi Superviser son Infrastructure ? La supervision permet de : - **Détecter les problèmes** avant qu'ils n'impactent les utilisateurs - **Analyser les performances** et optimiser les ressources - **Planifier la capacité** en anticipant les besoins futurs - **Diagnostiquer** rapidement les incidents - **Générer des rapports** sur l'utilisation des ressources ``` ┌─────────────────────────────────────────────────────────────────────────────┐ │ POURQUOI LE MONITORING EST ESSENTIEL │ └─────────────────────────────────────────────────────────────────────────────┘ SANS MONITORING AVEC MONITORING ────────────── ─────────────── ┌─────────────────────┐ ┌─────────────────────┐ │ SERVEUR VPS │ │ SERVEUR VPS │ │ │ │ │ │ CPU: ??? │ │ CPU: 85% ⚠️ │ │ RAM: ??? │ │ RAM: 72% │ │ Disque: ??? │ │ Disque: 45% │ │ Réseau: ??? │ │ Réseau: 150 Mbps │ │ │ │ │ └─────────────────────┘ └─────────────────────┘ │ │ ▼ ▼ ┌─────────────────────┐ ┌─────────────────────┐ │ 😰 PANIQUE ! │ │ 📊 Dashboard clair │ │ │ │ │ │ • Serveur lent ? │ │ • Alertes proactives│ │ • Pourquoi ? │ │ • Historique complet│ │ • Depuis quand ? │ │ • Diagnostic rapide│ │ • Comment réparer ?│ │ • Décisions éclairées│ └─────────────────────┘ └─────────────────────┘ ``` ### Architecture Globale ``` ┌─────────────────────────────────────────────────────────────────────────────┐ │ ARCHITECTURE PROMETHEUS + GRAFANA │ └─────────────────────────────────────────────────────────────────────────────┘ ADMINISTRATEUR │ │ Accès Web (port 3000) ▼ ┌─────────────────────────────────────┐ │ GRAFANA │ │ (Visualisation) │ │ │ │ ┌─────────────────────────────┐ │ │ │ Tableaux de Bord │ │ │ │ • CPU, RAM, Disque │ │ │ │ • Réseau, Processus │ │ │ │ • Alertes │ │ │ └─────────────────────────────┘ │ │ │ └──────────────────┬──────────────────┘ │ │ Requêtes PromQL (port 9090) ▼ ┌─────────────────────────────────────┐ │ PROMETHEUS │ │ (Collecte & Stockage) │ │ │ │ ┌─────────────────────────────┐ │ │ │ Base de données │ │ │ │ Time Series (TSDB) │ │ │ └─────────────────────────────┘ │ │ │ └──────────────────┬──────────────────┘ │ │ Scrape (pull) toutes les 15s │ ┌────────────────────────────┼────────────────────────────┐ │ │ │ ▼ ▼ ▼ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐ │ NODE EXPORTER │ │ NODE EXPORTER │ │ NODE EXPORTER │ │ (port 9100) │ │ (port 9100) │ │ (port 9100) │ │ │ │ │ │ │ │ ┌────────────┐ │ │ ┌────────────┐ │ │ ┌────────────┐ │ │ │ Métriques │ │ │ │ Métriques │ │ │ │ Métriques │ │ │ │ système │ │ │ │ système │ │ │ │ système │ │ │ └────────────┘ │ │ └────────────┘ │ │ └────────────┘ │ └────────┬─────────┘ └────────┬─────────┘ └────────┬─────────┘ │ │ │ ┌────┴────┐ ┌────┴────┐ ┌────┴────┐ │ VPS #1 │ │ VPS #2 │ │ VPS #3 │ │ (Web) │ │ (BDD) │ │ (Mail) │ └─────────┘ └─────────┘ └─────────┘ ``` ### Flux de Données ``` ┌─────────────────────────────────────────────────────────────────────────────┐ │ FLUX DE DONNÉES - MODÈLE PULL │ └─────────────────────────────────────────────────────────────────────────────┘ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ Node │ │ Prometheus │ │ Grafana │ │ Exporter │ │ │ │ │ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │ │ │ │ │ 1. Scrape Request │ │◀──────────────────────│ (HTTP GET) │ │ │ │ │ 2. Métriques │ │ │─────────────────────▶ │ │ │ (format texte) │ │ │ │ │ │ │ 3. Stockage TSDB │ │ │─────────┐ │ │ │ │ │ │ │◀────────┘ │ │ │ │ │ │ │ 4. Requête PromQL │ │◀──────────────────────│ │ │ │ │ │ 5. Données │ │ │─────────────────────▶ │ │ │ │ │ │ │ 6. Visualisation │ │ │─────────┐ │ │ │ │ │ │ │◀────────┘ │ │ │ Ce cycle se répète toutes les 15 secondes (configurable) ``` --- ## Composants du Stack ### Vue d'Ensemble des Composants ``` ┌─────────────────────────────────────────────────────────────────────────────┐ │ COMPOSANTS DU STACK DE MONITORING │ └─────────────────────────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────────────────────────┐ │ │ │ NODE EXPORTER │ │ ───────────── │ │ • Agent léger installé sur chaque serveur à surveiller │ │ • Expose les métriques système sur le port 9100 │ │ • Collecte : CPU, RAM, disque, réseau, processus, etc. │ │ • Format : texte Prometheus (clé=valeur) │ │ │ │ ──────────────────────────────────────────────────────────────────────── │ │ │ │ PROMETHEUS │ │ ────────── │ │ • Serveur central de collecte et stockage │ │ • Récupère (scrape) les métriques des exporters │ │ • Base de données Time Series (TSDB) intégrée │ │ • Langage de requête : PromQL │ │ • Interface web sur le port 9090 │ │ │ │ ──────────────────────────────────────────────────────────────────────── │ │ │ │ GRAFANA │ │ ─────── │ │ • Plateforme de visualisation et dashboarding │ │ • Se connecte à Prometheus comme source de données │ │ • Tableaux de bord interactifs et personnalisables │ │ • Système d'alertes intégré │ │ • Interface web sur le port 3000 │ │ │ └─────────────────────────────────────────────────────────────────────────────┘ ``` ### Ports Réseau ``` ┌─────────────────────────────────────────────────────────────────────────────┐ │ PORTS UTILISÉS │ ├────────┬──────────────┬─────────────────────────────────────────────────────┤ │ Port │ Service │ Description │ ├────────┼──────────────┼─────────────────────────────────────────────────────┤ │ 9100 │ Node Exporter│ Métriques système (CPU, RAM, etc.) │ │ 9090 │ Prometheus │ Interface web + API de requêtes │ │ 3000 │ Grafana │ Interface de visualisation │ └────────┴──────────────┴─────────────────────────────────────────────────────┘ ``` --- ## Prérequis ### Configuration Système ``` ┌─────────────────────────────────────────────────────────────────────────────┐ │ PRÉREQUIS SYSTÈME │ ├─────────────────────────┬───────────────────────────────────────────────────┤ │ Élément │ Minimum Recommandé │ ├─────────────────────────┼───────────────────────────────────────────────────┤ │ OS │ Ubuntu 20.04+ / Debian 11+ │ │ RAM (serveur monitor) │ 2 Go minimum, 4 Go recommandé │ │ Stockage │ 20 Go+ (dépend de la rétention) │ │ Accès │ root ou sudo │ │ Réseau │ Connectivité entre serveurs │ └─────────────────────────┴───────────────────────────────────────────────────┘ ``` ### Architecture de Déploiement ``` ┌─────────────────────────────────────────────────────────────────────────────┐ │ SCÉNARIOS DE DÉPLOIEMENT │ └─────────────────────────────────────────────────────────────────────────────┘ SCÉNARIO 1 : Tout sur un seul serveur SCÉNARIO 2 : Distribué ───────────────────────────────────── ────────────────────── ┌─────────────────────────────────┐ ┌──────────────────────────────┐ │ SERVEUR UNIQUE │ │ SERVEUR MONITORING │ │ │ │ │ │ ┌───────────┐ ┌───────────┐ │ │ ┌───────────┐ ┌───────────┐ │ │ │ Prometheus│ │ Grafana │ │ │ │ Prometheus│ │ Grafana │ │ │ └───────────┘ └───────────┘ │ │ └───────────┘ └───────────┘ │ │ │ │ │ │ │ │ │ └──────┬──────┘ │ └────────┼──────────────────────┘ │ │ │ │ │ ┌──────┴──────┐ │ │ Scrape via réseau │ │ Node Export │ │ ┌────────┴────────┐ │ └─────────────┘ │ │ │ │ │ ▼ ▼ │ + Applications à monitorer │ ┌───────────┐ ┌───────────┐ │ │ │ VPS #1 │ │ VPS #2 │ └─────────────────────────────────┘ │ Node Exp │ │ Node Exp │ └───────────┘ └───────────┘ ✅ Simple à mettre en place ✅ Scalable ✅ Pas de latence réseau ✅ Séparation des responsabilités ❌ Point unique de défaillance ✅ Monitoring reste up si un VPS down ``` --- ## Installation de Node Exporter ### Téléchargement et Installation ```bash # Créer un utilisateur système dédié sudo useradd --no-create-home --shell /bin/false node_exporter # Télécharger la dernière version cd /tmp wget https://github.com/prometheus/node_exporter/releases/download/v1.8.2/node_exporter-1.8.2.linux-amd64.tar.gz # Extraire l'archive tar xvfz node_exporter-1.8.2.linux-amd64.tar.gz # Copier le binaire sudo cp node_exporter-1.8.2.linux-amd64/node_exporter /usr/local/bin/ sudo chown node_exporter:node_exporter /usr/local/bin/node_exporter # Nettoyer rm -rf node_exporter-1.8.2.linux-amd64* ``` ### Création du Service Systemd ```bash sudo nano /etc/systemd/system/node_exporter.service ``` ```ini [Unit] Description=Node Exporter Documentation=https://prometheus.io/docs/guides/node-exporter/ Wants=network-online.target After=network-online.target [Service] User=node_exporter Group=node_exporter Type=simple ExecStart=/usr/local/bin/node_exporter [Install] WantedBy=multi-user.target ``` ### Démarrage du Service ```bash # Recharger systemd sudo systemctl daemon-reload # Démarrer le service sudo systemctl start node_exporter # Activer au démarrage sudo systemctl enable node_exporter # Vérifier le statut sudo systemctl status node_exporter ``` ### Vérification ```bash # Tester localement curl http://localhost:9100/metrics | head -20 # Vérifier depuis le réseau curl http://IP_DU_SERVEUR:9100/metrics | head -20 ``` ``` ┌─────────────────────────────────────────────────────────────────────────────┐ │ EXEMPLE DE SORTIE NODE EXPORTER │ └─────────────────────────────────────────────────────────────────────────────┘ # HELP node_cpu_seconds_total Seconds the CPUs spent in each mode. # TYPE node_cpu_seconds_total counter node_cpu_seconds_total{cpu="0",mode="idle"} 123456.78 node_cpu_seconds_total{cpu="0",mode="system"} 1234.56 node_cpu_seconds_total{cpu="0",mode="user"} 5678.90 # HELP node_memory_MemTotal_bytes Memory information field MemTotal_bytes. # TYPE node_memory_MemTotal_bytes gauge node_memory_MemTotal_bytes 4.123456789e+09 # HELP node_filesystem_size_bytes Filesystem size in bytes. # TYPE node_filesystem_size_bytes gauge node_filesystem_size_bytes{device="/dev/sda1",mountpoint="/"} 5.0e+10 ``` --- ## Installation de Prometheus ### Structure des Fichiers ``` ┌─────────────────────────────────────────────────────────────────────────────┐ │ STRUCTURE DES FICHIERS PROMETHEUS │ └─────────────────────────────────────────────────────────────────────────────┘ /etc/prometheus/ ├── prometheus.yml ← Configuration principale ├── consoles/ ← Templates console web └── console_libraries/ ← Bibliothèques console /var/lib/prometheus/ ← Données TSDB (métriques stockées) /usr/local/bin/ ├── prometheus ← Binaire principal └── promtool ← Outil de validation config ``` ### Téléchargement et Installation ```bash # Créer les utilisateurs et groupes sudo useradd --no-create-home --shell /bin/false prometheus # Créer les répertoires sudo mkdir /etc/prometheus sudo mkdir /var/lib/prometheus # Télécharger Prometheus cd /tmp wget https://github.com/prometheus/prometheus/releases/download/v2.54.1/prometheus-2.54.1.linux-amd64.tar.gz # Extraire tar xvfz prometheus-2.54.1.linux-amd64.tar.gz cd prometheus-2.54.1.linux-amd64 # Copier les binaires sudo cp prometheus /usr/local/bin/ sudo cp promtool /usr/local/bin/ sudo chown prometheus:prometheus /usr/local/bin/prometheus sudo chown prometheus:prometheus /usr/local/bin/promtool # Copier les fichiers de configuration sudo cp -r consoles /etc/prometheus sudo cp -r console_libraries /etc/prometheus sudo chown -R prometheus:prometheus /etc/prometheus sudo chown prometheus:prometheus /var/lib/prometheus # Nettoyer cd /tmp rm -rf prometheus-2.54.1.linux-amd64* ``` ### Configuration de Prometheus ```bash sudo nano /etc/prometheus/prometheus.yml ``` ```yaml # Configuration globale global: scrape_interval: 15s # Fréquence de collecte evaluation_interval: 15s # Fréquence d'évaluation des règles external_labels: monitor: 'vps-monitoring' # Configuration des alertes (optionnel) alerting: alertmanagers: - static_configs: - targets: [] # Fichiers de règles (optionnel) rule_files: # - "alert_rules.yml" # Configuration des cibles à scraper scrape_configs: # Prometheus lui-même - job_name: 'prometheus' static_configs: - targets: ['localhost:9090'] labels: instance: 'prometheus-server' # Serveur local - job_name: 'node-local' static_configs: - targets: ['localhost:9100'] labels: instance: 'monitoring-server' environment: 'production' # Serveurs distants (ajouter vos VPS ici) - job_name: 'vps-servers' static_configs: - targets: ['192.168.1.10:9100'] labels: instance: 'vps-web' environment: 'production' - targets: ['192.168.1.11:9100'] labels: instance: 'vps-database' environment: 'production' - targets: ['192.168.1.12:9100'] labels: instance: 'vps-mail' environment: 'production' ``` ``` ┌─────────────────────────────────────────────────────────────────────────────┐ │ SCHÉMA DE CONFIGURATION PROMETHEUS │ └─────────────────────────────────────────────────────────────────────────────┘ prometheus.yml │ ┌─────────────────────┼─────────────────────┐ │ │ │ ▼ ▼ ▼ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ global │ │scrape_ │ │alerting │ │ │ │configs │ │ │ └─────────┘ └────┬────┘ └─────────┘ │ │ │ │ ┌────┴────┐ ┌──────────┴──────────┐ │scrape_ │ │ │ │interval │ │ job_name: X │ │ 15s │ │ targets: [...] │ │ │ │ labels: {...} │ └─────────┘ │ │ └─────────────────────┘ ``` ### Création du Service Systemd ```bash sudo nano /etc/systemd/system/prometheus.service ``` ```ini [Unit] Description=Prometheus Monitoring System Documentation=https://prometheus.io/docs/introduction/overview/ Wants=network-online.target After=network-online.target [Service] User=prometheus Group=prometheus Type=simple ExecStart=/usr/local/bin/prometheus \ --config.file=/etc/prometheus/prometheus.yml \ --storage.tsdb.path=/var/lib/prometheus/ \ --web.console.templates=/etc/prometheus/consoles \ --web.console.libraries=/etc/prometheus/console_libraries \ --storage.tsdb.retention.time=30d \ --web.enable-lifecycle ExecReload=/bin/kill -HUP $MAINPID Restart=always [Install] WantedBy=multi-user.target ``` ### Démarrage du Service ```bash # Valider la configuration promtool check config /etc/prometheus/prometheus.yml # Recharger systemd sudo systemctl daemon-reload # Démarrer Prometheus sudo systemctl start prometheus # Activer au démarrage sudo systemctl enable prometheus # Vérifier le statut sudo systemctl status prometheus ``` ### Vérification ```bash # Accéder à l'interface web # Ouvrir dans un navigateur : http://IP_SERVEUR:9090 # Vérifier les targets # Aller sur : http://IP_SERVEUR:9090/targets ``` ``` ┌─────────────────────────────────────────────────────────────────────────────┐ │ INTERFACE PROMETHEUS - TARGETS │ └─────────────────────────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────────────────┐ │ Prometheus Status │ Targets │ ├─────────────────────────────────────────────────────────────────────┤ │ │ │ node-local (1/1 up) │ │ ┌─────────────────────────────────────────────────────────────┐ │ │ │ Endpoint State Labels Last Scrape │ │ │ │ localhost:9100 UP ✅ instance="..." 15s ago │ │ │ └─────────────────────────────────────────────────────────────┘ │ │ │ │ vps-servers (3/3 up) │ │ ┌─────────────────────────────────────────────────────────────┐ │ │ │ Endpoint State Labels Last Scrape │ │ │ │ 192.168.1.10:9100 UP ✅ instance="web" 12s ago │ │ │ │ 192.168.1.11:9100 UP ✅ instance="db" 14s ago │ │ │ │ 192.168.1.12:9100 UP ✅ instance="mail" 10s ago │ │ │ └─────────────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────────┘ ``` --- ## Installation de Grafana ### Installation via Repository APT ```bash # Installer les prérequis sudo apt-get install -y apt-transport-https software-properties-common wget # Ajouter la clé GPG sudo mkdir -p /etc/apt/keyrings/ wget -q -O - https://apt.grafana.com/gpg.key | gpg --dearmor | sudo tee /etc/apt/keyrings/grafana.gpg > /dev/null # Ajouter le repository echo "deb [signed-by=/etc/apt/keyrings/grafana.gpg] https://apt.grafana.com stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list # Mettre à jour et installer sudo apt-get update sudo apt-get install grafana -y ``` ### Démarrage du Service ```bash # Démarrer Grafana sudo systemctl start grafana-server # Activer au démarrage sudo systemctl enable grafana-server # Vérifier le statut sudo systemctl status grafana-server ``` ### Premier Accès ``` ┌─────────────────────────────────────────────────────────────────────────────┐ │ PREMIER ACCÈS À GRAFANA │ └─────────────────────────────────────────────────────────────────────────────┘ 1. Ouvrir dans un navigateur : http://IP_SERVEUR:3000 2. Identifiants par défaut : ┌──────────────────────────────┐ │ Username: admin │ │ Password: admin │ └──────────────────────────────┘ 3. Grafana demande de changer le mot de passe ┌─────────────────────────────────────────────────────────────────────┐ │ │ │ Welcome to Grafana │ │ │ │ ┌─────────────────────────────────────────────────────────┐ │ │ │ │ │ │ │ Email or username: [admin________________] │ │ │ │ │ │ │ │ Password: [••••_________________] │ │ │ │ │ │ │ │ [ Log in ] │ │ │ │ │ │ │ └─────────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────────┘ ``` --- ## Configuration de Grafana ### Ajouter Prometheus comme Source de Données ``` ┌─────────────────────────────────────────────────────────────────────────────┐ │ CONNEXION GRAFANA → PROMETHEUS │ └─────────────────────────────────────────────────────────────────────────────┘ Étape 1: Menu latéral → Connections → Data Sources Étape 2: Cliquer sur "Add data source" Étape 3: Sélectionner "Prometheus" ┌─────────────────────────────────────────────────────────────────────┐ │ Data Sources / Prometheus │ ├─────────────────────────────────────────────────────────────────────┤ │ │ │ Name: [ Prometheus_________________________ ] │ │ │ │ HTTP │ │ ───── │ │ URL: [ http://localhost:9090_____________ ] │ │ │ │ Auth │ │ ───── │ │ [ ] Basic auth │ │ [ ] With Credentials │ │ │ │ [ Save & Test ] │ │ │ │ ✅ Data source is working │ │ │ └─────────────────────────────────────────────────────────────────────┘ Si Prometheus et Grafana sont sur le même serveur : http://localhost:9090 Si sur des serveurs différents : http://IP_PROMETHEUS:9090 ``` ### Schéma de Connexion ``` ┌─────────────────────────────────────────────────────────────────────────────┐ │ FLUX DE CONNEXION │ └─────────────────────────────────────────────────────────────────────────────┘ ┌───────────────┐ ┌───────────────┐ │ │ HTTP Request │ │ │ GRAFANA │─────────────────────▶│ PROMETHEUS │ │ (port 3000) │ │ (port 9090) │ │ │ PromQL Query │ │ │ │ "node_cpu_*" │ │ │ │◀─────────────────────│ │ │ │ JSON Response │ │ └───────────────┘ └───────────────┘ │ │ Rendu graphique ▼ ┌───────────────────────────────────────────────────────────────────┐ │ │ │ 📊 Dashboard avec graphiques, jauges, tableaux │ │ │ └───────────────────────────────────────────────────────────────────┘ ``` --- ## Tableaux de Bord ### Importer un Dashboard Pré-configuré Le dashboard **Node Exporter Full** (ID: 1860) est très complet pour monitorer des serveurs Linux. ``` ┌─────────────────────────────────────────────────────────────────────────────┐ │ IMPORTER UN DASHBOARD │ └─────────────────────────────────────────────────────────────────────────────┘ Étape 1: Menu latéral → Dashboards → New → Import Étape 2: Entrer l'ID du dashboard ┌─────────────────────────────────────────────────────────────────────┐ │ Import dashboard │ ├─────────────────────────────────────────────────────────────────────┤ │ │ │ Import via grafana.com │ │ │ │ Dashboard ID: [ 1860________________________________ ] [ Load ] │ │ │ │ ─────────────────────────────────────────────────────────────── │ │ │ │ OR │ │ │ │ Import via dashboard JSON model │ │ [ Upload JSON file ] │ │ │ └─────────────────────────────────────────────────────────────────────┘ Étape 3: Sélectionner la source de données Prometheus Étape 4: Cliquer sur "Import" ``` ### Dashboards Recommandés ``` ┌─────────────────────────────────────────────────────────────────────────────┐ │ DASHBOARDS POPULAIRES │ ├───────────┬─────────────────────────────────────────────────────────────────┤ │ ID │ Description │ ├───────────┼─────────────────────────────────────────────────────────────────┤ │ 1860 │ Node Exporter Full - Très complet, métriques détaillées │ │ 11074 │ Node Exporter - Vue simplifiée et claire │ │ 13978 │ Node Exporter Quickstart - Dashboard minimaliste │ │ 12633 │ Linux Server - Métriques essentielles │ │ 14513 │ Docker Container Monitoring - Pour conteneurs │ └───────────┴─────────────────────────────────────────────────────────────────┘ ``` ### Aperçu d'un Dashboard ``` ┌─────────────────────────────────────────────────────────────────────────────┐ │ DASHBOARD NODE EXPORTER FULL │ └─────────────────────────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────────────────────────┐ │ Node Exporter Full Host: [vps-web ▼] Time: [Last 1 hour ▼] │ ├─────────────────────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ CPU Usage │ │ RAM Usage │ │ Disk Usage │ │ Uptime │ │ │ │ 23% │ │ 67% │ │ 45% │ │ 15 days │ │ │ │ ████░░ │ │ ██████░ │ │ ████░░░ │ │ │ │ │ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │ │ │ │ CPU Usage Over Time │ │ ┌─────────────────────────────────────────────────────────────────────┐ │ │ │ ^ │ │ │ │ 100%│ │ │ │ │ 80%│ ╱╲ │ │ │ │ 60%│ ╱╲ ╱ ╲ ╱╲ │ │ │ │ 40%│ ╱╲ ╱ ╲ ╱ ╲ ╱ ╲ │ │ │ │ 20%│ ╱ ╲ ╱ ╲╱ ╲╱ ╲────── │ │ │ │ 0%│╱ │ │ │ │ └───────────────────────────────────────────────────────▶ Time │ │ │ └─────────────────────────────────────────────────────────────────────┘ │ │ │ │ Memory Usage │ Network Traffic │ │ ┌─────────────────────────────┐ │ ┌─────────────────────────────────┐ │ │ │ Total: 8 GB │ │ │ In: 125 Mbps ↓ │ │ │ │ Used: 5.4 GB (67%) │ │ │ Out: 45 Mbps ↑ │ │ │ │ Free: 2.6 GB │ │ │ │ │ │ │ Cached: 1.2 GB │ │ │ ╱╲ ╱╲ ╱╲ │ │ │ └─────────────────────────────┘ │ │ ╱ ╲ ╱ ╲ ╱ ╲ │ │ │ │ └─────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────────────────────┘ ``` --- ## Alertes ### Configurer des Alertes dans Grafana ``` ┌─────────────────────────────────────────────────────────────────────────────┐ │ SYSTÈME D'ALERTES │ └─────────────────────────────────────────────────────────────────────────────┘ ┌───────────────────────────────────┐ │ PROMETHEUS │ │ │ │ Métrique: node_cpu_usage = 95% │ │ │ └───────────────┬───────────────────┘ │ ▼ ┌───────────────────────────────────┐ │ GRAFANA │ │ │ │ Règle: CPU > 90% pendant 5min │ │ État: 🔴 FIRING │ │ │ └───────────────┬───────────────────┘ │ ┌─────────────────────────┼─────────────────────────┐ │ │ │ ▼ ▼ ▼ ┌───────────┐ ┌───────────┐ ┌───────────┐ │ Email │ │ Slack │ │ Discord │ │ 📧 │ │ 💬 │ │ 🎮 │ └───────────┘ └───────────┘ └───────────┘ ``` ### Exemples de Règles d'Alerte ```yaml # Exemples de conditions d'alerte courantes # CPU élevé Condition: avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) < 0.1 Seuil: CPU utilisé > 90% pendant 5 minutes # Mémoire insuffisante Condition: node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes < 0.1 Seuil: Moins de 10% de RAM disponible # Disque plein Condition: node_filesystem_avail_bytes / node_filesystem_size_bytes < 0.15 Seuil: Moins de 15% d'espace disque # Serveur down Condition: up == 0 Seuil: Target non joignable ``` --- ## Sécurisation ### Firewall UFW ```bash # Autoriser uniquement les ports nécessaires sudo ufw allow 22/tcp # SSH sudo ufw allow 3000/tcp # Grafana (restreindre si possible) sudo ufw allow 9090/tcp # Prometheus (restreindre au réseau interne) sudo ufw allow 9100/tcp # Node Exporter (restreindre au serveur Prometheus) # Activer le firewall sudo ufw enable ``` ### Authentification Prometheus (Basic Auth) ```bash # Installer apache2-utils pour htpasswd sudo apt install apache2-utils -y # Créer un fichier de mot de passe sudo htpasswd -c /etc/prometheus/.htpasswd admin # Éditer la configuration Prometheus sudo nano /etc/prometheus/web.yml ``` ```yaml # /etc/prometheus/web.yml basic_auth_users: admin: $2y$12$... # Hash généré par htpasswd ``` ```bash # Modifier le service pour utiliser web.yml # Ajouter --web.config.file=/etc/prometheus/web.yml à ExecStart ``` ### Reverse Proxy avec Nginx (Recommandé) ``` ┌─────────────────────────────────────────────────────────────────────────────┐ │ ARCHITECTURE SÉCURISÉE AVEC NGINX │ └─────────────────────────────────────────────────────────────────────────────┘ INTERNET │ │ HTTPS (443) ▼ ┌────────────────────────┐ │ NGINX │ │ (Reverse Proxy) │ │ + SSL/TLS │ │ + Basic Auth │ └───────────┬────────────┘ │ ┌─────────────────┴─────────────────┐ │ localhost:3000 localhost:9090│ ▼ ▼ ┌──────────────────┐ ┌──────────────────┐ │ GRAFANA │ │ PROMETHEUS │ │ (non exposé) │ │ (non exposé) │ └──────────────────┘ └──────────────────┘ ``` --- ## Dépannage ### Commandes de Diagnostic ```bash # Vérifier les services sudo systemctl status node_exporter sudo systemctl status prometheus sudo systemctl status grafana-server # Voir les logs sudo journalctl -u node_exporter -f sudo journalctl -u prometheus -f sudo journalctl -u grafana-server -f # Tester les endpoints curl http://localhost:9100/metrics | head curl http://localhost:9090/api/v1/targets curl http://localhost:3000/api/health # Valider la config Prometheus promtool check config /etc/prometheus/prometheus.yml ``` ### Problèmes Courants ``` ┌─────────────────────────────────────────────────────────────────────────────┐ │ PROBLÈMES ET SOLUTIONS │ ├─────────────────────────────────────────────────────────────────────────────┤ │ │ │ ❌ Target DOWN dans Prometheus │ │ ─────────────────────────────── │ │ • Vérifier que node_exporter tourne : systemctl status node_exporter │ │ • Vérifier le firewall : ufw status │ │ • Tester la connectivité : curl http://IP:9100/metrics │ │ │ │ ❌ Grafana ne se connecte pas à Prometheus │ │ ────────────────────────────────────────── │ │ • Vérifier l'URL (localhost vs IP) │ │ • Vérifier que Prometheus répond : curl http://localhost:9090 │ │ • Vérifier les logs Grafana │ │ │ │ ❌ Pas de données dans le dashboard │ │ ─────────────────────────────────── │ │ • Vérifier le nom du job dans prometheus.yml │ │ • Vérifier que les métriques existent dans Prometheus │ │ • Tester une requête simple dans Prometheus : up │ │ │ │ ❌ Erreur "context deadline exceeded" │ │ ───────────────────────────────────── │ │ • Augmenter le timeout dans la datasource Grafana │ │ • Vérifier la charge du serveur Prometheus │ │ │ └─────────────────────────────────────────────────────────────────────────────┘ ``` --- ## Bonnes Pratiques ### Checklist de Déploiement ``` ┌─────────────────────────────────────────────────────────────────────────────┐ │ CHECKLIST │ └─────────────────────────────────────────────────────────────────────────────┘ [ ] Node Exporter installé sur tous les serveurs à monitorer [ ] Prometheus configuré avec tous les targets [ ] Tous les targets en état UP dans Prometheus [ ] Grafana connecté à Prometheus (datasource OK) [ ] Dashboard importé et fonctionnel [ ] Alertes configurées pour les métriques critiques [ ] Firewall configuré (ports restreints) [ ] Mot de passe Grafana changé (pas admin/admin) [ ] Rétention des données configurée [ ] Sauvegardes planifiées (config + dashboards) ``` ### Recommandations ``` ┌─────────────────────────────────────────────────────────────────────────────┐ │ BONNES PRATIQUES │ └─────────────────────────────────────────────────────────────────────────────┘ ✅ Utiliser des labels cohérents (environment, instance, job) ✅ Configurer une rétention adaptée (30 jours par défaut) ✅ Sécuriser l'accès avec reverse proxy + SSL ✅ Sauvegarder régulièrement les dashboards (export JSON) ✅ Documenter les alertes et les seuils ✅ Tester les alertes régulièrement ✅ Monitorer le serveur de monitoring lui-même ✅ Utiliser des dashboards existants comme base ``` --- ## Récapitulatif des Commandes ``` ┌─────────────────────────────────────────────────────────────────────────────┐ │ AIDE-MÉMOIRE │ └─────────────────────────────────────────────────────────────────────────────┘ ┌────────────────────────────────────────┬────────────────────────────────────┐ │ Commande │ Description │ ├────────────────────────────────────────┼────────────────────────────────────┤ │ systemctl status node_exporter │ État Node Exporter │ │ systemctl status prometheus │ État Prometheus │ │ systemctl status grafana-server │ État Grafana │ ├────────────────────────────────────────┼────────────────────────────────────┤ │ systemctl restart prometheus │ Redémarrer Prometheus │ │ systemctl restart grafana-server │ Redémarrer Grafana │ ├────────────────────────────────────────┼────────────────────────────────────┤ │ curl localhost:9100/metrics │ Tester Node Exporter │ │ curl localhost:9090/api/v1/targets │ Voir les targets Prometheus │ ├────────────────────────────────────────┼────────────────────────────────────┤ │ promtool check config │ Valider config Prometheus │ │ journalctl -u prometheus -f │ Logs Prometheus en direct │ └────────────────────────────────────────┴────────────────────────────────────┘ ``` ---