Skip to content

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

git clone https://forgejo.example.com/perfshop/perfshop.git
cd perfshop

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:

git clone git@forgejo.example.com:perfshop/perfshop.git
cd perfshop

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:

  1. Start the full stack via Docker Compose — see Run Docker Compose
  2. Iterate on the backend alone — see Build backend
  3. Iterate on the frontend alone — see Build frontend
  4. Contribute — see Forgejo Git workflow

Updating

To pull the latest changes:

cd perfshop
git pull

If you are working on a local branch, use git pull --rebase to avoid unnecessary merge commits in the history.