🍋 CDC · Maquettes Live

Outil Maquettes Live — Cahier des charges

Lemon Learning · v1 · 10 juin 2026 — duplication autonome du back-office pour dĂ©mos, POC et prototypes par les Ă©quipes mĂ©tier.

En une phrase. Un outil interne oĂč n'importe quel collaborateur Lemon, sans compĂ©tence technique, crĂ©e en un clic une instance live isolĂ©e du back-office (stack complet + base de donnĂ©es dĂ©diĂ©e), la pilote via une CLI web assistĂ©e par Claude Code, et la fait Ă©voluer — chaque action Ă©tant versionnĂ©e automatiquement et rĂ©utilisable par les dĂ©veloppeurs.

Convention de lecture : Décision = tranché par tes réponses · Proposition = à valider, je propose · Ouvert = à arbitrer.

1Contexte & objectif

Pourquoi cet outil, et ce qu'il doit permettre.

Aujourd'hui, monter un environnement de démonstration du back-office Lemon Learning dépend des équipes techniques. L'objectif est de supprimer cette dépendance : permettre aux équipes métier (commerce, CSM, produit, marketing) de créer en autonomie quasi immédiate une instance fonctionnelle pour préparer démonstrations, prototypes, POC ou environnements de présentation.

Principes directeurs

2Architecture générale

Ce qu'est réellement une « instance », et comment elles cohabitent.

DécisionUne instance = un stack complet, pas un conteneur unique. Le back-office Lemon est composé de ~8 services cùblés ensemble : reverse-proxy/TLS (Caddy), API+back-office PHP/Laravel, worker de jobs, PostgreSQL, Redis, Keycloak, lemonstats et l'antivirus (avapi).
DécisionTechnologie : Docker, avec orchestration Kubernetes si le besoin l'exige (montée en charge / multi-machines).
DécisionChaque instance est immuable : figée à la version stable du code au moment de sa création. Pas de mise à jour silencieuse qui casserait une démo en cours (voir §8 pour l'exception « tickbox »).

Isolation

Chaque projet est isolé à trois niveaux :

DĂ©cisionFrontiĂšre de confiance : un collaborateur peut se connecter Ă  n'importe quelle instance et tout y casser (c'est assumĂ©, l'archivage est le filet de sĂ©curitĂ©). En revanche, une session ne peut modifier que le projet auquel elle est rattachĂ©e — jamais les autres, ni le serveur hĂŽte.

Orchestration — trajectoire proposĂ©e

PropositionDémarrer simple, complexifier seulement si la charge l'impose :
  1. Phase 1 — Docker Compose scriptĂ© sur une machine unique : un projet compose par instance, pilotĂ© par un petit service de contrĂŽle. Couvre les ~60 projets cibles (voir §11).
  2. Phase 2 — Kubernetes uniquement quand on dĂ©passe une machine (HA, > ~70-80 instances, ou besoin de self-healing).
Rationale : K8s sur une seule machine pour 60 démos est de la complexité prématurée. On garde l'option ouverte sans la payer trop tÎt.

Schéma des flux

Du clic « crĂ©er » jusqu'au code versionnĂ© — chemin d'une maquette.

đŸ‘€ Collaborateurs Lemon
Tout le monde, tous les droits — actions nominatives et loggĂ©es.
â–ŒSSO Google
đŸ–„ïž Interface d'admin control-plane
Vue de tous les projets · création one-click · statut des instances · logs · alertes.
ݮ CrĂ©er un projet » + nom
⚙ Orchestrateur
Attribue une instance prĂȘte · reconstitue le pool en arriĂšre-plan · surveille les Ă©tats.
â–Œpioche une instance
đŸ”„ Pool — 4 instances prĂ©chauffĂ©es
Alimenté en continu par :
⟔ images Docker prĂ©-pull ⟔ DB clonĂ©e du « gold » anonymisĂ© (TEMPLATE) ⟔ realm Keycloak prĂ©-importĂ©
â–Œattribution instantanĂ©e
📩 Instance active — stack isolĂ© & immuable
frontbackjobsdbrediskeycloakstatsavapi
Deux accĂšs :
🌐 Maquette web — SSO Keycloak ⌚ CLI web (ttyd) ⟶ đŸ€– Claude Code (jail projet)
â–Œauto-commit invisible aprĂšs chaque modif
🔁 Versioning — forge isolĂ©e
1 dépÎt par projet, commits automatiques. Passerelle « promouvoir vers GitLab Lemon » à la demande d'un dev.

En transverse : l'Observabilité (§10) branche sur le control-plane (statut/logs/alertes) ; la Sécurité (§9) est le jail qui entoure chaque session et le réseau de chaque stack.

3Cycle de vie des projets

Création instantanée, pool préchauffé, archivage, suppression.

Création

L'utilisateur clique sur « Créer un projet », saisit un nom. Le systÚme attribue alors une instance disponible du pool, branche la base seed, génÚre les accÚs et rend l'environnement accessible en quelques secondes.

Pool d'instances préchauffées

DĂ©cision4 instances d'avance en permanence, dĂ©jĂ  branchĂ©es sur la derniĂšre version stable et sur une DB seed dĂ©diĂ©e, prĂȘtes Ă  ĂȘtre attribuĂ©es instantanĂ©ment. DĂšs qu'une est consommĂ©e, une nouvelle se recrĂ©e en arriĂšre-plan pour maintenir le stock.
PropositionPour que la reconstitution du pool soit quasi-gratuite : images Docker pré-pull + DB clonée par CREATE DATABASE 
 TEMPLATE (ou snapshot de volume copy-on-write) + realm Keycloak pré-importé. Un nouveau stack rejoint le pool en ~20-60 s.

Expiration & archivage

DécisionUn projet est archivé automatiquement au bout d'1 an et demi sans modification, ou plus tÎt si le nombre de projets explose.
DécisionLes archives sont supprimées automatiquement lorsque l'espace disque dépasse un seuil défini (purge des plus anciennes d'abord). L'archivage libÚre la RAM/CPU (stack éteint) ; l'archive ne conserve que la DB + le code versionné, compressés.

Le dimensionnement disque et la taille d'une instance (qui pilotent ce seuil) sont calculés en §11.

États d'un projet

pool (prĂ©chauffĂ©) → actif → archivĂ© (Ă©teint, RAM libĂ©rĂ©e) → supprimĂ© (purge disque)

4Interface d'administration

Authentification, vue des projets, droits, accĂšs.

DécisionAccÚs via la SSO Google de Lemon Learning. Tout collaborateur authentifié a automatiquement accÚs, sans provisioning manuel des comptes.

Vue des projets

Depuis l'écran principal, tout utilisateur voit l'ensemble des projets : nom, créateur, statut de l'instance (voir §10), et un accÚs direct à l'environnement et à la session de travail.

Droits

DĂ©cisionPas de quotas, pas de rĂŽles. Tout le monde voit tout et peut tout faire sur l'interface d'admin des instances. Le garde-fou n'est pas la permission mais la traçabilitĂ© : chaque action est loggĂ©e et nominative. La suppression n'est jamais directe — il faut d'abord archiver.

SĂ©lection de projet — interface

PropositionRĂ©utiliser le menu dĂ©clenchable par m dans tmux dĂ©jĂ  en place sur dev0203.com pour basculer entre projets — rapide et Ă©prouvĂ©. À remplacer par une UI web plus propre, plus « user-friendly » et sĂ©curisĂ©e si elle apporte un vrai gain pour des profils non techniques (le menu tmux peut rebuter un non-dev). À arbitrer aprĂšs un premier test utilisateur.

5Environnement de travail : CLI web + Claude Code

Comment l'utilisateur pilote et modifie sa maquette.

DécisionChaque projet expose un lien vers une interface de type CLI dans le navigateur (HTML, hébergée sur le serveur), permettant d'exécuter des commandes et de piloter l'instance live. Une session Claude Code (hébergée sur le serveur) y est associée, avec proposition de bascule/continuité vers elle.

Technologie

PropositionRĂ©utiliser le ttyd dĂ©jĂ  dĂ©ployĂ© (ttyd.dev0203.com) comme terminal web, un par projet, avec Claude Code lancĂ© dedans. Rester ouvert Ă  mieux si une option plus propre/sĂ©curisĂ©e Ă©merge. La continuitĂ© « CLI → session » est gratuite : mĂȘme conteneur, mĂȘme workdir, dossier de session Claude persistĂ© sur volume.

Expérience CLI sur mesure

Fichier mémoire de la session (CLAUDE.md par instance)

DécisionChaque instance embarque un fichier mémoire complet qui cadre le comportement de Claude Code :
  • reprend les bonnes pratiques de code de Pierre / Lemon ;
  • masque tous les dĂ©tails techniques dans les rĂ©ponses (sauf demande explicite contraire de l'utilisateur) ;
  • garantit des rĂ©ponses comprĂ©hensibles par un non-technicien ;
  • respecte les guidelines, frameworks et la gate SonarQube de Lemon Learning ;
  • fait elle-mĂȘme les choix techniques (peut poser des questions de haut niveau, jamais des questions techniques), en s'appuyant sur des guidelines pour rester cohĂ©rente d'une session Ă  l'autre.

Effet recherché : l'utilisateur métier décrit un besoin en langage naturel ; la session tranche le « comment » seule, dans le respect des standards Lemon, et ne renvoie que du compréhensible.

Collaboration

DĂ©cisionCollaboration ouverte : plusieurs utilisateurs peuvent travailler sur un mĂȘme projet ; tout le monde accĂšde aux sessions de tous les projets. Pas de systĂšme de partage dĂ©diĂ© nĂ©cessaire (l'accĂšs est dĂ©jĂ  universel). Pas d'historique des commandes CLI.

6Versioning & reprise par les développeurs

Tracer chaque changement sans bruit, et permettre aux devs de récupérer le code.

DĂ©cisionUn versioning GitLab est mis en place. Les commits se font automatiquement et en continu, de façon invisible pour l'utilisateur. Les dĂ©veloppeurs reprendront ce code, en tout ou partie, Ă  un moment — il faut donc un bon accĂšs pour eux. MĂ©langer ces commits au GitLab produit de Lemon gĂ©nĂšrerait trop de bruit.
PropositionForge isolée, dédiée aux maquettes.
  • Un namespace/groupe GitLab sĂ©parĂ© (ex. groupe maquettes-live, idĂ©alement une instance GitLab auto-hĂ©bergĂ©e sur le serveur — ou Gitea, plus lĂ©ger — pour ne jamais polluer l'historique du dĂ©pĂŽt produit).
  • Un dĂ©pĂŽt par projet/instance. Un watcher commit + push aprĂšs chaque modification de Claude Code, avec messages auto-gĂ©nĂ©rĂ©s. L'utilisateur ne voit rien.
  • Reprise par les devs : accĂšs en lecture au groupe maquettes-live ; ils parcourent l'historique complet d'un projet et rĂ©cupĂšrent ce qui les intĂ©resse.
  • Passerelle « promouvoir vers le GitLab Lemon » : une action gĂ©nĂšre une branche/patch (ou MR) vers le vrai dĂ©pĂŽt produit, Ă  la demande — le bruit ne traverse que sur dĂ©cision explicite d'un dev.

7Données : seed & anonymisation

D'oĂč viennent les donnĂ©es de dĂ©mo, et comment elles restent sĂ»res.

DécisionUne seed unique a priori, mais versionnable (pour la maintenabilité dans le temps). Chaque instance a sa propre base, isolée. La seed est maintenue par l'admin serveur.
DécisionL'utilisateur ne peut pas « réinitialiser » son environnement, mais peut l'archiver. Si c'est simple à implémenter, il peut revenir sur d'anciennes versions (rollback léger).

Source & anonymisation

PropositionPartir du dump de production anonymisé (le mécanisme bin/db-anon existe déjà) pour obtenir une seed crédible, puis appliquer un traitement d'anonymisation automatique remplaçant par des données réalistes :
  • une liste de sociĂ©tĂ©s amĂ©ricaines + une liste de ~300 prĂ©noms/noms amĂ©ricains, rĂ©injectĂ©s par intervalles sur les enregistrements ;
  • objectif : si l'on se faisait hacker, aucune donnĂ©e client rĂ©elle ne fuiterait — tout en gardant une dĂ©mo crĂ©dible.
Ce « gold » anonymisé devient le template Postgres cloné à chaque création (voir §3).

8Déploiement du code & mises à jour

Quelle version, et comment les instances suivent (ou non) le code.

OuvertBranche/version de référence pour « derniÚre version stable » : à confirmer (dernier tag de release vs master). Les instances étant immuables, une instance est épinglée à cette version au moment de sa création.

Mise Ă  jour des instances

DécisionInstances non déployées (pool, non encore attribuées) : mises à jour automatiquement vers la derniÚre version stable.
DécisionInstances déployées (attribuées à un projet) : une case à cocher « Mettre à jour automatiquement l'instance », modifiable à tout moment. Accompagnée d'un texte pour/contre :
✅ Pour⚠ Contre
Bénéficie des derniers correctifs/fonctionnalités ; démo « à jour »Risque de casser une démo stabilisée ; migrations DB à rejouer ; perte de reproductibilité
Par défaut décochée (cohérent avec l'immuabilité).
DécisionMigrations de base de données : l'interface propose plusieurs choix (ex. rejouer les migrations, conserver la version actuelle de la DB, repartir de la seed) au moment d'une mise à jour.

9🔒 SĂ©curitĂ©

Le point le plus sensible : donner un shell assisté par IA à des non-techniciens.

Le risque central. Une CLI web + Claude Code = capacitĂ© d'exĂ©cuter des commandes. Sans confinement, c'est une porte vers le serveur hĂŽte, les autres projets et les secrets. Tout le modĂšle de sĂ©curitĂ© repose donc sur le confinement par projet et la traçabilitĂ©, pas sur des permissions fines (il n'y en a pas — voir §4).

9.1 — Authentification (deux plans distincts)

DĂ©cisionOutil d'admin (liste des projets, crĂ©ation) → SSO Google Lemon Learning.
DĂ©cisionAccĂšs aux environnements/maquettes → SSO via Keycloak. Pas d'exposition publique anonyme.

9.2 — Confinement des sessions

DĂ©cisionUne session (CLI / Claude Code) ne peut modifier que son propre projet. Le crĂ©ateur peut se connecter Ă  toute instance et tout y casser — mais jamais dĂ©border vers un autre projet ou le host.
PropositionMise en Ɠuvre par jail conteneur : utilisateur non-root, pas d'accĂšs au socket Docker, rĂ©seau restreint au seul stack du projet, aucun accĂšs aux secrets de prod ni aux clĂ©s d'infra. Le « mode dangereux » (§5) reste bornĂ© Ă  ce pĂ©rimĂštre, avec une seule exception : la consultation de docs externes.

9.3 — Protection des donnĂ©es

DĂ©cisionAnonymisation systĂ©matique de la seed (sociĂ©tĂ©s + noms US rĂ©alistes par intervalles, §7). Aucune donnĂ©e client rĂ©elle ne rĂ©side dans une maquette → une compromission ne fuite rien d'exploitable.

9.4 — TraçabilitĂ© & rĂ©versibilitĂ©

DĂ©cisionToutes les actions de l'interface d'admin sont loggĂ©es et nominatives. La suppression exige un archivage prĂ©alable (pas de destruction directe). Le versioning Git automatique (§6) conserve l'historique complet → tout est rejouable / auditable.
Surface Auth Confinement ───────────────────────────────────────────── Outil d'admin SSO Google tous droits, tout loggĂ© Maquette (web) Keycloak SSO, non public Session CLI/IA hĂ©ritĂ©e projet jail : projet courant uniquement (+ docs externes en lecture)

10Observabilité

Voir l'Ă©tat, lire les logs, ĂȘtre alertĂ©.

DĂ©cisionStatut de chaque instance visible dans l'interface (running / arrĂȘtĂ©e / en provisioning / en erreur). Pas d'historique de mĂ©triques — un Ă©tat courant, pas du time-series.
DécisionLogs accessibles depuis l'interface.
DécisionAlertes en cas d'échec de provisioning (le pool doit toujours se reconstituer ; tout échec doit remonter).

11Dimensionnement & coûts

Taille d'une instance · RAM/CPU comparées · machine pour ~60 projets.

11.1 — Taille disque d'une instance calcul demandĂ©

PosteEstimationNote
Base PostgreSQL (clone du gold anonymisé)~3 Gocopie complÚte ; réductible via volume copy-on-write
Copie de code Ă©ditable (pour Claude Code)~1–2 GodĂ©pĂŽt + dĂ©pendances ; mutualisable en read-only + overlay
Stockage média (library/image/vidéo)~0,5 Goseed surtout partagée en lecture seule, delta par instance faible
Couches conteneurs + logs + données Keycloak/Redis~0,5 Goimages de base mutualisées (hors décompte)
Total par instance (planification)≈ 5–6 Gofourchette 4–8 Go — Ă  confirmer par mesure rĂ©elle d'un stack
Archive (DB dump + code, compressĂ©s)~2–3 Gola DB compresse bien

60 actifs × 6 Go ≈ 360 Go + archives jusqu'au seuil de purge images de base partagĂ©es ≈ 10–20 Go

→ Un disque NVMe ≄ 1 To (idĂ©alement 2×1 To) loge confortablement 60 instances actives + un volant d'archives. C'est ce volant qui dĂ©clenche la purge automatique (§3).

11.2 — RAM par instance & choix de la machine tableau demandĂ©

Deux régimes selon qu'on mutualise ou non les services non critiques pour la démo (antivirus avapi ~1 Go, Keycloak ~0,5 Go, lemonstats) :

Stack complet ≈ 2,5 Go/instance Stack densifiĂ© (avapi/keycloak/stats partagĂ©s) ≈ ~1 Go/instance

RAM machineInstances en stack complet (~2,5 Go)Instances densifiées (~1 Go)Verdict pour 60
64 Go~22~50❌ insuffisant
128 Go~48~115⚠ OK seulement si densifiĂ©
★ 192 Go~70~180✅ 60 stacks complets + marge
256 Go~95~240✅ confort total + croissance

CPU : 60 dĂ©mos majoritairement inactives, pics PHP Ă  l'affichage → un EPYC 24–32 c / 48–64 t absorbe largement. La RAM est la contrainte limitante, pas le CPU.

« 60 projets simultanés sur une machine, est-ce réaliste ? »

Oui, sur un seul Dedibox correctement dimensionné :

  • En stack complet → machine 192–256 Go (EPYC 24c+, 2×1 To NVMe). C'est disponible chez Dedibox pour ~230–320 €/mois HT.
  • En stack densifiĂ© → 128 Go suffit (~180–230 €/mois), au prix d'un effort d'ingĂ©nierie (mutualiser avapi/keycloak/stats).

Au-delà de ~70–80 instances, ou pour de la haute dispo, c'est le moment de passer en multi-machines + Kubernetes (§2, phase 2).

PropositionCible recommandĂ©e : un Dedibox Core EPYC 192–256 Go, 2×1 To NVMe (~230–320 €/mois HT) pour hĂ©berger 60 instances en stack complet, RAM toujours prĂȘte (pool de 4 inclus). Soit ~4–5 €/instance/mois. À comparer : sur un cloud usage-based (type Railway), 60 stacks toujours allumĂ©s coĂ»teraient un ordre de grandeur au-dessus.

12Questions ouvertes restantes

Le minimum encore Ă  trancher pour figer le CDC.

  1. Version de référence du code « stable » : dernier tag de release ou master ? (§8)
  2. Forge isolée : GitLab auto-hébergé dédié, groupe séparé sur le GitLab existant, ou Gitea léger ? (§6)
  3. UI de sélection de projet : on garde le menu tmux m, ou on investit dans une UI web dédiée pour les non-techs ? (§4)
  4. Seuil de purge disque des archives : à fixer une fois la taille réelle d'instance mesurée (§11.1).
  5. Stack complet vs densifiĂ© : accepte-t-on l'effort de mutualisation (avapi/keycloak) pour tenir sur 128 Go, ou on prend direct 192–256 Go ? (§11.2)
  6. Affichage des crédits Claude : faisabilité technique à confirmer cÎté API/quota (§5).