SE

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 site CCL Platform Infrastructure
CCL Platform Infrastructure, en ligne sur ccl.ma

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.

Autres projets