[{"data":1,"prerenderedAt":245},["ShallowReactive",2],{"seo-verification":3,"blog-migrer-minio-vers-garage-ou-rustfs-vps-fr":6},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-migrer-minio-vers-garage-ou-rustfs-vps-fr",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"publishedAt":20,"updatedAt":21,"category":22,"categories":28,"featuredImage":30,"bgImage":31,"posterImage":32,"relatedSolution":30,"intro":33,"sections":34,"ctaTitle":184,"ctaBody":185,"ctaButton":186,"ctaUrl":187,"relatedPosts":188},499,"migrer-minio-vers-garage-ou-rustfs-vps",{"fr":10,"en":12,"ar":13,"es":14},"migrate-minio-to-garage-or-rustfs-vps","ترحيل-minio-إلى-garage-أو-rustfs-على-vps","migrar-minio-a-garage-o-rustfs-vps","Migrer MinIO vers Garage ou RustFS sans perdre un objet courant","MinIO est archivé : copiez vos buckets vers Garage ou RustFS avec rclone, prouvez que rien ne manque et basculez l'application sans casser vos URLs.",13,0,false,"2026-10-23T00:00:00+00:00","2026-10-23T23:43:01+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\u002Fmigrer-minio-vers-garage-ou-rustfs-vps-poster.svg","Le dépôt MinIO est archivé depuis le 25 avril 2026 : votre stockage S3 tourne désormais sans correctif de sécurité en amont. Garage et RustFS sont les deux cibles auto-hébergeables qui reviennent, mais la copie des objets n'est que la moitié du travail. Les politiques IAM, l'historique des versions et les URLs présignées ne suivent pas. Ce guide inventorie la source, copie avec rclone, prouve le résultat par des comptes et des contrôles, puis bascule l'application en trois temps, avec une coupure d'écriture minimale et un retour arrière prêt.",[35,39,49,52,71,111,114,132,150,153,156,174,178,181],{"type":36,"title":37,"body":38},"h2","Pourquoi ne pas laisser MinIO là où il est","Le dépôt `minio\u002Fminio` a été archivé par son propriétaire le 25 avril 2026 : il est en lecture seule, son README annonce que le projet n'est plus maintenu et précise que les binaires déjà publiés ne recevront plus de mises à jour. Concrètement, la prochaine faille de votre serveur S3 ne sera corrigée par personne en amont. Le client `mc` l'a été le 14 juillet 2026.\n\nVotre MinIO continue de fonctionner : rien ne casse le jour de l'archivage. Mais un stockage objet est exposé et tourne désormais sans correctif de sécurité. Deux cibles auto-hébergeables reviennent dans les discussions : Garage, publié sous AGPLv3, et RustFS, publié sous licence Apache 2.0.\n\nL'installation de chacune a son guide : \u003Ca href=\"\u002Fblog\u002Fheberger-garage-s3-vps\">Garage sur un VPS\u003C\u002Fa> et \u003Ca href=\"\u002Fblog\u002Fself-host-rustfs-vps\">RustFS sur un VPS\u003C\u002Fa>. Ici, on part d'un MinIO en production : déplacer les données, prouver que rien ne manque, basculer sans URL cassée.",{"type":40,"title":41,"items":42},"ul","Ce qu'une copie de bucket ne déplace pas toute seule",[43,44,45,46,47,48],"**Les objets courants** — c'est la partie facile : `rclone` ou `mc mirror` les copient, avec un contrôle à faire ensuite.","**Les anciennes versions** — la documentation de `mc mirror` précise qu'il ne synchronise que l'objet courant, sans information de version.","**Les utilisateurs et les politiques IAM** — ils vivent dans MinIO, pas dans les buckets. Les secrets ne s'exportent pas : on régénère des clés côté cible.","**Les URLs présignées déjà distribuées** — la signature dépend de l'hôte, de la région et des clés. Un changement d'endpoint les invalide.","**Les écarts de compatibilité S3** — ACL, politiques de bucket, accès anonyme, versioning : chaque cible a ses trous, à lire dans sa documentation plutôt qu'à supposer.","**La configuration des clients** — endpoint, région, adressage path-style : tout ce que votre application, vos sauvegardes `restic` ou votre CDN ont en dur.",{"type":36,"title":50,"body":51},"Prérequis et plan de capacité","Il vous faut un accès administrateur à MinIO, un poste ou un VPS avec `mc` et `rclone`, et une cible déjà installée et joignable en HTTPS (voir les deux guides ci-dessus pour le reverse proxy et le certificat). La règle de capacité est simple : tant que vous n'avez pas validé la migration, vous gardez la source intacte, donc vous payez le disque deux fois.\n\nNotre recommandation : prévoir sur la cible la taille des données de la source plus une marge d'environ 30 %. Sur le même VPS, cela fait au moins deux fois le volume actuel plus la marge ; sur deux VPS, chacun porte sa part. Un nœud Garage unique avec `replication_factor = 1` ne garde qu'une copie de chaque objet : ce n'est pas une sauvegarde, et la source encore en place est votre seul filet pendant la migration.",{"type":53,"title":54,"steps":55},"steps","Étape 1 : inventorier la source avant de copier",[56,59,62,65,68],{"title":57,"body":58},"Déclarer MinIO comme alias","Créez un alias `src` avec des identifiants qui lisent tous les buckets :\n`mc alias set src https:\u002F\u002Fs3.mondomaine.com ACCESS_KEY SECRET_KEY`",{"title":60,"body":61},"Compter les objets et la taille","Pour chaque bucket, notez le nombre d'objets et le volume :\n`mc du --recursive src\u002Fmedias`\n`mc ls --recursive src\u002Fmedias | wc -l`\nReportez ces chiffres dans un tableau « avant \u002F après » : c'est votre preuve de fin de migration.",{"title":63,"body":64},"Compter les versions","Si le versioning est actif, la liste des versions est plus longue que celle des objets :\n`mc ls --recursive --versions src\u002Fmedias | wc -l`\nLa documentation de `mc ls` précise que `--versions` exige un service qui gère le versioning. Un écart important entre les deux comptes dit combien d'historique est en jeu.",{"title":66,"body":67},"Exporter la liste des politiques et des utilisateurs","Gardez une trace de ce qu'il faudra recréer :\n`mc admin policy list src`\n`mc admin user list src`\nLes secrets ne sont pas dans cette sortie et ne peuvent pas l'être : vous les régénérerez.",{"title":69,"body":70},"Relever la configuration des clients","Dans chaque application qui parle à MinIO, notez l'endpoint, la région, le style d'adressage et la variable d'environnement qui les porte : la bascule ne changera que cela.",{"type":72,"title":73,"headers":74,"rows":78},"comparison","Garage et RustFS : les écarts à connaître avant de choisir",[75,76,77],"Sujet","Garage","RustFS",[79,83,87,91,95,99,103,107],[80,81,82],"Licence","AGPLv3 (README du dépôt)","Apache 2.0 (README du dépôt)",[84,85,86],"Versioning","Non géré : `PutBucketVersioning` et `ListObjectVersions` figurent comme manquants","Indiqué comme disponible dans le README",[88,89,90],"Politiques de bucket et ACL","Aucune des deux : un système propre, par clé et par bucket","IAM et politiques de bucket ; les ACL sont volontairement non gérées",[92,93,94],"Accès anonyme","Refusé, avec une réponse 403","Évalué d'après la politique du bucket",[96,97,98],"Région du client","`s3_region` de `garage.toml`, à reporter dans le client","`RUSTFS_REGION`, `us-east-1` par défaut, à reporter dans le client",[100,101,102],"Adressage","Path-style et vhost-style gérés","Path-style par défaut, sans configuration DNS",[104,105,106],"URLs présignées","Gérées","Gérées, l'hôte, le schéma, le port, la région et le chemin doivent correspondre à la signature",[108,109,110],"API d'administration MinIO","Sans objet : on administre avec la commande `garage`","Surface séparée : le S3 fonctionne sans que `mc admin` soit garanti",{"type":36,"title":112,"body":113},"Versioning : ce que la copie perd, et que faire","C'est le point qui décide du choix de la cible. Garage ne gère pas le versioning : sa page de compatibilité S3 le dit sans détour. Si vos buckets conservent un historique que l'application consulte ou que vous devez garder pour des raisons métier, Garage n'en est pas la destination. RustFS indique le versioning comme disponible, mais la copie par `rclone sync` ou `mc mirror` n'y recréera pas votre historique.\n\nTrois voies, à choisir bucket par bucket. Assumer la perte : seule la version courante passe, ce qui convient quand le versioning ne servait que de filet contre l'erreur humaine. Copier version par version : vous listez les identifiants avec `mc ls --versions`, puis vous rejouez les versions de la plus ancienne à la plus récente vers une cible qui gère le versioning, après l'avoir activé sur le bucket ; les dates des versions seront celles de la copie, pas d'origine. Ou archiver l'historique à part, dans un bucket d'archive, et ne migrer que le courant. Dans tous les cas, testez d'abord sur un objet à plusieurs versions.",{"type":53,"title":115,"steps":116},"Étape 2 : préparer la cible, Garage ou RustFS",[117,120,123,126,129],{"title":118,"body":119},"Garage : assigner puis appliquer le layout","Aucun bucket n'est utilisable tant que le layout n'est pas appliqué. Relevez l'identifiant du nœud, puis assignez-lui une zone et une capacité :\n`garage status`\n`garage layout assign -z dc1 -c 1G \u003Cnode_id>`\n`garage layout apply --version 1`\nAjustez `-c` à l'espace disque réellement alloué.",{"title":121,"body":122},"Garage : créer la clé, le bucket et les droits","Les droits se donnent par clé et par bucket :\n`garage key create app-key`\n`garage bucket create medias`\n`garage bucket allow --read --write --owner medias --key app-key`\nLe secret s'affiche à la création de la clé : copiez-le tout de suite dans votre gestionnaire de secrets.",{"title":124,"body":125},"Garage : reporter la région dans le client","La section `[s3_api]` de `garage.toml` définit `s3_region`. Mettez exactement cette valeur dans la configuration de vos clients, et gardez l'adressage path-style. Une région différente donne des signatures refusées.",{"title":127,"body":128},"RustFS : alias et bucket","Avec `mc` configuré sur la cible :\n`mc alias set dst http:\u002F\u002F127.0.0.1:9000 ACCESS_KEY SECRET_KEY`\n`mc mb dst\u002Fmedias`\nLa documentation RustFS recommande des utilisateurs IAM ou des comptes de service plutôt que les clés racine pour les applications.",{"title":130,"body":131},"RustFS : recréer utilisateurs et politiques","Reprenez la liste exportée à l'étape 1 et recréez chaque utilisateur et chaque politique côté RustFS, avec une clé neuve par application. Alignez ensuite la région : `RUSTFS_REGION` vaut `us-east-1` par défaut, et le client doit utiliser la même.",{"type":53,"title":133,"steps":134},"Étape 3 : copier avec rclone et prouver le résultat",[135,138,141,144,147],{"title":136,"body":137},"Déclarer les deux remotes","Utilisez le fournisseur `Minio` pour la source et `Other` pour la cible :\n`rclone config create src s3 provider=Minio access_key_id=ACCESS_KEY secret_access_key=SECRET_KEY endpoint=https:\u002F\u002Fs3.mondomaine.com`\n`rclone config create dst s3 provider=Other access_key_id=ACCESS_KEY secret_access_key=SECRET_KEY endpoint=http:\u002F\u002F127.0.0.1:3900 region=garage`\n`region=garage` suppose `s3_region = \"garage\"`, la valeur de l'exemple de Garage : mettez la vôtre si elle diffère. Pour RustFS, remplacez l'endpoint par celui de la cible et la région par la valeur de `RUSTFS_REGION`.",{"title":139,"body":140},"Faire un essai à blanc","`rclone sync` modifie la destination pour qu'elle reflète la source, suppressions comprises. Ne l'inversez jamais, et jouez d'abord l'essai :\n`rclone sync src:medias dst:medias --checksum --metadata --transfers 16 --dry-run`",{"title":142,"body":143},"Lancer la copie à chaud","MinIO reste en service pendant ce premier passage :\n`rclone sync src:medias dst:medias --checksum --metadata --transfers 16 --progress`\n`--metadata` demande à rclone de préserver les métadonnées : contrôlez sur un objet témoin que le type de contenu est arrivé intact.",{"title":145,"body":146},"Vérifier la copie","Contrôlez que tout ce qui est dans la source existe dans la cible :\n`rclone check src:medias dst:medias --one-way --combined \u002Ftmp\u002Fcheck-medias.txt`\nLe fichier liste chaque chemin avec un symbole : `=` identique, `+` absent de la destination, `*` différent, `!` erreur. Zéro ligne `+`, `*` ou `!` est l'objectif.",{"title":148,"body":149},"Recompter après la copie","Rejouez `mc du --recursive` et le décompte d'objets sur la cible, avec l'alias `dst`, et remplissez la colonne « après » de votre tableau. Les deux chiffres doivent être identiques, sauf écarts expliqués par les versions.",{"type":36,"title":151,"body":152},"ETag multipart et mc mirror : lire les écarts sans se tromper","L'ETag d'un petit objet envoyé en une seule requête est son MD5, et `rclone` s'en sert comme somme de contrôle. Pour un objet multipart, la documentation rclone rappelle que l'ETag n'est plus le MD5 des données : c'est le MD5 de la suite des MD5 de chaque partie, suivi du nombre de parties. Il dépend donc de la taille des parties, que le client a choisie à l'envoi.\n\nVotre MinIO a reçu l'objet avec un découpage, `rclone` le renvoie avec un autre : contenu identique, ETag différent. Un `rclone check` qui signale ces objets comme différents n'a pas forcément raison. Rejouez-le sur eux avec `--download`, qui télécharge les deux côtés et compare les données elles-mêmes : plus lent, mais sans ambiguïté. Même vigilance avec `mc mirror` : sa documentation précise que des sommes composites peuvent différer simplement parce que la répartition en parties a changé.\n\nSi vous préférez rester dans l'écosystème `mc`, la copie s'écrit avec `mc mirror --preserve src\u002Fmedias dst\u002Fmedias`. L'option `--preserve` conserve les attributs de la source et ses règles de politique de bucket ; ce dernier point n'a de sens que si la cible sait les lire, ce qui exclut Garage.\n\nTrois limites à connaître. Sans `--overwrite`, un objet déjà présent sur la cible n'est pas recopié : l'erreur est journalisée et la copie continue, ce qui rend la relance à moitié silencieuse. Avec `--remove`, les objets de la cible absents de la source sont supprimés, geste à réserver à un bucket que vous maîtrisez. Enfin, `mc mirror` ne synchronise que l'objet courant, sans version. Sa comparaison porte sur le nom, la taille, la date et la somme de contrôle, sans lire le contenu. Le dépôt de `mc` est lui aussi archivé : l'outil marche, mais ne bougera plus.",{"type":36,"title":154,"body":155},"URLs présignées : pourquoi elles tombent à la bascule","Une URL présignée contient une signature calculée avec la clé secrète, l'hôte, la région et le chemin. La documentation RustFS le dit : l'hôte, le schéma, le port, la région et le chemin de la requête doivent correspondre à ceux utilisés pour signer. Changer d'endpoint ou de clé invalide donc tous les liens déjà émis, sans exception, et rien ne les redirige.\n\nC'est une affaire de séquencement. Les liens générés à la volée par votre application se régénèrent dès qu'elle est reconnectée à la cible. Ceux envoyés par e-mail ou stockés en base mourront à la bascule : raccourcissez leur durée de vie quelques jours avant, et prévenez les équipes qui en distribuent à la main.",{"type":53,"title":157,"steps":158},"Étape 4 : basculer en trois temps, sans coupure franche",[159,162,165,168,171],{"title":160,"body":161},"Sync initial à chaud","C'est la copie de l'étape 3, jouée pendant que MinIO sert encore le trafic. Elle dure le temps qu'il faut et ne gêne personne. Notez l'heure de fin.",{"title":163,"body":164},"Geler les écritures","Passez l'application en lecture seule ou en maintenance courte, ou activez une double écriture si votre code la permet. Les lectures peuvent continuer sur MinIO pendant que le sync final tourne.",{"title":166,"body":167},"Sync final avec --update","Ne transférez que ce qui a changé depuis :\n`rclone sync src:medias dst:medias --update --metadata --transfers 16 --progress`\n`rclone check src:medias dst:medias --one-way`\nRecomptez les objets et la taille, et comparez au tableau de l'étape 1.",{"title":169,"body":170},"Changer l'endpoint par variable d'environnement","Votre application doit lire l'endpoint, la région et les clés dans son environnement, jamais dans le code. Modifiez ces variables, redémarrez le service, puis testez un envoi, une lecture et une suppression sur un objet témoin. Régénérez les liens présignés qui comptent.",{"title":172,"body":173},"Surveiller, puis seulement ensuite démonter","Laissez MinIO en place, arrêté ou en lecture seule, le temps d'un cycle complet de vos sauvegardes et tâches planifiées. Pointez de nouveau vos sauvegardes `restic` vers la cible, voir le guide sur les \u003Ca href=\"\u002Fblog\u002Fsauvegardes-restic-vps\">sauvegardes restic\u003C\u002Fa>.",{"type":175,"title":176,"body":177},"tip","Le retour arrière tient en une variable","Tant que MinIO n'est pas supprimé et que le dernier sync a été fait en lecture seule, revenir en arrière consiste à remettre l'ancien endpoint dans l'environnement et à redémarrer. Si des écritures ont eu lieu sur la cible depuis la bascule, rapatriez-les d'abord vers la source avec une copie `rclone copy` dans l'autre sens (jamais un `sync`, qui supprimerait), puis revenez. N'effacez MinIO qu'après une période d'observation que vous aurez fixée à l'avance.",{"type":36,"title":179,"body":180},"Dépannage : les symptômes qui reviennent","Un appel sans signature sur Garage répond 403 avec le message `Garage does not support anonymous access yet`. C'est le comportement attendu de Garage, et la demande d'un accès anonyme figure toujours au suivi du projet comme une fonction jamais priorisée. Si votre application servait des fichiers publics, il faudra des URLs présignées ou un proxy devant le bucket.\n\nSi les écritures sont refusées pour signature invalide après la bascule, comparez la région du client à celle de la cible (`s3_region` pour Garage, `RUSTFS_REGION` pour RustFS) et vérifiez que le client utilise l'adressage path-style. Si `rclone check` signale des objets multipart comme différents alors que leurs tailles sont égales, rejouez-le avec `--download`. Si une relance de `mc mirror` ne recopie pas un objet modifié, c'est l'absence de `--overwrite`. Enfin, si un bucket est vide côté cible alors que le sync a réussi, vérifiez que la clé a bien reçu `--read --write` sur ce bucket côté Garage ou la bonne politique côté RustFS.",{"type":36,"title":182,"body":183},"La documentation officielle","Relisez ces sources avant d'agir, ces projets évoluent : le dépôt github.com\u002Fminio\u002Fminio pour le statut et la licence de MinIO ; github.com\u002Frustfs\u002Frustfs et docs.rustfs.com pour RustFS ; garagehq.deuxfleurs.fr pour la compatibilité S3 de Garage ; rclone.org pour `sync` et `check` ; la documentation MinIO de `mc mirror`. Pour sauvegarder ce stockage, voyez \u003Ca href=\"\u002Fblog\u002Fbackup-vps-restic-s3-3-2-1\">l'article 3-2-1 avec restic et S3\u003C\u002Fa>.","Un second VPS pour tester la cible avant de couper MinIO","Un second VPS root avec disque NVMe héberge la cible pendant la migration : vous testez à côté de la production et ne coupez MinIO qu'une fois les comptes d'objets validés. La bascule se fait sans toucher à la machine d'origine.","Voir les VPS Cloud","\u002Fvps-cloud",[189,208,227],{"id":190,"slug":191,"slugs":192,"title":196,"excerpt":197,"readTime":23,"views":18,"isPinned":19,"publishedAt":198,"updatedAt":21,"category":199,"categories":205,"featuredImage":30,"bgImage":31,"posterImage":207,"relatedSolution":30},70,"heberger-minio-vps",{"fr":191,"en":193,"ar":194,"es":195},"hosting-minio-on-a-vps","استضافة-minio-على-خادم-vps","alojar-minio-en-un-vps","Héberger MinIO sur un VPS","MinIO sur un VPS : buckets, console, TLS, sauvegardes. L'édition Community étant archivée, voici comment décider entre rester et migrer.","2026-04-11T00:00:00+00:00",{"id":200,"name":201,"slug":202,"color":203,"icon":204},6,"Bases de données","bases-de-donnees","bg-teal-500\u002F10 text-teal-400","database",[206],{"id":200,"name":201,"slug":202,"color":203,"icon":204},"\u002Fblog\u002Fcovers\u002Fheberger-minio-vps-poster.svg",{"id":209,"slug":210,"slugs":211,"title":215,"excerpt":216,"readTime":217,"views":218,"isPinned":19,"publishedAt":219,"updatedAt":220,"category":221,"categories":222,"featuredImage":30,"bgImage":31,"posterImage":224,"relatedSolution":225},245,"heberger-garage-s3-vps",{"fr":210,"en":212,"ar":213,"es":214},"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.",8,2,"2026-08-10T00:00:00+00:00","2026-09-07T11:26:10+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[223],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fheberger-garage-s3-vps-poster.svg",{"categorySlug":202,"appSlug":226},"garage",{"id":228,"slug":229,"slugs":230,"title":234,"excerpt":235,"readTime":236,"views":18,"isPinned":19,"publishedAt":237,"updatedAt":238,"category":239,"categories":240,"featuredImage":30,"bgImage":31,"posterImage":242,"relatedSolution":243},407,"self-host-rustfs-vps",{"fr":229,"en":231,"ar":232,"es":233},"self-host-rustfs-s3-object-storage-vps","استضافة-rustfs-على-vps-تخزين-كائنات-s3","autoalojar-rustfs-en-vps-almacenamiento-objetos-s3","Héberger RustFS sur un VPS : stockage objet S3 self-hosted","Guide pour héberger RustFS sur un VPS : console web S3, clés d'accès générées, volumes persistants — une alternative à MinIO ou Garage.",5,"2026-10-01T00:00:00+00:00","2026-10-02T21:10:18+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[241],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fself-host-rustfs-vps-poster.svg",{"categorySlug":202,"appSlug":244},"rustfs",1792799327623]