Développement Web

MinIO Client (mc) en pratique : tutoriel 2026

17 min de lecture

mc (MinIO Client) est le couteau suisse pour gérer MinIO et tout stockage S3-compatible depuis le terminal. Plus puissant et idiomatique qu’aws-cli pour MinIO. Voici le guide pratique en 2026 (informations vérifiées en avril 2026, susceptibles d’évoluer).

Voir notre guide MinIO complet.

Installation

# macOS
brew install minio-mc

# Linux
wget https://dl.min.io/client/mc/release/linux-amd64/mc -O /usr/local/bin/mc
chmod +x /usr/local/bin/mc

# Windows
# Télécharger sur min.io/download

# Vérifier
mc --version

Le client MinIO mc s’installe en téléchargeant un binaire statique depuis dl.min.io. Sur Linux : curl -O https://dl.min.io/client/mc/release/linux-amd64/mc && chmod +x mc && mv mc /usr/local/bin/. Sur macOS via Homebrew : brew install minio/stable/mc. Sur Windows, téléchargez l’exe depuis le même site. Vérifiez avec mc --version qui doit afficher RELEASE.20XX-XX-XX. Le binaire est statique (Go), pas de dépendances à gérer.

Alias (configuration cibles)

# Ajouter un alias
mc alias set prod https://s3.exemple.sn ACCESS_KEY SECRET_KEY

# Lister
mc alias list

# Tester
mc admin info prod

Un alias pointe vers une instance S3 (MinIO self-hosted, AWS S3, Backblaze B2, Cloudflare R2). Ajoutez un alias avec mc alias set monminio https://minio.example.com ACCESS_KEY SECRET_KEY. Listez les alias configurés avec mc alias list. Vérifiez la connexion avec mc admin info monminio. Pour copier des fichiers entre deux providers (migration AWS S3 vers MinIO self-hosted), créez deux alias et utilisez mc mirror entre eux.

Buckets

mc mb prod/mon-bucket                  # créer
mc mb prod/mon-bucket --with-lock      # avec Object Lock

mc ls prod                              # lister buckets
mc ls prod/mon-bucket                   # lister contenu
mc ls --recursive prod/mon-bucket       # récursif

mc rb prod/mon-bucket                   # supprimer (vide)
mc rb --force prod/mon-bucket           # supprimer (avec contenu)

Créez un bucket avec mc mb monminio/photos. Listez tous les buckets avec mc ls monminio. Supprimez avec mc rb monminio/photos --force (le flag force est requis si le bucket contient des objets). Pour configurer la politique d’accès public/privé, utilisez mc anonymous set download monminio/photos (lecture publique) ou private (par défaut). Cette dernière commande équivaut au bucket policy AWS S3 mais en plus simple à mémoriser.

Upload et download

mc cp local.zip prod/mon-bucket/        # upload
mc cp prod/mon-bucket/file.zip ./       # download
mc cp -r ./dossier/ prod/mon-bucket/    # récursif

# Mirror (sync continu)
mc mirror ./local-dir prod/mon-bucket/
mc mirror --watch ./local-dir prod/mon-bucket/  # surveille changements

Upload simple : mc cp fichier.pdf monminio/docs/. Upload récursif d’un dossier : mc cp --recursive ./photos/ monminio/photos/. Download : mc cp monminio/docs/fichier.pdf ./. Pour les très gros fichiers (>1 Go), mc utilise automatiquement le multipart upload qui découpe en chunks de 64 Mo et les envoie en parallèle. Sur une connexion 4G à Cocody, comptez 2-3 Mo/s en upload moyen sans optimisation.

URL signée (pre-signed)

# Générer une URL temporaire pour télécharger un objet privé
mc share download --expire=24h prod/mon-bucket/photo.jpg
# > URL valide 24h

# URL signée pour upload
mc share upload --expire=1h prod/mon-bucket/upload-target.jpg

Une URL signée donne un accès temporaire à un objet sans authentification. Générez avec mc share download monminio/docs/contrat.pdf --expire 24h qui retourne une URL valide 24 heures. Utile pour partager un fichier privé avec un client externe sans créer un compte. Pour l’upload, mc share upload monminio/uploads/ --expire 1h génère un formulaire HTML que le client peut soumettre directement vers MinIO sans passer par votre API.

Versioning

mc version enable prod/mon-bucket
mc version info prod/mon-bucket
mc version suspend prod/mon-bucket

# Lister versions d'un objet
mc ls --versions prod/mon-bucket/file.txt

# Restaurer une version
mc cp --version-id=ABC123 prod/mon-bucket/file.txt prod/mon-bucket/file.txt

Le versioning conserve toutes les versions d’un objet, ce qui protège contre la suppression accidentelle ou la corruption. Activez avec mc version enable monminio/docs. Listez les versions d’un fichier avec mc ls --versions monminio/docs/contrat.pdf. Restaurez une version antérieure avec mc cp --version-id ID monminio/docs/contrat.pdf monminio/docs/contrat.pdf. Le versioning consomme de l’espace : combinez avec le lifecycle pour expirer les anciennes versions automatiquement.

Lifecycle (expiration auto)

# Expirer les objets après 30 jours
mc ilm rule add --expire-days 30 prod/temp-bucket

# Expirer les versions non-courantes après 7 jours
mc ilm rule add --noncurrent-expire-days 7 prod/mon-bucket

# Lister règles
mc ilm rule list prod/mon-bucket

Le lifecycle définit l’expiration automatique des objets ou versions. Pour expirer les fichiers de plus de 90 jours dans un bucket logs : mc ilm rule add --expire-days 90 monminio/logs. Pour les anciennes versions seulement (en gardant la version courante), utilisez –noncurrent-expire-days. Cette automatisation évite la croissance illimitée du stockage et économise sur Backblaze B2 (6 USD/To/mois) ou MinIO self-hosted (coût RAID storage).

Réplication

# Réplication bucket à bucket entre instances MinIO
mc replicate add prod/source \
  --remote-bucket "https://ACCESS:SECRET@s3-backup.exemple.sn/dest" \
  --priority 1

mc replicate status prod/source

La réplication asynchrone copie les nouveaux objets vers un second cluster MinIO ou vers AWS S3. Configurez avec mc replicate add monminio/docs --remote-bucket arn:minio:replication::SECONDARY_ARN. Utile pour la disaster recovery (un cluster à Falkenstein, un autre à Helsinki) ou pour servir le même contenu depuis plusieurs régions. La réplication respecte le versioning : les versions et delete markers sont propagés.

Admin et utilisateurs

mc admin info prod                    # statut cluster
mc admin user add prod USER PASSWORD  # créer user
mc admin policy attach prod readwrite --user USER

# Service accounts
mc admin user svcacct add prod USER --access-key XXX --secret-key YYY

Pour gérer les utilisateurs IAM : mc admin user add monminio john MOTDEPASSE. Attribuez une policy : mc admin policy attach monminio readwrite --user john. Les policies built-in sont readonly, readwrite, writeonly, diagnostics. Pour des permissions fines, créez une policy JSON personnalisée : mc admin policy create monminio mapolicy ./policy.json. Auditez via mc admin user list monminio.

Quotas

mc admin bucket quota set prod/mon-bucket --hard 100GiB
mc admin bucket quota info prod/mon-bucket

Limitez l’espace par bucket avec mc admin bucket quota monminio/photos --hard 50gb. Quand le quota hard est atteint, les uploads échouent avec une erreur. Le quota soft (warning) génère juste un avertissement dans les logs. Utile pour le multi-tenant : un bucket par client avec quota selon le forfait. Pour une PME hébergeant 50 clients à 100 Go chacun, cette mécanique évite qu’un client gourmand déborde sur les autres.

Find et grep dans S3

mc find prod/mon-bucket --name "*.log"
mc find prod/mon-bucket --older-than 30d
mc find prod/mon-bucket --larger 100MB

mc find cherche des fichiers selon des critères. mc find monminio/logs --name "*.log" --older-than 30d liste les logs anciens. Combinez avec mc rm pour nettoyer : mc find monminio/logs --older-than 90d --exec "mc rm {}". mc cat affiche le contenu d’un fichier sans le télécharger : mc cat monminio/configs/app.yml. Idéal pour vérifier rapidement une config sur un cluster sans setup local.

Backup script type

#!/bin/bash
DATE=$(date +%Y%m%d)
mc cp /backups/db-$DATE.dump prod/backups-immutable/postgres/
mc cp /backups/files-$DATE.tar.gz prod/backups-immutable/files/

# Sync optionnel d'un dossier complet
mc mirror --remove /var/backups prod/backups-immutable/server/

# Vérifier
mc ls prod/backups-immutable/postgres/ | tail -5

Un script de sauvegarde quotidienne tient en 10 lignes bash. Lister les fichiers à sauvegarder, les pousser dans un bucket dédié avec horodatage, supprimer les sauvegardes plus anciennes que la rétention. Exemple : mc cp /var/lib/data monminio/backups/$(date +%Y%m%d)/ --recursive && mc find monminio/backups --older-than 30d --exec "mc rb {} --force". Lancez via cron quotidien à 2h du matin et alertez par email en cas d’échec via mailx.

Adaptation Afrique de l’Ouest

mc fonctionne identiquement avec MinIO local et tout S3 compatible (Backblaze B2, AWS S3, Wasabi, R2 Cloudflare). Apprenez la syntaxe une fois, vous travaillez avec n’importe quel stockage objet en Afrique ou ailleurs.

Pour une PME basée à Plateau, héberger MinIO sur un VPS Hetzner CX22 à 4 500 FCFA/mois donne 40 Go de stockage utilisable, suffisant pour 50-200 utilisateurs internes. Pour les volumes plus gros, Hetzner Storage Box (1 To à 2 100 FCFA/mois) connecté en SSH-FS ou rclone offre un stockage froid économique. Pour servir des fichiers à des utilisateurs externes (téléchargements clients, médias), Cloudflare R2 (gratuit jusqu’à 10 Go/mois sortie) reste imbattable côté bande passante.

Sur un angle proche

Cette pratique mc se complète bien avec d’autres outils du toolkit administrateur. rclone pour synchroniser entre providers cloud hétérogènes. restic ou borg pour les sauvegardes versionnées chiffrées. ssh-copy-id et fail2ban pour la sécurisation SSH du VPS hôte. Caddy ou Nginx pour les certificats automatiques sur l’endpoint MinIO public. Cette stack cohérente forme une infrastructure d’administrateur senior.

A quoi sert le client mc de MinIO

mc (MinIO Client) est le couteau suisse en ligne de commande pour piloter tout endpoint S3-compatible : MinIO self-hosted, AWS S3, Scaleway Object Storage, Backblaze B2, Cloudflare R2, OVH Object Storage. Il est ecrit en Go, distribue en binaire statique, et offre une syntaxe inspiree des commandes Unix classiques (cp, ls, rm, mirror) qui le rend immediatement utilisable. Pour une equipe ouest-africaine qui synchronise des sauvegardes entre un VPS Hetzner Helsinki et un bucket Scaleway Paris, mc remplace avantageusement le SDK officiel AWS dans la plupart des scripts cron.

Sortie attendue de ce tutoriel : un binaire mc configure avec deux alias (Scaleway, R2), une routine de synchronisation chiffree, et des bonnes pratiques de gestion des cles d’acces.

Etape 1 : Installer mc sur Linux

Telechargez le binaire officiel signe :

curl -O https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
sudo mv mc /usr/local/bin/
mc --version

Sortie attendue : mc version RELEASE.2026-... avec une date recente. Si curl renvoie un certificat invalide, c’est probablement un proxy d’entreprise qui intercepte TLS ; configurez-le ou utilisez un VPS hors entreprise pour le download initial.

Etape 2 : Creer un alias pour Scaleway Object Storage

Un alias mappe un nom court vers un endpoint + cles d’acces. Pour Scaleway Paris :

mc alias set scw https://s3.fr-par.scw.cloud SCW_VOTRE_ACCESS_KEY VOTRE_SECRET_KEY --api S3v4

Résultat type : Added 'scw' successfully.. Si l’erreur est Access Denied, regenerez la paire d’API keys dans la console Scaleway et verifiez que la policy attachee inclut s3:ListAllMyBuckets et s3:ListBucket sur les buckets cibles.

Etape 3 : Verifier la connexion et lister les buckets

mc ls scw

Ce que vous devez voir : la liste de vos buckets Scaleway avec leur date de creation. Une liste vide est legitime si vous venez de creer le compte ; testez alors avec mc mb scw/test-mc pour creer un bucket. Une erreur SignatureDoesNotMatch indique typiquement un caractere mal echappe dans la secret key (signe + ou /), regenerez-la.

Etape 4 : Copier des fichiers vers un bucket

Pour uploader un dossier complet en preservant la hierarchie :

mc cp --recursive /var/backups/ scw/backups-prod/$(date +%Y-%m-%d)/

Vous devriez obtenir : une barre de progression pour chaque fichier puis ...succeeded. Le flag --recursive est obligatoire pour les dossiers. Pour un transfert de plusieurs Go avec une connexion africaine instable, ajoutez --continue pour reprendre apres coupure.

Etape 5 : Synchronisation incrementale avec mc mirror

mc mirror est l’equivalent de rsync pour S3 : il ne transfere que les fichiers modifies depuis la derniere execution. Routine cron typique :

mc mirror --overwrite --remove /data/uploads/ scw/uploads-prod/

Ce que vous devez voir : pour la premiere execution, tous les fichiers sont transferes ; les executions suivantes affichent uniquement les nouveaux et les supprimes. --remove supprime cote cible les fichiers absents de la source : utile pour un miroir exact, dangereux si vous voulez conserver l’historique. Sans ce flag, mirror est purement additif.

Etape 6 : Chiffrement cote client avec sse-c

Scaleway chiffre par defaut les objets (SSE-S3) mais la cle est detenue par Scaleway. Pour un chiffrement ou seul vous detenez la cle, utilisez SSE-C :

export MC_ENCRYPT_KEY="scw/backups-prod/=32-byte-random-key-base64-encoded"
mc cp /backup.tar.gz scw/backups-prod/ --enc-c "scw/backups-prod/=...32 octets..."

Sortie attendue : l’upload reussit et l’objet est chiffre. Sans la cle au moment de la lecture, mc renvoie SSE-C key required. Stockez la cle dans un coffre-fort hors ligne, sa perte rend les sauvegardes irrecuperables.

Etape 7 : Bandwidth limiting

Sur une connexion fibre 100 Mbps a Dakar partagee avec d’autres equipes, plafonnez la bande passante sortante de mc pour ne pas saturer le lien :

mc cp --limit-upload 10MiB --limit-download 20MiB /data/big.tar.gz scw/archive/

Sortie de référence : la barre de progression reste sous 10 Mio/s en upload. C’est utile aussi pour respecter les quotas reseau d’un fournisseur africain qui facture le trafic au-dela d’un seuil mensuel.

Etape 8 : Watch et events temps reel

mc watch streame en temps reel les operations sur un bucket :

mc watch scw/uploads-prod

Vous devriez obtenir : a chaque PUT/DELETE/POST, une ligne s’affiche avec le timestamp, le type d’evenement et la cle. Pratique pour deboguer une integration applicative qui semble n’envoyer aucun fichier malgre un code « OK ». Combinez avec --events s3:ObjectCreated:* pour filtrer.

Etape 9 : Versioning et retention

Activez le versioning sur un bucket existant :

mc version enable scw/backups-prod

Résultat type : scw/backups-prod versioning is enabled. Combine a une lifecycle policy qui supprime les anciennes versions apres 30 jours, c’est une protection efficace contre les rm accidentels et certains rancongiciels. Definissez la policy avec mc ilm rule add en specifiant les regles JSON.

Etape 10 : À lire ensuite

mc supporte aussi les buckets locaux NAS via l’alias file:, ce qui permet de scripter des sauvegardes croisees disque local + S3. Consultez nos guides Litestream pour SQLite et BookStack avec Coolify et MySQL qui s’appuient tous deux sur du stockage objet S3-compatible.

Pour creuser MinIO en profondeur, voyez nos tutoriels d’installation MinIO sur Coolify, configuration multi-tenants avec policies fines, optimisation performances NVMe, et migration depuis AWS S3. La documentation officielle min.io/docs reste la référence canonique. Pour les usages avancés (lake house data, intégration Spark), le blog officiel de MinIO publie régulièrement des cas d’usage industriels.

Etape 11 : Replication multi-cloud avec mc replicate

Pour une resilience inter-region (incident OVH Strasbourg, suspension fournisseur), repliquez automatiquement un bucket Scaleway vers Backblaze B2 :

mc alias set b2 https://s3.us-west-001.backblazeb2.com B2_KEY_ID B2_APPLICATION_KEY
mc replicate add scw/backups-prod --remote-bucket arn:aws:s3:::backups-prod-b2 --priority 1 --replicate "delete,delete-marker,existing-objects"

Sortie attendue : Replication configuration applied successfully. Les ecritures sur Scaleway sont copiees vers B2 avec un delai typique de 1 a 5 minutes. Le cout : double stockage, mais resilience aux pannes regionales.

Etape 12 : Gestion des permissions IAM

Plutot que d’utiliser des cles root pour vos scripts, creez un utilisateur applicatif dedie avec policy minimale. Sur MinIO self-hosted :

mc admin user add myminio backupbot SUPER_SECRET
mc admin policy attach myminio readwrite --user backupbot

Sortie attendue : Added user backupbot puis Attached Policies: readwrite. Pour Scaleway, le menu Identity > IAM permet de creer des « applications » avec des policies attachees a un bucket precis.

Etape 13 : Scripter mc dans un cron robuste

Un cron de sauvegarde mal ecrit echoue silencieusement le jour ou ca compte. Pattern recommande :

#!/bin/bash
set -euo pipefail
LOG=/var/log/backup-$(date +%Y%m%d).log
{
  mc mirror --overwrite /data/uploads/ scw/uploads-prod/ \
    || curl -X POST https://hc-ping.com/UUID/fail
  curl -X POST https://hc-ping.com/UUID/0
} 2>&1 | tee -a "$LOG"

Vous devriez obtenir : un log datable et un ping Healthchecks.io qui alerte par email/Telegram si la commande echoue ou si le cron ne tourne plus du tout. set -euo pipefail stoppe le script a la premiere erreur.

Etape 14 : Diagnostic erreurs frequentes

Erreur The Access Key Id you provided does not exist : la cle a ete supprimee ou jamais creee, regenerez. Erreur BucketAlreadyOwnedByYou sur mb : pas un probleme, le bucket existe deja. Erreur RequestTimeTooSkewed : l’horloge serveur a plus de 15 minutes de derive, installez chrony et synchronisez NTP. Erreur EntityTooLarge : le fichier depasse 5 Tio (limite S3) ou la taille de partie multipart est mal configuree, augmentez avec --part-size.

Etape 15 : Comparaison avec aws-cli et rclone

aws-cli est puissant mais verbeux et oriente AWS specifiquement (le mode S3-compatible avec –endpoint-url fonctionne mais sans toutes les optimisations). rclone est exceptionnel pour les transferts cloud-a-cloud avec 70+ backends, mais sa syntaxe verbeuse et son moteur de chiffrement maison decouragent certains. mc se positionne entre les deux : syntaxe Unix simple, performances natives sur tout endpoint S3, et integration profonde avec MinIO server pour l’admin (utilisateurs, policies, replication).

Recommandation : mc pour l’admin et les sauvegardes simples, rclone pour les migrations massives entre clouds heterogenes (S3 vers Google Drive vers OneDrive), aws-cli si vous etes 100 pour cent AWS. Sur les benchs publics, mc atteint 80 a 90 pour cent du debit theorique d’un VPS Hetzner CX22 a Helsinki vers Scaleway Paris (limite par le 1 Gbps du VPS).

Etape 16 : Cas d’usage e-commerce ouest-africain

Une boutique WooCommerce hebergee a Dakar avec 50 Go d’images produit gagne a synchroniser le repertoire wp-content/uploads vers Scaleway Object Storage avec mc mirror nocturne, puis a servir les images via Cloudflare R2 en cache devant. Cout total : 0,50 EUR/mois (328 FCFA) pour 50 Go Scaleway + free tier R2 generous (10 Go/mois sortant gratuit). La duree de chargement des fiches produit chute de 600 a 200 ms depuis Cotonou ou Lome grace au POP Cloudflare local.

Etape 17 : Securite des cles et rotation

Les cles API ecrites dans ~/.mc/config.json sont en clair sur le disque. Sur un VPS partage ou sur un poste developpeur qui peut etre compromis, c’est un risque. Trois pratiques a adopter : (1) creer une cle par environnement et par usage (pas une cle root partout), (2) reduire la policy au strict minimum (un bot de sauvegarde n’a pas besoin de DeleteBucket), (3) tourner les cles tous les 90 jours et automatiser la rotation via un script qui regenere la cle Scaleway, met a jour ~/.mc/config.json, teste un mc ls, puis revoke l’ancienne cle.

Etape 18 : Audit des operations

Activez les access logs cote Scaleway (option payante mais peu chere : environ 0,02 EUR/Go de logs soit 13 FCFA) ou cote MinIO server avec mc admin trace qui streame en temps reel toutes les requetes. Output typique de trace : timestamp, methode HTTP, URI, status, taille, duree, signature. Indispensable pour deboguer un probleme de performance ou enqueter sur une fuite de donnees.

Etape 19 : Verification d’integrite avec md5/sha256

mc calcule un ETag (MD5 sur les uploads simples, structure differente pour multipart) que vous pouvez comparer cote source et destination apres un mirror. Pour une verification stricte sur des sauvegardes critiques, doublez avec sha256sum en local et stockez l’empreinte dans un fichier separe upload aussi vers le bucket. Au moment de la restauration, recalculez et comparez : c’est la seule garantie que le fichier n’a pas ete corrompu en transit ou alterne sur le stockage.

Etape 20 : Documentation officielle

La reference a jour est min.io/docs/minio/linux/reference/minio-mc.html. Le repo github.com/minio/mc maintient les release notes. Verifiez systematiquement la version installee avec mc --version et mettez a jour avec mc update tous les 2 a 3 mois pour beneficier des correctifs et nouvelles commandes.

La documentation officielle min.io/docs/minio/linux/reference/minio-mc.html liste exhaustivement les commandes mc avec exemples. Pour les questions techniques avancées, le canal Slack MinIO (slack.min.io) rassemble les mainteneurs et les utilisateurs power. Le repository GitHub minio/mc accepte les PR et les issues. Pour rester à jour sur les nouveautés (souvent breaking changes entre versions majeures), suivez le RSS du blog officiel ou la newsletter mensuelle.

Partager