# MinIO — stockage objet S3 du homelab Brique **partagée** du namespace `tools`, au même titre que pgbouncer ou clickhouse. Le serveur vit ici ; les buckets, quotas et identifiants d'une application vivent avec cette application. ## Premier consommateur : Kadans - [ADR-012](https://gitea.arcodange.lab/arcodange/kadans/src/branch/main/docs/adr/012-video-storage-minio-first.md) « MinIO local d'abord » — bascule vers Cloudflare R2 prévue aux seuils : 100+ utilisateurs actifs, > 10 To/mois, ou dispersion géographique. - [ADR-013](https://gitea.arcodange.lab/arcodange/kadans/src/branch/main/docs/adr/013-video-storage-opfs-local-first.md) le gratuit est **local-first** (la vidéo ne quitte pas l'appareil) ; MinIO sert les **paliers payants**. - [ADR-018](https://gitea.arcodange.lab/arcodange/kadans/src/branch/main/docs/adr/018-qualite-video-au-transfert.md) ce qui transite est **dérivé** (aperçu 240p ~50 Ko, travail 360p ~3,4 Mo/min) — le master reste chez l'utilisateur. D'où le dimensionnement ci-dessous. ## Ce que ce chart pose | | | |---|---| | Mode | **standalone** (1 réplique) — la donnée est dérivée et Longhorn réplique déjà le volume ; l'erasure coding distribué coûterait de la RAM que des Pi 5 n'ont pas à dépenser pour ça | | Volume | **50 Gi** sur `longhorn` ≈ **250 h de cours** au palier « travail ». ⚠ Longhorn réplique : compter **×3** sur la capacité du cluster avant d'augmenter | | Ressources | requests 512 Mi / 100 m · limit 2 Gi — la limite protège les voisins de `tools`, pas MinIO | | API S3 | `s3.arcodange.lab` (Traefik) | | Console | `minio.arcodange.lab` (Traefik) | | Bucket | `kadans-videos`, **privé** — l'accès passe par des URL signées (ADR-0002 du dossier produit) | | Identifiants | **jamais dans le dépôt** : `iac/` les génère dans Vault (`kvv2/minio/config`), le Vault Secrets Operator les matérialise en secret `minio-config`, le chart les lit via `existingSecret` | Le ServiceAccount du pod est nommé `minio` (et non le `minio-sa` par défaut du chart amont) parce que le module Vault `app_roles` borne l'authentification au SA portant le nom de l'app : un seul SA, rien à réconcilier. ## Première mise en service L'ordre compte, et il compte **deux fois** : 1. **Workflow `Hashicorp Vault`** — MinIO doit d'abord figurer dans `hashicorp-vault/iac/terraform.tfvars` (c'est fait) : c'est **là** que naît le rôle CI `gitea_cicd_minio`, et non dans `minio/iac`. Sans cette étape, le workflow MinIO échoue sur `role "gitea_cicd_minio" could not be found` — il essaie de s'authentifier avec un rôle que personne n'a encore créé. 2. **Workflow `MinIO`** — applique `minio/iac` : rôle Kubernetes pour le Vault Secrets Operator, et **génération** du mot de passe root dans `kvv2/minio/config`. 3. **ArgoCD** synchronise l'application (déclarée dans `chart/values.yaml`). 4. Vérifier : `kubectl -n tools get vaultstaticsecret minio` (secret matérialisé) puis `kubectl -n tools get pods -l app=minio`. > [!NOTE] > Sans le secret `minio-config`, le pod ne démarre pas. C'est voulu — mieux > vaut un pod en attente qu'un MinIO ouvert avec des identifiants par défaut.