Architecture Technique
Architecture fonctionnelle
| Module | Rô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éficiaires | Enrôlement, documents d'identité, cycle de vie |
| Programmes et transferts | Cycles 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 & évaluation | Activités PTBA, indicateurs, risques, missions, rapports |
| Agents communautaires | Registre, activités, paiements des cuidadoras |
| Carte | Visualisation géographique |
| Assistant Bemba | Assistant conversationnel (Claude) avec outils typés et base documentaire |
| Site public | Pages publiques, actualités, chiffres, réclamation en ligne |
Architecture technique
Chemin d'une requête
- Le navigateur appelle
https://bemba.ucp-pch.org. Traefik termine le TLS (certificat Let's Encrypt). - Les chemins
/apiet/photossont routés verspch_backend(port 8000), tout le reste verspch_frontend(build React).mariacare.ucp-pch.orgetsig.ucp-pch.orgsont redirigés versbemba.ucp-pch.org. - Dans
pch_backend, Nginx transmet à PHP-FPM ; Symfony interroge PostgreSQL (et Redis pour le cache). - 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
| Technologie | Version | Usage |
|---|---|---|
| React | 18 | Interface |
| TypeScript | 5 | Typage |
| TanStack Query | 5 | Requêtes et cache côté client |
| Zustand | 4 | État global |
| Tailwind CSS | 3 | Styles |
| React Router | 6 (HashRouter, URL en /#/…) | Navigation |
| i18next | 23 | Français, portugais, anglais |
| Leaflet, Recharts | 1.9, 2 | Cartes, graphiques |
| Sentry | 10 | Remontée d'erreurs |
| Service worker | — | Cache des ressources et mode hors ligne (plaintes) |
Backend
| Technologie | Version | Usage |
|---|---|---|
| PHP | 8.3 (FPM, Alpine) | Langage |
| Symfony | 7 | Framework, Messenger, Scheduler, Mailer |
| API Platform | 3 | Une partie des ressources REST |
| Doctrine ORM | 3 | Persistance, migrations |
| LexikJWT + Gesdinet | 2 / 1.5 | Jeton d'accès (1 h) et jeton de rafraîchissement |
| Sentry | 5 | Erreurs serveur |
Les identifiants des entités sont des UUID Ramsey (Ramsey\Uuid\UuidInterface).
Données et infrastructure
| Technologie | Version | Usage |
|---|---|---|
| PostgreSQL + PostGIS | 15 + 3.4 | Base pch_sig |
| Redis | 7 | Cache |
| Traefik | 2.10 | Reverse proxy, HTTPS |
| Docker + Compose v2 | — | Conteneurs (toujours -f) |
| Loki + Promtail | 2.9 | Journaux, 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.actionvé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