feat: enhance service discovery and proxy management

This commit is contained in:
gabdevele
2026-05-05 13:57:46 +02:00 Unverified
parent 93ba8e9ac2
commit a523c2faa3
53 changed files with 3206 additions and 706 deletions
+413
View File
@@ -0,0 +1,413 @@
# Testing Guide
Questa guida descrive come preparare e testare `thePlug` in tre scenari:
1. laptop con backend sulla macchina host
2. laptop con stack tutto Dockerizzato
3. vulnbox reale con backend fuori Docker
L’obiettivo non è solo far partire UI e API, ma verificare il comportamento
reale del proxy: remap della porta del servizio, avvio di `mitmdump`,
healthcheck e ripristino su `Stop`.
## Concetti Chiave
### Cosa fa `Save`
`Save` salva solo la configurazione del proxy nel backend. Non tocca:
- porte del servizio reale
- processi `mitmdump`
- Docker Compose
### Cosa fa `Start`
In `reverse` mode, se il proxy è associato a un servizio Docker Compose e
`mode_spec` non è impostato:
1. il backend sposta la porta pubblica del servizio reale su una porta libera
2. salva quella nuova porta come upstream live
3. avvia `mitmdump` sulla porta originale
Quindi, se vuoi che il proxy prenda davvero il posto del servizio originale,
`proxy_port` deve coincidere con la porta pubblica del servizio.
### Come vengono scoperti i servizi
Il backend cerca i servizi Docker Compose sotto una root di scansione:
- di default: `HOME`
- override: `SERVICE_SCAN_ROOT`
La scansione è volutamente shallow:
- il backend guarda solo le cartelle immediate sotto la root
- non scende ricorsivamente in profondità
Questa scelta riflette il layout atteso sulla macchina reale.
Esempio valido:
```text
/home/user/service-a/docker-compose.yml
/home/user/service-b/docker-compose.yml
```
Esempio non visto se la root è `/home/user`:
```text
/home/user/projects/lab/service-a/docker-compose.yml
```
In quel caso devi cambiare `SERVICE_SCAN_ROOT`.
## Prerequisiti
Su tutte le macchine:
- `docker`
- `docker compose`
- `uv`
- `python 3.14`
- `node 22`
Il backend installerà anche:
- `mitmproxy`
- `basedpyright`
Porte usate tipicamente:
- `3671` backend
- `5173` frontend
- `27017` mongodb
- `6379` redis
- una o più porte proxy/test
## Scenario 1: Laptop con Backend sulla Macchina Host
Questo è il setup migliore per testare davvero il comportamento del proxy.
### Quando usarlo
Usa questo scenario se vuoi verificare:
- discovery servizi
- remap porta Docker Compose
- takeover reale della porta pubblica
- start/stop/restart di `mitmdump`
- esempi script e editor
### Preparazione
Dalla root del progetto:
```bash
cd /home/gabdevele/CTF/thePlug
./setup.sh deps
export SERVICE_SCAN_ROOT="$PWD"
./setup.sh playground
```
Questo fa due cose:
- avvia solo `mongodb` e `redis` in Docker
- avvia un piccolo upstream locale in `playground/`
Il playground espone:
```text
http://127.0.0.1:9081
```
### Avvio applicazione
In un terminale:
```bash
cd /home/gabdevele/CTF/thePlug
npm run dev:backend
```
In un secondo terminale:
```bash
cd /home/gabdevele/CTF/thePlug
npm run dev:frontend
```
### Login
Le credenziali sono in:
- [backend/.env](/home/gabdevele/CTF/thePlug/backend/.env)
Apri:
```text
http://localhost:5173
```
### Test End-to-End Consigliato
1. Crea un nuovo proxy.
2. Seleziona il servizio `echo` rilevato dal backend.
3. Lascia `mode=reverse`.
4. Verifica che `proxy_port=9081`.
5. Salva.
6. Premi `Start`.
7. Esegui:
```bash
curl -i http://127.0.0.1:9081/
```
### Cosa devi vedere
Prima di `Start`:
- `9081` risponde direttamente il servizio playground
Dopo `Start`:
- `mitmdump` è in ascolto su `9081`
- il servizio reale è stato spostato su una porta upstream temporanea
- la UI mostra il live upstream cambiato
- i log del proxy iniziano a popolarsi
Dopo `Stop`:
- la porta pubblica originaria torna al servizio reale
- `service.upstream_port` torna `null`
### Verifiche Utili
Controlla i servizi rilevati:
```bash
curl -H "Authorization: Bearer <TOKEN>" http://127.0.0.1:3671/proxy/services
```
Controlla i log proxy dalla UI o via API:
```bash
curl -H "Authorization: Bearer <TOKEN>" http://127.0.0.1:3671/proxy/9081/logs
```
### Cleanup
```bash
npm run playground:down
docker compose --env-file backend/.env -f docker-compose.yml down
```
## Scenario 2: Laptop con Stack Tutto Dockerizzato
Questo scenario è adatto soprattutto a smoke test applicativi.
### Quando usarlo
Usalo per verificare:
- login/logout
- CRUD proxy
- examples
- options
- persistenza Mongo/Redis
- build frontend e wiring API
### Avvio
```bash
cd /home/gabdevele/CTF/thePlug
./setup.sh
```
Apri:
- frontend: `http://localhost:5173`
- backend: `http://localhost:3671`
### Cosa testare qui
Puoi testare bene:
- creazione proxy
- update/delete
- validazione codice
- examples custom
- health endpoint
- editor e autocomplete
### Limite importante
Questo non è il setup migliore per validare il takeover reale delle porte di un
servizio locale, perché il backend è dentro Docker e non replica la topologia
host-native del deployment reale.
Quindi:
- bene per smoke test UI/API
- non abbastanza per validare il flusso finale di orchestration
Per il test realistico del proxy usa lo Scenario 1.
### Spegnimento
```bash
docker compose --env-file backend/.env -f docker-compose.yml down
```
## Scenario 3: Vulnbox Reale con Backend fuori Docker
Questo è il modello più vicino al deployment reale.
### Layout atteso dei servizi
Caso ideale sotto `HOME`:
```text
/home/user/service-a/docker-compose.yml
/home/user/service-b/docker-compose.yml
/home/user/service-c/docker-compose.yml
```
Se il layout è diverso, imposta `SERVICE_SCAN_ROOT`.
### Preparazione backend
```bash
cd /path/to/thePlug
cp backend/.env.example backend/.env
./setup.sh deps
```
Se i servizi non sono sotto `HOME`:
```bash
export SERVICE_SCAN_ROOT="/path/che/contiene/le/cartelle-servizio"
```
### Avvio backend
```bash
cd /path/to/thePlug
npm run dev:backend
```
### Avvio frontend
In sviluppo:
```bash
cd /path/to/thePlug
npm run dev:frontend
```
Oppure build statico:
```bash
cd /path/to/thePlug/frontend
VITE_API_BASE_URL=http://IP_O_HOST:3671 npm run build
```
### Test operativo reale
1. Apri la UI.
2. Seleziona un servizio reale scoperto dal backend.
3. Se vuoi takeover vero della porta pubblica:
`proxy_port` deve essere uguale alla porta pubblica del servizio.
4. Salva.
5. Premi `Start`.
6. Verifica da terminale o con la tua applicazione client che il traffico passi
ancora sulla porta originale.
### Cosa aspettarsi
Su `Start`:
- il servizio reale viene spostato su una porta temporanea
- `mitmdump` si lega alla porta originaria
- il traffico continua a entrare dalla porta originale
- la UI mostra il nuovo live upstream
Su `Stop`:
- la porta originaria torna al servizio reale
- il proxy viene fermato
## Failure Modes Comuni
### Il backend non trova nessun servizio
Controlla:
- valore di `SERVICE_SCAN_ROOT`
- che i compose siano nelle cartelle immediate sotto quella root
- che i file si chiamino uno tra:
- `compose.yml`
- `compose.yaml`
- `docker-compose.yml`
- `docker-compose.yaml`
### Il proxy parte ma non prende il posto del servizio
Controlla:
- `mode=reverse`
- `mode_spec` vuoto
- `proxy_port` uguale alla porta del servizio
- servizio selezionato dalla UI correttamente
### `Start` fallisce
Controlla:
- `mitmdump` disponibile nel backend host
- conflitti di porta
- errori di sintassi nello script
- log del proxy
### Il frontend mostra session expired
Vuol dire che il token JWT è scaduto o non è più valido. Fai login di nuovo.
## Comandi Utili
Test backend:
```bash
cd backend
uv run ruff check .
uv run pytest
```
Build frontend:
```bash
cd frontend
npm run build
```
Avvio playground:
```bash
./setup.sh playground
```
Solo dipendenze backend per test host:
```bash
./setup.sh deps
```
## Raccomandazione Finale
Per lavorare in modo efficiente:
- usa `./setup.sh` per smoke test rapidi
- usa `backend host + frontend dev + playground` per il test vero del proxy
- usa `backend host` sulla vulnbox reale per validare il comportamento finale
Se devi testare davvero il remap porta, considera valido solo un setup con
backend fuori Docker.