[{"data":1,"prerenderedAt":134},["ShallowReactive",2],{"seo-verification":3,"blog-heberger-garage-s3-vps-ma-fr":6,"promo-bar-likely":133},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-heberger-garage-s3-vps-ma-fr",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"noindex":19,"publishedAt":20,"updatedAt":21,"category":22,"categories":28,"featuredImage":30,"bgImage":31,"posterImage":32,"relatedSolution":33,"intro":36,"sections":37,"ctaTitle":128,"ctaBody":129,"ctaButton":130,"ctaUrl":131,"relatedPosts":132},245,"heberger-garage-s3-vps",{"fr":10,"en":12,"ar":13,"es":14},"host-garage-on-a-vps-s3-object-storage-that-belongs-to-you","استضافة-garage-على-خادم-vps-تخزين-كائنات-s3-يملكه-أنت","alojar-garage-s3-en-un-vps","Héberger Garage sur un VPS : votre stockage objet compatible S3","Déployez Garage sur un VPS pour obtenir un storage bucket S3 personnel — sauvegardes, fichiers d'app, site statique — sans dépendance à un cloud tiers.",9,3,false,"2026-08-10T00:00:00+00:00","2026-11-08T01:13:16+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},7,"Self-hosting","self-hosting","bg-indigo-500\u002F10 text-indigo-400","cloud",[29],{"id":23,"name":24,"slug":25,"color":26,"icon":27},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fheberger-garage-s3-vps-poster.svg",{"categorySlug":34,"appSlug":35},"bases-de-donnees","garage","Vous voulez un storage bucket S3 à vous — pour vos sauvegardes restic, les fichiers d'une application, ou l'origine d'un site statique — sans ouvrir de compte chez un fournisseur de cloud. Garage, développé par le collectif Deuxfleurs, fait exactement cela : un seul binaire Rust qui expose une API S3, assez sobre pour cohabiter avec le reste de votre serveur. Ce guide part de zéro et va jusqu'au premier fichier déposé, puis couvre les cas d'usage courants et les pièges réels à éviter.",[38,42,52,55,58,77,80,89,121,125],{"type":39,"title":40,"body":41},"h2","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 le projet le destine à du matériel modeste : ses prérequis officiels s'en tiennent à 1 Go de RAM.\n\nCe qu'il n'est pas, il faut le dire tout de suite : **Garage n'intègre pas encore de console web**. L'administration passe par l'outil en ligne de commande `garage` et par une interface d'administration HTTP. Deuxfleurs teste une interface dans le navigateur, Garage Web Admin, publiée à part en pré-version et appelée à rejoindre le binaire. Des projets communautaires proposent aussi une interface par-dessus l'interface d'administration si vous y tenez.\n\nSi 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 et archivé son dépôt — la réponse honnête est que Garage ne vous rend pas, aujourd'hui, une console intégrée équivalente. Il vous rend en revanche un projet dont la licence AGPLv3 ne réserve aucune fonction à une édition payante.",{"type":43,"title":44,"items":45},"ul","Ce que Garage fait bien sur un VPS",[46,47,48,49,50,51],"**API S3 standard** : compatible avec `aws` CLI, `rclone`, `mc`, `restic`, les SDK Python\u002FGo\u002FRust et la quasi-totalité des clients S3 du marché.","**Empreinte modeste** : le projet vise du matériel modeste — il cohabite sans friction avec un serveur web, une base de données ou un reverse proxy sur le même VPS.","**Pas de dépendance externe** : ni PostgreSQL, ni Redis, ni etcd. Le moteur de métadonnées est embarqué (LMDB ou SQLite au choix).","**Réplication optionnelle** : en mono-nœud, un seul disque suffit ; en multi-nœuds, Garage réplique les objets entre machines, même sur des sites différents.","**Licence AGPLv3 franche** : aucune fonctionnalité réservée à une édition payante, pas de limite sur le volume ni sur le nombre de compartiments.","**Sous-domaines virtuels** : Garage gère le routing `\u003Cbucket>.s3.votre-domaine.com`, ce qu'attendent certains clients S3 et SDK.",{"type":39,"title":53,"body":54},"Prérequis : dimensionner votre VPS pour un storage bucket","Garage lui-même est frugal — c'est le **volume de données** que vous stockez qui décide de la taille du disque, pas le service. Un VPS d'entrée de gamme suffit à faire tourner le daemon. Pour une utilisation typique (sauvegardes applicatives, assets d'un site) :\n\n- **CPU** : 1 vCPU suffit ; Garage est peu intensif en calcul.\n- **RAM** : 1 Go, la valeur des prérequis officiels du projet ; le moteur LMDB tient ses index en mémoire mappée.\n- **Disque** : SSD NVMe de la taille de vos données, plus 20 % de marge pour les métadonnées. Un nœud unique conserve **une seule copie** de vos objets — planifiez en conséquence.\n- **OS** : Debian 12 ou Ubuntu 22.04 LTS, Docker et le plugin Compose installés.\n\nPour installer Docker en une commande :\n\n```bash\ncurl -fsSL https:\u002F\u002Fget.docker.com | sh\n```",{"type":39,"title":56,"body":57},"Configuration minimale du storage bucket","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 :\n\n```toml\nmetadata_dir = \"\u002Fvar\u002Flib\u002Fgarage\u002Fmeta\"\ndata_dir = \"\u002Fvar\u002Flib\u002Fgarage\u002Fdata\"\ndb_engine = \"sqlite\"\nreplication_factor = 1\n\nrpc_bind_addr = \"[::]:3901\"\nrpc_public_addr = \"127.0.0.1:3901\"\nrpc_secret = \"\u003C64 caractères hexadécimaux>\"\n\n[s3_api]\ns3_region = \"garage\"\napi_bind_addr = \"[::]:3900\"\nroot_domain = \".s3.votre-domaine.com\"\n\n[admin]\napi_bind_addr = \"[::]:3903\"\nadmin_token = \"\u003Cjeton d'administration>\"\n```\n\nLe `rpc_secret` doit faire 32 octets, soit 64 caractères hexadécimaux : `openssl rand -hex 32`. Le `root_domain` détermine le schéma de sous-domaine pour le routing par compartiment — remplacez-le par votre domaine réel.",{"type":59,"title":60,"steps":61},"steps","Déployer Garage et créer votre premier compartiment S3",[62,65,68,71,74],{"title":63,"body":64},"Créer la structure de répertoires","Commencez par créer un dossier de travail et le fichier de configuration :\n\n```bash\nmkdir -p \u002Fopt\u002Fgarage\u002Fconfig\nopenssl rand -hex 32   # → copiez ce secret dans rpc_secret\nopenssl rand -base64 32 | tr -d '=' | head -c 40  # → admin_token\n\n# Identifiants S3 du compartiment par défaut, dans un .env lisible par root seul\ncd \u002Fopt\u002Fgarage && umask 077\nprintf 'GARAGE_DEFAULT_ACCESS_KEY=GK%s\\nGARAGE_DEFAULT_SECRET_KEY=%s\\n' \"$(openssl rand -hex 12)\" \"$(openssl rand -hex 32)\" > .env\n```\n\nÉcrivez le `garage.toml` dans `\u002Fopt\u002Fgarage\u002Fconfig\u002F`, en remplaçant les deux jetons générés ci-dessus.",{"title":66,"body":67},"Écrire le Compose et démarrer","Depuis la version 2.3, Garage monte une grappe d'un seul nœud et crée son premier compartiment automatiquement, à partir de variables d'environnement. Cela évite la séquence manuelle `layout assign` \u002F `layout apply` \u002F `bucket create` \u002F `key create` :\n\n```yaml\nservices:\n  garage:\n    image: dxflrs\u002Fgarage:v2.5.0\n    restart: unless-stopped\n    command: [\"\u002Fgarage\", \"-c\", \"\u002Fetc\u002Fgarage\u002Fgarage.toml\", \"server\", \"--single-node\", \"--default-bucket\"]\n    environment:\n      GARAGE_DEFAULT_BUCKET: mon-compartiment\n      GARAGE_DEFAULT_ACCESS_KEY: ${GARAGE_DEFAULT_ACCESS_KEY}\n      GARAGE_DEFAULT_SECRET_KEY: ${GARAGE_DEFAULT_SECRET_KEY}\n    ports:\n      - \"127.0.0.1:3900:3900\"\n      - \"127.0.0.1:3903:3903\"\n    volumes:\n      - .\u002Fconfig:\u002Fetc\u002Fgarage\n      - garage-meta:\u002Fvar\u002Flib\u002Fgarage\u002Fmeta\n      - garage-data:\u002Fvar\u002Flib\u002Fgarage\u002Fdata\n\nvolumes:\n  garage-meta:\n  garage-data:\n```\n\nL'image est **distroless** : pas de shell, entrypoint vide. La commande doit nommer le binaire en chemin absolu (`\u002Fgarage`) et passer le fichier de configuration (`-c`). Sans ces deux éléments, le conteneur boucle sur `No such file or directory`.\n\nLes deux identifiants viennent du `.env` créé à l'étape précédente, que Compose lit de lui-même : aucun secret n'est écrit en clair dans le fichier. La forme `GK` suivie de 24 caractères hexadécimaux, avec un secret de 64, est celle des clés que Garage génère ; depuis la 2.3, une clé importée doit seulement compter au moins 8 caractères, et son secret au moins 16.\n\nDémarrez :\n```bash\ndocker compose up -d\n```",{"title":69,"body":70},"Vérifier que l'API répond","Un appel anonyme sur l'API S3 doit répondre **403** — c'est le signe que le service est vivant et refuse une requête non signée :\n\n```bash\ncurl -s -o \u002Fdev\u002Fnull -w '%{http_code}\\n' http:\u002F\u002F127.0.0.1:3900\u002F\n# 403 → l'API répond\n```\n\nL'interface d'administration répond 200 avec le jeton :\n\n```bash\ncurl -H \"Authorization: Bearer $ADMIN_TOKEN\" http:\u002F\u002F127.0.0.1:3903\u002Fv2\u002FListBuckets\n```\n\nSi vous obtenez `connection refused`, le conteneur n'a pas démarré — vérifiez `docker compose logs garage`.",{"title":72,"body":73},"Exposer l'API derrière nginx et un certificat TLS","Ne publiez jamais le port 3900 directement sur l'interface publique. Publiez-le sur la boucle locale et laissez nginx faire le proxy et le certificat TLS. Un bloc minimal pour `s3.votre-domaine.com` :\n\n```nginx\nserver {\n    listen 443 ssl;\n    server_name s3.votre-domaine.com *.s3.votre-domaine.com;\n    ssl_certificate \u002Fetc\u002Fletsencrypt\u002Flive\u002Fs3.votre-domaine.com\u002Ffullchain.pem;\n    ssl_certificate_key \u002Fetc\u002Fletsencrypt\u002Flive\u002Fs3.votre-domaine.com\u002Fprivkey.pem;\n    client_max_body_size 0;  # sinon nginx refuse tout envoi > 1 Mo (413)\n    location \u002F {\n        proxy_pass http:\u002F\u002F127.0.0.1:3900;\n        proxy_set_header Host $host;\n        proxy_max_temp_file_size 0;\n    }\n}\n```\n\nLe certificat wildcard `*.s3.votre-domaine.com` couvre les sous-domaines par compartiment. Utilisez certbot en mode DNS-01 pour l'obtenir. C'est ce que fait l'installation en un clic du Marketplace.",{"title":75,"body":76},"Tester avec un client S3","Avec les variables d'environnement positionnées, `aws` CLI fonctionne sans modification :\n\n```bash\nexport AWS_ACCESS_KEY_ID=GK...\nexport AWS_SECRET_ACCESS_KEY=...\nexport AWS_DEFAULT_REGION=garage\n\n# Lister les compartiments\naws --endpoint-url https:\u002F\u002Fs3.votre-domaine.com s3 ls\n\n# Déposer un fichier\naws --endpoint-url https:\u002F\u002Fs3.votre-domaine.com s3 cp monFichier.txt s3:\u002F\u002Fmon-compartiment\u002F\n\n# Avec rclone\nrclone lsd garage:mon-compartiment\n```\n\nPour `restic`, configurez la variable `RESTIC_REPOSITORY=s3:https:\u002F\u002Fs3.votre-domaine.com\u002Fmon-compartiment` et `RESTIC_PASSWORD` — la commande `restic init` initialise le dépôt de sauvegardes.",{"type":39,"title":78,"body":79},"Cas d'usage courants d'un storage bucket S3 auto-hébergé","Un storage bucket Garage sur VPS couvre plusieurs besoins courants sans dépendance à un cloud tiers.",{"type":43,"title":81,"items":82},"Ce qu'on déploie derrière Garage",[83,84,85,86,87,88],"**Sauvegardes restic** : configurez votre dépôt de backup en pointant vers `s3:https:\u002F\u002Fs3.votre-domaine.com\u002Fbackups`. La compatibilité S3 est native dans restic ; Borg, dans sa branche stable 1.4, ne connaît que les dépôts locaux ou SSH.","**Origine d'un site statique** : stockez les assets compilés de votre frontend et servez-les via nginx ou Cloudflare en mode proxy. Aucune requête S3 signée n'atteint le client final.","**Stockage d'uploads applicatifs** : vos applications Laravel, Django ou Rails peuvent écrire dans Garage via leur SDK S3 habituel, sans changer une ligne de code — seul l'endpoint change.","**Artefacts CI\u002FCD** : GitHub Actions ou GitLab CI peuvent pousser les artefacts de build vers Garage avec `aws s3 cp`, au même titre que vers S3 d'AWS.","**Logs et métriques d'archivage** : Loki, Vector ou Fluentd savent écrire dans un stockage objet compatible S3 pour l'archivage long terme.","**Partage de fichiers entre services** : deux conteneurs sur le même VPS ou sur deux VPS différents accèdent au même compartiment via l'API S3, sans montage NFS.",{"type":90,"title":91,"headers":92,"rows":96},"comparison","Garage vs alternatives S3 auto-hébergées",[93,94,95],"Critère","Garage","MinIO (communautaire)",[97,101,105,109,113,117],[98,99,100],"Licence","AGPLv3 — sans restriction d'usage","AGPLv3, mais console retirée de l'édition libre en 2025",[102,103,104],"Images Docker","Publiées activement sur Docker Hub (`dxflrs\u002Fgarage`)","Images communautaires arrêtées en 2025 ; dépôt GitHub aujourd'hui archivé",[106,107,108],"Console web","Pas encore intégrée (CLI + API admin ; Web Admin en pré-version)","Console supprimée de l'édition communautaire",[110,111,112],"Multi-sites","Nativement prévu (zones géographiques)","Possible mais requiert un cluster dédié",[114,115,116],"Empreinte mémoire","Matériel modeste (1 Go de RAM dans les prérequis)","Orientée haute performance et charges intensives",[118,119,120],"Compatibilité S3","Bonne sur la surface courante","Très étendue, y compris extensions AWS",{"type":122,"title":123,"body":124},"tip","Compartiments, accès et permissions","Garage gère les accès à la clé : chaque clé S3 peut être autorisée sur un ou plusieurs compartiments, en lecture seule ou lecture-écriture. Pour une sauvegarde automatisée, créez une clé dédiée avec accès au seul compartiment de backup — pas à l'ensemble du serveur.\n\nLa commande `garage key create \u003Cnom>` génère une clé, et `garage bucket allow --key \u003Cid> --read --write \u003Ccompartiment>` lui donne les droits. Vous pouvez aussi passer par l'API d'administration en HTTP si vous préférez l'automatiser dans un script.",{"type":39,"title":126,"body":127},"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 — une sauvegarde de votre bucket de sauvegardes vers un second emplacement (bande, autre serveur, cloud) n'est pas un luxe.\n\n**Exposez l'API derrière un domaine et du TLS**, pas sur une IP nue. C'est à la fois une exigence de sécurité et une nécessité pratique : plusieurs clients S3 refusent de fonctionner sans TLS, et le routing par sous-domaine de compartiment exige un certificat wildcard.\n\n**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 (Object Lambda, S3 Select, Replication cross-account…), vérifiez-le dans la documentation du projet avant de migrer.\n\n**Surveillez l'espace disque.** Un bucket de sauvegardes qui grossit sans politique de rétention remplit le disque silencieusement. Posez une règle de cycle de vie par l'API S3 (`aws s3api put-bucket-lifecycle-configuration`, expiration seulement ; depuis la 2.5.0, réservée à une clé propriétaire du compartiment) ou un cron qui purge les anciens snapshots (`restic forget --prune`).","Garage en un clic sur votre VPS","Le Marketplace ServOrbit installe Garage, crée son compartiment et vos identifiants S3 au premier démarrage. Vous n'avez plus qu'à brancher votre client.","Déployer Garage","\u002Fapplications\u002Fbases-de-donnees\u002Fgarage",[],true,1794270718211]