CCL Platform Infrastructure : visio et stockage sur nos propres serveurs
C'est le backend que le CCL, Schoolaris et Polypro partagent pour les cours en direct, les enregistrements et les fichiers de cours. Il fait tourner la visio LiveKit avec quatre workers d'enregistrement, un stockage S3 multi-locataire sur MinIO et des liens de streaming signés à durée limitée. Chaque plateforme a ainsi ses cours en direct dans ses propres pages, des enregistrements qui reviennent en replay, et des fichiers vérifiés avant d'être stockés.
Je l'ai construit et je le maintiens en tant que développeur full-stack au CCL, sur les serveurs de l'entreprise.
Le client
Le CCL (Centre de Compétences et Leadership) est un centre de formation à Marrakech. Au CCL, je développe et maintiens plusieurs plateformes e-learning, dont les sites du CCL, Schoolaris, une plateforme de soutien scolaire en ligne pour les élèves marocains, et Polypro Academy, une plateforme d'apprentissage des langues. Le CCL, Schoolaris et Polypro intègrent la visio : les trois avaient besoin de vidéo, d'enregistrement et de stockage.
Le besoin
Les cours en direct du CCL passaient par des liens Zoom, et les enregistrements restaient dans l'outil de visio au lieu d'être à côté du programme de l'apprenant. L'objectif : ramener les cours dans les plateformes, avec la visio et les enregistrements sur les serveurs de l'entreprise plutôt que chez un service facturé à la minute.
Auto-héberger la visio demande plus qu'un serveur. L'enregistrement est lourd : chaque enregistrement fait tourner un Chrome headless complet, et un worker en tenait environ 5 à 8 avant que la machine ne peine. Un cours enregistré pèse environ 1 Go par heure, les fichiers envoyés doivent être vérifiés avant d'être stockés, et les vidéos doivent passer par des liens qui ne restent pas ouverts indéfiniment.
Ce que j'ai développé
LiveKit derrière Caddy, avec TURN
Le serveur LiveKit, Redis et TURN tournent dans Docker, et Caddy gère le HTTPS. TURN sur TLS permet aux élèves derrière un réseau strict (école, bureau, mobile) de se connecter quand même, et notre API crée les salles et signe un jeton à courte durée pour chaque élève.
Quatre workers d'enregistrement
Les enregistrements passent par quatre workers LiveKit Egress qui partagent une file Redis, chacun avec son propre dossier temporaire. Un dossier partagé a un jour fait que les workers supprimaient les sockets des autres : on aurait dit un problème de capacité, ce n'en était pas un.
Une limite fixée par un test de charge
En mai 2026, sur la machine de production à 80 cœurs, 24 enregistrements simultanés ont utilisé environ la moitié du CPU, avec tous les fichiers complets ; 30 passaient, mais sans aucune marge. L'API refuse donc de lancer seule un 25e enregistrement, n'arrête jamais un enregistrement en cours, et un admin peut passer outre à la main.
Des salles qui tiennent malgré une coupure
Les salles sont créées par l'API, pas à l'arrivée du premier participant, et restent ouvertes 15 minutes en attendant la première arrivée et 5 minutes après le dernier départ. Une coupure Wi-Fi du formateur ne met fin ni au cours ni à son enregistrement.
Un stockage multi-locataire sur MinIO
Les fichiers de cours et les enregistrements de chaque plateforme vont dans un stockage S3 sur MinIO. ClamAV vérifie chaque fichier avant qu'il soit stocké, et les vidéos sont transcodées en HLS adaptatif pour le streaming.
Des liens de streaming signés et limités dans le temps
Les vidéos et les fichiers arrivent aux apprenants par des liens signés qui expirent, plutôt que par des URL publiques permanentes.
Ce que ça leur permet
Cours en direct, enregistrements et fichiers de cours tournent sur des serveurs que nous maîtrisons : conteneurisés avec Docker derrière Caddy (HTTPS automatique), avec ClamAV qui vérifie chaque fichier avant stockage et des vidéos transcodées en HLS adaptatif.
Le CCL, Schoolaris et Polypro font tourner leurs cours en direct dans leurs propres plateformes, sur une seule installation partagée, sans envoyer les élèves vers des liens de réunion. Les enregistrements arrivent dans un stockage que l'entreprise maîtrise et reviennent en replay. Le test de charge donne une limite connue, 24 enregistrements simultanés, qui ne vaut que pour ce matériel : changer de serveur veut dire refaire le test.
Articles liés
Autres projets
Polypro AcademyLes apprenants sont positionnés à leur niveau en quelques minutes et s'entraînent à l'oral avec une IA à toute heure, puis obtiennent des certificats vérifiables en ligne par tous. Les organisations partenaires reçoivent des clés de licence et les affiliés touchent des commissions.
CCL E-LearningLes apprenants achètent et suivent les capsules vidéo à leur rythme, avec paiement Stripe et connexion par lien magique, sur le même système que le reste du CCL.
SchoolarisLes parents suivent la progression de chaque enfant et paient en ligne (Stripe ou CMI), les enseignants animent les cours en direct depuis le back-office, et l'équipe gère ventes, comptabilité et revenus au même endroit.
