#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 dashboard | Fichier JSON | Datasource | Description |
|---|---|---|---|---|
| 1 | Overview Stack RGZ | stack_overview.json | Prometheus | CPU/RAM/réseau tous conteneurs |
| 2 | RADIUS Sessions | radius_sessions.json | Prometheus | Sessions actives, auth rate, échecs |
| 3 | Revenue Dashboard | revenue.json | PostgreSQL | FCFA/jour, split 50/50, top revendeurs |
| 4 | SLA par revendeur | sla_reseller.json | PostgreSQL | Uptime%, incidents, pénalités |
| 5 | RF Monitoring | rf_heatmap.json | PostgreSQL | Heatmap RSSI 8 villes (#41) |
| 6 | Network Flows | netflow.json | Prometheus | Bandwidth usage, top talkers |
| 7 | Security Events | security.json | Prometheus | Suricata alerts, fraude détectée |
| 8 | Subscriber Activity | subscribers.json | PostgreSQL | Sessions, data usage, abonnés actifs |
| 9 | DHCP/VLAN Status | dhcp_vlan.json | Prometheus | Pools, leases, VLANs actifs |
| 10 | Celery Tasks | celery.json | Prometheus | Queues, lag, failures, workers |
| 11 | API Performance | api_perf.json | Prometheus | Latency P50/P95/P99, error rate |
| 12 | DNS Queries | dns.json | Prometheus | Volume requêtes, sinkhole hits |
| 13 | Payment Flow | payments.json | PostgreSQL | KKiaPay, statuts webhook, remboursements |
| 14 | Alertmanager | alertmanager.json | Prometheus | Alertes actives, silences, historique |
| 15 | Spectrum Analyzer | spectrum.json | Prometheus | Interférences 5GHz, DFS (#66) |
Configuration
Variables d'environnement
| Variable | Exemple | Description |
|---|---|---|
GF_SECURITY_ADMIN_PASSWORD | changeme-secure-pass | Mot de passe admin Grafana (CHANGER EN PROD) |
GF_DATABASE_URL | postgres://grafana:pass@rgz-db:5432/grafana | Base de données Grafana (sessions, users) |
GF_SERVER_DOMAIN | grafana-rgz.duckdns.org | Domaine public pour les liens |
GF_SERVER_ROOT_URL | https://grafana-rgz.duckdns.org | URL racine avec protocole |
GF_SMTP_HOST | smtp.host:587 | Serveur SMTP pour alertes email |
GF_SMTP_FROM_ADDRESS | alertes@rgz.bj | Adresse expéditeur alertes |
PROMETHEUS_URL | http://rgz-prometheus:9090 | URL Prometheus interne |
DB_HOST | rgz-db | Hô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 AnalyzerExemple provisioning datasource Prometheus
# 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
# 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/-/healthySécurité
| Règle | Implémentation |
|---|---|
| SEC-07 | GF_SECURITY_ADMIN_PASSWORD via env var uniquement, jamais en clair dans config |
| SEC-11 | GF_SERVER_ROOT_URL avec HTTPS, accès public via Traefik TLS uniquement |
| LL#27 | Logs Docker : max-size: 10m, max-file: 3 — Grafana génère beaucoup de logs |
| LL#33 | restart: unless-stopped dans docker-compose.monitoring.yml |
| LL#43 | Healthcheck : wget -qO- http://127.0.0.1:3000/api/health (127.0.0.1, pas localhost) |
| Charte graphique | Dashboards avec palette ACCESS : jaune #f5c445, bleu #3f68ae, rouge #da3747 |
# 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-grafanadéfini dansdocker-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