README.md 3,69 ko
Newer Older
Massiles Ghernaout's avatar
Massiles Ghernaout a validé
## Projet Docker Swarm – Bruteforce MD5

Massiles Ghernaout's avatar
Massiles Ghernaout a validé
![coverage](https://www-apps.univ-lehavre.fr/forge/gm213204/killemd5/badges/master/coverage.svg?job=build-and-test)
Massiles Ghernaout's avatar
Massiles Ghernaout a validé
Ce dépôt contient une petite infrastructure Docker Swarm capable de bruteforcer des hash MD5 de manière scalable, ainsi qu’une application web pour piloter et monitorer le cluster.

Massiles Ghernaout's avatar
Massiles Ghernaout a validé
### Sous-projets

- **backend** : API Node.js/Express pour gérer les jobs de bruteforce, l’état du cluster, et le scaling des workers.
- **worker** : service de bruteforce MD5 (conteneurs réplicables dans le Swarm).
- **frontend** : application React permettant d’envoyer des hash, choisir les modes *gentil/normal/agressif* et visualiser l’état du cluster.
- **infra** : configuration Docker Swarm (stack) et scripts éventuels.
- **CI** : workflows d’intégration continue (fichier `.gitlab-ci.yml`).
Massiles Ghernaout's avatar
Massiles Ghernaout a validé

Massiles Ghernaout's avatar
Massiles Ghernaout a validé
### Prérequis

- Docker et Docker Swarm initialisé (`docker swarm init`).
- Node.js (pour le développement local du backend et du frontend).

Un **scaler** tourne dans le processus du backend. Il lit périodiquement la file Redis (`jobs:pending`) et le nombre de workers, puis ajuste le nombre de réplicas du service worker Swarm entre un min et un max configurables. Les seuils sont basés sur la charge (jobs par worker) : scale up si (jobs en attente / workers) dépasse un seuil, scale down si ça tombe en dessous d’un seuil plus bas (et qu’aucun job n’est en cours).

Variables d’environnement (optionnelles, sur le service `api_backend`) :

| Variable | Défaut | Description |
|----------|--------|-------------|
| `SCALER_ENABLED` | `true` | Mettre à `false` pour désactiver le scaler (ex. dev local sans Swarm). |
| `SCALER_INTERVAL_MS` | `10000` | Période entre deux évaluations (ms). |
| `SCALER_MIN_REPLICAS` | `1` | Nombre minimum de workers. |
| `SCALER_MAX_REPLICAS` | `10` | Nombre maximum de workers. |
| `SCALER_SCALE_UP_WHEN_JOBS_PER_WORKER_ABOVE` | `4` | Scale up si (jobs en attente / workers) ≥ cette valeur. |
| `SCALER_SCALE_DOWN_WHEN_JOBS_PER_WORKER_BELOW` | `1` | Scale down si (jobs en attente / workers) ≤ cette valeur (et aucun job en cours). |
---

### Déploiement via Docker Swarm (stack)

1. Construire les images localement (ou via la CI) :
   - `docker build -t md5-swarm-backend:latest ./backend`
   - `docker build -t md5-swarm-worker:latest ./worker`
   - `docker build -t md5-swarm-frontend:latest ./frontend`

2. Initialiser Swarm si besoin :
   - `docker swarm init`

3. Déployer la stack :
   - `cd infra`
   - `docker stack deploy -c stack.yml md5-swarm`

4. Accéder à l’application :
   - Backend : `http://localhost:8080`
   - Frontend (proxy Nginx dans le conteneur) : `http://localhost:5173`

La stack crée un service Redis, un backend qui gère la file de jobs dans Redis, un worker scalable pour le bruteforce, et un frontend pour piloter le tout.

---

### Tests & couverture

- **Tests backend** :
  - `cd backend`
  - `npm test`
  - Les tests utilisent le runner intégré de Node.js (`node --test`) avec la collecte de couverture activée.

- **CI GitLab** :
  - Le job `build-and-test` dans `.gitlab-ci.yml` exécute les tests backend, le build frontend et extrait le pourcentage de couverture à partir du rapport de Node.
  - Le badge en haut de ce README reflète la couverture de la branche par défaut.

---

### Licence

Ce projet est distribué sous licence MIT. Voir le fichier `LICENSE.txt` pour plus de détails.

---
Massiles Ghernaout's avatar
Massiles Ghernaout a validé

### À faire / améliorations possibles
Massiles Ghernaout's avatar
Massiles Ghernaout a validé

- Durcir la configuration de sécurité (CORS plus restrictif, `helmet`, etc.).
- Ajouter davantage de tests (notamment sur le frontend).
- Documenter en détail les endpoints de l’API et les scénarios d’utilisation côté UI.
Massiles Ghernaout's avatar
Massiles Ghernaout a validé