GAALAFIS : Git Authenticated and Authorized LArge FIle Storage

Une architecture de référence pour Git et Git-LFS avec un contrôle d’accès par dépôt, conçue pour la modularité, la réutilisabilité et la validation itérative de la conception.

2024-01-07

En commençant à auto-héberger certains de mes projets, j’ai vite réalisé que Git seul ne suffisait pas. Il me fallait une solution capable de gérer les fichiers volumineux et d’assurer une authentification correcte. Les solutions existantes comme GitLab ou Gitea étaient trop lourdes : elles proposaient des tableaux de bord, des pull requests, tout un écosystème dont je n’avais pas besoin. Je voulais quelque chose de plus léger, modulaire et sous contrôle. C’est ainsi qu’est né GAALAFIS : une architecture de référence permettant de construire ses propres outils sur une base Git + LFS solide.

Ce projet est autant une aventure d’ingénierie qu’une exploration méthodologique. Il a d’abord été l’occasion d’expérimenter les principes du cours transversal Conception de systèmes complexes, suivi en dernière année à CentraleSupélec (2024). Le cours portait sur la conception de grands systèmes d’ingénierie — avions, ponts, infrastructures — mais j’étais curieux de voir comment ces méthodes pouvaient s’appliquer au logiciel, souvent perçu comme un domaine dominé par l’agile et ses itérations rapides.

Dans ce cadre, chaque décision — des cas d’usage aux choix de composants en passant par la conception des API — a été appuyée par une documentation structurée et des allers-retours entre théorie et pratique. C’était plus formel qu’un développement classique, mais l’expérience en valait la peine.

Du besoin au design

L’objectif initial était simple : concevoir un serveur capable de gérer des dépôts Git, des fichiers volumineux via LFS, et une authentification contrôlée. Pour garantir la réutilisabilité et la flexibilité, j’ai dû penser la modularité, la séparation des responsabilités et l’extensibilité dès le départ. Chaque exigence a été raffinée et validée selon des scénarios réels et des besoins utilisateurs.

Alors que la plupart des projets logiciels modernes reposent sur des pratiques agiles — peu de spécifications initiales, beaucoup d’itérations — GAALAFIS a exploré une autre voie : définir clairement les exigences et interfaces dès le début, puis itérer sur cette base solide. Chaque route d’API, chaque réponse attendue, chaque scénario d’erreur provient d’un besoin utilisateur ou de la spécification Git-LFS.

Le travail a commencé par une exploration du contexte. Même si la théorie recommande de partir uniquement du point de vue utilisateur, on ne part jamais d’une feuille blanche. Des standards industriels et des usages établis guident les premières hypothèses. J’ai donc esquissé un premier diagramme de contexte.

Diagramme de contexte
Diagramme de contexte

Le risque, à ce stade, est de prendre ce premier schéma comme une cible finale. C’est là qu’interviennent les stories utilisateurs, qui permettent de valider et d’ajuster, en retardant le plus possible les choix irréversibles. À partir de ces interactions — un développeur pousse du code, téléverse des fichiers, gère des locks — les exigences fonctionnelles et non fonctionnelles se sont précisées.

Diagramme des fonctions
Diagramme des fonctions

Ces fonctions ont ensuite servi à dériver les exigences techniques, à différents niveaux de détail.

Architecture et composants

GAALAFIS repose sur un ensemble d’outils existants et de composants personnalisés. Certains sont déjà largement admises comme des standard, d’autres demandent des choix plus fins, voire un développement spécifique.

Les principaux composants sont :

L’architecture est conçue pour la modularité : le serveur LFS peut fonctionner en mode “complet” (avec batch, fichiers et verrous) ou en mode minimal, selon les besoins. Chaque backend implémente une interface claire, permettant d’échanger le stockage ou de modifier la stratégie d’authentification sans toucher au reste du système.

Diagramme des composants
Diagramme des composants

Authentification et autorisation

L’un des défis majeurs était de combiner les mécanismes d’authentification de Git et de LFS de façon fluide. Lorsqu’un utilisateur exécute une commande Git-LFS, le client se connecte d’abord à Gitolite via SSH. Gitolite vérifie la clé de l’utilisateur et émet un jeton JWT signé, correspondant au dépôt et à l’action demandée. Ce jeton est ensuite transmis au serveur LFS, qui le valide avant d’autoriser l’opération.

Ce mécanisme fait de Gitolite la source unique de vérité pour les permissions, tandis que le serveur LFS se concentre sur la gestion et le stockage. L’authentification reste sans état grâce à l’usage des JWT.

Diagramme de séquence : obtention d’un JWT depuis le serveur Gitolite
Diagramme de séquence : obtention d’un JWT depuis le serveur Gitolite

Le jeton peut ensuite être utilisé auprès du serveur LFS pour obtenir des liens signés permettant de téléverser ou télécharger des fichiers.

Diagramme de séquence : utilisation du JWT pour accéder au serveur LFS
Diagramme de séquence : utilisation du JWT pour accéder au serveur LFS

Déploiement

Le déploiement s’appuie sur Docker Compose : chaque composant tourne dans son propre conteneur, les secrets sont gérés de manière sécurisée, et seuls les points d’entrée essentiels sont exposés. Grâce à sa modularité, chaque service peut être remplacé ou étendu indépendamment, ce qui rend l’ensemble adaptable à différentes configurations.

Leçons du processus de conception

Travailler sur GAALAFIS m’a offert une perspective concrète sur le processus en V, bien différente de son image souvent figée. Souvent caricaturé comme rigide par les approches agiles, ce modèle est en réalité profondément itératif. Chaque phase — exigences, conception, implémentation, validation — forme un petit cycle complet où l’on affine, vérifie et ajuste avant d’avancer.

Dans GAALAFIS, cette logique a guidé toute la progression. Je n’ai pas conçu un serveur Git + LFS complet d’un seul bloc. J’ai défini les cas d’usage et exigences principales, puis descendu progressivement vers la conception des composants : Gitolite, serveur LFS, PostgreSQL, MinIO, et le signataire JWT. À chaque étape, j’ai construit, testé, et révisé.

Ce va-et-vient constant a permis au système d’évoluer de manière cohérente, tout en maintenant la lisibilité et la cohérence des interfaces. En pratique, ce processus montre que rigueur et expérimentation ne sont pas opposées : une conception structurée peut très bien accueillir l’itération et l’apprentissage continu.

GAALAFIS est aujourd’hui prêt pour l’expérimentation. Les développeurs peuvent cloner le dépôt, fournir leurs clés et secrets, et lancer le système en une commande Docker Compose. Les opérations Git et Git-LFS fonctionnent comme prévu, tout en offrant une base claire pour explorer, apprendre et construire.

Ce projet n’est pas un produit fini, mais une plateforme d’expérimentation sur la conception et la mise en œuvre de systèmes logiciels modulaires.