Skip to content

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

OutilURLUsage Quotidien
Grafanahttps://grafana-rgz.duckdns.orgMonitoring 15+ dashboards, alertes
Kibanakibana-rgz.duckdns.org (interne)Logs ELK centralisés, debugging
Dashboard Adminhttps://admin-rgz.duckdns.orgIncidents, revendeurs, abonnés
API Swaggerhttps://api-rgz.duckdns.org/docsTests endpoints, status health
SSH Productionssh rgz_prod_1Accès serveur (alias SSH configuré)
Portail Captifhttps://access-rgz.duckdns.orgTest flux abonné

Routine Quotidienne

09h00 — Vérification Matinale (Checklist 10 min)

  1. Vérifier l'état Docker: ssh rgz_prod_1 "docker compose ps"

    • Résultat attendu: 21 conteneurs en état healthy ou Up
    • Si unhealthy: noter le service, voir Procédure P1
  2. 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
  3. Vérifier les alertes Prometheus:

    • Dashboard "Alertes Actives" → aucune alerte rouge (P0)
    • Alertes jaunes (P1) acceptables si <2
  4. Tester API health: curl https://api-rgz.duckdns.org/health

    • Réponse attendue: {"status":"ok","db":"ok","redis":"ok"}
  5. Consulter Kibana: kibana-rgz.duckdns.org

    • Chercher errors de la nuit: level:ERROR
    • Filtrer par timestamp -24h, vérifier aucun crash

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

NiveauDescriptionSLAEscaladeExemple
P0Coupure totale service30 minDG immédiat + équipeTous abonnés WiFi coupés
P1Service dégradé >20% utilisateurs2hDG + lead équipeRADIUS rejette 50%, MIR <500kbps
P2Impact <20% ou dégradation mineureBest effortÉquipe support1-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:

  1. 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."
  2. Vérifier docker ps sur prod:

    bash
    ssh rgz_prod_1 "docker compose ps"
    • Chercher services en état Exited, Restarting, ou unhealthy
  3. 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
  4. Redémarrer le service identifié:

    bash
    ssh rgz_prod_1 "docker compose restart rgz-radius"
  5. Tester RADIUS auth immédiatement (max 2 min après restart):

  6. Vérifier Grafana sessions actives:

    • Dashboard "RADIUS Active Sessions" → doit augmenter
    • Si sessions = 0 après 2 min → étape 7
  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é
  8. 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

Procédure P1 — Urgence (2h SLA)

P1 — Urgence (SLA: 2 heures)

Services partiellement impactés ou dégradés (>20% utilisateurs).

  1. Évaluer l'impact réel:

    • Dashboard "Subscribers Impact" → % impactés
    • Vérifier Kibana: level:ERROR service:radius (last 30min)
    • Chercher patterns (erreur récurrente?)
  2. Créer ticket P1:

    • Dashboard Admin → /incidents/new
    • Sélectionner priorité P1, service affecté
    • Assigner à vous-même
  3. 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"
  4. 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
  5. 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
  6. Vérifier résolution:

    • Rafraîchir Grafana → tendance doit s'améliorer
    • Relancer test client WiFi
    • Vérifier Kibana: nombre d'erreurs en baisse?
  7. Escalader vers Directeur (après 45 min):

    • Appeler DG avec update: "P1 en cours, cause trouvée, ETA résolution XX min"
  8. 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

Dashboards Principaux

DashboardURL (local)Métriques ClésSeuil Alerte
System Overview/d/system-overviewCPU/RAM/Disk tous servicesCPU >80%, RAM >85%, Disk >90%
RADIUS Auth/d/radius-authSessions actives, auth reject %, Access-Accept vs Access-RejectReject >2% = P1
QoS & Fair-Use/d/qos-fairuseMIR par revendeur, HTB queueMIR <500kbps = P1
Billing Reconciliation/d/billing-reconPaiements KKiaPay vs sessionsÉcart >1% = P2 investigation
Alertes Actives/d/alerts-activeAlertes red/yellowRed = P0 escalade, Yellow = P1 notif

Requêtes Grafana Utiles

Pour déboguer, ouvrir "Explore" → Prometheus:

promql
# 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_active

Investigation Logs (Kibana)

Accès & Authentification

  1. Ouvrir https://kibana-rgz.duckdns.org (VPN interne si hors prod)

  2. Authentification:

    • Username: elastic
    • Password: (voir .env.prod sur serveur → variable KIBANA_PASSWORD)
  3. Dashboard → "Discover"

  4. Sélectionner Index: logs-* (tous les logs)

  5. 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

bash
# 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 Env

Diagramme 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/:

yaml
# 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: critical

Intégration WhatsApp Business (Notifications)

Les alertes P0/P1 peuvent être envoyées via WhatsApp Business (si configuré).

Configurer numéro Admin NOC:

bash
ssh rgz_prod_1
nano .env
# WHATSAPP_ADMIN_PHONE=0197979964
# Sauvegarder et redémarrer rgz-api
docker restart rgz-api

Aprè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

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