Skip to content

#37 — dashboards-grafana

EN COURS DE DÉPLOIEMENT

Priorité: 🔴 CRITIQUE · Type: TYPE F · Conteneur: rgz-grafana · Code: config/grafana/dashboards/*.json

Dépendances: #38 prometheus-alert, #04 rgz-db


Description

dashboards-grafana est la couche de visualisation centrale de la plateforme RGZ. Il s'agit d'une instance Grafana 10.x déployée en conteneur, exposée publiquement via Traefik sur https://grafana-rgz.duckdns.org avec un certificat Let's Encrypt valide. L'instance agrège les données de deux datasources principales : Prometheus (métriques temps réel) et PostgreSQL/TimescaleDB (données billing et SNMP historiques), et les présente sous forme de 15 dashboards JSON provisionnés automatiquement au démarrage.

Tous les dashboards sont définis dans config/grafana/dashboards/ au format JSON standard Grafana et chargés via le mécanisme de provisioning (config/grafana/provisioning/dashboards/). Cela signifie qu'il n'est pas nécessaire de reconfigurer manuellement Grafana après un redémarrage ou une mise à jour : l'état désiré est entièrement dans le dépôt Git. Les datasources sont également provisionnées via config/grafana/provisioning/datasources/.

L'outil #37 est la porte d'entrée visuelle pour le NOC (dashboard #52) et les revendeurs (dashboard #51). Il dépend directement de #38 pour les métriques Prometheus et de #39 pour les métriques SNMP stockées dans TimescaleDB. Le dashboard RF (#41) est un sous-composant JSON de #37.

Grafana est configuré avec une authentification locale (admin/password via variable d'env). En production, le mot de passe par défaut admin doit être changé immédiatement via GF_SECURITY_ADMIN_PASSWORD. Des organisations Grafana séparées peuvent être envisagées en V2 pour isoler les revendeurs.

Architecture Interne

grafana-rgz.duckdns.org (HTTPS via Traefik)


  rgz-grafana :3000

        ├── Datasource 1: Prometheus (http://rgz-prometheus:9090)
        │     └── Métriques: CPU, RAM, réseau, RADIUS, API, DNS

        ├── Datasource 2: PostgreSQL (rgz-db:5432/rgz)
        │     └── Données: billing, sessions, SNMP métriques historiques

        ├── Provisioning automatique au démarrage:
        │     ├── config/grafana/provisioning/datasources/*.yml
        │     ├── config/grafana/provisioning/dashboards/*.yml
        │     └── config/grafana/dashboards/*.json (15 dashboards)

        └── Alerting: règles Grafana → Alertmanager (:9093)

Les 15 Dashboards

#Nom du dashboardFichier JSONDatasourceDescription
1Overview Stack RGZstack_overview.jsonPrometheusCPU/RAM/réseau tous conteneurs
2RADIUS Sessionsradius_sessions.jsonPrometheusSessions actives, auth rate, échecs
3Revenue Dashboardrevenue.jsonPostgreSQLFCFA/jour, split 50/50, top revendeurs
4SLA par revendeursla_reseller.jsonPostgreSQLUptime%, incidents, pénalités
5RF Monitoringrf_heatmap.jsonPostgreSQLHeatmap RSSI 8 villes (#41)
6Network Flowsnetflow.jsonPrometheusBandwidth usage, top talkers
7Security Eventssecurity.jsonPrometheusSuricata alerts, fraude détectée
8Subscriber Activitysubscribers.jsonPostgreSQLSessions, data usage, abonnés actifs
9DHCP/VLAN Statusdhcp_vlan.jsonPrometheusPools, leases, VLANs actifs
10Celery Taskscelery.jsonPrometheusQueues, lag, failures, workers
11API Performanceapi_perf.jsonPrometheusLatency P50/P95/P99, error rate
12DNS Queriesdns.jsonPrometheusVolume requêtes, sinkhole hits
13Payment Flowpayments.jsonPostgreSQLKKiaPay, statuts webhook, remboursements
14Alertmanageralertmanager.jsonPrometheusAlertes actives, silences, historique
15Spectrum Analyzerspectrum.jsonPrometheusInterférences 5GHz, DFS (#66)

Configuration

Variables d'environnement

VariableExempleDescription
GF_SECURITY_ADMIN_PASSWORDchangeme-secure-passMot de passe admin Grafana (CHANGER EN PROD)
GF_DATABASE_URLpostgres://grafana:pass@rgz-db:5432/grafanaBase de données Grafana (sessions, users)
GF_SERVER_DOMAINgrafana-rgz.duckdns.orgDomaine public pour les liens
GF_SERVER_ROOT_URLhttps://grafana-rgz.duckdns.orgURL racine avec protocole
GF_SMTP_HOSTsmtp.host:587Serveur SMTP pour alertes email
GF_SMTP_FROM_ADDRESSalertes@rgz.bjAdresse expéditeur alertes
PROMETHEUS_URLhttp://rgz-prometheus:9090URL Prometheus interne
DB_HOSTrgz-dbHôte PostgreSQL (datasource PostgreSQL)
DB_PASSWORD...Mot de passe datasource PostgreSQL

Fichiers de configuration

config/grafana/
├── provisioning/
│   ├── datasources/
│   │   ├── prometheus.yml     # Datasource Prometheus auto-configurée
│   │   └── postgresql.yml     # Datasource PostgreSQL/TimescaleDB
│   └── dashboards/
│       └── default.yml        # Chemin vers les JSON à charger
└── dashboards/
    ├── stack_overview.json
    ├── radius_sessions.json
    ├── revenue.json
    ├── sla_reseller.json
    ├── rf_heatmap.json        # #41 RF Monitoring
    ├── netflow.json
    ├── security.json
    ├── subscribers.json
    ├── dhcp_vlan.json
    ├── celery.json
    ├── api_perf.json
    ├── dns.json
    ├── payments.json
    ├── alertmanager.json
    └── spectrum.json          # #66 Spectrum Analyzer

Exemple provisioning datasource Prometheus

yaml
# config/grafana/provisioning/datasources/prometheus.yml
apiVersion: 1
datasources:
  - name: Prometheus
    type: prometheus
    access: proxy
    url: http://rgz-prometheus:9090
    isDefault: true
    jsonData:
      httpMethod: POST
      exemplarTraceIdDestinations: []

Commandes Utiles

bash
# Vérifier que Grafana est UP
curl -s http://127.0.0.1:3000/api/health | jq .
# Réponse attendue: {"commit":"...","database":"ok","version":"10.x.x"}

# Depuis l'hôte (HTTPS via Traefik)
curl -s https://grafana-rgz.duckdns.org/api/health | jq .

# Lister les datasources configurées
curl -s -u admin:$GF_SECURITY_ADMIN_PASSWORD \
  http://127.0.0.1:3000/api/datasources | jq '.[].name'

# Lister les dashboards provisionnés
curl -s -u admin:$GF_SECURITY_ADMIN_PASSWORD \
  http://127.0.0.1:3000/api/search | jq '.[].title'

# Recharger les provisioning (après modification JSON)
curl -s -u admin:$GF_SECURITY_ADMIN_PASSWORD \
  -X POST http://127.0.0.1:3000/api/admin/provisioning/dashboards/reload

# Logs Grafana
docker logs rgz-grafana -f --tail=50

# Restart Grafana
docker compose -f /home/claude-dev/RGZ/docker-compose.monitoring.yml restart rgz-grafana

# Accéder au shell Grafana
docker exec -it rgz-grafana sh

# Vérifier la connexion à Prometheus depuis Grafana
docker exec rgz-grafana wget -qO- http://rgz-prometheus:9090/-/healthy

Sécurité

RègleImplémentation
SEC-07GF_SECURITY_ADMIN_PASSWORD via env var uniquement, jamais en clair dans config
SEC-11GF_SERVER_ROOT_URL avec HTTPS, accès public via Traefik TLS uniquement
LL#27Logs Docker : max-size: 10m, max-file: 3 — Grafana génère beaucoup de logs
LL#33restart: unless-stopped dans docker-compose.monitoring.yml
LL#43Healthcheck : wget -qO- http://127.0.0.1:3000/api/health (127.0.0.1, pas localhost)
Charte graphiqueDashboards avec palette ACCESS : jaune #f5c445, bleu #3f68ae, rouge #da3747
yaml
# Fragment docker-compose.monitoring.yml
rgz-grafana:
  image: grafana/grafana:10.x.x
  restart: unless-stopped
  environment:
    GF_SECURITY_ADMIN_PASSWORD: ${GF_SECURITY_ADMIN_PASSWORD}
    GF_SERVER_DOMAIN: grafana-rgz.duckdns.org
    GF_SERVER_ROOT_URL: https://grafana-rgz.duckdns.org
  volumes:
    - ./config/grafana/provisioning:/etc/grafana/provisioning:ro
    - ./config/grafana/dashboards:/var/lib/grafana/dashboards:ro
    - grafana_data:/var/lib/grafana
  healthcheck:
    test: ["CMD-SHELL", "wget -qO- http://127.0.0.1:3000/api/health || exit 1"]
    interval: 30s
    timeout: 10s
    retries: 3
  logging:
    driver: "json-file"
    options:
      max-size: "10m"
      max-file: "3"

Implémentation TODO

  • [x] Service rgz-grafana défini dans docker-compose.monitoring.yml
  • [x] Certificat Let's Encrypt actif via Traefik (grafana-rgz.duckdns.org)
  • [ ] config/grafana/provisioning/datasources/prometheus.yml — datasource Prometheus
  • [ ] config/grafana/provisioning/datasources/postgresql.yml — datasource PostgreSQL
  • [ ] config/grafana/provisioning/dashboards/default.yml — chemin JSON
  • [ ] config/grafana/dashboards/stack_overview.json — overview conteneurs
  • [ ] config/grafana/dashboards/radius_sessions.json — RADIUS
  • [ ] config/grafana/dashboards/revenue.json — billing FCFA
  • [ ] config/grafana/dashboards/sla_reseller.json — SLA uptime%
  • [ ] config/grafana/dashboards/rf_heatmap.json — RF heatmap (#41)
  • [ ] config/grafana/dashboards/netflow.json — trafic réseau
  • [ ] config/grafana/dashboards/security.json — événements sécurité
  • [ ] config/grafana/dashboards/subscribers.json — activité abonnés
  • [ ] config/grafana/dashboards/dhcp_vlan.json — DHCP/VLAN
  • [ ] config/grafana/dashboards/celery.json — workers Celery
  • [ ] config/grafana/dashboards/api_perf.json — performance API
  • [ ] config/grafana/dashboards/dns.json — DNS/sinkhole
  • [ ] config/grafana/dashboards/payments.json — KKiaPay
  • [ ] config/grafana/dashboards/alertmanager.json — alertes
  • [ ] config/grafana/dashboards/spectrum.json — spectre 5GHz (#66)
  • [ ] Changer le mot de passe admin en production
  • [ ] Tests de smoke : vérifier que les 15 dashboards chargent sans erreur

Dernière mise à jour: 2026-02-21

PROJET MOSAÏQUE — 81 outils, 22 conteneurs, 500+ revendeurs WiFi Zone