diff --git a/.gitea/workflows/helmcharts.yaml b/.gitea/workflows/helmcharts.yaml index 57b5bdb..399d8c1 100644 --- a/.gitea/workflows/helmcharts.yaml +++ b/.gitea/workflows/helmcharts.yaml @@ -131,7 +131,26 @@ jobs: needs: filter-chart strategy: matrix: - chart: [tool] # turns out gitea doesn't support dynamic matrix + # ⚠⚠ ÉNUMÉRATION EXHAUSTIVE, ET ELLE DOIT LE RESTER. + # + # Gitea ne sait pas monter une matrice DYNAMIQUE : on ne peut pas + # écrire `fromJson(needs.filter-chart.outputs.library_charts)` ici. + # La conséquence est passée inaperçue longtemps — le détecteur + # calculait la bonne réponse, et PERSONNE NE LA CONSOMMAIT : le `if:` + # ci-dessous vérifie seulement si le chart CODÉ EN DUR figure dans la + # liste détectée. Seuls `tool` et `pgcat` pouvaient donc être + # construits ; les HUIT AUTRES charts de ce dépôt ne l'étaient jamais, + # et leurs PR affichaient vert. Mesuré le 2026-09-02 sur la PR #32, + # qui réécrivait le chart `minio` en entier : `Detect changed charts` + # ✓, les deux jobs de construction `Skipped`, statut global `success`. + # + # Le remède n'a pas besoin de matrice dynamique : le `if:` filtre DÉJÀ + # sur la sortie du détecteur, donc un chart non modifié reste `Skipped`. + # Il ne manquait que l'ÉNUMÉRATION. + # + # ⚠ Ajouter un chart au dépôt SANS l'ajouter ici le rend invisible à la + # CI, en silence. C'est le mode d'échec de ce fichier. + chart: [tool] # chart: ${{ fromJson(needs.filter-chart.outputs.library_charts) }} type: [library] if: >- @@ -191,6 +210,9 @@ jobs: needs: [filter-chart,library-charts] strategy: matrix: + # ⚠ Les NEUF charts applicatifs du dépôt — voir l'avertissement du job + # `library-charts` ci-dessus. Un chart absent de cette liste n'est + # JAMAIS construit, et sa PR est verte quand même. # chart: ${{ fromJson(needs.filter-chart.outputs.application_charts) }} - chart: [pgcat] + chart: [chart, crowdsec, grafana, hashicorp-vault, minio, pgbouncer, pgcat, prometheus, redis] type: [application] \ No newline at end of file diff --git a/minio/.helmignore b/minio/.helmignore new file mode 100644 index 0000000..aaf3909 --- /dev/null +++ b/minio/.helmignore @@ -0,0 +1,19 @@ +# Motifs exclus de l'empaquetage Helm. +# +# ⚠ `iac/` est la raison d'être de ce fichier : il porte le Terraform des +# buckets, et son `.terraform/` local contient un binaire de provider de plus de +# 5 Mo — au-dessus de la limite par fichier de Helm. Un `helm template minio/` +# lancé depuis un poste où le Terraform a été initialisé ÉCHOUE sans ce fichier : +# Error: chart file "terraform-provider-minio_v3.3.0" is larger than the +# maximum file size 5242880 +# ArgoCD ne le voyait pas (`.terraform` est gitignoré), donc le défaut ne se +# manifestait qu'en local, à la relecture — c'est-à-dire au pire moment. +.terraform/ +iac/ + +.DS_Store +.git/ +.gitignore +*.tmproj +.idea/ +.vscode/ diff --git a/minio/Chart.yaml b/minio/Chart.yaml index e24e4ad..f0789ee 100644 --- a/minio/Chart.yaml +++ b/minio/Chart.yaml @@ -14,27 +14,35 @@ # master d'une vidéo reste sur l'appareil de son propriétaire — ADR-018 du front) ; # la redondance de Longhorn suffit, l'erasure coding distribué de MinIO coûterait # de la RAM et des IOPS que des Pi n'ont pas à dépenser pour ça. +# +# ⚠⚠ CE CHART EST AUTONOME DEPUIS LE 2026-09-02, ET CE N'EST PAS UN CAPRICE. +# Il dépendait du sous-chart officiel `minio/minio` 5.4.0. Ce chart N'OFFRE +# AUCUNE SONDE DE SANTÉ — vérifié sur toutes ses versions publiées, la 5.4.0 +# étant la dernière : pas une clé `livenessProbe` dans ses valeurs, pas un rendu +# de sonde dans ses templates. MinIO tournait donc sans le moindre contrôle, et +# une panne totale de trois jours est passée inaperçue (arcodange-org/tools#31). +# +# Il n'existe aucun moyen de greffer une sonde sur le Deployment d'un sous-chart +# depuis un chart parent. On rend donc les manifestes nous-mêmes — huit objets, +# tous dans templates/, chacun commenté avec ce qu'il reprend à l'identique et +# ce qu'il change délibérément. +# +# CE QU'ON REPREND À NOTRE CHARGE, ET QU'IL FAUT DONC SUIVRE À LA MAIN : le +# `tag` de l'image (values.yaml), qui n'est plus tiré par la version du chart. # ----------------------------------------------------------------------------- apiVersion: v2 name: minio -description: A Helm chart for Kubernetes +description: Stockage objet S3 du homelab — manifestes rendus ici, sans sous-chart. -dependencies: -- name: tool - version: 0.1.0 - repository: https://gitea.arcodange.lab/api/packages/arcodange-org/helm -- name: minio - version: 5.4.0 - repository: https://charts.min.io/ +# ⚠ Plus AUCUNE dépendance, et c'est délibéré : +# - `minio/minio` 5.4.0 est parti pour la raison ci-dessus ; +# - la bibliothèque `tool` n'était utilisée que par templates/helm-chart*.yaml, +# deux fichiers inertes (gardés par `tool.kind == "HelmChart"`, jamais vrai +# ici) supprimés dans le même passage. +# Effet de bord bienvenu : la synchronisation ArgoCD ne dépend plus de deux +# dépôts Helm distants — un point de panne en moins sur le stockage objet. +dependencies: [] -# A chart can be either an 'application' or a 'library' chart. -# -# Application charts are a collection of templates that can be packaged into versioned archives -# to be deployed. -# -# Library charts provide useful utilities or functions for the chart developer. They're included as -# a dependency of application charts to inject those utilities and functions into the rendering -# pipeline. Library charts do not define any templates and therefore cannot be deployed. type: application -version: 0.1.0 -appVersion: "latest" +version: 0.2.0 +appVersion: "RELEASE.2024-12-18T13-15-44Z" diff --git a/minio/templates/deployment.yaml b/minio/templates/deployment.yaml new file mode 100644 index 0000000..302425e --- /dev/null +++ b/minio/templates/deployment.yaml @@ -0,0 +1,172 @@ +# ----------------------------------------------------------------------------- +# MinIO — Deployment écrit À LA MAIN, et voici pourquoi. +# +# ⚠⚠ LE CHART OFFICIEL `minio/minio` N'OFFRE AUCUNE SONDE DE SANTÉ. +# Vérifié sur la 5.4.0 (la dernière au 2026-09-02) : aucune clé `livenessProbe` +# dans ses `values.yaml`, aucun rendu de sonde dans ses `templates/`. Ce n'était +# donc pas un oubli de configuration de notre part — il n'y avait rien à +# configurer. On reprend le manifeste à notre charge pour pouvoir poser la sonde. +# +# CE QUE ÇA A COÛTÉ, MESURÉ (arcodange-org/tools#31) : +# le 2026-08-29 à 14 h 11, les répliques Longhorn se perdent de vue sur le réseau +# (`R/W Timeout. No response received in 8s`) ; le moteur les marque `ERR` une à +# une ; à 15 h 32 le périphérique bloc disparaît sous MinIO ; à 17 h 54 **ext4 +# abandonne son journal** (`comm minio: Detected aborted journal`). À partir de +# là, toute écriture rend `EIO`. +# +# Longhorn s'est rétabli TOUT SEUL le 30 août à 11 h 50. Mais un journal ext4 +# abandonné ne se répare jamais seul : il le reste jusqu'au démontage. MinIO est +# donc resté assis sur un montage mort DEUX JOURS APRÈS la réparation du +# stockage, pendant que Longhorn (`healthy`), les répliques (`RW`), les nœuds, +# ArgoCD (`Synced, Healthy`) et le pod lui-même (`1/1 Running`, `0 restart`) +# affichaient tous vert. Trois jours de panne totale du stockage objet, et pas +# un seul indicateur rouge. +# +# ⚠ LE POD NE REDÉMARRE PAS QUAND SON SYSTÈME DE FICHIERS MEURT. Le processus +# vit ; c'est tout ce que Kubernetes regardait, faute de sonde. +# ----------------------------------------------------------------------------- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: minio + namespace: tools + labels: + app: minio + release: minio +spec: + replicas: 1 + # ⚠ IMMUABLE, et repris À L'IDENTIQUE de ce que le sous-chart avait posé : + # changer un `selector` sur un Deployment existant fait ÉCHOUER l'application, + # et ArgoCD le recréerait — donc détacherait puis rattacherait le volume. + selector: + matchLabels: + app: minio + release: minio + strategy: + # ⚠ `Recreate`, PAS `RollingUpdate` : le volume est ReadWriteOnce. Un + # roulement voudrait deux pods à la fois, le second resterait en + # `ContainerCreating` sur un `Multi-Attach error` jusqu'au timeout, et le + # déploiement paraîtrait « en cours » pendant des minutes. Le chart amont + # posait `maxSurge: 100%`, ce qui est le mauvais réglage pour un RWO. + type: Recreate + template: + metadata: + labels: + app: minio + release: minio + spec: + serviceAccountName: minio + securityContext: + # Repris tel quel : la donnée déjà écrite sur le volume appartient à + # 1000:1000. Changer ces valeurs rendrait le bucket illisible. + runAsUser: 1000 + runAsGroup: 1000 + fsGroup: 1000 + fsGroupChangePolicy: OnRootMismatch + terminationGracePeriodSeconds: 30 + containers: + - name: minio + image: "{{ .Values.minio.image.repository }}:{{ .Values.minio.image.tag }}" + imagePullPolicy: {{ .Values.minio.image.pullPolicy }} + command: + - /bin/sh + - -ce + - /usr/bin/docker-entrypoint.sh minio server /export -S /etc/minio/certs/ --address :9000 --console-address :9001 + env: + # Identifiants JAMAIS dans le dépôt : le secret est matérialisé par + # le Vault Secrets Operator depuis kvv2/minio/config. + - name: MINIO_ROOT_USER + valueFrom: + secretKeyRef: + name: {{ .Values.minio.existingSecret }} + key: rootUser + - name: MINIO_ROOT_PASSWORD + valueFrom: + secretKeyRef: + name: {{ .Values.minio.existingSecret }} + key: rootPassword + {{- range $cle, $valeur := .Values.minio.environment }} + - name: {{ $cle }} + value: {{ $valeur | quote }} + {{- end }} + ports: + - name: http + containerPort: 9000 + protocol: TCP + - name: http-console + containerPort: 9001 + protocol: TCP + # --------------------------------------------------------------- + # LES SONDES — la raison d'être de ce fichier. + # + # ⚠ `/minio/health/live` NE SUFFIT PAS, et c'est mesuré : il répond + # 200 sur un magasin QUI NE PEUT PLUS ÉCRIRE. C'est précisément + # pourquoi la panne du 29 août est restée invisible trois jours. + # + # `/minio/health/cluster` vérifie le QUORUM D'ÉCRITURE — la propriété + # qu'on veut réellement garder. + # + # SABOTAGE RELEVÉ (2026-09-02, MinIO jetable, quatre disques, les deux + # moitiés dans LE MÊME POD, même image) : + # + # | état du magasin | /health/live | /health/cluster | + # |------------------------|--------------|-----------------| + # | 4 disques sains | 200 | **200** | + # | quorum d'écriture perdu| **200** | **503** | + # + # Sabotage : `format.json` de deux disques sur quatre écrasé. La bascule + # de `cluster` est survenue entre t+20 s et t+40 s. `live` n'a jamais + # bougé. Les DEUX moitiés comptent : la sonde rougit quand la propriété + # est violée, ET reste verte sinon. + # --------------------------------------------------------------- + startupProbe: + # Au démarrage on interroge `live` : tant que MinIO monte, `cluster` + # répond 503 pour une raison légitime, et l'interroger ici tuerait + # le pod avant qu'il ait fini de démarrer. + # 24 × 5 s = 2 min accordées au démarrage. + httpGet: + path: /minio/health/live + port: 9000 + periodSeconds: 5 + timeoutSeconds: 5 + failureThreshold: 24 + readinessProbe: + # Retire MinIO du Service quand il ne peut plus écrire : les clients + # reçoivent un refus franc au lieu d'un dépôt qui part dans le vide. + httpGet: + path: /minio/health/cluster + port: 9000 + periodSeconds: 15 + timeoutSeconds: 5 + failureThreshold: 3 + livenessProbe: + # ⚠ C'EST CELLE-CI QUI AURAIT LEVÉ LA PANNE : le remède au journal + # ext4 abandonné est un démontage, donc un redémarrage du pod. + # + # ⚠ 6 × 30 s = 3 MINUTES de refus SOUTENU avant de redémarrer. Cette + # grappe connaît des à-coups Longhorn de quelques secondes (le + # déclencheur du 29 août était un `R/W Timeout` de 8 s) : une sonde + # nerveuse redémarrerait MinIO sur un hoquet. C'est l'erreur exacte + # que redis a payée ici en 2026-07 — 836 échecs de sonde, 135 + # redémarrages, et un `.fr` en 403 (voir redis/values.yaml). + httpGet: + path: /minio/health/cluster + port: 9000 + periodSeconds: 30 + timeoutSeconds: 5 + failureThreshold: 6 + resources: + {{- toYaml .Values.minio.resources | nindent 12 }} + volumeMounts: + - name: export + mountPath: /export + - name: minio-user + mountPath: /tmp/credentials + readOnly: true + volumes: + - name: export + persistentVolumeClaim: + claimName: minio + - name: minio-user + secret: + secretName: {{ .Values.minio.existingSecret }} diff --git a/minio/templates/helm-chart-config.yaml b/minio/templates/helm-chart-config.yaml deleted file mode 100644 index 31cb271..0000000 --- a/minio/templates/helm-chart-config.yaml +++ /dev/null @@ -1,3 +0,0 @@ -{{- if eq .Values.tool.kind "HelmChart" -}} -{{- include "tool.helm-chart-config.tpl" . -}} -{{- end -}} \ No newline at end of file diff --git a/minio/templates/helm-chart.yaml b/minio/templates/helm-chart.yaml deleted file mode 100644 index c6b793d..0000000 --- a/minio/templates/helm-chart.yaml +++ /dev/null @@ -1,3 +0,0 @@ -{{- if eq .Values.tool.kind "HelmChart" -}} -{{- include "tool.helm-chart.tpl" . -}} -{{- end -}} \ No newline at end of file diff --git a/minio/templates/ingress.yaml b/minio/templates/ingress.yaml new file mode 100644 index 0000000..b469cda --- /dev/null +++ b/minio/templates/ingress.yaml @@ -0,0 +1,48 @@ +# Les deux expositions INTERNES (`.lab`). L'exposition publique de l'API S3 vit +# dans ingress-public.yaml, avec ses propres avertissements. +# +# ⚠ La console d'administration n'est PAS exposée publiquement, et ça ne doit +# pas changer par inadvertance : elle porte les identifiants racine. +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: minio + namespace: tools + labels: + app: minio + release: minio +spec: + ingressClassName: traefik + rules: + - host: s3.arcodange.lab + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: minio + port: + number: 9000 +--- +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: minio-console + namespace: tools + labels: + app: minio + release: minio +spec: + ingressClassName: traefik + rules: + - host: minio.arcodange.lab + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: minio-console + port: + number: 9001 diff --git a/minio/templates/pvc.yaml b/minio/templates/pvc.yaml new file mode 100644 index 0000000..24d9aa0 --- /dev/null +++ b/minio/templates/pvc.yaml @@ -0,0 +1,39 @@ +# ----------------------------------------------------------------------------- +# Le volume de données. ⚠⚠ C'EST L'OBJET LE PLUS DANGEREUX DE CE LOT. +# +# Il était rendu par le sous-chart `minio/minio`. En reprenant les manifestes à +# notre charge, si on avait OUBLIÉ de le rendre ici, ArgoCD l'aurait ÉLAGUÉ — +# c'est-à-dire supprimé, avec les vidéos dedans. +# +# ⚠ `volumeName` n'est VOLONTAIREMENT pas déclaré : c'est le contrôleur qui +# pose ce champ à la liaison. ArgoCD ignore ce qui existe en vie sans être +# déclaré, donc la liaison actuelle (pvc-ebb2605f-…) survit ; et le figer ici +# empêcherait toute recréation future de se lier à un autre volume. +# +# ⚠ La plupart des champs d'un PVC sont IMMUABLES. Ce fichier reproduit à +# l'identique ce que le sous-chart avait posé — le modifier n'aurait pas l'effet +# qu'on croit, il ferait échouer l'application. +# ----------------------------------------------------------------------------- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: minio + namespace: tools + labels: + app: minio + release: minio + annotations: + # Ceinture ET bretelles : même si ce manifeste disparaissait un jour du + # dépôt, ArgoCD ne supprimerait pas le volume de lui-même. + argocd.argoproj.io/sync-options: Prune=false +spec: + accessModes: + - ReadWriteOnce + storageClassName: {{ .Values.minio.persistence.storageClass }} + volumeMode: Filesystem + resources: + requests: + # 50 Gi ≈ 250 heures de cours au palier « travail » de Kadans (360p, + # 3,4 Mo/min — ADR-018 du front). Longhorn réplique ce volume sur les + # nœuds : compter ×3 sur la capacité du cluster avant d'augmenter. + storage: {{ .Values.minio.persistence.size }} diff --git a/minio/templates/service.yaml b/minio/templates/service.yaml new file mode 100644 index 0000000..73096ac --- /dev/null +++ b/minio/templates/service.yaml @@ -0,0 +1,40 @@ +# API S3 (les applications parlent ici) et console d'administration (humains). +# Deux Services distincts parce que deux ingress distincts les exposent, et que +# seul le premier est ouvert publiquement (voir ingress-public.yaml). +apiVersion: v1 +kind: Service +metadata: + name: minio + namespace: tools + labels: + app: minio + release: minio +spec: + type: ClusterIP + selector: + app: minio + release: minio + ports: + - name: http + port: 9000 + targetPort: 9000 + protocol: TCP +--- +apiVersion: v1 +kind: Service +metadata: + name: minio-console + namespace: tools + labels: + app: minio + release: minio +spec: + type: ClusterIP + selector: + app: minio + release: minio + ports: + - name: http + port: 9001 + targetPort: 9001 + protocol: TCP diff --git a/minio/templates/serviceaccount.yaml b/minio/templates/serviceaccount.yaml new file mode 100644 index 0000000..996bb20 --- /dev/null +++ b/minio/templates/serviceaccount.yaml @@ -0,0 +1,12 @@ +# Le rôle Vault du module `app_roles` borne l'authentification au SERVICE +# ACCOUNT nommé comme l'app (`bound_service_account_names = [minio]`) : on +# aligne donc le SA du pod sur ce nom — un SA pour le pod, le même pour Vault, +# rien à réconcilier. +apiVersion: v1 +kind: ServiceAccount +metadata: + name: minio + namespace: tools + labels: + app: minio + release: minio diff --git a/minio/values.yaml b/minio/values.yaml index 9c0d545..0fa3ed6 100644 --- a/minio/values.yaml +++ b/minio/values.yaml @@ -1,33 +1,41 @@ -minio: &minio_config +# ----------------------------------------------------------------------------- +# ⚠ Depuis le 2026-09-02, ces valeurs alimentent NOS PROPRES manifestes +# (templates/deployment.yaml & co.), plus un sous-chart. Beaucoup de réglages +# qui vivaient ici sont devenus du manifeste explicite — on dit ci-dessous où +# chacun est parti, pour qu'on ne les cherche pas en vain : +# +# mode / replicas → templates/deployment.yaml (`replicas: 1`) +# serviceAccount.* → templates/serviceaccount.yaml +# ingress / consoleIngress→ templates/ingress.yaml (le public : ingress-public.yaml) +# buckets: [] → n'existe plus : chaque app déclare les siens +# depuis son dépôt, via iac/modules/minio_app +# metrics.serviceMonitor → n'existe plus : pas d'opérateur Prometheus ici, +# le scrape se fait par annotation +# +# ⚠ Et le `post-job` du chart officiel (création de buckets et d'utilisateurs) +# n'existe plus non plus. Il ne faisait rien : `buckets` était vide, et son +# ConfigMap de 25 Ko n'était monté par AUCUN conteneur — vérifié sur le +# Deployment vivant avant de le retirer. +# ----------------------------------------------------------------------------- +minio: # Image officielle MinIO — multi-arch, arm64 inclus (les nœuds sont des Pi 5). + # + # ⚠ LE TAG EST MAINTENANT À NOTRE CHARGE. Il était auparavant choisi par la + # version du sous-chart ; plus personne ne le fait avancer tout seul. C'est le + # prix assumé de l'autonomie du chart — à relever quand on met à jour. image: repository: quay.io/minio/minio + tag: RELEASE.2024-12-18T13-15-44Z pullPolicy: IfNotPresent - # STANDALONE : un seul serveur, un seul volume. La donnée servie ici est - # DÉRIVÉE (le master reste chez l'utilisateur) et Longhorn réplique déjà le - # volume ; l'erasure coding distribué coûterait de la RAM que les Pi n'ont pas - # à dépenser pour ça. `replicas` est ignoré en standalone. - mode: standalone - replicas: 1 - - # Le rôle Vault du module `app_roles` borne l'authentification au SERVICE - # ACCOUNT nommé comme l'app (`bound_service_account_names = [minio]`) : on - # aligne donc le SA du pod sur ce nom, plutôt que le « minio-sa » par défaut - # du chart amont — un SA pour le pod, le même pour Vault, rien à réconcilier. - serviceAccount: - create: true - name: minio - # Identifiants JAMAIS dans le dépôt : le secret est matérialisé par le - # Vault Secrets Operator depuis kvv2/minio/config (voir resources/ et iac/). - # Le chart lit `.data.rootUser` et `.data.rootPassword` de ce secret. + # Vault Secrets Operator depuis kvv2/minio/config (voir templates/ et iac/). + # Les clés `rootUser` / `rootPassword` gardent les noms qu'attendait le chart + # officiel — les renommer obligerait à toucher Vault pour rien. existingSecret: minio-config persistence: - enabled: true storageClass: longhorn - accessMode: ReadWriteOnce # 50 Gi ≈ 250 heures de cours au palier « travail » de Kadans (360p, # 3,4 Mo/min — ADR-018 du front). Longhorn réplique ce volume sur les # nœuds : compter ×3 sur la capacité du cluster avant d'augmenter. @@ -42,45 +50,15 @@ minio: &minio_config limits: memory: 2Gi - # API S3 (les applications parlent ici). - ingress: - enabled: true - ingressClassName: traefik - path: / - hosts: - - s3.arcodange.lab - - # Console d'administration (humains). - consoleIngress: - enabled: true - ingressClassName: traefik - path: / - hosts: - - minio.arcodange.lab - - # Buckets créés au déploiement. `versioning: false` assumé : ces objets sont - # DÉRIVÉS et re-générables depuis le master local — versionner doublerait le - # stockage pour un filet dont on n'a pas besoin. - # AUCUN bucket ici : chaque app déclare les siens depuis son dépôt, via le - # module `iac/modules/minio_app`. - # ADR : factory/doc/adr/20260726-stockage-objet-minio.md - buckets: [] - - # Métriques : Prometheus (namespace `tools`) scrape déjà la façade et le - # laptop (ADR-0014 du dossier) — MinIO rejoint la même vue. - metrics: - serviceMonitor: - enabled: false # pas d'opérateur Prometheus ici : scrape par annotation environment: + # Métriques : Prometheus (namespace `tools`) scrape déjà la façade et le + # laptop (ADR-0014 du dossier) — MinIO rejoint la même vue. + # + # ⚠ Cette variable était déclarée DEUX FOIS sur le Deployment rendu par le + # sous-chart (une fois par le chart, une fois par nos `environment`) — + # `kubectl` le signalait à chaque application : « hides previous definition + # of MINIO_PROMETHEUS_AUTH_TYPE ». Rendre le manifeste nous-mêmes règle ça. MINIO_PROMETHEUS_AUTH_TYPE: "public" # CORS : le navigateur téléverse directement (URL présignées) — origines # EXACTES, jamais « * » : une URL qui fuite serait sinon rejouable partout. MINIO_API_CORS_ALLOW_ORIGIN: "https://kadans.arcodange.fr,https://kadans.arcodange.lab" - -tool: - # kind: 'SubChart' or 'HelmChart', if subchart then uncomment Chart.yaml dependency, else comment and use tool library with helm chart template - kind: 'SubChart' - repo: https://charts.min.io/ - chart: minio - version: 5.4.0 - values: *minio_config