// GUIDE TECHNIQUE D'ÉQUIPE — CONFIDENTIEL

Architecture & Ingénierie
Hola Africa

Plateforme de distribution de connectivité satellite D2C pour l'Afrique centrale et occidentale. Ce document est la référence technique unique pour les 5 pôles de l'équipe.

Satellite D2C Mobile Money Multi-pays CEMAC/UEMOA Flutter App
Filtrer par rôle :

Vision & Périmètre du Projet

Pour toute l'équipe — lecture obligatoire

Ce que Hola Africa N'est PAS

Hola Africa n'est pas un MVNO classique. Il ne revend pas de SIM physique, ne gère pas de cartes eSIM, et n'est pas un agrégateur de données mobiles terrestres. C'est une plateforme de distribution de connectivité satellite Direct-to-Consumer (D2C) : la connectivité est délivrée depuis l'orbite directement sur le terminal de l'utilisateur, sans passer par une tour télécom locale.

Hola Africa est une interface commerciale et technique placée entre un partenaire opérateur satellite (non encore identifié à ce stade — Starlink, AST SpaceMobile, ou MVNE satellite white-label) et des millions d'utilisateurs en Afrique centrale et de l'Ouest. Notre rôle est d'orchestrer la vente, le provisionnement et le support de cette connectivité via une application mobile fluide, en s'appuyant sur les paiements Mobile Money locaux.

Modèle économique
D2C Satellite
Revendeur agréé de capacité satellite. Marge sur arbitrage gros/détail.
Marché cible initial
CEMAC + UEMOA
Cameroun, RCA, Gabon, Sénégal, Côte d'Ivoire — architecture multi-pays dès le départ.

Les 3 promesses produit

  1. 01
    Connectivité sans opérateur local
    L'utilisateur n'a besoin ni de SIM physique, ni de carte de recharge. La connexion arrive par satellite sur son terminal compatible.
  2. 02
    Paiement 100% Mobile Money
    Orange Money, MTN MoMo, Wave, Moov Money — aucune carte bancaire requise. Paiement micro-forfait en quelques secondes.
  3. 03
    Activation instantanée
    Du paiement au premier octet : moins de 30 secondes. Le système backend déclenche le provisionnement dès confirmation webhook du paiement.
Dépendance critique à identifier en priorité Le partenaire satellite est le composant le plus stratégique du projet. Toute l'architecture backend de provisionnement sera dictée par son API. Avant de coder quoi que ce soit sur le service de provisionnement, ce partenariat doit être formalisé (MoU minimum). Les candidats à évaluer : Starlink Business API, AST SpaceMobile, Konnect Africa (Eutelsat), Intelsat, ou un MVNE satellite white-label comme Transatel/NTT ou BICS.

Stack Technologique Complète

Vue transversale — chaque pôle retrouve ses outils ici

Backend & Infrastructure

NestJS
BACKEND
Framework Node.js structuré (modules, guards, pipes, interceptors). Utilisé pour tous les microservices backend. Sa structure modulaire facilite le découpage par domaine métier.
Core de tous les services API
PostgreSQL
BACKEND
Base de données relationnelle principale. Gère les utilisateurs, transactions, abonnements, historiques de provisionnement et logs KYC. Scalabilité multi-tenant pour le multi-pays.
Source de vérité de toutes les données métier
Prisma ORM
BACKEND
ORM type-safe entre NestJS et PostgreSQL. Gère les migrations de schéma, les relations complexes et l'introspection automatique. Rend le code backend lisible et maintenable.
Couche d'accès aux données
Redis
BACKEND
Cache en mémoire pour les sessions, les tokens JWT blacklistés, les rate-limits par IP, et les états de transactions en cours. Critique pour la performance des endpoints de paiement.
Cache, sessions, rate-limiting
RabbitMQ
BACKEND
Message broker pour la communication asynchrone entre microservices. Indispensable pour découpler le service de paiement du service de provisionnement satellite. Gère les retry automatiques.
Bus de messages entre microservices
API Satellite Partner
BACKEND
L'API du partenaire satellite retenu (à identifier). C'est le point d'intégration le plus critique de toute la plateforme. Elle permettra de déclencher/couper la connectivité sur un terminal identifié.
Provisionnement connectivité D2C

Frontend Web & Back-Office

Next.js 14
FRONTEND
Framework React avec App Router, Server Components et SSR. Utilisé pour le site marketing public et le back-office admin. Excellente SEO et performance en production.
Site web public + dashboard admin
TailwindCSS
FRONTEND
Framework CSS utility-first pour une implémentation rapide du design system Hola Africa. Cohérence visuelle garantie entre le web et le back-office.
Styling et design system web
Tanstack Query
FRONTEND
Gestion du state serveur côté frontend : fetch, cache, invalidation et synchronisation des données API. Remplace Redux pour la plupart des cas d'usage du back-office.
Data fetching & state serveur
Recharts / Chart.js
FRONTEND
Librairies de visualisation pour le dashboard admin : courbes de revenus, cartes de couverture satellite, taux d'activation par pays, KPIs en temps réel.
Visualisation données back-office

Mobile

Flutter
MOBILE
SDK cross-platform Dart pour iOS et Android. Un seul codebase, deux apps natives. Performances proches du natif, animations fluides. Idéal pour une équipe réduite.
Application utilisateur iOS & Android
Riverpod
MOBILE
State management Flutter. Gère les états d'authentification, de panier, de transaction en cours, et de l'état de la connectivité de l'utilisateur en temps quasi-réel.
State management Flutter
Dio + Retrofit
MOBILE
Client HTTP Flutter avec intercepteurs (ajout automatique des tokens JWT, refresh silencieux, gestion des erreurs réseau). Retrofit génère les clients d'API type-safe depuis les annotations.
Appels API depuis l'app mobile
Firebase Messaging
MOBILE
Notifications push cross-platform. Notifie l'utilisateur de l'activation de son forfait, des alertes de consommation, des échecs de paiement, et des promotions ciblées.
Notifications push temps réel

DevOps & Infrastructure Cloud

Docker + Compose
DEVOPS
Conteneurisation de tous les services. Docker Compose pour le développement local (tous les services en une commande), Docker en production pour l'isolation et la portabilité.
Environnement de dev & packaging
Kubernetes (K8s)
DEVOPS
Orchestration des conteneurs en production. Gère l'auto-scaling horizontal lors des pics de charge, le rolling deployment sans interruption, et la résilience des services.
Orchestration production
GitHub Actions
DEVOPS
Pipeline CI/CD : lint, tests automatisés, build Docker, push registry, déploiement staging/production. Chaque push sur main déclenche la chaîne complète.
CI/CD pipeline
AWS / GCP
DEVOPS
Infrastructure cloud. AWS Africa (Cape Town) ou GCP africa-south1 pour la latence régionale. Services clés : EKS/GKE, RDS PostgreSQL, ElastiCache Redis, S3/GCS.
Cloud provider principal
Cloudflare
DEVOPS
CDN global + WAF (Web Application Firewall). Protection DDoS, terminaison TLS, cache des assets statiques, et règles de sécurité en bordure de réseau avant même d'atteindre nos serveurs.
CDN, WAF, protection DDoS
Prometheus + Grafana
DEVOPS
Monitoring et alerting. Prometheus collecte les métriques de tous les services. Grafana les visualise : latence API, taux d'échec des paiements, queue de messages, uptime par pays.
Monitoring & alerting

Design & Outils transverses

Figma
DESIGN
Source unique de vérité du design : design system, composants, prototypes interactifs et handoff aux développeurs. Toutes les décisions visuelles passent par Figma avant le code.
Design system & prototypage
CinetPay / Monetbil
BACKEND
Agrégateurs de paiement Mobile Money régionaux. CinetPay couvre 10+ pays africains (Orange Money, MTN, Wave, Moov). Simplifie drastiquement les intégrations paiement multi-pays.
Agrégation paiements Mobile Money
Supabase Auth / Custom JWT
BACKEND
Gestion de l'authentification. JWT access token (15 min) + refresh token (30 jours) stocké en base. Supabase Auth accélère le démarrage, migration vers custom JWT si besoins spécifiques.
Authentification & sessions
Sentry
DEVOPS
Tracking des erreurs en production sur tous les services (backend NestJS, frontend Next.js, app Flutter). Alertes temps réel sur les erreurs critiques, breadcrumbs pour le débogage.
Error tracking temps réel

Architecture Globale du Système

Pour toute l'équipe

L'architecture est orientée microservices, découpée selon les domaines métier. Chaque service est indépendant, déployable séparément, et communique via l'API Gateway (pour les requêtes synchrones) ou RabbitMQ (pour les événements asynchrones).

// VUE ARCHITECTURE COMPLÈTE — HOLA AFRICA
// CLIENTS // EDGE & GATEWAY // MICROSERVICES BACKEND // COUCHE DONNÉES // MESSAGING & EVENTS // PARTENAIRES EXTERNES App Mobile Flutter iOS/Android Site Web Next.js Marketing Back-Office Admin / Support B2B Dashboard Entreprises clientes Cloudflare WAF DDoS · TLS · CDN API Gateway Nginx / Kong · Auth · Rate-limit WebSocket Hub Notifications temps réel Auth Service JWT · Sessions KYC Identity User Service Profils · Abonnements Multi-pays Payment Service Mobile Money · Webhooks Réconciliation Provisioning Service API Satellite Partner Retry · Remboursement auto Notif Service Push · SMS · Email Firebase · Africa's Talking PostgreSQL Données métier Redis Cache · Sessions S3 / Cloud Storage KYC Docs · Assets RabbitMQ payment.confirmed · prov.retry Prometheus Métriques · Alerting CinetPay Mobile Money 10+ pays africains MTN MoMo Direct API Collection · Disbursement Orange Money Direct API CM · SN · CI · UEMOA Satellite Partner À identifier Starlink / AST / BICS / Konnect KYC Provider Smile Identity Vérif CNI biométrique Flux critique provisionnement Flux paiement Flux données clients

Le flux critique : de l'achat à la connectivité

  1. 01
    L'utilisateur sélectionne un forfait dans l'app Flutter
    Il choisit la durée (1h, 24h, 7 jours) et confirme. L'app appelle le Payment Service via l'API Gateway.
  2. 02
    Le Payment Service initie la collecte Mobile Money
    Il appelle CinetPay ou l'API MoMo directe. L'utilisateur reçoit une notification USSD/push pour confirmer le paiement. La transaction est enregistrée en base avec le statut PENDING.
  3. 03
    Webhook de confirmation asynchrone
    CinetPay envoie un webhook signé (HMAC) vers le backend. Le Payment Service valide la signature, passe la transaction en PAID, et publie l'événement payment.confirmed dans RabbitMQ.
  4. 04
    Le Provisioning Service consomme l'événement
    Il appelle l'API du partenaire satellite pour activer la connectivité sur le terminal de l'utilisateur (identifié par son device ID ou numéro de compte Hola Africa).
  5. 05
    Confirmation et notification
    Le Notification Service envoie un push Firebase confirmant l'activation. L'app Flutter reçoit la mise à jour via WebSocket et affiche l'écran de connectivité active.
  6. 06
    Si le provisionnement échoue
    Le Provisioning Service retente automatiquement (backoff exponentiel, max 3 fois). Si toujours en échec, il publie prov.failed → remboursement automatique via API de décaissement Mobile Money.

Couche Satellite D2C — Le Coeur du Projet

Pour toute l'équipe — compréhension obligatoire
Ce qui différencie Hola Africa de tout le reste Contrairement à un MVNO classique qui revend de la data via les réseaux terrestres (4G/5G), Hola Africa distribue de la connectivité délivrée par satellite en orbite basse (LEO) ou géostationnaire (GEO) directement sur le terminal de l'utilisateur. Pas de SIM, pas de tour mobile, pas de câble.

Typologies de partenaires satellites à évaluer

Partenaire potentiel Type Couverture Afrique Modèle pour Hola Disponibilité API
Starlink (SpaceX)LEOProgressive (CM partiel 2025)Revendeur agréé (Starlink Business)API limitée, portail revendeur
AST SpaceMobileLEO D2DCouvre CM, SN, CIAccord MVNE avec opérateur local partenaireEn déploiement B2B
Konnect Africa (Eutelsat)GEO/LEOPanafricaineRevendeur direct, API marchande existanteAPI REST disponible
BICS / TransatelMVNE Satellite WLVia accords roamingWhite-label, on devient MVNO sous leur umbrellaAPI complète documentée
Intelsat / SESGEOExcellenteGrossiste bande passante, partenaire VARIntégration sur mesure B2B

Ce que le Provisioning Service doit être capable de faire

Indépendamment du partenaire retenu, le Provisioning Service backend doit supporter les opérations suivantes via l'API partenaire :

  1. ACT
    Activer une session de connectivité
    En passant l'identifiant terminal unique de l'utilisateur, le forfait acheté et la date/heure de début.
  2. MON
    Consulter la consommation en temps réel
    Pour afficher à l'utilisateur son solde de données restant dans l'app Flutter.
  3. CUT
    Couper / suspendre une session
    En fin de forfait ou en cas de fraude détectée.
  4. RPT
    Recevoir des webhooks de fin de session
    Le partenaire notifie quand le forfait est épuisé, pour déclencher une notif push à l'utilisateur et proposer le renouvellement.
  5. LOG
    Logger toutes les interactions
    Pour la réconciliation, le support client et les audits réglementaires.
Architecture recommandée : Adapter Pattern Le Provisioning Service doit être conçu avec un Adapter Pattern : une interface commune ISatelliteProvider avec des implémentations spécifiques par partenaire. Ainsi, changer de partenaire satellite ne nécessite qu'une nouvelle implémentation d'adapter, sans toucher à la logique métier des autres services.

Disponibilité attendue et gestion de la résilience

La connectivité satellite D2C en Afrique subsaharienne offre une disponibilité de 60% à 75% selon les zones géographiques, la météo, et l'orbite utilisée (LEO > GEO en disponibilité, mais plus complexe). Le système doit être conçu pour absorber cette réalité :

Stratégie de retry
Backoff exponentiel
3 tentatives : 0s → 30s → 5min. Si échec définitif : remboursement automatique.
SLA interne cible
99.5%
Uptime de l'application (hors disponibilité satellite partenaire).

Phases de Développement & Roadmap

Pour toute l'équipe — feuille de route partagée
PHASE 0 — PRÉ-REQUIS
Signature du partenariat satellite & Setup fondations
Formaliser l'accord avec le partenaire satellite (MoU minimum). Sans cela, le Provisioning Service ne peut pas être développé. En parallèle : setup du monorepo, CI/CD, environnements cloud, design system Figma.
Chef de projet DevOps Design ~3-4 semaines
PHASE 1 — MVP CORE
Auth + Paiement + Provisionnement + App Flutter basique
Le cœur transactionnel : Auth Service (JWT, KYC basique), Payment Service (CinetPay), Provisioning Service (un seul partenaire satellite), app Flutter (onboarding, achat forfait, activation). Back-office minimal pour le support.
Backend Mobile Frontend (back-office) ~10-14 semaines
PHASE 2 — CROISSANCE
Multi-pays + Offres B2B + KYC avancé + Monitoring
Expansion géographique (Sénégal, Côte d'Ivoire). Ajout Orange Money direct. Dashboard B2B pour les entreprises. KYC biométrique (Smile Identity). Grafana/Prometheus en production. Site marketing public.
Tous les pôles ~8-10 semaines
PHASE 3 — SCALE
Auto-scaling, Ad-sponsored data, second partenaire satellite
Kubernetes auto-scaling. Module publicitaire sponsorisé (freemium). Intégration d'un second partenaire satellite pour la résilience. Smart auto-refill (renouvellement automatique algorithmique).
DevOps Backend Mobile ~6-8 semaines

Responsabilités du backend

Le backend est architecturé en microservices NestJS indépendants. Chaque service a sa propre responsabilité, sa propre base de données logique (schéma PostgreSQL séparé), et communique via l'API Gateway (sync) ou RabbitMQ (async).

Les 5 microservices à développer

ServiceResponsabilitéTechnologies clésPhase
Auth Service Inscription, connexion, JWT, refresh tokens, blacklist tokens, KYC upload NestJS, JWT, Bcrypt, Redis (sessions), S3 (docs KYC) MVP
User Service Profils utilisateurs, historique de consommation, gestion multi-pays, préférences NestJS, Prisma, PostgreSQL MVP
Payment Service Initiation paiement Mobile Money, réception webhooks, réconciliation, remboursements NestJS, CinetPay API, RabbitMQ (publisher), Prisma MVP
Provisioning Service Activation / coupure connectivité satellite, retry logic, auto-refund sur échec NestJS, API Satellite (Adapter Pattern), RabbitMQ (consumer), Redis MVP
Notification Service Push Firebase, SMS OTP (Africa's Talking), emails transactionnels (SendGrid) NestJS, Firebase Admin SDK, Africa's Talking, SendGrid MVP

Architecture des données (schéma conceptuel)

users id (UUID PK) phone_number country_code kyc_status device_id (satellite) wallet_balance created_at updated_at packages id (UUID PK) name data_volume_mb duration_hours price_fcfa country_codes[ ] satellite_sku transactions id (UUID PK) user_id (FK) package_id (FK) status (ENUM) payment_ref payment_provider amount_fcfa satellite_session_id retry_count paid_at · failed_at prov_logs id (UUID PK) transaction_id (FK) attempt_number provider_response status latency_ms created_at status ENUM : PENDING → PAID → PROVISIONED → FAILED → REFUNDED

Patterns critiques à implémenter

CRITIQUE
Idempotence des webhooks de paiement
Un webhook peut être reçu plusieurs fois par CinetPay (retry réseau). Le Payment Service doit stocker le payment_ref unique et ignorer les doublons. Ne jamais déclencher deux provisionnements pour un même paiement.
CRITIQUE
Adapter Pattern pour le Provisioning Service
Implémenter une interface ISatelliteProvider avec les méthodes activateSession(), getUsage(), terminateSession(). Chaque partenaire satellite est une classe d'implémentation distincte. Permet de changer de partenaire sans refactoring majeur.
IMPORTANT
Gestion du décalage de trésorerie
CinetPay reverse les fonds en 72h mais le provisionnement satellite est payé en temps réel. Une ligne de crédit de fonctionnement doit être provisionnée. Ce n'est pas un problème technique mais une contrainte business qui impacte le sizing du fonds de roulement.
IMPORTANT
Architecture Multi-tenant pour le multi-pays
Dès la conception, chaque entité en base doit porter un country_code. Les forfaits, tarifs, devises et partenaires de paiement varient par pays. Utiliser un contexte NestJS par requête pour injecter automatiquement le bon pays selon l'origine de la requête.

Les deux applications web à développer

Application 1
Site Marketing Public
holaafrica.tech — Présentation du produit, landing page, téléchargement app, FAQ, blog. SEO optimisé, multilingue FR/EN. Next.js App Router avec Server Components pour les performances.
Application 2
Back-Office Admin
admin.holaafrica.tech — Interface pour l'équipe support et finance. Gestion des transactions, KYC, remboursements, KPIs. Accès restreint par rôle (ADMIN, SUPPORT, COMPLIANCE).

Fonctionnalités du Back-Office (détail)

  1. TXN
    Dashboard Transactions
    Liste paginée de toutes les transactions avec filtres (statut, pays, opérateur de paiement, date). Vue détail avec timeline complète : paiement → provisionnement → résultat.
  2. KYC
    File d'attente KYC
    Affichage des documents CNI soumis en attente de validation manuelle. Interface d'approbation/rejet avec motif. Intégration future avec Smile Identity pour l'automatisation biométrique.
  3. RFD
    Module Remboursements
    Remboursements manuels sur les transactions FAILED orphelines. Appel direct à l'API de décaissement CinetPay depuis l'interface. Log automatique avec justificatif.
  4. KPI
    Dashboard Finance & KPIs
    GMV journalier/mensuel, marge brute par pays, taux d'échec de provisionnement, taux de conversion, nouveaux utilisateurs actifs. Graphiques recharts.
  5. USR
    Gestion Utilisateurs
    Recherche par numéro de téléphone ou device ID. Historique complet de l'utilisateur. Actions : suspendre compte, réinitialiser KYC, forcer déconnexion.

Structure des routes Next.js (App Router)

RouteTypeRôleAuth requise
/PublicLanding page marketingNon
/plansPublicCatalogue des forfaitsNon
/downloadPublicTéléchargement app FlutterNon
/adminPrivéDashboard overview KPIsADMIN
/admin/transactionsPrivéListe transactionsADMIN / SUPPORT
/admin/kycPrivéFile d'attente KYCCOMPLIANCE
/admin/users/[id]PrivéProfil utilisateur détailléADMIN / SUPPORT
/admin/reconciliationPrivéTransactions orphelinesADMIN
Server Components vs Client Components Les pages du back-office qui affichent des données statiques ou pré-rendues utilisent les React Server Components (RSC) de Next.js pour les performances. Seules les parties interactives (filtres, formulaires, graphiques temps réel) sont marquées 'use client'. Cela réduit le JavaScript envoyé au navigateur et améliore le Time to First Contentful Paint.

Architecture Flutter recommandée

Architecture Feature-First avec Clean Architecture par feature. Chaque feature (auth, plans, purchase, connectivity-status) est un module indépendant avec ses propres couches : data, domain, presentation.

FeatureÉcransServices consommésPhase
Auth Splash, Onboarding, Inscription (phone), OTP, KYC upload CNI Auth Service MVP
Plans & Purchase Catalogue forfaits, Détail forfait, Paiement Mobile Money, Confirmation User Service, Payment Service MVP
Connectivity Status Dashboard connectivité active, Solde restant temps réel, Timer expiration Provisioning Service (WebSocket), User Service MVP
Historique Liste des achats passés, Reçus téléchargeables, Statuts User Service MVP
Notifications Centre de notifications in-app, Paramètres push Notification Service, Firebase MVP
Profil & Paramètres Profil utilisateur, Langue, Pays, Support chat User Service Phase 2
Auto-refill Configuration renouvellement automatique, Seuil d'alerte User Service, Payment Service Phase 3

Gestion de l'état avec Riverpod

  1. AUTH
    AuthNotifier
    État global de l'authentification. Persiste les tokens JWT (Flutter Secure Storage). Gère le refresh silencieux en arrière-plan quand l'access token expire.
  2. CONN
    ConnectivityStatusNotifier
    Mise à jour temps réel de l'état de la connectivité de l'utilisateur. Écoute le WebSocket du backend et notifie l'UI instantanément lors d'un changement de statut.
  3. PAY
    PurchaseNotifier
    Orchestre le flux d'achat : sélection forfait → initiation paiement → polling statut → confirmation. Gère les états loading, success, error avec des messages utilisateur contextuels.

Points d'attention critiques pour le dev mobile

CRITIQUE
Stockage sécurisé des tokens JWT
Ne JAMAIS stocker les tokens dans SharedPreferences (non chiffré). Utiliser flutter_secure_storage qui utilise le Keychain iOS / Keystore Android. Les tokens ne doivent jamais être visibles dans les logs.
IMPORTANT
Deep links pour le retour paiement Mobile Money
Après confirmation du paiement sur l'app Orange Money ou MTN MoMo, l'utilisateur doit revenir automatiquement sur Hola Africa. Implémenter les deep links (holaafrica://payment/return) pour iOS et Android dès le MVP.
IMPORTANT
Gestion du mode offline gracieux
En zone à faible connectivité (paradoxe : l'app sert à connecter des zones mal couvertes), l'app doit afficher l'état de connectivité mis en cache localement. Ne pas afficher des spinners infinis. Message clair : "Dernière mise à jour il y a X minutes".
Internationalisation (i18n) dès le MVP L'app doit être bilingue Français / Anglais dès le premier jour. Utiliser flutter_localizations + intl. Les fichiers de traduction sont en ARB (Application Resource Bundle). Toutes les chaînes de caractères passent par les fichiers de traduction, jamais en dur dans le code.

Architecture d'infrastructure par environnement

EnvironnementObjectifInfrastructureDéploiement
Local (dev)Développement quotidienDocker Compose (tous services)Manuel (docker compose up)
StagingTests intégration, validation QAKubernetes single-node (k3s)Auto sur push develop
ProductionUtilisateurs réelsEKS (AWS) ou GKE (GCP) multi-zoneAuto sur push main après approbation

Pipeline CI/CD GitHub Actions

Code Push PR / main merge Lint + Tests ESLint · Jest · e2e Docker Build Multi-stage · Push ECR Staging Deploy Helm chart rollout Approbation Review manuelle Production deploy uniquement après approbation manuelle

Stratégie de déploiement Kubernetes

  1. HPA
    Horizontal Pod Autoscaler sur le Payment Service
    Le Payment Service est le plus sollicité lors des pics. L'HPA doit scaler automatiquement de 2 à 10 replicas selon la charge CPU/mémoire. Le Provisioning Service doit également être scalé indépendamment.
  2. RD
    Rolling Deployment sans interruption
    Chaque déploiement utilise une stratégie Rolling Update : les nouveaux pods démarrent avant que les anciens ne soient arrêtés. Zero-downtime garanti même lors des mises à jour en heures de pointe.
  3. NS
    Namespaces par environnement
    hola-prod, hola-staging, hola-monitoring. Les secrets Kubernetes (API keys, DB passwords) sont gérés via AWS Secrets Manager avec External Secrets Operator.
  4. BK
    Backups PostgreSQL automatiques
    Snapshots RDS quotidiens avec rétention 30 jours. WAL archiving en continu pour le point-in-time recovery. En cas d'incident, retour en arrière possible à la minute près.

Stack de monitoring

Prometheus
DEVOPS
Collecte les métriques exposées par chaque microservice NestJS (/metrics endpoint). Règles d'alerte configurées : taux d'erreur >5%, latence P95 >2s, queue RabbitMQ >1000 messages.
Grafana
DEVOPS
Dashboards visuels : health de tous les services, taux de succès paiements par pays, latence API satellite, consommation infrastructure. Alertes Slack/email en cas d'anomalie.
Sentry
DEVOPS
Capture des exceptions en temps réel sur backend et app Flutter. Breadcrumbs complets pour reproduire les bugs. Alertes immédiates sur les erreurs non gérées en production.
Loki + Grafana
DEVOPS
Centralisation des logs de tous les microservices. Corrélation logs/métriques/traces dans un seul dashboard Grafana. Rétention 90 jours pour les audits réglementaires.

Rôle du designer dans l'équipe Hola Africa

Le designer est la source de vérité visuelle de toute la plateforme. Son travail en Figma précède chaque développement. Aucune interface ne doit être codée sans maquette validée. Il est le garant de la cohérence entre l'app Flutter, le back-office et le site marketing.

Livrables attendus par phase

PHASE 0 — FONDATIONS DESIGN
Design System complet dans Figma
Palette de couleurs (tokens), typographie, espacements, grille, composants atomiques (boutons, inputs, cards, badges, toasts). Tous les tokens doivent être exportables en JSON pour l'intégration Flutter et Tailwind.
Design Tokens Component Library Figma Variables
PHASE 1 — APP FLUTTER MVP
Maquettes haute-fidélité + Prototype interactif
Tous les écrans du MVP : onboarding, inscription, KYC upload, catalogue forfaits, tunnel d'achat, écran connectivité active, historique, notifications. Prototype Figma cliquable pour valider l'UX avant développement.
High-fi Mockups User Flow Prototype Figma
PHASE 1 — SITE MARKETING
Landing page & Site public (desktop + mobile)
Maquettes responsive du site holaafrica.tech : hero, fonctionnalités, pays couverts, téléchargement app, FAQ. Version mobile-first (la majorité des visiteurs viennent de mobile en Afrique).
PHASE 2 — BACK-OFFICE
Interface admin
Design fonctionnel du back-office : tableaux de données, formulaires, graphiques, states vides, states erreur. Priorité à la lisibilité sur l'esthétique (outil interne). Dark mode par défaut.

Directives brand Hola Africa

Identité visuelle : Tech africaine, moderne, accessible Le design de Hola Africa doit exprimer confiance (paiement, connectivité — des sujets sérieux), modernité (technologie de pointe), et accessibilité locale (l'utilisateur cible est au Cameroun, pas à San Francisco). Éviter les clichés "startup Silicon Valley" tout comme les représentations folkloriques de l'Afrique. Viser quelque chose entre Wave Money (clarté, couleur franche) et Stripe (confiance, minimalisme technique).
ÉlémentDirection recommandéeRaison
Couleur primaireBleu électrique ou cyan (#F4801F ou similaire)Évoque la connectivité, le satellite, la tech. Confiance.
Typographie appSans-serif géométrique (Sora, Outfit, Plus Jakarta Sans)Lisibilité sur petits écrans, modernité.
Fond appClair (white/light gray) pour l'app utilisateurContraste, accessibilité en plein soleil (usage outdoor Afrique).
Fond adminSombre (comme ce document)Usage bureau, réduction fatigue oculaire, densité d'information.
IconographieIcônes linéaires simples (Lucide, Phosphor)Légèreté, cohérence, lisibilité petite taille.
IllustrationsFlat géométriques, palette limitéeChargement rapide, cohérence, style intemporel.

Handoff designer → développeur

  1. TKN
    Export des Design Tokens
    Exporter les variables Figma en JSON. Le DevFlutter les convertit en ThemeData Flutter. Le DevFrontend les importe dans tailwind.config.js. Un seul fichier source = cohérence garantie.
  2. SPC
    Spécifications Figma complètes
    Chaque composant doit avoir des annotations : espacements exacts, tailles de texte, états (hover, focus, disabled, error). Utiliser le plugin Figma "Inspect" pour le handoff au développeur.
  3. AST
    Assets exportés
    Icônes en SVG (pas en PNG). Illustrations en SVG ou WebP optimisé. Jamais de JPEG pour les assets UI. Nommage standardisé : ic_satellite_active.svg, ic_payment_success.svg.

Sécurité — Exigences Transversales

Pour toute l'équipe — non négociable
Hola Africa manipule de l'argent réel et des données d'identité. Une faille de sécurité n'est pas un bug à corriger plus tard. C'est un risque de fermeture immédiate, de poursuites judiciaires, et de perte de confiance irréversible. La sécurité est une contrainte architecturale, pas une feature optionnelle.

Sécurité par couche

Niveau Réseau & Périmètre

CRITIQUE
HTTPS/TLS partout, sans exception
TLS 1.3 minimum. Certificats gérés via Let's Encrypt (auto-renouvellement). Cloudflare gère la terminaison TLS en bordure. Aucune communication en HTTP clair, même en interne entre services (mTLS recommandé en prod).
CRITIQUE
Cloudflare WAF — Règles Anti-fraude
Rules WAF pour bloquer : injections SQL/NoSQL, XSS, CSRF. Rate limiting par IP et par user_id sur les endpoints de paiement (max 5 tentatives / 5 minutes). Bot protection activée. Toute anomalie déclenche une alerte Slack immédiate.

Niveau Authentification

CRITIQUE
JWT Access Token court + Refresh Token sécurisé
Access token expire en 15 minutes. Refresh token en 30 jours, stocké en base et révocable. En cas de compromission détectée, tous les refresh tokens de l'utilisateur sont invalidés en masse. Jamais de token dans les URLs.
IMPORTANT
OTP SMS pour les actions critiques
Confirmation SMS obligatoire pour : premier paiement, changement de numéro de téléphone, suppression de compte. L'OTP est valide 5 minutes, usage unique, stocké haché en Redis (jamais en clair en base).

Niveau Paiement

CRITIQUE
Validation cryptographique des webhooks
Chaque webhook de CinetPay, MTN MoMo et Orange Money est signé avec un secret partagé (HMAC-SHA256). Le backend vérifie la signature avant toute action. Un webhook non signé ou avec une signature invalide est rejeté et alerté. C'est la première ligne de défense anti-fraude.
CRITIQUE
Protection contre le double-spending
Chaque transaction reçoit un identifiant unique idempotent avant même l'appel à CinetPay. Si deux requêtes d'achat arrivent avec le même identifiant (retry réseau), seule la première est traitée. Le lock Redis garantit l'atomicité de cette vérification.

Niveau Données & RGPD/ART

CRITIQUE
Chiffrement des données personnelles en base
Les numéros de téléphone, données KYC et device IDs sont chiffrés au repos (AES-256) dans PostgreSQL. Les clés de chiffrement sont gérées dans AWS KMS / GCP Cloud KMS — jamais dans le code source. Les logs ne contiennent jamais de données personnelles en clair.
IMPORTANT
Conformité KYC — Décrets camerounais SIM
Les décrets gouvernementaux camerounais imposent la vérification d'identité pour toute activation de service de connectivité. Le processus KYC (upload CNI + validation biométrique via Smile Identity en Phase 2) est obligatoire avant le premier achat. Les documents sont stockés chiffrés sur S3 avec accès audit log.

Niveau Secrets & Variables d'environnement

Variables critiques — Ne jamais committer dans Git
JWT_SECRET · DB_PASSWORD · REDIS_PASSWORD · RABBITMQ_PASSWORD · CINETPAY_API_KEY · MTN_MOMO_API_KEY · ORANGE_API_KEY · SATELLITE_PARTNER_API_KEY · WEBHOOK_SECRET_CINETPAY · AWS_SECRET_ACCESS_KEY · SENTRY_DSN

Ces secrets sont stockés dans AWS Secrets Manager (production) et GitHub Encrypted Secrets (CI/CD). En local, un fichier .env.local (ignoré par Git) est utilisé. Un commit contenant un secret déclenche une alerte automatique via git-secrets ou truffleHog dans la CI.

Audit de Sécurité

IMPORTANT
Pentest avant le Go-Live production
Avant le lancement commercial, un audit de sécurité indépendant (pentest) doit être commandé. Focus : injection SQL, accès non autorisé aux endpoints admin, manipulation des webhooks de paiement, exfiltration de données KYC. Coût estimé : 1,5M à 4M FCFA selon le prestataire.

Intégration Paiements Mobile Money

Backend — Priorité MVP absolue

Le paiement est le premier événement de la chaîne de valeur. Sans paiement validé, pas de provisionnement. L'architecture de paiement doit être infaillible.

Stratégie d'intégration par pays

PaysOpérateurs ciblesAgrégateur recommandéPhase
🇨🇲 CamerounMTN MoMo + Orange MoneyCinetPay + MTN direct en Phase 2MVP
🇸🇳 SénégalOrange Money + Wave + Free MoneyCinetPay (couverture native)Phase 2
🇨🇮 Côte d'IvoireOrange Money + MTN MoMo + WaveCinetPay (couverture native)Phase 2
🇬🇦 GabonAirtel Money + Moov MoneyCinetPay + MonetbilPhase 2
🇨🇬 CongoMTN MoMo + Airtel MoneyCinetPayPhase 3

Le flux de paiement en détail

App Flutter User achète forfait Payment Service 1. Crée TX (PENDING) 2. Init CinetPay 3. Retourne URL pay 4. Attend webhook 5. Valide HMAC 6. TX → PAID CinetPay Collect MoMo MTN / Orange User confirme USSD RabbitMQ payment.confirmed Provisioning Active satellite webhook ✓ SUCCESS PATH ÉCHEC → Remboursement auto CinetPay Disbursement API
Décalage de trésorerie : un problème opérationnel critique CinetPay reverse les fonds collectés sous 72 heures. Mais l'API du partenaire satellite doit être payée au moment de l'activation (temps réel). Cela crée un float permanent : l'entreprise avance la connectivité avant d'encaisser réellement les fonds. Ce float doit être intégré dans le plan de financement dès le premier jour.

KYC & Conformité Réglementaire

Backend — Obligation légale

La réglementation camerounaise (décrets ART + directives BEAC) impose la vérification d'identité avant toute activation de service de connectivité. Le KYC n'est pas une option.

Processus KYC par étape

  1. MVP
    Phase 1 MVP — KYC Manuel
    L'utilisateur upload une photo de sa CNI (recto-verso) et un selfie via l'app Flutter. Les fichiers sont chiffrés et envoyés sur S3. Un agent du back-office valide manuellement. Délai : 24-48h. Suffisant pour le lancement.
  2. PH2
    Phase 2 — KYC Automatisé (Smile Identity)
    Intégration de Smile Identity (principal provider KYC pour l'Afrique). L'API analyse la CNI, extrait les données, et réalise une vérification biométrique (matching selfie/photo CNI). Délai : moins de 60 secondes. Taux d'automatisation : ~85%.
  3. DRT
    Droits des données utilisateur
    L'utilisateur peut demander la suppression de son compte et de ses données (conformité RGPD / loi camerounaise sur la cybersécurité). La plateforme doit supporter cette opération avec archivage légal des données de transaction (obligation de rétention fiscale).
Interdiction BEAC : pas de wallet interne La BEAC interdit à toute entité non bancaire d'émettre de la monnaie électronique ou de maintenir des soldes de portefeuilles pour des tiers. Hola Africa ne peut pas créer un système de "crédits internes" sur lesquels l'utilisateur dépose de l'argent pour des achats futurs. Toute transaction doit être un paiement direct de l'utilisateur vers Hola Africa, sans intermédiaire de valeur stockée. Le remboursement en cas d'échec doit retourner directement sur le compte Mobile Money de l'utilisateur.

Back-Office Admin & Réconciliation

Frontend Web — MVP Phase 1

Le back-office est l'outil de pilotage interne de Hola Africa. Il doit permettre à l'équipe de support de résoudre chaque incident en moins de 5 minutes, sans intervention d'un développeur.

Job de réconciliation automatique

Chaque nuit à 2h00, un job automatique (cron NestJS) analyse les transactions PAID qui n'ont pas été provisionnées depuis plus de 2 heures. Il tente un re-provisionnement ou déclenche un remboursement automatique. Le matin, l'équipe finance reçoit un rapport récapitulatif.

ScénarioStatut initialAction systèmeStatut final
Paiement reçu, satellite OKPENDING → PAIDProvisionnement automatiquePROVISIONED
Satellite en timeout (retry < 3)PAIDRe-tentative automatique (job cron)PROVISIONED ou FAILED
Satellite en échec définitifPAID (retry = 3)Remboursement auto CinetPayREFUNDED
Webhook paiement dupliquéPAID (déjà)Rejeté (idempotence)PAID (inchangé)
Paiement échoué côté Mobile MoneyPENDINGAucun provisionnement, TX expiréeFAILED

Monitoring & Alerting en Production

DevOps — Disponibilité 24/7

Métriques critiques à surveiller

MétriqueSeuil d'alerteSeuil critiqueAction
Taux d'erreur Payment Service> 2%> 5%PagerDuty + Slack
Taux d'échec provisionnement> 10%> 25%Alerte équipe + vérif partenaire sat
Latence API Gateway (P95)> 1s> 3sInvestiguer scaling
Queue RabbitMQ (messages)> 500> 2000Scale Provisioning Service
Connexions PostgreSQL> 80%> 95%Scale connection pool
Webhook signature invalide> 0Alerte sécurité immédiate

SLA & Disponibilité par service

Payment Service
99.9%
= max 8.7h down/an
Provisioning Service
99.5%
Dépend du partenaire sat
API Gateway
99.95%
Cloudflare + multi-zone
Checklist pré-lancement production

Pentest indépendant réalisé et rapport traité
Webhooks de paiement testés avec signatures invalides (rejection vérifiée)
Scénario de remboursement auto testé de bout en bout
Monitoring Prometheus/Grafana opérationnel avec alertes Slack configurées
Backups PostgreSQL testés avec restore complet réussi
Secrets gérés via AWS Secrets Manager (aucune variable en clair dans le code)
KYC flow validé conforme aux décrets ART
Partenariat satellite formalisé (MoU signé)
License SVA / ART en cours ou obtenue
Accord CinetPay marchand activé (compte production)
HOLA AFRICA · GUIDE TECHNIQUE v1.0 · FLAG TECHNOLOGY © 2025
Document confidentiel — usage interne équipe uniquement