Skip to content

Parcours Admin NOC — Opérations Quotidiennes

Vue d'ensemble des responsabilités opérationnelles quotidiennes du Network Operations Center (NOC) RGZ. Ce guide couvre la routine matinale, surveillance, gestion des alertes et tâches nocturnes.

Timeline quotidienne


09h00 — Vérification du Docker Stack

Action : Vérifier que les 21 conteneurs de production sont healthy.

Commandes essentielles

bash
# SSH sur serveur production
ssh rgz_prod_1

# Vérifier les services
sudo docker compose -f /opt/rgz/docker-compose.core.yml ps
sudo docker compose -f /opt/rgz/docker-compose.monitoring.yml ps

# Status détaillé
sudo docker compose -f /opt/rgz/docker-compose.core.yml ps -a

# Logs en cas de problème
sudo docker logs rgz-api --tail 50
sudo docker logs rgz-db --tail 30

Résultat attendu

STATUS    HEALTHY        (21 services)
rgz-api           ✓
rgz-web           ✓
rgz-portal        ✓
rgz-nginx         ✓
rgz-db            ✓
rgz-redis         ✓
rgz-beat          ✓
rgz-radius        ✓
rgz-dns           ✓
rgz-gateway       ✓
rgz-prometheus    ✓
rgz-grafana       ✓

Seuil critique

Si >3 services sont DOWN, c'est une escalade P0 immédiate. Contacter Directeur Technique.


09h10 — Grafana System Overview

Action : Consulter les métriques système globales.

URL : https://grafana-rgz.duckdns.org → Dashboard "System Overview"

Métriques à vérifier

MétriqueSeuil OKSeuil AlerteAction
CPU Usage<60%>80%Identifier processus gourmand
RAM Usage<70%>85%Vérifier memory leaks
Disk Usage (/)<70%>80%Nettoyer logs, archiver données
Disk Usage (/var)<70%>80%Docker logs trop gros → rotate
Network In<500 Mbps>800 MbpsSpike traffic = possible DDoS
Network Out<500 Mbps>800 MbpsVérifier transferts de données
Température CPU<60°C>75°CProblème ventilation physique

Analyse rapide

Grafana propose les 15 derniers jours. Comparer jour/jour pour détecter les tendances dégradées.


10h00 — Revue AlertManager

Action : Consulter les alertes actives et prioriser les incidents.

URL : https://grafana-rgz.duckdns.org → Alerting → Alerts

Classification des incidents

P0 (CRITIQUE - Escalade 0min):
  ├─ rgz-api DOWN
  ├─ rgz-db DOWN
  ├─ rgz-radius DOWN
  ├─ Disk / >90%
  └─ Memory >95%

P1 (HAUTE - Escalade 15min):
  ├─ rgz-api latence >5s
  ├─ Erreurs RADIUS >50/min
  ├─ Session RADIUS dropped >5%
  └─ Paiement KKiaPay timeout

P2 (NORMALE - Escalade 1h):
  ├─ CPU >85%
  ├─ Redis latence >100ms
  └─ DNS timeout <1%

Processus de triage

  1. Lire alerte : timestamp, service, métrique, valeur
  2. Vérifier contexte : changements récents? déploiement? trafic anormal?
  3. Escalader si P0/P1 : créer ticket incident Jira/Discord
  4. Documenter : raison supposée + actions prises
  5. Résoudre ou remonter : si >30min sans résolution → escalade DG

P0 Alert

Tout P0 déclenche automatiquement :

  • Alerte SMS au CTO
  • Message Discord #critical
  • Ouverture ticket incident auto

11h00 — Vérification des Services Critiques

Action : Vérifier les 4 services métier critiques.

Checklist API

bash
# Santé API
curl -H "Authorization: Bearer $(your_token)" \
  https://api-rgz.duckdns.org/api/v1/health

# Résultat attendu:
{
  "status": "ok",
  "db": "ok",
  "redis": "ok",
  "uptime_seconds": 123456
}

Checklist Portail Captif

bash
# Test portail (sans auth)
curl -L https://access-rgz.duckdns.org

# Vérifier redirection: 302 vers /portal/index.html

Checklist RADIUS

bash
# Test RADIUS auth (depuis anywhere)
radtest user-123 password-123 \
  rgz-prod-1 1812 shared_secret_here

# Résultat: Access-Accept = OK

Checklist PostgreSQL

bash
# Depuis conteneur rgz-api
sudo docker exec rgz-api psql -h rgz-db -U postgres -d rgz \
  -c "SELECT COUNT(*) as subscribers FROM subscribers;"

# Vérifier count >0

14h00 — Vérification des Backups

Action : Vérifier que les backups PostgreSQL 03h00 ont réussi.

bash
# Vérifier derniers fichiers backup
ssh rgz_prod_1
ls -lah /opt/rgz/backups/ | tail -5

# Attendu: fichier du jour, taille >50MB
# Format: backup_2026-02-24_03h00.sql.gz

Restauration de test (optionnel hebdo)

bash
# Créer BD de test
sudo docker exec rgz-db createdb -U postgres rgz_test

# Restaurer
zcat /opt/rgz/backups/backup_2026-02-24_03h00.sql.gz | \
  sudo docker exec -i rgz-db psql -U postgres rgz_test

# Vérifier
sudo docker exec rgz-db psql -U postgres rgz_test -c \
  "SELECT COUNT(*) FROM subscribers;"

# Nettoyer
sudo docker exec rgz-db dropdb -U postgres rgz_test

16h00 — Rapport Quotidien au Directeur Général

Action : Envoyer rapport statut du jour par email/WhatsApp.

Template rapport

📊 RAPPORT OPÉRATIONNEL RGZ — 24 février 2026

🟢 STATUT: Tous services OK

📈 MÉTRIQUES JOUR:
  • Abonnés actifs: X (J-1: Y)
  • Sessions RADIUS: Z
  • Revenus jour: 45,000 FCFA
  • Paiements KKiaPay: 12 transactions (100% approuvé)
  • Temps réponse API: 145ms avg (SLA: <500ms)

⚠️ INCIDENTS: Aucun

📊 GRAFANA: https://grafana-rgz.duckdns.org/d/system-overview
📲 DASHBOARD: https://admin-rgz.duckdns.org/

Questions? Support: support@rgz.bj

Tâches nocturnes (Celery Beat)

00h15 — Réconciliation des paiements KKiaPay

python
# Task: rgz.billing.reconcile
# Déclenche automatiquement via Celery Beat

# Qu'elle fait:
# 1. Requête KKiaPay API → liste transactions 24h
# 2. Compare avec DB (radius_sessions)
# 3. Détecte divergences: paiement sans session, session sans paiement
# 4. Résout automatiquement 90% des cas
# 5. Génère rapport divergence pour révision manuel

Vérification :

bash
# Logs de la task
sudo docker exec rgz-api tail -f /var/log/celery/celery.log | \
  grep "billing.reconcile"

# Ou via Celery Flower (si déployé)
https://flower-rgz.duckdns.org/task/ search "billing.reconcile"

03h00 — Backup PostgreSQL

bash
# Task: rgz.backup.pg_dump
# Déclenche: daily 03h00 UTC

# Fichier généré:
# /opt/rgz/backups/backup_YYYY-MM-DD_03h00.sql.gz

# Vérifier:
ls -lh /opt/rgz/backups/ | grep "$(date +%Y-%m-%d)"

# Taille attendue: >50MB pour 500+ abonnés

Rétention : 30 jours glissants (suppression auto des backups >30j)

Backup critique

Si backup 03h00 échoue, NOC doit être alerté avant 09h00. C'est le point de restauration officiel du jour.

05h00 — Purge APDP (Droit à l'oubli)

bash
# Task: rgz.apdp.purge_expired
# Anonymise les comptes dont la demande de suppression APDP a >90j

# Qu'elle fait:
# 1. SELECT subscribers WHERE deletion_requested_at < NOW() - INTERVAL '90 days'
# 2. Anonymise: msisdn → "DELETED", nom → "DELETED", OTP logs supprimé
# 3. Conserve: subscriber_id (audit ARCEP obligatoire)
# 4. Génère audit trail

Outils du NOC

Dashboard Admin Web

URL : https://admin-rgz.duckdns.org

Pages principales :

  • Dashboard : KPIs globaux, uptime, revenue
  • /alerts : alertes actives, incidents, tickets
  • /incidents : file d'attente incidents P0/P1/P2
  • /monitoring : santé services, CPU/RAM/disk
  • /billing : factures, paiements, divergences KKiaPay
  • /subscribers : recherche abonnés, sessions actives
  • /sessions : RADIUS sessions en temps réel

Grafana Dashboards

URL : https://grafana-rgz.duckdns.org

Dashboards importants :

  • System Overview : CPU, RAM, Disk, Network
  • API Performance : requests/sec, latence, erreurs
  • RADIUS Sessions : auth success/fail, simultaneous-use violations
  • Revenue-Billing : revenus temps réel, paiements KKiaPay, factures
  • SLA Incidents : uptime par revendeur, alertes actives
  • Database : queries/sec, connections, cache hit ratio

Kibana (Logs centralisés)

URL : https://kibana-rgz.duckdns.org (si déployé)

Index principaux :

  • rgz-api-* → logs FastAPI
  • rgz-radius-* → FreeRADIUS authentification
  • rgz-nginx-* → reverse proxy accès
  • rgz-celery-* → tâches de fond

SSH Prod (Troubleshooting avancé)

bash
ssh rgz_prod_1

# Vérifier ressources
free -h                    # Mémoire
df -h                      # Disques
top -b -n 1 | head -20    # Processus top

# Logs Docker
docker logs rgz-api | tail -100
docker logs rgz-db --tail 50 --follow

# Vérifier réseau
netstat -tulpn | grep LISTEN
ss -s                      # Statistiques sockets

Escalade d'urgence

Procédure P0

Si service DOWN :

  1. Confirmation (5 min)

    • Vérifier docker ps
    • Vérifier logs
    • Essayer redémarrage: docker restart rgz-api
  2. Notification (5 min)

    • SMS au CTO
    • Message Discord #critical
    • Email DG
  3. Diagnostic (15 min)

    • Cause supposée (logs, disk space, memory?)
    • Tentative résolution
  4. Escalade (30 min)

    • Si pas de résolution: appel téléphone CTO
    • Envisager rollback ou failover
  5. Documentation

    • Créer incident ticket
    • Timeline événements
    • Cause root + actions correctives

Checklist journalière (résumé)

  • [ ] 09h00 : docker ps — tous services healthy
  • [ ] 09h10 : Grafana System Overview — CPU/RAM/Disk <80%
  • [ ] 10h00 : AlertManager — aucune alerte P0 active
  • [ ] 11h00 : API health, Portail, RADIUS, PostgreSQL — tous OK
  • [ ] 14h00 : Backup 03h00 du jour — fichier >50MB
  • [ ] 16h00 : Rapport DG envoyé
  • [ ] 00h15 : Task reconciliation — log OK
  • [ ] 03h00 : Backup — fichier créé
  • [ ] 05h00 : APDP purge — aucune erreur

Fin : Valider le lendemain 09h00 ✓

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