Skip to content

MinIO Docker : stockage objet S3-compatible auto-hébergé

Brandon
Date de publication:

💡 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 ?

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 :

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 :

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 :

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 :

  1. Clique sur Buckets dans le menu gauche
  2. Create Bucket
  3. Nomme-le (par exemple : homelab-backups)
  4. 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.

  1. Identity > Users > Create User
  2. Nom d’utilisateur : duplicati-minio (ou ce que tu veux)
  3. Mot de passe : un truc long et aléatoire, stocké dans ton gestionnaire de mots de passe
  4. Attribue la policy readwrite sur 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 :

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 :

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 :

  1. Snapshot du volume : si tu es sur LVM ou ZFS, prends des snapshots réguliers du dossier ./data
  2. Réplication vers un second MinIO : MinIO supporte nativement la réplication de buckets entre serveurs
  3. Backup incrémental avec Duplicati ou Restic : sauvegarde /chemin/vers/minio/data vers 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.

Next
Ansible homelab 101 : automatise ton infrastructure en YAML