Aller au contenu
Documentation Plateforme READ Ouvrir la plateforme

Chapitre 1

Architecture

Les composants de la plateforme, les conteneurs qui les portent, les volumes de données et les flux réseau.

Concerne :Équipe techniqueHébergeur

La plateforme READ est une application web unique (un « monolithe modulaire »), livrée en conteneurs Docker et orchestrée par Docker Compose sur un seul serveur.

Figure 1.1 Architecture de déploiement de la plateforme

Composants logiciels#

  • Application web en .NET 10 (Blazor, rendu côté serveur) : pages légères, peu de JavaScript (graphiques, calendrier, grille de saisie). Elle sert le site des comptes connectés (/admin, /espace), le portail public (/) et l'API (/api/v1).
  • Module hors ligne (/terrain/) : application WebAssembly installable sur un téléphone (PWA). Elle est servie par la même application et dialogue avec la plateforme par l'API, au moyen de jetons.
  • Base de données PostgreSQL 16. Les dates y sont enregistrées en UTC et affichées à l'heure de Niamey ; les montants sont en FCFA sans décimale.
  • Relais HTTPS Caddy : il obtient et renouvelle automatiquement le certificat (Let's Encrypt), ajoute les en-têtes de sécurité, compresse les réponses et transmet les requêtes à l'application.

Chaque écriture en base produit une ligne du journal d'audit (anciennes et nouvelles valeurs), dans la même transaction. Le journal est en ajout seul : l'application n'a pas le droit de le modifier ni de le vider.

Conteneurs#

Le projet Compose s'appelle toujours read-plateforme (fixé dans compose.yaml), quel que soit le dossier où se trouve le code. Les conteneurs portent donc des noms comme read-plateforme-app-1.

ServiceImageRôle
dbpostgres:16.15-alpineBase de données ; port non publié sur l'hôte
migrationsread-plateforme:latestLancé à chaque docker compose up, puis arrêté : applique les migrations du schéma avec le compte propriétaire et crée ou met à jour le rôle restreint de l'application
appread-plateforme:latestApplication, port 8080 interne ; se connecte avec le rôle restreint
caddycaddy:2.11.7-alpineSeul service exposé : ports 80 et 443 (TCP, et UDP pour HTTP/3)

L'image read-plateforme:latest est construite sur le serveur à partir du code source (Dockerfile) : aucun registre d'images n'est nécessaire.

Remarque

Au premier démarrage sur une base vide, le service migrations écrit dans son journal une erreur sur la table __EFMigrationsHistory avant de la créer. Elle est normale.

Volumes de données#

VolumeContenuSauvegardé
read-plateforme_pgdataFichiers de la base PostgreSQLOui, par pg_dump
read-plateforme_app-donneesFichiers déposés : logo, pièces jointes, ressources de la bibliothèque, e-mails écrits localement (boite-envoi/)Oui
read-plateforme_app-keysClés de protection des données (cookies de session, jetons)Oui
read-plateforme_app-logsJournaux quotidiens de l'application, 30 joursNon
read-plateforme_caddy-dataCertificats HTTPSNon (redemandés automatiquement)
read-plateforme_caddy-configÉtat de CaddyNon

Attention

Ne supprimez jamais les volumes pgdata, app-donnees ou app-keys : docker compose down -v efface toutes les données de la plateforme. Sans app-keys, toutes les sessions et tous les jetons du module hors ligne deviennent invalides (les utilisateurs doivent se reconnecter).

Flux réseau#

SensDepuisVersPortUsage
EntrantInternetcaddy80/TCPRedirection vers HTTPS, validation du certificat
EntrantInternetcaddy443/TCP et 443/UDPSite, portail, API, module hors ligne
EntrantPoste de l'équipe techniqueServeur22/TCPSSH (déploiement, exploitation)
Internecaddyapp8080Relais HTTP sur le réseau Docker
Interneapp, migrationsdb5432Base de données
SortantcaddyLet's Encrypt443Obtention et renouvellement du certificat
SortantappServeur SMTP587 ou 465 (réglable)E-mails (mot de passe oublié, notifications)
SortantSauvegardeStockage objet S3443Copie chiffrée hors serveur

L'application ne croit l'adresse du client transmise par Caddy (en-tête X-Forwarded-For) que si la requête vient d'un réseau privé (réseau Docker) : la limitation des connexions et le journal d'audit voient la vraie adresse du visiteur.

Organisation du serveur#

EmplacementContenu
/opt/read/.envRéglages et secrets (droits 600) ; lié dans code/deploy/.env
/opt/read/codeCode de la version déployée ; fichier VERSION = commit
/opt/read/code.ancienVersion précédente, pour un retour arrière
/opt/read/deploiement.logCompte rendu du dernier déploiement
/var/backups/readSauvegardes locales, un dossier horodaté par jour
/etc/systemd/system/read-sauvegarde.*Minuteur de la sauvegarde quotidienne

Tâches de fond#

L'application exécute elle-même quelques tâches, sans planificateur externe :

  • chaque minute : envoi des e-mails de notification en attente ;
  • chaque jour à partir de 7 h (heure de Niamey) : rappels (activités et rapports en retard), puis suppression des notifications de plus de 90 jours ;
  • chaque jour (première passe cinq minutes après le démarrage) : suppression des listes de présence arrivées à échéance, effacement des coordonnées des demandes d'inscription refusées depuis 12 mois, purge des jetons de l'API expirés ou révoqués.

La sauvegarde, elle, est lancée par un minuteur systemd du serveur (chapitre Sauvegarde et restauration).

Plateforme READ — Édition 1.0 — octobre 2026. Documentation générée à partir des sources du projet ; les captures montrent des données de démonstration entièrement fictives.