- JavaScript 48.5%
- Java 23.1%
- HTML 15.7%
- CSS 4.2%
- Python 2.9%
- Other 5.6%
| admin | ||
| backend | ||
| chaos-admin | ||
| forgejo-seed | ||
| frontend | ||
| games | ||
| grafana | ||
| grafana-seed | ||
| jmeter | ||
| jmeter-ui | ||
| loki | ||
| mkdocs | ||
| monitoring | ||
| opensearch | ||
| opensearch-seed | ||
| prometheus | ||
| promtail | ||
| pyroscope | ||
| scripts-ui | ||
| squash-orchestrator | ||
| squash-seed | ||
| squash-tm | ||
| tempo | ||
| test-runner | ||
| vector | ||
| welcome | ||
| .env.example | ||
| .gitattributes | ||
| .gitignore | ||
| build.bat | ||
| build.sh | ||
| deploy.conf.example | ||
| docker-compose.build.yml | ||
| docker-compose.desktop.yml | ||
| LICENSE | ||
| LICENSE-COMMERCIAL.en | ||
| LICENSE-COMMERCIAL.fr | ||
| README.md | ||
| result-publisher-community.jar | ||
| THIRD-PARTY-LICENSES | ||
⚡ PerfShop.io — Chaos Engineering Platform
The open source pedagogical platform to master chaos engineering, performance testing, and observability.
Deploy a complete full-stack e-commerce environment in 5 minutes — inject real anomalies, observe live metrics, train your QA, SRE, and DevOps teams.
🚧 Source repository — github.com/perfshop/perfshop.
🚀 Quick Start
Choose your deployment scenario below. All modes use the same build.sh script —
only the target argument changes.
🪟 Windows — Docker Desktop
Prerequisites
| Tool | Download |
|---|---|
| Docker Desktop | https://www.docker.com/products/docker-desktop/ |
| Git for Windows (includes Git Bash) | https://git-scm.com/download/win |
Make sure Docker Desktop is started and running before proceeding.
Installation
Open Git Bash and run:
git clone https://github.com/perfshop/perfshop.git
cd perfshop
./build.sh desktop
Or with the native Windows launcher (cmd / PowerShell):
build.bat desktop
build.batsupportsdesktopandprodonly. For Linux deployments, use./build.sh unixor./build.sh prodinstead.
What the script does
⚠️ The script overwrites your
.envfile on every run, regenerating it from.env.examplewith the detected host IP injected into allPUBLIC_*URLs. Do not store custom values in.env— edit.env.exampleinstead.
- Checks prerequisites (Docker, Git)
- Detects your host IP and lets you choose (useful for classroom use where students connect from other machines)
- Asks for a license key (Enter = community mode)
- Overwrites
.envfrom.env.exampleand replaceslocalhostwith your chosen IP - Runs
docker compose -f docker-compose.desktop.yml up -d --build - Displays all service URLs
First launch: ~5 min (Maven build + npm install). Subsequent launches: ~30 sec (Docker cache).
ℹ️ Uses
docker-compose.desktop.yml. Pyroscope runs initimermode (SIGPROF) —perf_event_openis unavailable under Docker Desktop's restricted Linux VM.
Silent / automated mode:
./build.sh desktop --silent --ip=192.168.1.10 --license=PFSH-xxx
./build.sh desktop --silent --ip=192.168.1.10 --lang=en
./build.sh desktop --params=deploy.conf
The script asks your preferred language (
fr/en) before the banner. Use--lang=fror--lang=ento skip the question in silent/CI mode. The chosen language is automatically injected into.envasPERFSHOP_LANG.
⚠️ Windows / Hyper-V port conflict — Hyper-V reserves port ranges at boot (typically 3061–3661). The following ports have been remapped in
.env.example:DB_PORT=19306·LOKI_HTTP_PORT=19100·TEMPO_HTTP_PORT=19200
🐧 Linux — Local server / VPS / CI
Prerequisites
Works on all Debian-based distributions (Ubuntu, Debian, Linux Mint, Pop!_OS…). For other distros: use
dnfon Fedora/RHEL orpacmanon Arch. The Docker install script works everywhere.
# 1. Update system
sudo apt update && sudo apt upgrade -y
# 2. Install Docker
curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker $USER
newgrp docker
# 3. Install Git
sudo apt install -y git
After
newgrp docker, Docker runs withoutsudo— nosudoneeded for./build.sh.
Installation
git clone https://github.com/perfshop/perfshop.git
cd perfshop
chmod +x build.sh
./build.sh unix
What the script does
⚠️ The script overwrites your
.envfile on every run, regenerating it from.env.examplewith the detected host IP injected into allPUBLIC_*URLs. Do not store custom values in.env— edit.env.exampleinstead.
- Checks prerequisites
- Detects your host IP and lets you choose (LAN IP for multi-student access)
- Asks for a license key (Enter = community mode)
- Overwrites
.envfrom.env.exampleand replaceslocalhostwith your chosen IP - Runs
docker compose -f docker-compose.build.yml up -d --build - Displays all service URLs
ℹ️ Uses
docker-compose.build.yml. Pyroscope runs incpumode (perf_event) — requires bare-metal Linux or a full VPS (not available under Docker Desktop).
Silent / CI mode:
./build.sh unix --silent --ip=10.0.0.5
./build.sh unix --silent --ip=10.0.0.5 --lang=en
The script asks your preferred language (
fr/en) before the banner. Use--lang=fror--lang=ento skip the question in silent/CI mode. The chosen language is automatically injected into.envasPERFSHOP_LANG.
🏫 Production / University / Custom domain (DNS mode)
Use this mode when deploying on a server with real domain names (e.g. a university server, a cloud VPS with HTTPS, or any environment where URLs are not IP-based).
How it works
✅ The script never touches your
.envin this mode. All values are read as-is from the existing.envfile. No IP is asked. No overwrite happens.
You are fully in control of the configuration.
Setup
git clone https://github.com/perfshop/perfshop.git
cd perfshop
chmod +x build.sh
# 1. Create your .env from the template
cp .env.example .env
# 2. Edit .env and fill in your real domain names and secrets
nano .env # or vim, or any editor
Key variables to set in .env:
HOST_IP=perfshop.university.edu # or your server IP
PUBLIC_FRONTEND_URL=https://perfshop.university.edu:9091
PUBLIC_API_URL=https://perfshop.university.edu:9080
PUBLIC_GRAFANA_URL=https://perfshop.university.edu:3002
PUBLIC_CHAOS_URL=https://perfshop.university.edu:3003
PUBLIC_FORGEJO_URL=https://perfshop.university.edu:3009
# ... all other PUBLIC_* URLs
FORGEJO_DOMAIN=perfshop.university.edu
CORS_ALLOWED_ORIGINS=https://perfshop.university.edu:9091,...
# 3. Deploy — reads your .env, never overwrites it
./build.sh prod
# Windows:
build.bat prod
Silent mode:
./build.sh prod --silent
# Windows:
build.bat prod --silent
🌐 Available Services
🏠 Welcome Page — your starting point
Bookmark this page. After deployment, all services are listed here with the correct host IP. Works with
localhostfor local access, and with the server IP for classroom deployments.
| Local URL | Production URL |
|---|---|
| http://localhost:3011 | https://perfshop-welcome.perfshop.io |
Main Stack
| Service | Local | Production |
|---|---|---|
| 🛒 Application | http://localhost:9091 | https://perfshop.perfshop.io |
| 📊 Monitoring | http://localhost:3001 | https://perfshop-monitoring.perfshop.io |
| 📈 Grafana | http://localhost:3002 | https://perfshop-grafana.perfshop.io |
| 🔍 OpenSearch | http://localhost:5601 | https://perfshop-opensearch.perfshop.io |
| 💥 Chaos Admin | http://localhost:3003 | https://perfshop-chaos.perfshop.io |
| 🔧 Admin | http://localhost:3004 | https://perfshop-admin.perfshop.io |
| 📚 Documentation | http://localhost:9087 | https://perfshop-docs.perfshop.io |
| 🔌 API Backend | http://localhost:9080 | https://perfshop-api.perfshop.io |
JMeter Stack
| Service | Local | Production |
|---|---|---|
| 🎯 JMeter UI | http://localhost:3005 | https://perfshop-jmeter.perfshop.io |
Pedagogical QA Stack (Phase 9 & 10)
| Service | Local | Production | Login |
|---|---|---|---|
| 🧪 Squash TM (ALM) | http://localhost:9086/squash | https://perfshop-squash.perfshop.io/squash | admin / admin |
| 🖥️ Selenium VNC | http://localhost:7900 | https://perfshop-selenium.perfshop.io | — |
| 🦊 Forgejo Git | http://localhost:3009 | https://perfshop-git.perfshop.io | admin / perfshop |
| 📝 Scripts UI | http://localhost:3008 | https://perfshop-scripts.perfshop.io | admin@perfshop.fr / perfshop |
Grafana credentials: admin / perfshop
Test accounts: user1@perfshop.com / password1 … user20@perfshop.com / password20 (20 interactive accounts)
Load test accounts: load1@perfshop.com / load1 … load500@perfshop.com / load500 (500 accounts pre-loaded for JMeter scenarios)
✨ Features
💥 Chaos Engineering
Backend — 8 anomalies (sliders 0–100%)
| Anomaly | Description |
|---|---|
| 🧠 JVM Memory Leak | Progressively fills the JVM heap. Top slider sets fill target, bottom guardrail limits effective allocation. |
| 📈 GC Pressure (sawtooth) | Allocates short-lived objects in a loop → constant GC collections → sawtooth pattern on heap chart. |
| 🗄️ DB Pool Saturation | Blocks HikariCP connections. Requests queue up and timeout. |
| 🧵 Thread Pool Saturation | Blocks Tomcat threads with artificial delays. New requests rejected. |
| 💻 CPU Overload | Intensive SHA-256 computations in loop. Degrades all requests. |
| 🌐 Slow SQL Queries | Adds delays to SQL queries. Simulates overloaded DB or missing indexes. |
| 🔒 DB Deadlock | Triggers database deadlocks. Transaction rollbacks and retries. |
| 🌍 Network Timeout | Simulates slow connections and network timeouts. External call degradation. |
Frontend — 5 anomalies (sliders 0–100%)
| Anomaly | Description |
|---|---|
| 🔥 Blocking CPU Loop | Synchronous while() loop blocking the main thread. Browser freezes, clicks/scrolls unresponsive. |
| 💾 JS Memory Leak | Accumulates objects without releasing them (arrays, closures, orphan event listeners). Tab memory grows indefinitely. |
| 🌊 Massive DOM Re-renders | Massively inserts/removes DOM elements, forcing constant reflows/repaints. Rendering becomes choppy. |
| 📡 Network Request Flood | Launches HTTP requests in a loop. Saturates client network and generates backend load. |
| 🔄 Double API Call | Each click duplicates API calls. Backend receives 2× more requests. Classic double event listener bug. |
Chaos Scripting — 4 levels (checkout flow token complexity)
| Level | Description |
|---|---|
| Level 1 | Basic HTTP — standard checkout, no token required |
| Level 2 | Session token — single token, static header |
| Level 3 | Rotating token — token refreshed per request |
| Level 4 — Maestro | Multi-step challenge with dynamic token and strict sequencing |
Chaos Business — 4 levels (silent functional anomalies in e-commerce flow)
| Level | Description |
|---|---|
| Level 1 | Subtle price rounding — cents randomly altered |
| Level 2 | Stock inconsistency — available quantities differ between pages |
| Level 3 | Order amount drift — total recalculated differently at checkout |
| Level 4 | Silent order rejection — orders accepted then silently cancelled |
Chaos Security — 4 levels (simulated OWASP Top 10 vulnerabilities)
| Level | Description |
|---|---|
| Level 1 | Information disclosure — verbose error messages, stack traces exposed |
| Level 2 | Broken access control — admin endpoints accessible without auth |
| Level 3 | Injection — SQL injection vectors in product search |
| Level 4 — Master | XSS + CSRF + admin portal exposure — combined attack surface |
Chaos Pédagogique — 5 BAC levels (escape-room enigma system)
| Level | Enigmas | Description |
|---|---|---|
| BAC 1 | 10 | Beginner — HTTP basics, status codes, simple metrics reading |
| BAC 2 | 15 | Intermediate — latency analysis, Grafana dashboards |
| BAC 3 | 20 | Advanced — distributed traces, JVM profiling |
| BAC 4 | 25 | Expert — chaos correlation, performance root-cause analysis |
| BAC 5 | 30 | Master — full observability stack, SLO/SLA investigation |
📊 Full APM Observability
- Grafana + Prometheus — pre-configured JVM, HTTP, DB, and chaos-state dashboards
- Tempo — end-to-end distributed OpenTelemetry traces
- Pyroscope — continuous CPU and memory flamegraphs
- Loki + Promtail — centralized log aggregation
- OpenSearch + Vector — full-text log search and analytics
- Zero configuration — everything is pre-wired out of the box
🧪 Complete Pedagogical QA Stack (Phase 9 & 10)
- Squash TM — open source ALM: requirements → test cases → campaigns → results
- Selenium Grid + noVNC — headless Chrome, students watch the browser execute live
- Polyglot Test Runner — Robot Framework (
.robot) AND pytest (.py) in the same container - Forgejo local Git — self-hosted Git server,
perfshop-testsrepository pre-initialized - Scripts UI — CodeMirror web editor, script execution, publish to Forgejo
🎮 PerfShop Games
- Server Defender — pedagogical tower-defense game simulating SRE decisions under load
📜 Chaos Scripting
JMeter scripts provided at progressive pedagogical complexity levels.
⚙️ Configuration
All configuration is in the .env file.
Change ports (if conflict)
FRONTEND_HTTP_PORT=9091 # default
BACKEND_HTTP_PORT=9080 # default
DOCS_HTTP_PORT=9087 # default
DB_PORT=19306 # remapped — port 3306 reserved by Hyper-V on Windows
LOKI_HTTP_PORT=19100 # remapped — port 3100 reserved by Hyper-V on Windows
TEMPO_HTTP_PORT=19200 # remapped — port 3200 reserved by Hyper-V on Windows
Deploy on a custom domain
PUBLIC_API_URL=https://perfshop-api.yourdomain.com
PUBLIC_MONITORING_URL=https://perfshop-monitoring.yourdomain.com
PUBLIC_FRONTEND_URL=https://perfshop.yourdomain.com
PUBLIC_GRAFANA_URL=https://perfshop-grafana.yourdomain.com
PUBLIC_CHAOS_URL=https://perfshop-chaos.yourdomain.com
PUBLIC_ADMIN_URL=https://perfshop-admin.yourdomain.com
PUBLIC_FORGEJO_URL=https://perfshop-git.yourdomain.com
PUBLIC_SCRIPTS_URL=https://perfshop-scripts.yourdomain.com
FORGEJO_DOMAIN=perfshop-git.yourdomain.com
CORS_ALLOWED_ORIGINS=https://perfshop.yourdomain.com,https://perfshop-admin.yourdomain.com,https://perfshop-chaos.yourdomain.com
🏗️ Architecture
.env
└── docker-compose.build.yml ← Linux VPS / CI (local build, perf_event)
└── docker-compose.desktop.yml ← Docker Desktop Windows/macOS (local build, itimer)
├── perfshop-frontend :9091 (React/Nginx)
├── perfshop-app :9080 (Spring Boot)
├── perfshop-db :19306 (MySQL — host port remapped for Windows)
├── perfshop-monitoring :3001 (Node.js)
├── perfshop-chaos-admin :3003 (Nginx)
├── perfshop-admin :3004 (Nginx)
├── prometheus :9092
├── grafana :3002
├── perfshop-loki :19100 (host port remapped for Windows)
├── perfshop-tempo :19200 (host port remapped for Windows)
├── pyroscope ← continuous profiling
├── docs :9087 (MkDocs)
│
├── ── JMeter Stack ──────────────────────────────────────
├── perfshop-jmeter (permanent container — runs via docker exec)
├── perfshop-jmeter-ui :3005 (Node.js — JMeter control UI)
├── perfshop-games :3010 (Nginx — pedagogical games hub)
│
├── ── QA Stack Phase 9 ──────────────────────────────────
├── perfshop-testmgmt :9086 (Squash TM — QA ALM) → /squash
├── perfshop-squash-db :5433 (PostgreSQL 16 dedicated to Squash TM)
├── perfshop-selenium :4444+7900 (headless Chrome + noVNC live)
├── perfshop-test-runner ← Robot Framework + pytest + OpenSSH
├── perfshop-orchestrator ← Squash Orchestrator (internal)
├── perfshop-squash-seed ← one-shot Squash TM init
│
├── ── Local Git Stack Phase 10 ──────────────────────────
├── perfshop-forgejo :3009 (self-hosted Forgejo Git)
├── perfshop-forgejo-seed ← one-shot accounts + repo + scripts init
└── perfshop-scripts-ui :3008 (editor + script runner)
🛑 Stop
docker compose down # keep data
docker compose down -v # remove everything (DB, metrics, dashboards)
📜 License
PerfShop is dual-licensed:
| Usage | License | Cost |
|---|---|---|
| 🟢 Personal, self-training, private testing | AGPL-3.0-or-later | Free |
| 🔵 Professional, enterprise, training organizations | Commercial | On request |
→ LICENSE · LICENSE-COMMERCIAL.en · contact@perfshop.io
📚 Full Documentation
http://localhost:9087 (local) — https://perfshop-docs.perfshop.io (production)
👤 Author
Philippe Naveau — Performance Testing & Chaos Engineering Expert
PerfShop.io — Master chaos, master performance.
⚡ PerfShop.io — Plateforme de Chaos Engineering
La plateforme pédagogique open source pour maîtriser le chaos engineering, les tests de performance et l'observabilité.
Déployez un environnement e-commerce full-stack complet en 5 minutes — injectez des anomalies réelles, observez les métriques en temps réel, formez vos équipes QA, SRE et DevOps.
🚧 Dépôt source — github.com/perfshop/perfshop.
🚀 Démarrage rapide
Choisissez votre scénario de déploiement ci-dessous. Tous les modes utilisent
le même script build.sh — seul l'argument cible change.
🪟 Windows — Docker Desktop
Prérequis
| Outil | Téléchargement |
|---|---|
| Docker Desktop | https://www.docker.com/products/docker-desktop/ |
| Git for Windows (inclut Git Bash) | https://git-scm.com/download/win |
Assurez-vous que Docker Desktop est démarré et en cours d'exécution avant de continuer.
Installation
Ouvrez Git Bash et lancez :
git clone https://github.com/perfshop/perfshop.git
cd perfshop
./build.sh desktop
Ou avec le lanceur Windows natif (cmd / PowerShell) :
build.bat desktop
build.batsupporte uniquementdesktopetprod. Pour Linux, utilisez./build.sh unixou./build.sh prod.
Ce que fait le script
⚠️ Le script écrase votre fichier
.envà chaque exécution, en le régénérant depuis.env.exampleavec l'IP hôte détectée injectée dans toutes les URLsPUBLIC_*. Ne stockez pas de valeurs personnalisées dans.env— modifiez plutôt.env.example.
- Vérifie les prérequis (Docker, Git)
- Détecte votre IP hôte et vous laisse choisir (utile en salle où les étudiants se connectent depuis d'autres machines)
- Demande une clé de licence (Entrée = mode communauté)
- Écrase le
.envdepuis.env.exampleen remplaçantlocalhostpar l'IP choisie - Lance
docker compose -f docker-compose.desktop.yml up -d --build - Affiche toutes les URLs des services
Premier lancement : ~5 min (build Maven + npm install). Lancements suivants : ~30 sec (cache Docker).
ℹ️ Utilise
docker-compose.desktop.yml. Pyroscope fonctionne en modeitimer(SIGPROF) —perf_event_openn'est pas disponible sous la VM Linux restreinte de Docker Desktop.
Mode silencieux / automatisé :
./build.sh desktop --silent --ip=192.168.1.10 --license=PFSH-xxx
./build.sh desktop --silent --ip=192.168.1.10 --lang=en
./build.sh desktop --params=deploy.conf
Le script propose le choix de langue (
fr/en) avant le banner. Utilisez--lang=frou--lang=enpour ignorer la question en mode silencieux/CI. La langue choisie est automatiquement injectée dans.envcommePERFSHOP_LANG.
⚠️ Windows / Hyper-V — conflit de ports — Hyper-V réserve des plages de ports au démarrage (typiquement 3061–3661). Les ports suivants ont été remappés dans
.env.example:DB_PORT=19306·LOKI_HTTP_PORT=19100·TEMPO_HTTP_PORT=19200
🐧 Linux — Serveur local / VPS / CI
Prérequis
Fonctionne sur toutes les distributions Debian-based (Ubuntu, Debian, Linux Mint, Pop!_OS…). Pour les autres :
dnfsur Fedora/RHEL oupacmansur Arch. Le script Docker fonctionne partout.
# 1. Mise à jour du système
sudo apt update && sudo apt upgrade -y
# 2. Installer Docker
curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker $USER
newgrp docker
# 3. Installer Git
sudo apt install -y git
Après
newgrp docker, Docker s'utilise sanssudo— aucunsudonécessaire pour./build.sh.
Installation
git clone https://github.com/perfshop/perfshop.git
cd perfshop
chmod +x build.sh
./build.sh unix
Ce que fait le script
⚠️ Le script écrase votre fichier
.envà chaque exécution, en le régénérant depuis.env.exampleavec l'IP hôte détectée injectée dans toutes les URLsPUBLIC_*. Ne stockez pas de valeurs personnalisées dans.env— modifiez plutôt.env.example.
- Vérifie les prérequis
- Détecte votre IP hôte et vous laisse choisir (IP LAN pour accès multi-étudiants)
- Demande une clé de licence (Entrée = mode communauté)
- Écrase le
.envdepuis.env.exampleen remplaçantlocalhostpar l'IP choisie - Lance
docker compose -f docker-compose.build.yml up -d --build - Affiche toutes les URLs des services
ℹ️ Utilise
docker-compose.build.yml. Pyroscope fonctionne en modecpu(perf_event) — nécessite Linux bare-metal ou VPS complet (non disponible sous Docker Desktop).
Mode silencieux / CI :
./build.sh unix --silent --ip=10.0.0.5
./build.sh unix --silent --ip=10.0.0.5 --lang=fr
Le script propose le choix de langue (
fr/en) avant le banner. Utilisez--lang=frou--lang=enpour ignorer la question en mode silencieux/CI. La langue choisie est automatiquement injectée dans.envcommePERFSHOP_LANG.
🏫 Production / Université / Domaine personnalisé (mode DNS)
Utilisez ce mode pour déployer sur un serveur avec de vrais noms de domaine (serveur universitaire, VPS cloud avec HTTPS, ou tout environnement sans IP brute).
Fonctionnement
✅ Le script ne touche jamais votre
.envdans ce mode. Toutes les valeurs sont lues telles quelles depuis le fichier.envexistant. Aucune IP n'est demandée. Aucun écrasement n'a lieu.
Vous gardez le contrôle total de la configuration.
Mise en place
git clone https://github.com/perfshop/perfshop.git
cd perfshop
chmod +x build.sh
# 1. Créer votre .env depuis le modèle
cp .env.example .env
# 2. Éditer .env et renseigner vos vrais domaines et secrets
nano .env # ou vim, ou tout éditeur
Variables clés à renseigner dans .env :
HOST_IP=perfshop.universite.fr # ou l'IP de votre serveur
PUBLIC_FRONTEND_URL=https://perfshop.universite.fr:9091
PUBLIC_API_URL=https://perfshop.universite.fr:9080
PUBLIC_GRAFANA_URL=https://perfshop.universite.fr:3002
PUBLIC_CHAOS_URL=https://perfshop.universite.fr:3003
PUBLIC_FORGEJO_URL=https://perfshop.universite.fr:3009
# ... toutes les autres URLs PUBLIC_*
FORGEJO_DOMAIN=perfshop.universite.fr
CORS_ALLOWED_ORIGINS=https://perfshop.universite.fr:9091,...
# 3. Déployer — lit votre .env, ne l'écrase jamais
./build.sh prod
# Windows :
build.bat prod
Mode silencieux :
./build.sh prod --silent
# Windows :
build.bat prod --silent
🌐 Services disponibles
🏠 Page d'accueil — votre point de départ
Mettez cette page en favori. Après le déploiement, tous les services y sont listés avec la bonne IP. Fonctionne avec
localhosten local, et avec l'IP du serveur en salle de classe.
| URL locale | URL production |
|---|---|
| http://localhost:3011 | https://perfshop-welcome.perfshop.io |
Stack principale
| Service | Local | Production |
|---|---|---|
| 🛒 Application | http://localhost:9091 | https://perfshop.perfshop.io |
| 📊 Monitoring | http://localhost:3001 | https://perfshop-monitoring.perfshop.io |
| 📈 Grafana | http://localhost:3002 | https://perfshop-grafana.perfshop.io |
| 🔍 OpenSearch | http://localhost:5601 | https://perfshop-opensearch.perfshop.io |
| 💥 Chaos Admin | http://localhost:3003 | https://perfshop-chaos.perfshop.io |
| 🔧 Admin | http://localhost:3004 | https://perfshop-admin.perfshop.io |
| 📚 Documentation | http://localhost:9087 | https://perfshop-docs.perfshop.io |
| 🔌 API Backend | http://localhost:9080 | https://perfshop-api.perfshop.io |
Stack JMeter
| Service | Local | Production |
|---|---|---|
| 🎯 JMeter UI | http://localhost:3005 | https://perfshop-jmeter.perfshop.io |
Stack QA pédagogique (Phase 9 & 10)
| Service | Local | Production | Login |
|---|---|---|---|
| 🧪 Squash TM (ALM) | http://localhost:9086/squash | https://perfshop-squash.perfshop.io/squash | admin / admin |
| 🖥️ Selenium VNC | http://localhost:7900 | https://perfshop-selenium.perfshop.io | — |
| 🦊 Forgejo Git local | http://localhost:3009 | https://perfshop-git.perfshop.io | admin / perfshop |
| 📝 Scripts UI | http://localhost:3008 | https://perfshop-scripts.perfshop.io | admin@perfshop.fr / perfshop |
Identifiants Grafana : admin / perfshop
Comptes de test : user1@perfshop.com / password1 … user20@perfshop.com / password20 (20 comptes interactifs)
Comptes tests de charge : load1@perfshop.com / load1 … load500@perfshop.com / load500 (500 comptes pré-chargés pour les scénarios JMeter)
✨ Fonctionnalités
💥 Chaos Engineering
Backend — 8 anomalies (sliders 0–100%)
| Anomalie | Description |
|---|---|
| 🧠 JVM Memory Leak | Remplit progressivement le heap JVM. Slider haut = objectif de remplissage, slider bas = guardrail. |
| 📈 GC Pressure (dents de scie) | Alloue des objets éphémères en boucle → GC constant → pattern en dents de scie sur le heap. |
| 🗄️ DB Pool Saturation | Bloque les connexions HikariCP. Les requêtes s'accumulent et timeout. |
| 🧵 Thread Pool Saturation | Bloque les threads Tomcat avec des délais artificiels. Nouvelles requêtes rejetées. |
| 💻 CPU Overload | Calculs SHA-256 intensifs en boucle. Dégrade toutes les requêtes. |
| 🌐 Slow SQL Queries | Ajoute des délais aux requêtes SQL. Simule une BDD surchargée ou des index manquants. |
| 🔒 DB Deadlock | Déclenche des deadlocks en base. Rollbacks et retentatives de transactions. |
| 🌍 Network Timeout | Simule des connexions lentes et timeouts réseau. Dégradation des appels externes. |
Frontend — 5 anomalies (sliders 0–100%)
| Anomalie | Description |
|---|---|
| 🔥 Blocking CPU Loop | Boucle while() synchrone bloquant le thread principal. Navigateur gelé, clics/scrolls sans réponse. |
| 💾 JS Memory Leak | Accumule des objets sans les libérer (tableaux, closures, event listeners orphelins). Mémoire de l'onglet croît indéfiniment. |
| 🌊 Massive DOM Re-renders | Insère/supprime massivement des éléments DOM, forçant reflows/repaints constants. Rendu saccadé. |
| 📡 Network Request Flood | Lance des requêtes HTTP en boucle. Sature la connexion réseau client et génère de la charge backend. |
| 🔄 Double API Call | Chaque clic duplique les appels API. Le backend reçoit 2× plus de requêtes. Bug classique double event listener. |
Chaos Scripting — 4 niveaux (complexité des tokens sur le tunnel checkout)
| Niveau | Description |
|---|---|
| Niveau 1 | HTTP basique — checkout standard, aucun token requis |
| Niveau 2 | Token de session — token unique, header statique |
| Niveau 3 | Token tournant — token rafraîchi à chaque requête |
| Niveau 4 — Maestro | Challenge multi-étapes avec token dynamique et séquençage strict |
Chaos Business — 4 niveaux (anomalies fonctionnelles silencieuses dans le flux e-commerce)
| Niveau | Description |
|---|---|
| Niveau 1 | Arrondi de prix subtil — centimes aléatoirement altérés |
| Niveau 2 | Incohérence de stock — quantités disponibles différentes selon les pages |
| Niveau 3 | Dérive du montant commande — total recalculé différemment au checkout |
| Niveau 4 | Rejet silencieux — commandes acceptées puis annulées silencieusement |
Chaos Sécurité — 4 niveaux (vulnérabilités OWASP Top 10 simulées)
| Niveau | Description |
|---|---|
| Niveau 1 | Divulgation d'informations — messages d'erreur verbeux, stack traces exposées |
| Niveau 2 | Contrôle d'accès cassé — endpoints admin accessibles sans authentification |
| Niveau 3 | Injection — vecteurs d'injection SQL dans la recherche produit |
| Niveau 4 — Master | XSS + CSRF + exposition portail admin — surface d'attaque combinée |
Chaos Pédagogique — 5 niveaux BAC (système d'énigmes escape-room)
| Niveau | Énigmes | Description |
|---|---|---|
| BAC 1 | 10 | Débutant — bases HTTP, codes de statut, lecture de métriques simples |
| BAC 2 | 15 | Intermédiaire — analyse de latence, dashboards Grafana |
| BAC 3 | 20 | Avancé — traces distribuées, profiling JVM |
| BAC 4 | 25 | Expert — corrélation chaos, analyse root-cause performance |
| BAC 5 | 30 | Maître — stack observabilité complète, investigation SLO/SLA |
📊 Observabilité APM complète
- Grafana + Prometheus — dashboards JVM, HTTP, DB, chaos state pré-configurés
- Tempo — traces distribuées OpenTelemetry de bout en bout
- Pyroscope — flamegraphs CPU et mémoire en continu
- Loki + Promtail — agrégation centralisée des logs
- OpenSearch + Vector — recherche full-text et analyse des logs
- Zéro configuration — tout est pré-câblé out-of-the-box
🧪 Stack QA pédagogique complète (Phase 9 & 10)
- Squash TM — ALM open source : exigences → cas de test → campagnes → résultats
- Selenium Grid + noVNC — Chrome headless, les étudiants voient le navigateur s'exécuter en direct
- Test Runner polyglotte — Robot Framework (
.robot) ET pytest (.py) dans le même container - Forgejo Git local — serveur Git auto-hébergé, dépôt
perfshop-testspré-initialisé - Scripts UI — éditeur web CodeMirror, lancement de scripts, publication vers Forgejo
🎮 PerfShop Games
- Server Defender — jeu pédagogique tower-defense simulant les décisions SRE sous charge
📜 Chaos Scripting
Scripts JMeter fournis en niveaux de complexité pédagogique progressifs.
⚙️ Configuration
Tout se passe dans le fichier .env.
Changer les ports (si conflit)
FRONTEND_HTTP_PORT=9091 # défaut
BACKEND_HTTP_PORT=9080 # défaut
DOCS_HTTP_PORT=9087 # défaut
DB_PORT=19306 # remappé — port 3306 réservé par Hyper-V sur Windows
LOKI_HTTP_PORT=19100 # remappé — port 3100 réservé par Hyper-V sur Windows
TEMPO_HTTP_PORT=19200 # remappé — port 3200 réservé par Hyper-V sur Windows
Déployer sur un autre domaine
PUBLIC_API_URL=https://perfshop-api.mondomaine.com
PUBLIC_MONITORING_URL=https://perfshop-monitoring.mondomaine.com
PUBLIC_FRONTEND_URL=https://perfshop.mondomaine.com
PUBLIC_GRAFANA_URL=https://perfshop-grafana.mondomaine.com
PUBLIC_CHAOS_URL=https://perfshop-chaos.mondomaine.com
PUBLIC_ADMIN_URL=https://perfshop-admin.mondomaine.com
PUBLIC_FORGEJO_URL=https://perfshop-git.mondomaine.com
PUBLIC_SCRIPTS_URL=https://perfshop-scripts.mondomaine.com
FORGEJO_DOMAIN=perfshop-git.mondomaine.com
CORS_ALLOWED_ORIGINS=https://perfshop.mondomaine.com,https://perfshop-admin.mondomaine.com,https://perfshop-chaos.mondomaine.com
🏗️ Architecture
.env
└── docker-compose.build.yml ← VPS Linux / CI (build local, perf_event)
└── docker-compose.desktop.yml ← Docker Desktop Windows/macOS (build local, itimer)
├── perfshop-frontend :9091 (React/Nginx)
├── perfshop-app :9080 (Spring Boot)
├── perfshop-db :19306 (MySQL — port host remappé pour Windows)
├── perfshop-monitoring :3001 (Node.js)
├── perfshop-chaos-admin :3003 (Nginx)
├── perfshop-admin :3004 (Nginx)
├── prometheus :9092
├── grafana :3002
├── perfshop-loki :19100 (port host remappé pour Windows)
├── perfshop-tempo :19200 (port host remappé pour Windows)
├── pyroscope ← profiling continu
├── docs :9087 (MkDocs)
│
├── ── Stack JMeter ──────────────────────────────────────
├── perfshop-jmeter (container permanent — tirs via docker exec)
├── perfshop-jmeter-ui :3005 (Node.js — IHM pilotage JMeter)
├── perfshop-games :3010 (Nginx — hub de mini-jeux pédagogiques)
│
├── ── Stack QA Phase 9 ──────────────────────────────────
├── perfshop-testmgmt :9086 (Squash TM — ALM QA) → /squash
├── perfshop-squash-db :5433 (PostgreSQL 16 dédié Squash TM)
├── perfshop-selenium :4444+7900 (Chrome headless + noVNC live)
├── perfshop-test-runner ← Robot Framework + pytest + OpenSSH
├── perfshop-orchestrator ← Squash Orchestrator (interne)
├── perfshop-squash-seed ← one-shot init Squash TM
│
├── ── Stack Git local Phase 10 ──────────────────────────
├── perfshop-forgejo :3009 (Forgejo Git auto-hébergé)
├── perfshop-forgejo-seed ← one-shot init comptes + dépôt + scripts
└── perfshop-scripts-ui :3008 (éditeur + lanceur de scripts)
🛑 Arrêter
docker compose down # garde les données
docker compose down -v # supprime tout (BDD, métriques, dashboards)
📜 Licence
PerfShop est distribué sous double licence :
| Usage | Licence | Coût |
|---|---|---|
| 🟢 Personnel, auto-formation, tests privés | AGPL-3.0-or-later | Gratuit |
| 🔵 Professionnel, entreprise, ESN, formation | Commerciale | Sur devis |
→ LICENSE · LICENSE-COMMERCIAL.fr · contact@perfshop.io
📚 Documentation complète
http://localhost:9087 (local) — https://perfshop-docs.perfshop.io (production)
👤 Auteur
Philippe Naveau — Expert Tests de Performance & Chaos Engineering
PerfShop.io — Maîtrisez le chaos, maîtrisez la performance.