Aller au contenu

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.