Files
factory/doc/adr
arcodangeandClaude Opus 5 b92da95701 docs(adr) — stockage objet MinIO : qui déclare quoi, et qui détient quoi
Trois questions indépendantes, tranchées lors du branchement de Kadans sur
MinIO (2026-07-26) : qui déclare les buckets d'une app, qui détient les
identifiants capables de les créer, et comment l'app lit les siens.

La décision de fond est du fondateur : CHACUN SON PÉRIMÈTRE. Une application
déclare ses buckets depuis son propre dépôt ; `tools` fournit le serveur, un
module de standardisation et un compte de provisionnement — pas la liste. Une
première version faisait tout porter par l'infra partagée : à ce rythme, chaque
bucket de chaque app devenait une PR sur le dépôt commun.

L'ADR consigne aussi les trois identités et leurs portées (root / provisionneur
/ compte de service), pourquoi la lecture des identifiants est une propriété
inconditionnelle de la plateforme plutôt qu'une déclaration par app, et pourquoi
les octets ne transitent pas par l'API — avec les conséquences que ça impose
(endpoint public, CORS aux origines exactes, pas de basic-auth sur l'ingress S3).

Les alternatives écartées sont listées avec leur motif, dont deux que j'avais
moi-même proposées et qui étaient plus faibles.

Deux limites assumées y figurent : le provisionneur est un secret PARTAGÉ entre
rôles CI (sa compromission permet de créer des buckets, pas de lire des objets),
et les noms d'actions d'administration MinIO n'ont pas été éprouvés contre le
serveur au moment d'écrire.

Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
Claude-Session: https://claude.ai/code/session_01CoafGWmRVESaWX819USUUA
2026-07-26 10:19:48 +02:00
..

Bases

Fondamentaux

Note

Reference: Arcodange Factory Ansible Collection

Important

duckdns.org offre un sous domaine de duckdns.org gratuitement ainsi que des (sous-)sous domaines. Avec notre token on peut valider le challenge DNS de letsencrypt (pour du SSL gratuit) et configurer un cron job pour mettre à jour l'ip publique référencée par notre sous-domaine.

%%{init: { 'logLevel': 'debug', 'theme': 'base' } }%%
flowchart
    net[Internet]
    subgraph "Local Network (livebox)"
        net_rules{network rules}
        subgraph pi1
            subgraph Docker_pi1[Docker]
                %%subgraph Traefik
                %%    :web80
                %%    :websecure443
                %%end
                gitea_action_runner
            end
            subgraph k3s_server[K3S Master]
                %% Traefik -.-> K3S_Traefik
                subgraph K3S_Traefik
                    subdomain_git[/git.arcodange.duckdns.org/]
                end
                Pods[hello world web app]
                ArgoCD
            end
        end
        subgraph pi2
            subgraph Docker_pi2[Docker]
                subgraph gitea_network
                    subgraph postgres_service
                    end
                    subgraph gitea_service
                    end
                end
            end
            subgraph HardDisk[Hard Disk]
                pg_data[pg_data partition]
                gitea_data[gitea_data partition]
                nfs_data[NFS_data partition]
                K3S_storage_provisioner --o nfs_data
            end
            subgraph k3s_agent[K3S Agent]
                Pods'[hello world web app]
            end
        end
    end

    postgres_service --o pg_data
    gitea_service --o gitea_data

    net -. "http(s)://(*.)arcodange.duckdns.org" .- net_rules -. :<i>443/80</i> .-> K3S_Traefik
    %% Traefik

    subdomain_git -.-> gitea_service

    classDef k3s fill:#fff,stroke:#f0f,stroke-width:1px;
    classDef storage fill:#999,stroke:#000,stroke-width:2px;

    class HardDisk storage;
    class k3s_server,k3s_agent,K3S_storage_provisioner k3s;