Freemium vs Pro¶
PerfShop applique un modèle freemium : une partie de la plateforme est accessible sans licence pour permettre la découverte et la prise en main, et le reste est débloqué par l'activation d'une licence commerciale. Cette page décrit précisément la frontière entre les deux.
Sources
backend/src/main/java/com/perfshop/service/LicenseService.java, chaos/LicenseInterceptor.java, controller/ChaosStudentController.java, controller/ChaosScriptingPublicController.java
Philosophie¶
Un étudiant doit pouvoir démarrer avec PerfShop immédiatement, sans formalité. Il doit pouvoir naviguer sur le shop, lancer un premier chaos performance, essayer un premier niveau de scripting, et démarrer les deux premiers niveaux du parcours pédagogique (BAC1 et BAC2). Cela suffit largement à faire une démonstration convaincante en cours ou en évaluation.
Ce qui relève de l'usage intensif en formation continue ou en entreprise — les chaos métier complets, les failles de sécurité OWASP, les scénarios avancés, le parcours pédagogique expert — nécessite une licence.
La licence commerciale inclut également l'accès à une bibliothèque de TP clés en main hébergée séparément, qui n'est pas distribuée avec le code source PerfShop et n'est pas documentée ici.
Tableau récapitulatif¶
| Famille de chaos | Sans licence (freemium) | Avec licence |
|---|---|---|
| Performance backend | Niveau 0 + Niveau 1 (freemium N1) | Niveaux 0 à 4 + 20 scénarios météo |
| Scripting | Niveau 0 + Niveau 1 (Junior) | Niveaux 0 à 4 (jusqu'à Maestro) |
| Frontend | Niveau 0 uniquement | Niveaux 0 à 4 |
| Métier | Niveau 0 uniquement | Niveaux 0 à 4 (16 anomalies A1-A16) |
| Fonctionnel | Niveau 0 uniquement | Niveaux 0 à 4 (F1-F4) |
| Sécurité | Niveau 0 uniquement | Niveaux 0 à 4 (S1-S12, portail admin S10-S12 au niveau Master) |
| Pédagogique | BAC1, BAC2 | BAC1 à BAC5 |
| Interface formateur | Sans licence | Avec licence |
|---|---|---|
chaos-admin (panneau formateur) |
❌ Bloqué | ✅ Accessible |
scripts-ui (éditeur scripts web) |
❌ Bloqué | ✅ Accessible (plan functional+) |
jmeter-ui (lanceur JMeter) |
❌ Bloqué | ✅ Accessible (plan performance+) |
monitoring (login admin) |
❌ Bloqué | ✅ Accessible |
Backoffice admin /api/admin/* |
❌ Bloqué | ✅ Accessible |
| Interface étudiant | Sans licence | Avec licence |
|---|---|---|
Page étudiant chaos-admin/public/ |
✅ Accessible | ✅ Accessible |
| Shop e-commerce | ✅ Accessible | ✅ Accessible |
| Monitoring HTML dashboard lecture | ✅ Accessible | ✅ Accessible |
| Documentation MkDocs | ✅ Accessible | ✅ Accessible |
Ce qui est toujours accessible¶
Ces ressources ne sont jamais bloquées par le LicenseInterceptor, quelle que soit la licence :
/api/license/*— activation, statut, révocation (sinon deadlock)/api/chaos/student/*— la page étudiant freemium/api/chaos/public/*— monitoring pédagogique lecture seule/api/products/*— catalogue du shop/api/auth/*— authentification shop/api/cart/*— panier/api/checkout/*— tunnel d'achat/api/orders/*— commandes/api/countries— référentiel pays/actuator/*— Prometheus scraping/images/*— assets produits
Voir Système de licence pour la liste exhaustive et la logique d'interception.
Code 402 Payment Required¶
Quand un endpoint protégé est appelé sans licence valide, le backend répond :
HTTP/1.1 402 Payment Required
Content-Type: application/json;charset=UTF-8
X-License-Required: true
{
"error": "LICENSE_REQUIRED",
"message": "Licence requise pour accéder à chaos-admin",
"path": "/api/chaos/backend",
"activateUrl": "/api/license/activate",
"statusUrl": "/api/license/status",
"portalUrl": "https://perfshop.io"
}
Le code HTTP 402 est choisi volontairement — il signifie exactement « paiement requis ». La spec HTTP l'avait réservé pour un usage futur lié aux micropaiements ; il est peu utilisé en pratique, ce qui en fait un signal clair et non ambigu. Les frontends PerfShop (chaos-admin, scripts-ui, jmeter-ui) détectent ce code et affichent un message de redirection vers le portail d'activation plutôt qu'une erreur générique.
Le header supplémentaire X-License-Required: true permet aux clients programmatiques (curl, scripts CI) de détecter le cas sans parser le JSON.
Application du freemium dans le code¶
Le LicenseInterceptor gère l'autorisation par URL. Pour les endpoints freemium plus fins (niveau 1 du Scripting autorisé, niveaux 2+ bloqués), l'application passe par les contrôleurs eux-mêmes qui consultent licenseService.isLicenseValid() et limitent le maxLevel retourné dans les payloads /status.
Par exemple, ChaosStudentController retourne pour chaque famille de chaos un objet { level, maxLevel }. Sans licence, maxLevel vaut 1 pour scripting (Junior freemium) et 0 pour business, functional, security. Avec licence, maxLevel passe à 4 pour toutes les familles.
Le frontend utilise cette valeur pour verrouiller visuellement les sliders : slider.max = maxLevel et slider.disabled = (maxLevel === 0). Voir Page chaos étudiant.
Niveau Master (niveau 4 cumulé)¶
Le niveau 4 de chaque famille est surnommé « Master » dans les interfaces. Il nécessite une licence active mais il est aussi qualitativement différent :
- Master Business (A12-A16) — 5 anomalies silencieuses à fort impact financier, invisibles sans inspection des payloads JSON
- Master Security (S10-S12) — scénario chaîné sur le portail admin vulnérable (voir Portail admin et Chaos Sécurité)
- Master Functional (F4) — corruption silencieuse : pas de crash, Tempo vert, HTTP 200, mais payload corrompu
- Master Scripting — clé HMAC dérivée par session (plus exigeant en reverse-engineering)
- Master Performance — scénarios météo N4 combinant plusieurs chaos simultanés
- Master Pédagogique (BAC5) — parcours le plus long, mots de passe construits par calcul XOR + Pi
Le niveau Master est la cible des formations les plus avancées. Il est inclus dans tous les plans (functional, performance, enterprise).
Activation depuis la page étudiant¶
Un détail important : la page étudiant reste accessible sans licence, et elle inclut un bouton « 🔑 Activer une licence » en en-tête qui appelle POST /api/license/activate. Ce endpoint est lui-même public (voir Système de licence).
Conséquence pratique en salle de classe : le formateur peut donner une clé à un étudiant test, qui l'active depuis son poste — et tous les autres étudiants bénéficient immédiatement des niveaux débloqués, parce que la licence est partagée au niveau serveur, pas au niveau session navigateur. Cette propriété est une conséquence directe du modèle : une licence par instance PerfShop, pas par utilisateur.
Que se passe-t-il quand la licence expire ?¶
À chaque appel, isLicenseValid() vérifie la date courante contre expiresAt :
public boolean isLicenseValid() {
LicenseInfo info = cachedLicense.get();
if (info == null) return false;
if (info.expiresAt == null) return true;
return !LocalDate.now().isAfter(info.expiresAt);
}
Le basculement est immédiat : à partir du lendemain de l'expiration, tous les appels aux endpoints protégés retournent 402. Le shop, la page étudiant et le monitoring HTML restent accessibles — c'est-à-dire que les étudiants peuvent continuer à voir ce qu'ils ont déjà lancé mais ne peuvent plus démarrer de nouveaux chaos. Les tableaux de bord Grafana historiques restent consultables.
Pour prolonger, il suffit d'activer une nouvelle clé via POST /api/license/activate — aucun redémarrage n'est nécessaire.
Achat de licence¶
Les licences commerciales PerfShop sont distribuées par perfshop.io. Les modalités (nombre d'instances, durée, formation, support) sont négociées directement. Contactez contact@perfshop.io pour obtenir un devis.
L'achat de licence inclut également l'accès à la bibliothèque de TP clés en main, qui est hébergée séparément et n'est pas documentée dans cette référence technique.