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
- Autonomie : zéro intervention technique pour créer et utiliser une maquette.
- Immédiateté : provisioning quasi instantané grùce à un pool d'instances préchauffées.
- Crédibilité : chaque instance démarre avec des données réalistes (seed).
- Simplicité « one-click » : créer un projet = un nom + un clic.
- Réutilisabilité : le travail produit est versionné et récupérable par les développeurs.
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 :
- Applicatif : son propre stack de conteneurs, son propre sous-domaine.
- Base de données : chaque instance a sa DB dédiée (jamais partagée).
- Session CLI / Claude Code : exécution confinée au seul projet concerné.
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 :
- 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).
- 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
- Indications de lancement affichées dans la CLI (ex. « tape
claude pour démarrer⊠»), adaptées à un public non technique.
- Proposition Raccourci « mode dangereux » confiné : équivalent du lancement permissif, mais limité au projet en cours (écriture/exécution interdites hors du projet, sauf consultation de docs externes autorisée).
- Crédits restants affichés dans l'interface si possible (consommation Claude visible par l'utilisateur).
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Ă©
| Poste | Estimation | Note |
| Base PostgreSQL (clone du gold anonymisé) | ~3 Go | copie complÚte ; réductible via volume copy-on-write |
| Copie de code Ă©ditable (pour Claude Code) | ~1â2 Go | dĂ©pĂŽt + dĂ©pendances ; mutualisable en read-only + overlay |
| Stockage média (library/image/vidéo) | ~0,5 Go | seed surtout partagée en lecture seule, delta par instance faible |
| Couches conteneurs + logs + données Keycloak/Redis | ~0,5 Go | images de base mutualisées (hors décompte) |
| Total par instance (planification) | â 5â6 Go | fourchette 4â8 Go â Ă confirmer par mesure rĂ©elle d'un stack |
| Archive (DB dump + code, compressĂ©s) | ~2â3 Go | la 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 machine | Instances 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.
- Version de référence du code « stable » : dernier tag de release ou
master ? (§8)
- Forge isolée : GitLab auto-hébergé dédié, groupe séparé sur le GitLab existant, ou Gitea léger ? (§6)
- 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)
- Seuil de purge disque des archives : à fixer une fois la taille réelle d'instance mesurée (§11.1).
- 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)
- Affichage des crédits Claude : faisabilité technique à confirmer cÎté API/quota (§5).