Clone from Forgejo¶
PerfShop source code is hosted on a self-hosted Forgejo instance (see Forgejo for a presentation of the tool). Forgejo is a community fork of Gitea, fully compatible with standard Git commands. Cloning PerfShop works exactly like cloning from GitHub or GitLab — only the URL changes.
Repository URL¶
The repository URL depends on the Forgejo deployment you are using:
- Local Forgejo instance (deployed by PerfShop itself):
http://<HOST_IP>:3009/<user>/perfshop.git - Public Forgejo instance: contact contact@perfshop.io to get the URL and credentials
In training environments, it is common for the instructor to host their own Forgejo instance on a workstation or NAS, and to distribute the URL to students at the start of the lab.
Classic HTTPS clone¶
If the repository is private, Git will ask for a login / password on the first call. On Forgejo, you can also use a personal access token instead of the password — this is the recommended method for scripts and CI.
SSH clone¶
If you have added an SSH key to your Forgejo account:
The git@host:owner/repo.git format is identical to GitHub and GitLab.
Repository structure¶
Once cloned, the repository contains these main folders:
perfshop/
├── backend/ ← Spring Boot 3.2 + Java 21 + Maven
├── frontend/ ← React 18 + Vite
├── chaos-admin/ ← Instructor panel + student page (vanilla HTML/JS)
├── monitoring/ ← Node.js HTML dashboard
├── welcome/ ← Pedagogical welcome page (static Nginx)
├── jmeter/ ← Ready-to-use JMeter tests
├── jmeter-ui/ ← JMeter web launcher
├── scripts-ui/ ← Web editor for Robot / pytest scripts
├── test-runner/ ← Polyglot Robot Framework + pytest runner
├── selenium/ ← Selenium Grid configuration
├── squash-tm/ ← Squash TM configuration
├── squash-orchestrator/ ← Squash orchestrator
├── squash-seed/ ← Squash TM project seed
├── grafana/ ← Grafana dashboards and provisioning
├── grafana-seed/ ← Grafana ACL seed
├── prometheus/ ← Prometheus configuration
├── loki/ ← Loki configuration
├── tempo/ ← Tempo configuration
├── pyroscope/ ← Pyroscope configuration
├── promtail/ ← Promtail configuration
├── vector/ ← Vector configuration (OpenSearch relay)
├── opensearch/ ← OpenSearch configuration
├── opensearch-seed/ ← Index and template seed
├── forgejo-seed/ ← Internal Forgejo repo seed
├── mkdocs/ ← This documentation (source)
├── mkdocs-patch/ ← Documentation patches and rework (in progress)
├── shell/ ← Utility shell scripts
├── admin/ ← Admin backoffice (assets)
├── .env.example ← Configuration template
├── .env.production ← Production values (NAS)
├── docker-compose.yml ← Main compose (NAS prod + images)
├── docker-compose.desktop.yml ← Docker Desktop compose (Windows/macOS)
├── docker-compose.build.yml ← Local build compose (Unix VPS)
├── build.sh ← Full build script
├── build.bat ← Windows equivalent
├── LICENSE ← AGPL-3.0
├── LICENSE-COMMERCIAL.fr ← French commercial license
├── LICENSE-COMMERCIAL.en ← English commercial license
├── THIRD-PARTY-LICENSES ← Dependency licenses
└── README.md ← Overview
Backend layout¶
backend/
├── pom.xml
├── Dockerfile
├── src/main/
│ ├── java/com/perfshop/
│ │ ├── PerfShopApplication.java
│ │ ├── config/ ← Spring beans, CORS, MVC
│ │ ├── controller/ ← REST controllers
│ │ ├── service/ ← Business services
│ │ ├── repository/ ← Spring Data JPA repositories
│ │ ├── entity/ ← JPA entities
│ │ ├── chaos/ ← Chaos services + interceptors
│ │ └── pedagogique/ ← Pedagogical engine (enigmas, sessions)
│ └── resources/
│ ├── application.yml
│ ├── messages_fr.properties
│ ├── messages_en.properties
│ ├── db/migration-fr/ ← Consolidated Flyway migrations V1-V10
│ └── i18n/ ← Enigma and logic JSON
└── src/test/ ← JUnit tests
Frontend layout¶
frontend/
├── package.json
├── vite.config.js
├── Dockerfile
├── env-inject.sh ← Runtime injection of VITE_*
├── index.html
├── public/ ← Static assets copied as-is
└── src/
├── main.jsx ← React entry point
├── App.jsx ← Routes and AppShell
├── index.css
├── chaos-agent.js ← Frontend Chaos in the browser
├── pages/ ← Page components
├── pedagogique/ ← Pedagogical journey components
├── services/api.js ← Unified API client
└── i18n/ ← I18nContext + FR/EN dictionaries
Next steps¶
Once the repository is cloned, you can:
- Start the full stack via Docker Compose — see Run Docker Compose
- Iterate on the backend alone — see Build backend
- Iterate on the frontend alone — see Build frontend
- Contribute — see Forgejo Git workflow
Updating¶
To pull the latest changes:
If you are working on a local branch, use git pull --rebase to avoid unnecessary merge commits in the history.