Développement Web

Installer MinIO sur Coolify : tutoriel pratique 2026

12 دقائق للقراءة

Coolify a MinIO dans sa marketplace, ce qui en fait le moyen le plus rapide de déployer un stockage objet S3-compatible : 10 minutes pour une instance fonctionnelle avec HTTPS, console web, et configuration sécurisée par défaut. Voici le tutoriel pas à pas 2026.

Voir notre guide MinIO complet.

Étape 1 — Créer le service

  1. Coolify → Projects → votre projet → « + New Resource » → One-Click Service
  2. Rechercher « MinIO » → cliquer
  3. Configurer :
    • Service Name : minio-prod
    • API URL : https://s3.exemple.sn
    • Console URL : https://minio-console.exemple.sn
    • Root user / password (ou Generate)
  4. Storage : ajouter Persistent Volume sur /data avec taille appropriée (50-200 Go selon usage)
  5. Deploy

Étape 2 — Premier accès

  1. Ouvrir https://minio-console.exemple.sn
  2. Login avec root user/password
  3. Buckets → Create Bucket → « backups-prod »
  4. Identity → Service Accounts → Create. Copier Access Key + Secret Key — elles ne réapparaîtront pas

Étape 3 — Configurer le client mc localement

# Installer MinIO Client
brew install minio-mc          # macOS
# ou
wget https://dl.min.io/client/mc/release/linux-amd64/mc -O /usr/local/bin/mc
chmod +x /usr/local/bin/mc

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

# Tester
mc ls prod
mc mb prod/test-bucket
mc cp local-file.txt prod/test-bucket/

Étape 4 — Activer Object Lock pour anti-ransomware

mc retention set --default GOVERNANCE 30d prod/backups-prod

Voir notre tutoriel Object Lock pour le détail.

Étape 5 — Coolify backups vers MinIO

  1. Coolify → Servers → S3 Storages → « + New »
  2. Endpoint : https://s3.exemple.sn
  3. Region : us-east-1 (toujours, MinIO ignore mais requiert)
  4. Bucket : backups-prod
  5. Use Path Style : oui
  6. Access Key + Secret
  7. Test → Save

Désormais vous pouvez utiliser ce stockage pour les backups Postgres Coolify (voir guide).

Étape 6 — Stockage uploads d’application

Pour une app qui stocke des uploads utilisateur, configurez le SDK avec endpoint MinIO :

// Node.js avec @aws-sdk/client-s3
const s3 = new S3Client({
  endpoint: "https://s3.exemple.sn",
  region: "us-east-1",
  credentials: { accessKeyId: ACCESS, secretAccessKey: SECRET },
  forcePathStyle: true,
});

await s3.send(new PutObjectCommand({
  Bucket: "uploads",
  Key: `user-${userId}/avatar.jpg`,
  Body: fileBuffer,
  ContentType: "image/jpeg",
}));

Étape 7 — Monitoring

  • Console MinIO → Metrics : graphes natifs
  • Prometheus exporter intégré sur /minio/v2/metrics/cluster
  • Coolify : ajouter Uptime Kuma pour HTTP check sur /minio/health/live

Adaptation Afrique de l’Ouest

MinIO sur Coolify chez Hetzner offre du stockage S3 souverain à coût fixe ~8-15 €/mois pour 100-500 Go. Idéal pour les PME africaines qui ont besoin de souveraineté (données sensibles, contraintes sectorielles) ou qui veulent éviter la facturation cloud public en USD.

Lectures complémentaires

Pourquoi déployer MinIO derrière Coolify

MinIO est un serveur de stockage objet compatible S3, performant et léger, idéal pour héberger sauvegardes, médias, et artefacts CI sur un VPS auto-géré. Coolify (la plateforme open source PaaS comparable à Heroku) simplifie le déploiement de MinIO en quelques clics, sans toucher manuellement à docker-compose. Ce tutoriel cible une PME tech à Dakar, Abidjan, Cotonou ou Lomé qui veut s’affranchir des coûts AWS S3 ou Cloudflare R2 sur les volumes importants. Le seuil de rentabilité contre R2 (0,015 USD par Go par mois) se situe vers 200 Go stockés ; au-delà, MinIO sur VPS Hetzner devient sensiblement moins cher.

Prérequis : un VPS minimum 2 vCPU / 4 Go RAM / 80 Go SSD (environ 8 EUR par mois soit 5248 FCFA), Coolify v4+ déjà installé, un nom de domaine pointant vers le VPS.

Étape 1 — Vérifier l’installation Coolify

Connectez-vous à votre interface Coolify sur https://coolify.exemple.io. Vérifiez la version dans Settings → version : la 4.0+ est nécessaire pour les templates récents. Confirmez que le serveur cible est bien en état Healthy dans Servers. Tout incident à ce stade doit être résolu avant de déployer un nouveau service.

Étape 2 — Créer un nouveau Resource MinIO

Cliquez sur Projects → New Resource → One-Click Services → MinIO. Si MinIO n’apparaît pas dans la liste des templates pré-packagés, choisissez Docker Compose et collez le fichier docker-compose.yml officiel MinIO (disponible sur min.io/docs). Coolify pré-remplit les champs Service Name, Domain, et génère les variables d’environnement essentielles.

Étape 3 — Configurer le domaine et le TLS

Dans la section Domain, indiquez deux domaines : https://s3.exemple.io pour l’API S3 (port 9000) et https://console.exemple.io pour la console web admin (port 9001). Coolify configure automatiquement Traefik pour générer les certificats Let’s Encrypt et router le trafic vers les bons ports du conteneur. Vérifiez la résolution DNS avant le déploiement : dig s3.exemple.io +short doit retourner l’IP de votre VPS.

Étape 4 — Définir les credentials root

Dans Environment Variables, fixez MINIO_ROOT_USER à un identifiant de 12 caractères minimum (évitez minioadmin) et MINIO_ROOT_PASSWORD à un mot de passe long de 32 caractères généré aléatoirement avec openssl rand -base64 32. Stockez ces credentials dans Bitwarden ou KeePassXC ; ils donnent un contrôle total sur les buckets et les utilisateurs.

Étape 5 — Configurer le volume persistant

MinIO stocke ses données dans /data à l’intérieur du conteneur. Coolify monte par défaut un volume Docker nommé sur ce chemin. Pour des volumes importants (50+ Go), montez plutôt un dossier hôte sur un disque dédié : /mnt/minio-data:/data. Cette séparation simplifie les sauvegardes par snapshot LVM ou par export tar et permet d’agrandir le volume sans recréer le conteneur.

Étape 6 — Lancer le déploiement

Cliquez sur Deploy. Coolify pull l’image officielle minio/minio:latest, configure Traefik, démarre le conteneur, et exécute les health checks. La première initialisation prend environ 30 secondes. Surveillez les logs en direct dans l’onglet Logs jusqu’à voir API: http://0.0.0.0:9000 et WebUI: http://0.0.0.0:9001. Tout autre message d’erreur (port occupé, volume non montable, secret manquant) doit être traité avant de poursuivre.

Étape 7 — Accéder à la console et créer un premier bucket

Ouvrez https://console.exemple.io, connectez-vous avec les credentials root. Cliquez sur Buckets → Create Bucket. Nommez-le backups-itskills en minuscules sans espace ni caractère spécial (les noms de buckets S3 suivent des règles strictes). Activez Versioning si vous souhaitez garder l’historique des versions, et Object Locking pour les sauvegardes immuables (protection contre ransomware). Cliquez Create.

Étape 8 — Créer un utilisateur applicatif limité

Ne jamais utiliser le compte root pour les applications. Allez dans Identity → Users → Create User. Attribuez-lui une access key et une secret key. Dans Policies, créez une policy JSON limitant l’accès au seul bucket backups-itskills :

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:*"],
      "Resource": ["arn:aws:s3:::backups-itskills/*", "arn:aws:s3:::backups-itskills"]
    }
  ]
}

Attachez cette policy à l’utilisateur. Toute opération hors du bucket autorisé sera refusée, ce qui limite les dégâts en cas de fuite des credentials applicatifs.

Étape 9 — Tester avec mc (MinIO Client)

Installez mc localement : brew install minio-mc sur macOS ou téléchargez le binaire Linux depuis min.io. Configurez l’alias :

mc alias set itskills https://s3.exemple.io ACCESS_KEY SECRET_KEY
mc ls itskills

La sortie affiche le bucket backups-itskills. Testez un upload : mc cp ~/test.txt itskills/backups-itskills/. Si la commande retourne 1 B / 1 B, votre MinIO est opérationnel et accessible depuis l’extérieur.

Étape 10 — Sauvegarder MinIO lui-même

Configurer un cron qui exporte le volume /mnt/minio-data vers un second VPS ou Backblaze B2 via restic. Cette sauvegarde croisée protège contre la perte du serveur principal. Pour approfondir, lisez notre guide sécurité VPS et notre tutoriel sur la supervision avec Uptime Kuma.

Étape 11 — Brancher un client applicatif S3 (Laravel, Node, Python)

MinIO étant compatible avec l’API S3 d’AWS, n’importe quel SDK officiel s’y connecte sans modification. Côté Laravel, dans config/filesystems.php, ajoutez un disque minio de driver s3 avec les paramètres endpoint pointant vers https://s3.exemple.io, use_path_style_endpoint à true, et region arbitraire (par exemple us-east-1). Côté Node.js, le SDK @aws-sdk/client-s3 prend les mêmes paramètres : endpoint, forcePathStyle: true, credentials. Côté Python, boto3.client('s3', endpoint_url='https://s3.exemple.io', ...). Testez chaque intégration avec un upload puis un download d’un fichier de test pour valider la chaîne complète.

Étape 12 — Configurer la rétention et le cycle de vie

Pour un bucket de sauvegardes, configurer une lifecycle policy qui supprime automatiquement les objets de plus de 90 jours évite le gonflement infini du stockage. Dans la console MinIO, sélectionnez le bucket → Lifecycle → Add Rule. Définissez Expiration: 90 days et appliquez. Pour les buckets contenant des médias web (photos, PDF clients), désactivez l’expiration mais activez la transition vers une classe de stockage moins coûteuse. MinIO supporte les tiers de stockage si vous combinez plusieurs disques avec des perfs différentes.

Étape 13 — Notifications d’événements pour automatisations

MinIO peut publier des événements (PUT, DELETE, COMPLETED MULTIPART UPLOAD) vers un webhook, AMQP, NATS, Redis, Kafka, MySQL, PostgreSQL ou Elasticsearch. Configurez par exemple un webhook Telegram qui notifie l’équipe à chaque nouveau backup réussi. Dans Settings → Configurations → Event Destinations → Webhook, indiquez l’URL et activez. Puis dans le bucket : Events → Subscribe to event, choisissez s3:ObjectCreated:* et le webhook cible. Cette mécanique transforme MinIO en pivot d’automatisation pour vos pipelines CI/CD ou vos workflows métier.

Étape 14 — Activer le mode multi-disques pour la résilience

Sur un VPS avec plusieurs disques attachés, MinIO peut tourner en mode Erasure Coding : les données sont réparties avec parité sur quatre disques minimum, supportant la perte d’un ou deux disques sans perte de données. Cette résilience matérielle convient aux services qui ne peuvent pas perdre une seule sauvegarde critique. Le mode mono-disque par défaut suffit pour la plupart des PME, mais sachez que MinIO peut monter en gamme sans changer de produit le jour où vos volumes l’imposent.

Étape 15 — Migrer depuis AWS S3 ou Cloudflare R2

Pour migrer un bucket existant, mc mirror copie incrémentalement le contenu d’une source vers MinIO :

mc alias set aws https://s3.amazonaws.com AWS_ACCESS_KEY AWS_SECRET_KEY
mc mirror --overwrite aws/mon-bucket-source itskills/backups-itskills

La commande peut tourner pendant des heures pour des volumes importants. Lancez-la dans un tmux ou via nohup pour qu’elle survive à la déconnexion SSH. Une fois le mirror initial terminé, relancez-le périodiquement pour synchroniser les delta jusqu’au jour J où vous basculez vos applications vers MinIO comme endpoint principal.

Étape 16 — Surveiller MinIO avec Prometheus

MinIO expose nativement des métriques au format Prometheus sur l’endpoint /minio/v2/metrics/cluster. Configurez un scrape Prometheus avec un job dédié :

- job_name: 'minio'
  metrics_path: /minio/v2/metrics/cluster
  scheme: https
  static_configs:
    - targets: ['s3.exemple.io']

Visualisez ensuite dans Grafana les métriques clés : nombre d’objets, taille totale, débit en lecture/écriture, taux d’erreur. Un dashboard officiel MinIO existe sur grafana.com (ID 13502). Configurez des alertes Alertmanager si la latence dépasse un seuil ou si l’espace libre tombe sous 20 %.

Étape 17 — Limiter l’accès à la console admin par IP

La console MinIO sur le port 9001 contient potentiellement les credentials root et permet de tout supprimer en quelques clics. Limitez son accès aux IP de l’équipe via la configuration Traefik exposée par Coolify : ajoutez un middleware ipWhiteList dans la configuration de la route console.exemple.io. Listez les IP fixes des bureaux de Dakar, Abidjan, Cotonou, ou un range VPN d’équipe. L’API S3 sur s3.exemple.io reste accessible publiquement (les applications doivent y accéder), mais la console admin disparaît du radar des bots.

Étape 18 — Audit régulier des credentials et policies

Tous les trimestres, listez les utilisateurs MinIO via mc admin user list itskills et révoquez ceux qui ne correspondent plus à un usage actif. Listez les policies attachées avec mc admin user info itskills nom-utilisateur et resserrez les permissions trop larges (la policy readwrite globale est presque toujours trop permissive ; préférez des policies par bucket). Cette hygiène empêche l’accumulation silencieuse de credentials orphelins après le départ d’un développeur ou la fin d’un contrat de prestataire.

Étape 19 — Comparer le coût total à AWS S3 et Cloudflare R2

Pour 500 Go stockés et 5 To de bande passante par mois, AWS S3 facture environ 11,50 USD pour le stockage plus 450 USD pour la sortie de données — soit plus de 460 USD mensuels (300 000 FCFA). Cloudflare R2 supprime les frais de bande passante : 7,50 USD pour 500 Go stockés, soit 4900 FCFA. MinIO sur un VPS Hetzner CX32 avec disque dédié 200 Go coûte 13 EUR par mois soit 8528 FCFA, mais avec 20 To de bande passante incluse. Le calcul penche pour MinIO dès que la bande passante dépasse les volumes de stockage, ce qui est typique des sites de médias et des PaaS d’équipes ouest-africaines.

Étape 20 — Mettre à jour MinIO sans interrompre le service

MinIO publie des releases régulières sur min.io/download. Coolify simplifie la mise à jour : dans la configuration du service, modifiez le tag d’image (par exemple RELEASE.2026-04-01T00-00-00Z) puis cliquez Redeploy. Avant chaque mise à jour majeure, sauvegardez le volume de données et lisez le changelog officiel pour repérer les éventuels breaking changes. Pour une mise en production critique, dupliquez d’abord le service sur un environnement de staging Coolify, validez la nouvelle version pendant 48 heures, puis appliquez en production. Cette discipline élimine les régressions en environnement réel.

مشاركة