Ce que Garage est, et ce qu'il n'est pas
Garage est un magasin d'objets compatible S3 pensé pour les déploiements auto-hébergés de petite taille, éventuellement répartis sur plusieurs sites. Il tient dans un conteneur, n'a pas besoin d'un serveur de base de données à côté, et sur un déploiement mono-nœud il consomme quelques mégaoctets de mémoire au repos.
Ce qu'il n'est pas, il faut le dire tout de suite : Garage n'a pas de console web. L'administration passe par l'outil en ligne de commande garage et par une interface d'administration HTTP. Ce n'est pas une fonction oubliée, c'est un choix : le service reste petit et sa surface d'exploitation étroite. Des projets communautaires proposent une interface dans le navigateur par-dessus l'interface d'administration si vous y tenez.
Si vous cherchiez ce point précis parce que MinIO a retiré sa console de l'édition communautaire en 2025 — puis cessé de publier ses images Docker communautaires — la réponse honnête est que Garage ne vous rendra pas cette console. Il vous rend en revanche un projet dont la licence AGPLv3 ne réserve aucune fonction à une édition payante.
Préparer le serveur
Garage se déploie en conteneur. Sur un VPS Debian ou Ubuntu à jour, l'essentiel est d'avoir Docker et le plugin Compose :
curl -fsSL https://get.docker.com | shCôté dimensionnement, Garage lui-même est frugal : c'est le volume de données que vous stockez qui décide, pas le service. Un VPS d'entrée de gamme suffit à faire tourner le daemon ; prévoyez le disque en fonction de ce que vous comptez y déposer, et gardez à l'esprit qu'un nœud unique conserve une seule copie de vos objets.
La configuration minimale
Garage lit un fichier garage.toml. Pour un nœud unique, l'essentiel tient en quelques lignes — notez le replication_factor = 1, qui dit explicitement qu'il n'y a pas de réplication :
metadata_dir = "/var/lib/garage/meta"
data_dir = "/var/lib/garage/data"
db_engine = "sqlite"
replication_factor = 1
rpc_bind_addr = "[::]:3901"
rpc_public_addr = "127.0.0.1:3901"
rpc_secret = "<64 caractères hexadécimaux>"
[s3_api]
s3_region = "garage"
api_bind_addr = "[::]:3900"
root_domain = ".s3.garage.localhost"
[admin]
api_bind_addr = "[::]:3903"
admin_token = "<jeton d'administration>"Le rpc_secret doit faire 32 octets, soit 64 caractères hexadécimaux : openssl rand -hex 32.
Démarrer, et obtenir ses identifiants S3
Depuis la version 2.3, Garage sait monter une grappe d'un seul nœud et créer son premier compartiment tout seul, à partir de variables d'environnement. C'est ce qui évite la séquence manuelle layout assign / layout apply / bucket create / key create :
services:
garage:
image: dxflrs/garage:v2.3.0
restart: unless-stopped
command: ["/garage", "-c", "/etc/garage/garage.toml", "server", "--single-node", "--default-bucket"]
environment:
GARAGE_DEFAULT_BUCKET: mon-compartiment
GARAGE_DEFAULT_ACCESS_KEY: GK...
GARAGE_DEFAULT_SECRET_KEY: ...
ports:
- "127.0.0.1:3900:3900"
volumes:
- ./config:/etc/garage
- garage-meta:/var/lib/garage/meta
- garage-data:/var/lib/garage/dataDeux pièges valent d'être signalés, parce qu'ils coûtent une demi-heure chacun. L'image est distroless : elle n'a pas de shell, et son entrypoint est vide — la commande doit donc nommer le binaire en chemin absolu (/garage) et le fichier de configuration (-c), faute de quoi le conteneur boucle sur No such file or directory. Et la clé d'accès S3 doit avoir la forme attendue par Garage : le préfixe GK suivi de 30 caractères hexadécimaux.
Vérifier que ça marche
Un appel anonyme sur l'API S3 doit répondre 403, avec le message Garage does not support anonymous access yet. C'est le bon signe : le service est vivant et refuse une requête non signée.
curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:3900/
# 403 → l'API répondL'interface d'administration, elle, répond 200 avec le jeton :
curl -H "Authorization: Bearer $ADMIN_TOKEN" http://127.0.0.1:3903/v2/ListBucketsÀ partir de là, n'importe quel client S3 fonctionne : aws --endpoint-url, mc, rclone, ou directement restic pour vos sauvegardes.
Ce qu'il faut garder en tête
Un nœud unique n'est pas de la redondance. Garage sait répliquer entre plusieurs machines, éventuellement sur des sites différents — c'est même sa raison d'être. Mais tant que vous n'avez qu'un nœud, vos objets existent en un seul exemplaire, sur un seul disque. Gardez la discipline de sauvegarde que vous auriez de toute façon.
Exposez l'API derrière un domaine et du TLS, pas sur une IP nue : publiez le port sur la boucle locale et laissez nginx faire le proxy et le certificat. C'est ce que fait l'installation en un clic du Marketplace.
La compatibilité S3 porte sur la surface courante, pas sur chaque extension propre à AWS. Les clients, bibliothèques et outils de sauvegarde standard fonctionnent sans modification ; si vous dépendez d'un appel inhabituel, vérifiez-le dans la documentation du projet avant de migrer.