Un système existant PHP de 1 500 fichiers, reconstruit en monolithe modulaire faisant tourner les opérations de formation de quatre pays.
Liren Language & Communications gère des formations linguistiques en entreprise au Luxembourg, en Belgique, en France et aux Émirats arabes unis. Feneco a reconstruit la plateforme derrière cette activité — d'un système PHP non documenté, sans tests et sans processus, vers un monolithe modulaire .NET avec une véritable infrastructure, et un générateur de cours par IA dont l'approbation humaine est conçue dans le modèle de données, et non ajoutée après coup.
L'existant
~1 500 fichiers PHP procéduraux, des appels bruts à mysqli_connect, et un sous-système CodeIgniter « elearning » séparé, greffé par-dessus — le tout sur un hébergement cPanel mutualisé. Aucun schéma versionné ; il n'existait que dans la base de données de production en direct. Pas de CI/CD, pas d'infrastructure en tant que code, pas d'observabilité, pas de documentation, pas de tests. Chaque changement était une modification directe sur un système que personne ne pouvait toucher avec confiance.
Un monolithe modulaire, pas une nouvelle solution de fortune
Feneco a reconstruit le système central de Liren en monolithe modulaire en .NET : CQRS avec MediatR, EF Core sur PostgreSQL, agrégats de style DDD avec identifiants fortement typés, un pattern outbox pour des événements de domaine fiables, et une identité entièrement déléguée à Auth0. Dix projets ciblés — domaine, infrastructure, contrats, services — remplacent l'unique base de code PHP indifférenciée.
Migrer les données, pas seulement le code
Sans schéma versionné et avec un système de hachage de mots de passe hérité incompatible avec le nouveau système d'identité basé sur Auth0, il ne s'agissait jamais d'une simple copie de schéma à schéma. La migration lit les données existantes et les réécrit via les mêmes méthodes et invariants de domaine — l'unicité globale des e-mails entre RH, formateurs et apprenants, entre autres — que l'application en production applique, dans un chargement ordonné par dépendances (entreprises → identité → RH/formateurs/apprenants → inscriptions → commercial/facturation), avec réconciliation et une restauration répétée avant la bascule.
Un processus là où il n'y en avait aucun
L'ensemble de l'infrastructure AWS — VPC, RDS, ECS Fargate, ALB, CloudFront/S3, Secrets Manager — est géré en Terraform, déployé via GitHub Actions avec OIDC, de sorte qu'aucune identification AWS de longue durée ne traîne en CI. Les déploiements sont verrouillés derrière un environnement exigeant une revue. La base de données et le répartiteur de charge n'ont aucun point d'accès public. La région d'infrastructure a été choisie délibérément pour la latence vis-à-vis de la base de clients réelle au Luxembourg, en Belgique et en France — pas par défaut vers la région la moins chère ou la plus proche de Feneco.
Un générateur de cours par IA où « approuvé » est une donnée, pas une formalité
Les modules de cours suivent un cycle de génération explicite imposé par le modèle de domaine lui-même, et non laissé à la convention ou à l'état de l'interface :
Demander une génération et la compléter sont des commandes distinctes ; un module ne peut pas être approuvé tant qu'il n'a pas réellement été généré, et l'approbation enregistre exactement qui l'a approuvé et quand, directement sur l'entité. L'IA rédige des brouillons. Un humain décide ce qui est publié — et cette décision est une donnée, pas une case à cocher qui disparaît après coup.
Statut
En production, faisant tourner les opérations de formation de Liren au Luxembourg, en Belgique, en France et aux Émirats arabes unis.
Si un système existant est ce qui empêche votre équipe de fonctionner comme l'entreprise en a réellement besoin, parlons-en.