Aller au contenu principal

Architecture Technique

Architecture fonctionnelle​

Architecture fonctionnelle de Bemba

ModuleRôle
Registre social (RSU)Ménages, membres, logement ; import par collecte (Kobo, Survey Solutions, fichiers) et pré-collecte
Ciblage et éligibilitéScore PMT par projet, règles d'éligibilité par programme
BénéficiairesEnrôlement, documents d'identité, cycle de vie
Programmes et transfertsCycles de transfert, paiements, réconciliation avec les opérateurs (fichiers ST/CT)
Plaintes (MGP)Workflow configurable, escalade, plaintes sensibles EAS/HS, mode hors ligne
Suivi & évaluationActivités PTBA, indicateurs, risques, missions, rapports
Agents communautairesRegistre, activités, paiements des cuidadoras
CarteVisualisation géographique
Assistant BembaAssistant conversationnel (Claude) avec outils typés et base documentaire
Site publicPages publiques, actualités, chiffres, réclamation en ligne

Architecture technique​

Architecture technique

Chemin d'une requête​

  1. Le navigateur appelle https://bemba.ucp-pch.org. Traefik termine le TLS (certificat Let's Encrypt).
  2. Les chemins /api et /photos sont routés vers pch_backend (port 8000), tout le reste vers pch_frontend (build React). mariacare.ucp-pch.org et sig.ucp-pch.org sont redirigés vers bemba.ucp-pch.org.
  3. Dans pch_backend, Nginx transmet à PHP-FPM ; Symfony interroge PostgreSQL (et Redis pour le cache).
  4. Les e-mails et traitements longs sont mis en file (Symfony Messenger, transport Doctrine) et consommés par les workers lancés par supervisord dans le même conteneur. Aucun e-mail n'est envoyé pendant une requête.

Processus du conteneur backend​

supervisord lance : Nginx, PHP-FPM, messenger:consume async (e-mails, tâches) et messenger:consume scheduler_plaintes scheduler_transferts (tâches planifiées : plaintes, et récurrence des transferts chaque jour à 6 h). Au démarrage, l'entrypoint vérifie les clés JWT, attend la base, joue les migrations en attente, prépare le cache et remet les droits de var/ à www-data.

Stack​

Frontend​

TechnologieVersionUsage
React18Interface
TypeScript5Typage
TanStack Query5Requêtes et cache côté client
Zustand4État global
Tailwind CSS3Styles
React Router6 (HashRouter, URL en /#/…)Navigation
i18next23Français, portugais, anglais
Leaflet, Recharts1.9, 2Cartes, graphiques
Sentry10Remontée d'erreurs
Service worker—Cache des ressources et mode hors ligne (plaintes)

Backend​

TechnologieVersionUsage
PHP8.3 (FPM, Alpine)Langage
Symfony7Framework, Messenger, Scheduler, Mailer
API Platform3Une partie des ressources REST
Doctrine ORM3Persistance, migrations
LexikJWT + Gesdinet2 / 1.5Jeton d'accès (1 h) et jeton de rafraîchissement
Sentry5Erreurs serveur

Les identifiants des entités sont des UUID Ramsey (Ramsey\Uuid\UuidInterface).

Données et infrastructure​

TechnologieVersionUsage
PostgreSQL + PostGIS15 + 3.4Base pch_sig
Redis7Cache
Traefik2.10Reverse proxy, HTTPS
Docker + Compose v2—Conteneurs (toujours -f)
Loki + Promtail2.9Journaux, rétention un an

Sécurité en bref​

  • Authentification : JWT signé (RS256), transmis par cookie HttpOnly ou en-tête Authorization ; rafraîchissement automatique. Voir authentification JWT.
  • Autorisation : permissions module.action vérifiées par un voter Symfony, et cloisonnement des données par institution et par projet (CloisonnementService), vérifié aussi objet par objet.
  • Réponses : 401 sans session, 403 avec session mais sans droit, 404 pour un identifiant mal formé.
  • Navigateur : politique de sécurité du contenu (CSP) appliquée par Nginx du frontend ; les photos ne sont servies que par lien signé valable 12 h.
  • Limitation des requêtes : verrouillage du compte après cinq échecs de connexion, quotas de l'assistant et du site public. Voir limitation des requêtes.

Structure du dépôt​

pch-sig/
├── backend/ # Symfony (src/, config/, migrations/, docker/, Dockerfile.prod)
├── frontend/ # React (src/pages, src/components, src/services, src/i18n)
├── documentation/ # Ce site (Docusaurus), schémas (diagrams/), vidéos (videos/)
├── nginx/ # Configuration Nginx du frontend (CSP)
├── monitoring/ # Grafana / Prometheus pour le poste d'administration
├── docs/ # Documents internes (HANDOVER, déploiement, secrets, QA…)
├── docker-compose.prod.yml
└── docker-compose.preprod.yml