Aggiungo CMS Strapi self-hosted per gestire rosa, classifica e storico partite

Introduce lo stack Strapi dockerizzato (infra/strapi/), sullo stesso Postgres
dello stack Supabase con un database logico separato, dietro Caddy su /cms/*.
L'editing dei dati avviene solo nel pannello admin nativo di Strapi.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-28 15:39:20 +02:00
co-authored by Claude Sonnet 5
parent 3fdbfefa62
commit 3f61b32219
43 changed files with 22425 additions and 9 deletions
+30 -6
View File
@@ -152,24 +152,48 @@ Passo passo, sul server di produzione:
docker exec -i supabase-db psql -U postgres -d postgres -v ON_ERROR_STOP=1 < "$f"
done
```
3. **Reverse proxy TLS**: copia `infra/supabase/docker/Caddyfile.example` in `Caddyfile`,
3. **Stack Strapi** (CMS admin per rosa, classifica, storico partite, scout finalizzato — vedi
`infra/strapi/`): usa lo stesso Postgres dello stack Supabase, in un database logico separato:
```sh
docker exec -i supabase-db psql -U postgres -c "CREATE DATABASE strapi;"
docker exec -i supabase-db psql -U postgres -c "CREATE USER strapi WITH PASSWORD '...';"
docker exec -i supabase-db psql -U postgres -c "GRANT ALL PRIVILEGES ON DATABASE strapi TO strapi;"
cp infra/strapi/.env.production.example infra/strapi/.env
```
Compila in `infra/strapi/.env` i secret (`APP_KEYS`, `JWT_SECRET`, ecc. — genera ognuno con
`openssl rand -base64 32`) e `DATABASE_PASSWORD` (la stessa scelta sopra), poi:
```sh
cd infra/strapi
docker compose up -d --build
```
Al primo accesso su `<dominio>/cms/admin` crea l'utente amministratore Strapi. Da lì, un solo
giro di setup manuale (nessuna automazione: i permessi Strapi si abilitano solo dall'admin UI):
in Settings → Users & Permissions Plugin → Roles → Public abilita `find`/`findOne` per
`Giocatore`, `Riga-classifica` e `Match-storico`; poi in Settings → API Tokens genera un token
con permesso `create` solo su `Scout-match-finale` (va in `STRAPI_WRITE_TOKEN` nell'env
dell'app, punto 5). Infine inserisci a mano rosa/classifica/storico nelle rispettive collezioni
(i valori di partenza sono nella cronologia git di `src/lib/crapp-data.ts`, prima che venissero
spostati qui).
4. **Reverse proxy TLS**: copia `infra/supabase/docker/Caddyfile.example` in `Caddyfile`,
sostituisci il dominio del punto 0, poi `caddy run --config Caddyfile` (o come container).
Gestisce automaticamente il certificato Let's Encrypt.
4. **Env dell'app**:
5. **Env dell'app**:
```sh
cp .env.production.example .env
```
Compila `VITE_SUPABASE_URL` (dominio del punto 0 + `/api`),
`VITE_SUPABASE_PUBLISHABLE_KEY` (= `ANON_KEY` dello stack), `SUPABASE_SERVICE_ROLE_KEY`
(= `SERVICE_ROLE_KEY`), e le chiavi `VAPID_*` reali (`npx web-push generate-vapid-keys`).
5. **Build e avvio**:
(= `SERVICE_ROLE_KEY`), `VITE_STRAPI_URL` (dominio del punto 0 + `/cms`), `STRAPI_WRITE_TOKEN`
(il token generato al punto 3), e le chiavi `VAPID_*` reali
(`npx web-push generate-vapid-keys`).
6. **Build e avvio**:
```sh
bun run build
node .output/server/index.mjs # ascolta su PORT (default 3000)
```
Tienilo vivo con un process manager (pm2/systemd) — il Caddy del punto 3 lo espone via TLS
Tienilo vivo con un process manager (pm2/systemd) — il Caddy del punto 4 lo espone via TLS
sull'hostname app.
6. **Job pianificati** — gli endpoint `src/routes/api/public/promemoria-palloni.ts` e
7. **Job pianificati** — gli endpoint `src/routes/api/public/promemoria-palloni.ts` e
`sollecita-presenze.ts` vanno richiamati periodicamente via HTTP POST da un cron di sistema o
`pg_cron`: non partono da soli.