💡 TL;DR
- MinIO est un serveur de stockage objet 100 % compatible API S3, open-source et auto-hébergeable en quelques minutes
- Un seul conteneur Docker Compose suffit pour démarrer, avec persistance des données et console web intégrée
- Tu peux l’utiliser comme backend pour Nextcloud, Duplicati, ou n’importe quel outil compatible S3 sans dépendre d’Amazon
Table des matières
Table des matières
- Pourquoi MinIO Docker plutôt qu’AWS S3 ?
- Ce que tu dois savoir avant de commencer
- Déploiement MinIO Docker Compose
- Configuration initiale et création de buckets
- Intégration avec tes applications
- Sauvegarde et persistance des données
- Sécurité : les basiques à ne pas ignorer
- Performances et astuces
- Conclusion
Pourquoi MinIO Docker plutôt qu’AWS S3 ?
Amazon S3, c’est le standard du stockage objet. Stable, rapide, omniprésent. Mais il a un défaut majeur : ce n’est pas à toi. Tes données vivent chez Amazon, facturées au gigaoctet, avec des prix de sortie qui font mal et une dépendance qui s’engraine à chaque projet.
MinIO est la réponse open-source. C’est un serveur de stockage objet haute performance, 100 % compatible avec l’API Amazon S3. En mode minio docker, il se déploie en un conteneur unique sans dépendance externe. Le projet est écrit en Go, distribué sous licence AGPL-3.0, et compte plus de 48 000 stars sur GitHub. La communauté est active, les releases sortent régulièrement, et l’image Docker minio/minio est maintenue par l’équipe officielle.
Ce qui rend MinIO sexy pour un homelab :
- Zéro vendor lock-in : tes applications pensent parler à S3, en réalité elles parlent à ton serveur chez toi
- Performances : conçu pour le stockage haute performance, il tient la route sur du matériel modeste
- Légèreté : un seul binaire de quelques dizaines de mégaoctets, pas de base de données externe
- Console web : gestion des buckets, des utilisateurs, des politiques d’accès, tout dans une interface propre
- Évolutivité : du mono-serveur Docker au cluster distribué, MinIO grandit avec tes besoins
Pour moi, MinIO sert deux rôles. Premièrement, c’est le stockage backend de mon Nextcloud : les fichiers lourds partent sur MinIO, la base Nextcloud reste légère. Deuxièmement, c’est la destination de sauvegarde de mes backups incrémentaux. Si tu cherches une solution de sauvegarde robuste pour tes données MinIO, j’ai testé Duplicati avec Docker : chiffrement AES-256, planning automatique, interface web intuitive. Ça tourne en cron depuis deux ans sans accroc.
Le coût ? L’électricité de ton serveur et le disque dur que tu as déjà. Pas de surprise en fin de mois, pas de limites de bande passante artificielles.
Ce que tu dois savoir avant de commencer
Avant de lancer le Docker Compose, quelques points de vocabulaire et d’architecture :
Bucket : l’équivalent d’un dossier racine dans S3. Chaque bucket a un nom unique et une politique d’accès.
Object : un fichier stocké dans un bucket, accompagné de métadonnées (taille, type MIME, date, tags).
Access Key / Secret Key : le couple d’identifiants qui remplace ton login-mot de passe dans les appels API. C’est comme un utilisateur technique avec des permissions précises.
API S3 : le protocole HTTP standardisé par Amazon. Tout outil qui sait parler à S3 sait parler à MinIO : AWS CLI, rclone, Duplicati, Restic, Nextcloud, Cyberduck, etc.
Prérequis matériels :
- Un serveur Linux avec Docker et Docker Compose
- Un disque ou un volume avec au moins quelques gigaoctets de libre
- Une connexion réseau stable (évidemment)
- Un reverse proxy ou un VPN si tu veux y accéder depuis l’extérieur (jamais expose MinIO directement sur Internet)
MinIO s’intègre parfaitement dans un écosystème auto-hébergé, que ce soit avec Nextcloud comme cloud personnel ou comme backend de stockage pour tes outils de backup. L’API S3 est le ciment qui unit tout ça.
Déploiement MinIO Docker Compose
Crée un dossier dédié et le fichier docker-compose.yml :
services:
minio:
image: minio/minio:latest
container_name: minio
restart: unless-stopped
command: server /data --console-address ":9001"
environment:
- MINIO_ROOT_USER=admin
- MINIO_ROOT_PASSWORD=ChangeMoiToutDeSuite42!
- MINIO_BROWSER_REDIRECT_URL=https://console.minio.tondomaine.com
volumes:
- ./data:/data
- ./config:/root/.minio
ports:
- "9000:9000"
- "9001:9001"
Quelques explications avant que tu copies ça bêtement :
server /data: c’est le dossier où MinIO stocke les objets. Ici, on le monte en volume local./data.--console-address ":9001": le port de la console web d’administration. Le port9000est l’API S3 proprement dite.MINIO_ROOT_USER/MINIO_ROOT_PASSWORD: les identifiants du compte administrateur. Choisis un mot de passe solide. Ce ne sont pas des clés d’API, c’est le compte root.MINIO_BROWSER_REDIRECT_URL: optionnel, mais utile si tu passes par un reverse proxy. Il redirige la console vers ton domaine public.
Lance la stack :
cd /chemin/vers/ton/dossier/minio
docker compose up -d
Attends quelques secondes, puis vérifie que les conteneurs tournent :
docker ps | grep minio
Tu dois voir minio/minio en status Up. Si ce n’est pas le cas, check les logs :
docker logs minio
Les erreurs classiques : un dossier ./data qui n’existe pas (Docker le crée automatiquement, mais vérifie les permissions), ou un mot de passe trop court (MinIO exige au moins 8 caractères).
Accède à la console web : http://IP_DE_TON_SERVEUR:9001. Connecte-toi avec admin et le mot de passe que tu as défini. L’interface est sobre, rapide, et te permet de créer des buckets, des utilisateurs, et des policies sans toucher à la CLI.
Configuration initiale et création de buckets
Le premier réflexe une fois connecté : créer un bucket de test.
Dans la console web :
- Clique sur Buckets dans le menu gauche
- Create Bucket
- Nomme-le (par exemple :
homelab-backups) - Laisse les options par défaut pour l’instant
Ensuite, crée un utilisateur dédié pour tes applications. Ne jamais utiliser le compte admin dans les configs d’apps tierces. C’est comme donner les clés de ta maison à ton facteur.
- Identity > Users > Create User
- Nom d’utilisateur :
duplicati-minio(ou ce que tu veux) - Mot de passe : un truc long et aléatoire, stocké dans ton gestionnaire de mots de passe
- Attribue la policy
readwritesur le bucket cible
Récupère la Access Key et la Secret Key de cet utilisateur. C’est ce couple que tu colleras dans Duplicati, Nextcloud, ou ton .s3cfg.
Si tu maîtrises déjà les commandes S3 en CLI avec ton instance minio docker, tu te sentiras comme chez toi — j’ai détaillé l’usage de S3cmd avec des services S3-compatibles dans un article dédié. Les mêmes commandes s3cmd sync, s3cmd put, s3cmd ls fonctionnent avec MinIO en changeant juste l’endpoint.
Test rapide avec le client MinIO (mc) :
# Installe mc
wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
sudo mv mc /usr/local/bin/
# Configure l'alias vers ton instance
mc alias set local http://localhost:9000 admin ChangeMoiToutDeSuite42!
# Liste les buckets
mc ls local
# Uploade un fichier test
mc cp /etc/hostname local/homelab-backups/test.txt
Si tu vois ton fichier dans la console web, tout est fonctionnel.
Intégration avec tes applications
Le vrai intérêt d’un déploiement minio docker, c’est qu’il parle le langage universel du stockage objet. Voici trois intégrations typiques d’homelab.
Avec Duplicati (backup)
Dans l’interface web de Duplicati, choisis Storage Type > S3 compatible. Renseigne :
- Server :
http://IP:9000(ouhttps://si tu as mis un reverse proxy avec TLS) - Bucket name :
homelab-backups - AWS Access ID : la clé d’accès de l’utilisateur dédié
- AWS Secret Key : la clé secrète correspondante
- Region :
us-east-1(MinIO s’en fiche, mais le champ est obligatoire)
Active le chiffrement côté client dans Duplicati. Même si MinIO est chez toi, le chiffrement AES-256 est une assurance supplémentaire.
Avec Nextcloud (External Storage)
Dans Nextcloud, installe l’app External Storage support depuis le store. Ajoute un stockage de type Amazon S3 :
- Bucket :
nextcloud-data - Hostname :
IP_DE_TON_SERVEUR - Port :
9000 - Region :
us-east-1 - Key et Secret : les identifiants utilisateur MinIO
- Coche Enable SSL si tu passes par un reverse proxy HTTPS
Nextcloud va utiliser MinIO comme dossier externe. Les fichiers lourds (photos, vidéos) y atterrissent, allégeant la base PostgreSQL/MariaDB.
Avec rclone (synchronisation multi-cloud)
rclone config
# Choisis "n" (new remote), nomme-le "minio", type "s3"
# Provider : Minio
# Endpoint : http://IP:9000
# Access Key / Secret Key : tes credentials
Ensuite :
rclone sync /chemin/local minio:homelab-backups
Parfait pour synchroniser un dossier vers MinIO en cron, ou faire l’inverse pour des restaurations.
Sauvegarde et persistance des données
MinIO stocke tout dans /data : les objets, les métadonnées, les configurations de buckets. Le volume ./data:/data dans le docker-compose minio assure la persistance.
Mais persistance ne veut pas dire backup. Si le disque meurt, ./data meurt avec. Voici la stratégie minimale :
- Snapshot du volume : si tu es sur LVM ou ZFS, prends des snapshots réguliers du dossier
./data - Réplication vers un second MinIO : MinIO supporte nativement la réplication de buckets entre serveurs
- Backup incrémental avec Duplicati ou Restic : sauvegarde
/chemin/vers/minio/datavers un autre stockage (NAS, cloud distant, second serveur)
Pour la réplication bucket-to-bucket, MinIO propose le Bucket Replication. Depuis la console web, dans les paramètres d’un bucket, tu peux configurer une cible distante. C’est du vrai temps réel : chaque objet écrit est répliqué immédiatement.
Si tu veux quelque chose de plus simple, un rsync nocturne vers un NAS fait l’affaire pour un homelab personnel. L’important est d’avoir deux copies de tes données critiques.
Sécurité : les basiques à ne pas ignorer
MinIO exposé sur Internet sans protection, c’est une invitation au piratage. Quelques règles non négociables :
Jamais exposer les ports 9000 et 9001 directement sur Internet. Utilise un reverse proxy avec authentification (Traefik, Caddy, Nginx) ou un VPN (WireGuard, Tailscale). Le port 9001 (console) est particulièrement sensible.
Active TLS. MinIO supporte le HTTPS natif. En production, utilise un certificat Let’s Encrypt via ton reverse proxy. En interne, tu peux générer un certificat auto-signé avec MinIO :
# Génère un certificat auto-signé (développement uniquement)
mkdir -p ~/.minio/certs
cd ~/.minio/certs
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout private.key -out public.crt \
-subj "/C=FR/ST=France/L=Paris/O=Homelab/CN=minio.local"
Monte ce dossier dans le conteneur avec ./certs:/root/.minio/certs.
Politiques d’accès restrictives. Par défaut, un bucket est privé. Ne le passe jamais en public-read sans réfléchir. Pour un backup, la policy doit être write-only pour l’application et read-write pour l’admin.
Mots de passe robustes. Le compte root doit avoir un mot de passe unique, stocké dans ton gestionnaire de mots de passe. Les clés d’API doivent être rotées tous les 6-12 mois.
Mise à jour régulière. L’image minio/minio:latest évolue vite. Relance docker compose pull && docker compose up -d mensuellement pour patcher les failles de sécurité.
Performances et astuces
MinIO est conçu pour être rapide, mais quelques réglages optimisent encore l’expérience sur un homelab modeste :
Cache : MinIO utilise le système de fichiers sous-jacent comme cache. Plus le disque est rapide (SSD > HDD), plus les lectures sont vives. Pour un usage intensif, place ./data sur un SSD dédié.
Compression : MinIO ne compresse pas nativement. Si tu stockes beaucoup de texte ou de logs, compresse-les côté client avant upload (gzip + mc cp).
Chunk size : pour les gros fichiers (> 100 Mo), MinIO découpe automatiquement en multipart. Pas de réglage nécessaire, l’API S3 gère ça.
Monitoring : la console web affiche les métriques de base (espace utilisé, nombre d’objets, bande passante). Pour aller plus loin, MinIO expose un endpoint Prometheus au format OpenMetrics. Ajoute ça dans ta stack de monitoring si tu utilises déjà Beszel Docker ou Netdata.
Répartition de charge : si tu as plusieurs disques, MinIO peut les utiliser en pool de stockage. Modifie le command :
command: server /data1 /data2 /data3 --console-address ":9001"
Chaque /dataX est un volume monté sur un disque différent. MinIO répartit les objets automatiquement.
Conclusion
MinIO transforme n’importe quel serveur en stockage objet S3-compatible en moins de temps qu’il ne faut pour commander un café. L’installation Docker est ridiculement simple, l’API est universelle, et la console web rend la gestion accessible sans doctorat en AWS.
Pour un homelab, c’est la pierre angulaire d’une stratégie de stockage décentralisée. Tu peux l’utiliser comme backend Nextcloud, comme destination de backup, comme staging pour tes projets web, ou comme simple remplacement de Google Drive pour les applications compatibles S3.
Le stockage objet auto-hébergé n’est plus réservé aux géants du cloud. Avec MinIO et Docker, il tient dans un conteneur de quelques centaines de mégaoctets et répond à tes ordres.