Guide Admin NOC
AUDIENCE: Admin NOC — Opérations quotidiennes, incidents P0/P1/P2, monitoring 22 conteneurs
Vue d'ensemble
L'Admin NOC est responsable de:
- Monitoring temps réel des 22 conteneurs Docker en production
- Gestion des incidents P0/P1/P2 avec SLAs stricts
- Investigations via logs centralisés (Kibana) et métriques (Grafana)
- Redémarrages d'urgence et escalades
- Rapports quotidiens au Directeur Général en cas de P0
- Maintenance préventive (backups, certificats SSL, mises à jour)
Accès Rapide
| Outil | URL | Usage Quotidien |
|---|---|---|
| Grafana | https://grafana-rgz.duckdns.org | Monitoring 15+ dashboards, alertes |
| Kibana | kibana-rgz.duckdns.org (interne) | Logs ELK centralisés, debugging |
| Dashboard Admin | https://admin-rgz.duckdns.org | Incidents, revendeurs, abonnés |
| API Swagger | https://api-rgz.duckdns.org/docs | Tests endpoints, status health |
| SSH Production | ssh rgz_prod_1 | Accès serveur (alias SSH configuré) |
| Portail Captif | https://access-rgz.duckdns.org | Test flux abonné |
Routine Quotidienne
09h00 — Vérification Matinale (Checklist 10 min)
Vérifier l'état Docker:
ssh rgz_prod_1 "docker compose ps"- Résultat attendu: 21 conteneurs en état
healthyouUp - Si unhealthy: noter le service, voir Procédure P1
- Résultat attendu: 21 conteneurs en état
Consulter Grafana: https://grafana-rgz.duckdns.org
- Dashboard "System Overview" — CPU, RAM, Disk tous <80%
- Dashboard "RADIUS Auth" — Sessions actives, taux rejet <2%
- Si dépassement: créer ticket P1
Vérifier les alertes Prometheus:
- Dashboard "Alertes Actives" → aucune alerte rouge (P0)
- Alertes jaunes (P1) acceptables si <2
Tester API health:
curl https://api-rgz.duckdns.org/health- Réponse attendue:
{"status":"ok","db":"ok","redis":"ok"}
- Réponse attendue:
Consulter Kibana: kibana-rgz.duckdns.org
- Chercher errors de la nuit:
level:ERROR - Filtrer par timestamp -24h, vérifier aucun crash
- Chercher errors de la nuit:
10h00 — Revue des Alertes
Accéder à Dashboard Admin → https://admin-rgz.duckdns.org/alerts
- Alertes RADIUS: Si >5% abonnés rejetés → action
- Alertes Débit: Si MIR <1Mbps pour >20% abonnés → escalade
- Alertes CPU/RAM: Si >90% pendant >5min → redémarrage service
Gestion des Incidents
Classification Incidents
| Niveau | Description | SLA | Escalade | Exemple |
|---|---|---|---|---|
| P0 | Coupure totale service | 30 min | DG immédiat + équipe | Tous abonnés WiFi coupés |
| P1 | Service dégradé >20% utilisateurs | 2h | DG + lead équipe | RADIUS rejette 50%, MIR <500kbps |
| P2 | Impact <20% ou dégradation mineure | Best effort | Équipe support | 1-2 abonnés impactés, lenteur |
Procédure P0 — Coupure Totale (30 min SLA)
P0 — Réponse Immédiate (SLA: 30 min max)
Étapes numérotées, à exécuter dans l'ordre:
Alerter le DG immédiatement (SMS/appel)
- Sujet: "P0 RGZ — Coupure WiFi totale — 09h42"
- Message: "Tous abonnés coupés depuis 09h40. Diagnostic en cours."
Vérifier docker ps sur prod:
bashssh rgz_prod_1 "docker compose ps"- Chercher services en état
Exited,Restarting, ouunhealthy
- Chercher services en état
Identifier le service DOWN:
- rgz-radius down? → Restarting? → Attendre 30s, retester
- rgz-api down? → Vérifier:
docker logs rgz-api --tail 20 - rgz-gateway down? → NAT/QoS cassé → impasse totale
Redémarrer le service identifié:
bashssh rgz_prod_1 "docker compose restart rgz-radius"Tester RADIUS auth immédiatement (max 2 min après restart):
- Ouvrir portail: https://access-rgz.duckdns.org
- Saisir MSISDN test: 0197979964
- Recevoir OTP SMS → tester RADIUS
- Résultat: Access-Accept = P0 résolu
Vérifier Grafana sessions actives:
- Dashboard "RADIUS Active Sessions" → doit augmenter
- Si sessions = 0 après 2 min → étape 7
Escalader escalade (après 5 min):
- Appeler Directeur Général
- Passer en mode "analyse approfondie" → Procédure P1 complète
- Créer ticket incident haute priorité
Documenter:
- Créer ticket Dashboard Admin:
/incidents/new - Titre: "P0 - Coupure WiFi [service down] - [HH:MM]"
- Ajouter: étapes prises, durée downtime (T0-T_résol), cause supposée
- Créer ticket Dashboard Admin:
Procédure P1 — Urgence (2h SLA)
P1 — Urgence (SLA: 2 heures)
Services partiellement impactés ou dégradés (>20% utilisateurs).
Évaluer l'impact réel:
- Dashboard "Subscribers Impact" → % impactés
- Vérifier Kibana:
level:ERROR service:radius(last 30min) - Chercher patterns (erreur récurrente?)
Créer ticket P1:
- Dashboard Admin →
/incidents/new - Sélectionner priorité P1, service affecté
- Assigner à vous-même
- Dashboard Admin →
Investiguer logs Kibana:
- Requête utile:
level:ERROR AND timestamp:[now-30m TO now] - Filtrer par service impacté
- Chercher: "connection refused", "Out of memory", "timeout"
- Requête utile:
Identifier type d'erreur:
- DB Connection: → Vérifier PostgreSQL:
docker logs rgz-db --tail 10 - Redis Memory: →
docker exec rgz-redis redis-cli INFO memory - RADIUS Auth Reject: → Vérifier client.conf RADIUS vs config revendeur
- Débit lent (MIR): → Vérifier htb/qos:
docker exec rgz-gateway tc -s qdisc show
- DB Connection: → Vérifier PostgreSQL:
Appliquer solution (selon type):
- DB Slow: Restart rgz-db + vérifier query lentes (Prometheus)
- Redis Full: Clear cache:
docker exec rgz-redis redis-cli FLUSHDB(ATTENTION: reset sessions!) - QoS Cassée: Restart rgz-gateway:
docker restart rgz-gateway
Vérifier résolution:
- Rafraîchir Grafana → tendance doit s'améliorer
- Relancer test client WiFi
- Vérifier Kibana: nombre d'erreurs en baisse?
Escalader vers Directeur (après 45 min):
- Appeler DG avec update: "P1 en cours, cause trouvée, ETA résolution XX min"
Fermer incident:
- Dashboard Admin → incident → marquer "Résolu"
- Ajouter: durée totale, cause root, actions préventives
Procédure P2 — Best Effort
P2 — Best Effort (pas de SLA strict)
Dégradation mineure ou impact <20%.
- Documenter dans Kibana tag
severity:p2 - Planifier résolution pendant heures creuses
- Notifier équipe support pour information abonnés
Navigation Grafana
Dashboards Principaux
| Dashboard | URL (local) | Métriques Clés | Seuil Alerte |
|---|---|---|---|
| System Overview | /d/system-overview | CPU/RAM/Disk tous services | CPU >80%, RAM >85%, Disk >90% |
| RADIUS Auth | /d/radius-auth | Sessions actives, auth reject %, Access-Accept vs Access-Reject | Reject >2% = P1 |
| QoS & Fair-Use | /d/qos-fairuse | MIR par revendeur, HTB queue | MIR <500kbps = P1 |
| Billing Reconciliation | /d/billing-recon | Paiements KKiaPay vs sessions | Écart >1% = P2 investigation |
| Alertes Actives | /d/alerts-active | Alertes red/yellow | Red = P0 escalade, Yellow = P1 notif |
Requêtes Grafana Utiles
Pour déboguer, ouvrir "Explore" → Prometheus:
# Taux d'erreur auth RADIUS (%)
(increase(radius_reject_total[5m]) / increase(radius_auth_attempt_total[5m])) * 100
# Débit moyen par revendeur (Mbps)
rate(subscriber_bytes_total[5m]) / 1_000_000
# Utilisation mémoire API
container_memory_usage_bytes{name="rgz-api"} / 1_000_000_000 # in GB
# Sessions RADIUS actives
radius_sessions_activeInvestigation Logs (Kibana)
Accès & Authentification
Ouvrir https://kibana-rgz.duckdns.org (VPN interne si hors prod)
Authentification:
- Username:
elastic - Password: (voir
.env.prodsur serveur → variableKIBANA_PASSWORD)
- Username:
Dashboard → "Discover"
Sélectionner Index:
logs-*(tous les logs)Time picker: choisir plage horaire
Requêtes Utiles
# Tous les erreurs depuis 1h
level:ERROR AND timestamp:[now-1h TO now]
# Erreurs RADIUS uniquement
level:ERROR AND service:radius AND timestamp:[now-2h TO now]
# Requêtes API lentes (>5s)
service:api AND duration_ms:>5000
# Webhooks KKiaPay échoués
service:billing AND webhook_status:failed
# Connexions rejetées par MAC spoof
service:fraud AND event:mac_spoof_detected
# Logs d'un revendeur spécifique
nas_id:"access_kossou" AND timestamp:[now-24h TO now]Interpréter les Résultats
Si vous voyez:
"error": "connection refused"→ Database down"error": "REDIS READONLY"→ Redis memory issue"code": "INVALID_OTP"→ Letexto API problem"code": "KKIAPAY_TIMEOUT"→ Webhook KKiaPay lent
Commandes Docker Essentielles
# Vérifier état tous services
docker compose ps
# Voir logs en temps réel (dernières 50 lignes)
docker logs rgz-api --tail 50 -f
# Redémarrer un service spécifique
docker restart rgz-radius
# Redémarrer tous les services
docker compose restart
# Accéder à container (bash shell)
docker exec -it rgz-api bash
# Vérifier ressources utilisées
docker stats
# Inspecter configuration d'un service
docker inspect rgz-db | grep -A 20 EnvDiagramme Décision Incidents
Maintenance Préventive
Checklist Hebdomadaire (lundi 08h)
- [ ] Vérifier espace disque
/opt/rgz(doit être >50% libre) - [ ] Vérifier certificats SSL restants (dashboard Traefik)
- [ ] Nettoyer logs Elasticsearch (conservation 30j)
- [ ] Vérifier backups PostgreSQL (derniers fichiers <24h)
- [ ] Tester recovery PostgreSQL avec dernier backup
Checklist Mensuelle (1er du mois)
- [ ] Renouvellement certificats SSL (Traefik auto-renouvelle, vérifier acme.json)
- [ ] Archiver incidents résolus (dashboard)
- [ ] Audit des accès ssh_history (users qui se sont connectés?)
- [ ] Vérifier quotas stockage Kibana (documents, indices)
- [ ] Tester failover Redis (backup Redis actif?)
Alertes Configuration
Les alertes suivantes sont activées dans config/prometheus/alerts/:
# CPU >80% pendant 5 min
- alert: HighCPUUsage
expr: 'container_cpu_usage_seconds_total > 0.8'
for: 5m
severity: warning
# RADIUS reject rate >2%
- alert: HighRADIUSRejectRate
expr: 'radius_reject_rate > 0.02'
for: 5m
severity: critical
# PostgreSQL disk usage >90%
- alert: PGDiskUsage
expr: 'pg_disk_usage_percent > 90'
for: 1m
severity: criticalIntégration WhatsApp Business (Notifications)
Les alertes P0/P1 peuvent être envoyées via WhatsApp Business (si configuré).
Configurer numéro Admin NOC:
ssh rgz_prod_1
nano .env
# WHATSAPP_ADMIN_PHONE=0197979964
# Sauvegarder et redémarrer rgz-api
docker restart rgz-apiAprès redémarrage, alertes P0 seront envoyées via WhatsApp au numéro configuré.
Support & Escalade
Contacts Rapides
- Directeur Général: [numéro DG] (SMS urgent P0/P1)
- Lead Technique: [numéro lead] (détails techniques)
- Support Revendeurs: [numéro support] (escalade client)
Mis à jour: 2026-02-24 | Version: 1.0 | Guide Admin NOC Complet