2026-07-21 11:22:03 +02:00
|
|
|
|
# Avviare il server
|
|
|
|
|
|
|
|
|
|
|
|
Presuppone che [setup.md](setup.md) sia già stato completato (`.env` pronto,
|
|
|
|
|
|
master key generata, migrazioni applicate).
|
|
|
|
|
|
|
|
|
|
|
|
## Locale / venv (sviluppo rapido)
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
source .venv/bin/activate
|
|
|
|
|
|
uvicorn app.main:app --reload --port 8123
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
- App su `http://127.0.0.1:8123/`
|
|
|
|
|
|
- Pannello admin su `http://127.0.0.1:8123/admin`
|
|
|
|
|
|
- Log applicativi in `logs/app.log` (rotante, 10MB × 5 backup)
|
|
|
|
|
|
- Nessun TLS, nessun reverse proxy — solo per test locali sulla tua macchina.
|
|
|
|
|
|
|
|
|
|
|
|
Per fermarlo: `Ctrl+C`, oppure se lanciato in background con `nohup`:
|
|
|
|
|
|
```bash
|
|
|
|
|
|
pkill -f "uvicorn app.main:app"
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## Docker + Caddy (consigliato, anche per i test con dominio/TLS)
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
mkdir -p data/db data/keys data/logs # una tantum, se non già presenti
|
|
|
|
|
|
docker compose up -d --build
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
- Caddy fa da reverse proxy davanti all'app e gestisce il TLS automaticamente
|
|
|
|
|
|
- App su `https://localhost/` (o sul dominio configurato, vedi sotto)
|
|
|
|
|
|
- Pannello admin su `https://localhost/admin`
|
|
|
|
|
|
- DB, master key cifrata e log persistono in `./data/` sulla root del repo
|
|
|
|
|
|
(bind mount, non volumi Docker opachi) — sopravvivono a stop/rebuild del
|
|
|
|
|
|
container e sono ispezionabili/backup-abili direttamente
|
|
|
|
|
|
|
|
|
|
|
|
### Modalità dev, senza dominio (certificato self-signed)
|
|
|
|
|
|
|
|
|
|
|
|
Non serve fare nulla: lasciando `SITE_ADDRESS` non impostata, Caddy usa
|
|
|
|
|
|
`localhost` di default. Rilevando che non è un hostname pubblico, genera da
|
|
|
|
|
|
solo un certificato dalla sua CA interna — il browser mostrerà un avviso di
|
|
|
|
|
|
sicurezza al primo accesso (normale, accettalo o usa `curl -k`).
|
|
|
|
|
|
|
|
|
|
|
|
### Modalità produzione, con dominio reale
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
SITE_ADDRESS=lottery.tuodominio.it docker compose up -d
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
Il DNS del dominio deve già puntare all'IP del server, con le porte 80 e 443
|
|
|
|
|
|
raggiungibili da internet. Caddy richiede e rinnova automaticamente un
|
|
|
|
|
|
certificato Let's Encrypt reale — nessuna configurazione aggiuntiva.
|
|
|
|
|
|
|
|
|
|
|
|
### Comandi utili
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
docker compose logs -f app # segui i log dell'app (anche in ./data/logs/app.log)
|
|
|
|
|
|
docker compose ps # stato dei container
|
|
|
|
|
|
docker compose stop # ferma senza rimuovere i container
|
|
|
|
|
|
docker compose down # ferma e rimuove i container (i dati in ./data/ restano)
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-07-23 11:05:27 +02:00
|
|
|
|
> **Nota sul `Caddyfile`**: è montato in sola lettura nel container `caddy`
|
|
|
|
|
|
> (bind mount). Modificarlo non basta a farlo ripartire con la nuova
|
|
|
|
|
|
> configurazione — `docker compose up -d --build` non ricrea `caddy` solo
|
|
|
|
|
|
> perché il *contenuto* di un file montato è cambiato. Dopo una modifica al
|
|
|
|
|
|
> `Caddyfile` serve un passaggio in più:
|
|
|
|
|
|
> ```bash
|
|
|
|
|
|
> docker compose restart caddy
|
|
|
|
|
|
> ```
|
|
|
|
|
|
> (oppure, senza interrompere le connessioni esistenti: `docker compose exec
|
|
|
|
|
|
> caddy caddy reload --config /etc/caddy/Caddyfile`).
|
|
|
|
|
|
|
2026-07-21 11:22:03 +02:00
|
|
|
|
### ⚠️ Attenzione: riavvii automatici a metà round
|
|
|
|
|
|
|
|
|
|
|
|
`docker-compose.yml` imposta `restart: unless-stopped` sul container dell'app:
|
|
|
|
|
|
se crasha, riparte da solo. Questo però non è ancora sicuro in ogni caso — se
|
|
|
|
|
|
il crash avviene mentre un round è in stato `closing`/`drawing`/`paying_out`,
|
|
|
|
|
|
lo scheduler non lo riprende al riavvio e il round resta bloccato (gap noto,
|
|
|
|
|
|
vedi "Known gaps" in `CLAUDE.md`). Non trattare questo setup come
|
|
|
|
|
|
"non supervisionato" finché quel gap non è risolto.
|