Pular para o conteúdo principal

Stack Technique

Cette page presente l'ensemble des technologies utilisees dans Bemba, organisees par composant.

Vue d'ensemble​

┌─────────────────────────────────────────────────────────────────┐
│ FRONTEND │
│ React 18 + TypeScript + TailwindCSS + React Query │
├─────────────────────────────────────────────────────────────────┤
│ INTELLIGENCE ARTIFICIELLE │
│ Claude AI + Cohere Embeddings + Web Speech API │
├─────────────────────────────────────────────────────────────────┤
│ BACKEND │
│ Symfony 7 + PHP 8.3 + API Platform 3 │
├─────────────────────────────────────────────────────────────────┤
│ BASE DE DONNEES │
│ PostgreSQL 15 + PostGIS 3.4 + Redis 7 │
├─────────────────────────────────────────────────────────────────┤
│ INFRASTRUCTURE │
│ Docker + Traefik + Nginx + Loki + Sentry │
└─────────────────────────────────────────────────────────────────┘

Frontend​

Framework Principal​

TechnologieVersionDescription
React18.2Bibliotheque JavaScript pour construire des interfaces utilisateur reactives
TypeScript5.3Superset de JavaScript avec typage statique pour une meilleure maintenabilite
React Router6.21Gestion du routage cote client (navigation SPA)

Styling & UI​

TechnologieVersionDescription
TailwindCSS3.4Framework CSS utility-first pour un styling rapide et coherent
Headless UI1.7Composants UI accessibles et non-styles (modals, dropdowns, tabs)
Heroicons2.1Collection d'icones SVG par les createurs de Tailwind
clsx2.1Utilitaire pour construire des classes CSS conditionnelles

Gestion d'Etat & Donnees​

TechnologieVersionDescription
TanStack Query5.17Gestion du cache et des requetes API (anciennement React Query)
Zustand4.5Gestion d'etat global legere et simple
React Hook Form7.49Gestion performante des formulaires avec validation
Axios1.13Client HTTP pour les appels API

Tableaux & Visualisation​

TechnologieVersionDescription
TanStack Table8.11Tableaux headless avec tri, filtrage, pagination
Chart.js4.4Graphiques interactifs (barres, lignes, camemberts)
React-Chartjs-25.2Wrapper React pour Chart.js
Recharts2.10Bibliotheque de graphiques basee sur D3
Mermaid11.12Generation de diagrammes a partir de texte

Cartographie (SIG)​

TechnologieVersionDescription
Leaflet1.9Bibliotheque de cartographie interactive open source
React-Leaflet4.2Composants React pour Leaflet
Leaflet.heat0.2Plugin pour les cartes de chaleur (heatmaps)
React-Leaflet-Cluster4.0Clustering de marqueurs pour grandes quantites de points
Turf.js7.3Analyse geospatiale cote client
React-Globe.gl2.37Visualisation 3D du globe terrestre

Export & Documents​

TechnologieVersionDescription
ExcelJS4.4Generation de fichiers Excel (.xlsx) cote client
jsPDF4.1Generation de documents PDF cote client
jspdf-autotable5.0Plugin jsPDF pour tableaux automatiques
html2canvas1.4Capture de screenshots de composants HTML
FileSaver2.0Sauvegarde de fichiers generes cote client

Internationalisation​

TechnologieVersionDescription
i18next23.16Framework d'internationalisation complet
react-i18next14.1Integration React pour i18next
i18next-browser-languagedetector7.2Detection automatique de la langue du navigateur

Autres​

TechnologieVersionDescription
date-fns3.3Manipulation de dates (alternative legere a Moment.js)
React Hot Toast2.4Notifications toast elegantes
React Dropzone15.0Zone de drop pour upload de fichiers
dnd-kit6.3Drag and drop accessible
React Markdown10.1Rendu de contenu Markdown
React Grid Layout2.2Layouts redimensionnables et draggables

Monitoring Frontend​

TechnologieVersionDescription
Sentry React10.42Suivi des erreurs et performances frontend

Backend​

Framework Principal​

TechnologieVersionDescription
PHP8.3Langage de programmation backend
Symfony7.1Framework PHP moderne et modulaire
API Platform3.2Framework pour creer des APIs REST/GraphQL

Base de Donnees​

TechnologieVersionDescription
Doctrine ORM3.0Object-Relational Mapping pour PHP
Doctrine Migrations3.3Gestion des migrations de schema de base de donnees
Ramsey UUID Doctrine2.0Support des UUID comme identifiants

Authentification & Securite​

TechnologieVersionDescription
LexikJWT2.20Authentification par JSON Web Tokens
Gesdinet JWT Refresh Token1.5Gestion des refresh tokens JWT
Symfony Security7.1Systeme de securite (voters, firewalls, authentification)
Symfony Rate Limiter7.1Protection contre les attaques par force brute
OTPHP11.4Generation de codes OTP (authentification 2FA)

Communication & API​

TechnologieVersionDescription
Nelmio CORS2.4Gestion des headers CORS pour l'API
Guzzle7.8Client HTTP pour appels vers services externes
Symfony Mailer7.1Envoi d'emails (SMTP, API)
Symfony Messenger7.1File de messages asynchrones

Generation de Documents​

TechnologieVersionDescription
PhpSpreadsheet2.0Generation de fichiers Excel (.xlsx)
PhpWord1.4Generation de fichiers Word (.docx)
DomPDF3.1Generation de PDF a partir de HTML
Endroid QR Code5.0Generation de codes QR

Planification & Taches​

TechnologieVersionDescription
Symfony Scheduler7.1Planification de taches recurrentes (cron)
Cron Expression3.3Parsing d'expressions cron
Symfony Lock7.1Mecanismes de verrouillage pour taches concurrentes

Monitoring Backend​

TechnologieVersionDescription
Sentry Symfony5.9Suivi des erreurs et performances backend
Symfony Monolog3.10Logging structure

Tests & Qualite​

TechnologieVersionDescription
PHPUnit10.5Framework de tests unitaires et fonctionnels
PHPStanlatestAnalyse statique du code PHP
PHPStan DoctrinelatestPlugin PHPStan pour Doctrine
PHPStan SymfonylatestPlugin PHPStan pour Symfony

Base de Donnees​

TechnologieVersionDescription
PostgreSQL15Base de donnees relationnelle performante et fiable
PostGIS3.4Extension PostgreSQL pour donnees geospatiales
Redis7Cache en memoire pour sessions, cache applicatif

Pourquoi PostgreSQL + PostGIS ?​

  • Donnees geographiques : Stockage natif de geometries (points, polygones)
  • Requetes spatiales : Distance, intersection, contenance
  • Index spatiaux : Performances optimisees sur les donnees geo
  • Conformite OGC : Standards ouverts de l'industrie SIG

Infrastructure​

Conteneurisation et réseau​

TechnologieVersionDescription
Docker Engine24+ (natif, Ubuntu)Conteneurs, sur des VPS OVH
Docker Composev2 (docker compose, toujours avec -f)Un fichier par environnement (docker-compose.prod.yml, docker-compose.preprod.yml)
Traefik2.10Reverse proxy, HTTPS Let's Encrypt, routage par nom d'hôte
NginxalpineFichiers statiques du frontend et de la documentation ; devant PHP-FPM dans le conteneur backend
PHP-FPM8.3 (image php:8.3-fpm-alpine)Exécution de Symfony
supervisord—Lance Nginx, PHP-FPM et les workers Messenger dans le conteneur backend

Images Docker utilisées​

ImageUsage
traefik:v2.10Reverse proxy et certificats
nginx:alpineFrontend et documentation
image construite depuis backend/Dockerfile.prodBackend (PHP-FPM + Nginx + workers)
postgis/postgis:15-3.4-alpinePostgreSQL + PostGIS
redis:7-alpineCache
grafana/loki:2.9.0, grafana/promtail:2.9.0Journaux
gcr.io/cadvisor/cadvisor, prom/node-exporter, prometheuscommunity/postgres-exporter, oliver006/redis_exporterMétriques (ports liés à 127.0.0.1)
boky/postfixRelais SMTP de la production, réservé au KoboToolbox de la préproduction

Monitoring & Observabilité​

TechnologieOùDescription
Loki + Promtailserveur de productionJournaux de tous les conteneurs, rétention un an, copie hors site
Exporteurs Prometheusserveur de production (127.0.0.1)Métriques des conteneurs, du système, de PostgreSQL et de Redis
Prometheus + Grafanaposte d'administration (monitoring/)Tableaux de bord, via des tunnels SSH
Sentryservice externeErreurs du frontend et du backend

Voir Monitoring et Logs.


Intelligence Artificielle (assistant Bemba)​

Assistant conversationnel​

TechnologieModèleDescription
Claude (Anthropic)claude-opus-5 par défaut (paramètre claude_model, variable CLAUDE_MODEL)Compréhension des questions et rédaction des réponses

Principe : le modèle n'écrit jamais de SQL. Il appelle des outils typés (backend/src/Service/Assistant/Outil/) qui appliquent eux-mêmes le cloisonnement, le filtre géographique et les permissions de l'utilisateur :

OutilRôle
Statistiques, couverture, suivi-évaluationChiffres agrégés dans le périmètre de l'utilisateur
Recherche, détail d'un ménageDonnées nominatives, si les droits le permettent
Référentiel géographique, localiserRégions, secteurs, localités, carte
NaviguerOuvrir un écran de l'application
Déposer une plainteEnregistrement guidé d'une réclamation
Rechercher dans les connaissancesBase documentaire (voir ci-dessous)
  • Langues : français, portugais, anglais, kriol (créole de Guinée-Bissau, réservé à l'assistant).
  • Limites : 40 questions par tranche de 10 minutes et par utilisateur ; un tour dure au plus 50 secondes.
  • Assistant du site public : point d'entrée anonyme séparé, trois outils sans accès aux données (présentation du projet, pages publiées, dépôt de réclamation), limité par adresse IP.
  • Contrat d'API et ajout d'un outil : docs/ASSISTANT_IA.md du dépôt.

Base documentaire (RAG)​

ÉlémentDescription
SourcesBuild de ce site de documentation (fr, pt, en) et articles publiés de la base de connaissances
IndexTable assistant_documents : recherche plein texte PostgreSQL (unaccent, configurations française, portugaise, anglaise)
Repli sémantiqueEmbeddings Cohere embed-multilingual-v3.0, utilisés seulement quand le plein texte ne trouve rien
Mise à jourphp bin/console app:assistant:indexer après chaque déploiement de la documentation et chaque nuit (cron 03:15)

Similarité des plaintes​

AlgorithmeUsage
Embeddings CohereRegroupement des plaintes similaires (seuil 0,75)
TF-IDFRepli sans clé Cohere (seuil 0,45)
Levenshtein, similar_textDoublons de noms (ménages, plaignants)
HaversineDistance entre coordonnées GPS

Voix​

La saisie et la lecture vocales utilisent la Web Speech API du navigateur (gratuite, sans service externe) : fr-FR, pt-PT, en-US ; le kriol utilise la voix portugaise.

Stockage des Embeddings​

Les embeddings sont stockes directement dans PostgreSQL :

ChampTypeDescription
embeddingJSONVecteur d'embedding Cohere (1024 dimensions)
cluster_idUUIDCluster associe
cluster_similarity_scoreFLOATScore de similarite avec le cluster
centroid_embeddingJSONEmbedding centre du cluster
keywordsJSONMots-cles extraits

Interface utilisateur​

L'assistant est un composant unique (components/assistant/AssistantChat.tsx), monté par un widget flottant sur toutes les pages sauf la carte, et par le panneau de la carte.


Documentation​

TechnologieVersionDescription
Docusaurus3.10Generateur de sites de documentation
MDX3.0Markdown avec composants React
Prism React Renderer2.3Coloration syntaxique du code

Outils de Developpement​

Frontend​

OutilDescription
Create React AppBoilerplate et configuration Webpack
ESLintLinter JavaScript/TypeScript
PostCSSTransformations CSS (autoprefixer)
JestFramework de tests
Testing LibraryTests de composants React

Backend​

OutilDescription
Symfony CLIOutils de developpement Symfony
ComposerGestionnaire de dependances PHP
Symfony MakerGeneration de code (entites, controllers)

Integrations Externes​

Services IA​

ServiceDescription
Anthropic (Claude)Assistant Bemba (clé ANTHROPIC_API_KEY)
CohereEmbeddings multilingues (clé COHERE_API_KEY), facultatif

Collecte de Donnees​

ServiceDescription
KoBoToolboxCollecte de donnees terrain (formulaires)
Survey SolutionsCollecte de donnees (CAPI/CAWI)

Paiements & Communication​

ServiceDescription
Opérateurs de paiement (Orange Money, MTN, Wave, TELECEL)Échange de fichiers (ST envoyé à l'opérateur, CT reçu pour la réconciliation) ; aucune API connectée
SMTP OVHE-mails transactionnels depuis noreply@ucp-pch.org, envoyés de façon asynchrone
Passerelle SMSCampagnes SMS

Choix Architecturaux​

Pourquoi cette stack ?​

ChoixJustification
React + TypeScriptTypage statique, maintenabilite, large ecosysteme
Symfony + API PlatformFramework mature, securise, API-first
PostgreSQL + PostGISDonnees geographiques natives, performances
TanStack QueryCache intelligent, synchronisation automatique
TailwindCSSStyling rapide, design system coherent
DockerEnvironnements reproductibles, deploiement simplifie
Claude AILLM performant, contexte long, support multilingue
Cohere EmbeddingsEmbeddings multilingues 100+ langues, ideal pour l'Afrique
Web Speech APIReconnaissance vocale native, gratuite, sans dependance externe

Principes​

  1. API-First : Le backend expose une API REST complete
  2. Type-Safe : TypeScript partout cote frontend
  3. Stateless : JWT pour l'authentification (pas de sessions serveur)
  4. Containerise : Tous les services dans Docker
  5. Observable : Monitoring complet (metriques, logs, traces)
  6. IA-Augmente : Assistant intelligent pour simplifier l'acces aux donnees
  7. Multilingue : Support natif de 4 langues incluant le Kriol

Versions Minimales Requises​

ComposantVersion Minimale
Node.js20.x
PHP8.3
PostgreSQL15
Docker24
Docker Compose2.x

Prochaines etapes​