Garage
Garage est une solution de stockage d'objets distribuée compatible avec l'API S3 (Amazon Simple Storage Service). Conçu pour être léger, résilient et facilement déployable, Garage permet de stocker de grandes quantités de données de manière répartie sur plusieurs zones, tout en assurant la redondance, la haute disponibilité et la tolérance aux pannes.
Installation
Les machines garage font partie des machines virtuelles créés avec Terraform. On en aura une dans chaque serveur (Titanium, Plutonium et Uranium). Une fois la création faite avec Terraform, nous allons mettre en place Garage avec une configuration Nix.
Nix
Configuration
Nous devons ajouter un nouveau dossier "Garage" dans la configuration Nix des serveurs. Dans ce dossier, on va créer un fichier garage.nix pour y mettre la configuration de Garage commune aux 3 machines :
NB : Pour l'instant, nous n'avons pas à notre disposition les node_id n'ayant pas encore les différents Garage d'installé
Pour chaque machine, on crée un dossier avec un fichier default.nix permettant de récupérer les différents fichiers dont il aura besoin. On ajoute ensuite dans chaque dossier un fichier networking.nix pour la partie réseau et adresse IP de la machine et un fichier garage.nix avec la configuration unique de chaque machine :
Application de la configuration
Pour appliquer la configuration à nos machines, nous ajoutons dans Colmena nos configurations :
Pour appliquer la configuration, on effectue cette commande :
Configuration de Garage
Node id
Maintenant que garage est installé sur les machines, nous pouvons récupérer les nodes id de chaque machine :
Une fois tous les nodes id récupérés, on modifie de nouveau notre configuration Nix que nous allons réappliquer.
Pour vérifier que les différentes machines se reconnaissent entre elles, nous utilisons cette commande :

Zones
Dans Garage S3, une zone représente un groupe logique de serveurs, souvent basé sur un critère géographique ou physique (comme un datacenter ou un bâtiment). Bien que le concept soit libre et personnalisable, il est principalement utilisé pour renforcer la résilience et la haute disponibilité du stockage. Dans notre projet, nous allons configurer des zones afin de :
Répartir les données sur plusieurs emplacements logiques, ce qui réduit le risque de perte en cas de panne locale (ex. : coupure réseau ou crash d’un nœud).
Simuler un environnement multi-sites, comme cela se fait dans une infrastructure cloud professionnelle.
Améliorer la tolérance aux pannes : Garage essaiera automatiquement de répliquer les objets stockés dans des zones différentes, garantissant ainsi que les données restent accessibles même si une zone devient indisponible.
Tester des scénarios de basculement (failover) et de redondance dans un contexte distribué.
En résumé, l'utilisation des zones nous permet d’assurer que nos données sont à la fois redondées et réparties, une exigence essentielle pour tout système de stockage fiable et robuste.
Voici les zones créées :




Bucket
Un bucket dans Garage (comme dans AWS S3) représente une unité logique de stockage. C’est dans ces buckets que seront stockés les fichiers et objets utilisés par les services de notre infrastructure.
Dans notre projet, nous devons créer deux buckets :
longhorn: utilisé pour le stockage persistant dans notre cluster Kubernetes (via Longhorn).xcp-ng: utilisé pour les sauvegardes de machines virtuelles gérées avec Xen Orchestra.
Chaque bucket est distribué sur l’ensemble des zones définies.

API Key
Pour interagir avec les buckets, Garage utilise un système de clés API. Chaque clé correspond à une identité autorisée à lire ou écrire sur un ou plusieurs buckets.
Nous devons générer :
une clé
longhorn-keypour permettre à Longhorn de lire et écrire dans son bucket dédié.une clé
xcp-ng-keypour autoriser Xen Orchestra à sauvegarder et restaurer des machines virtuelles dans son propre espace.


ACL
Une fois les clés créées, nous devons explicitement définir les droits d’accès à chaque bucket :
--read: autorise la lecture des données du bucket.--write: autorise l’écriture (upload, modification, suppression) dans le bucket.
Cela permet de garantir un contrôle fin des accès, évitant qu’un service ait plus de permissions que nécessaire (principe du moindre privilège). Cette configuration est également essentielle pour la sécurité et la traçabilité des opérations sur les données.

Sur chaque Bucket, nous pouvons vérifier que notre configuration s'est bien répliqué en effectuant cette commande :
