- Spezza il registro delle decisioni in docs/decisions/DD-XXX.md, con indice - Ripulisce DATABASE.md dalla storia delle migration e aggiunge la sezione Lettura - Riduce PROJECT_STATE.md a una pagina; la procedura di allestimento passa in OPERATIONS.md - Aggiunge OPERATIONS.md, GLOSSARIO.md, trappole note e checklist in ARCHITECTURE.md - Sintetizza la copertura test di badge.md e documenta docs/archive - Allinea AGENTS.md, README.md e la regola Cursor (tolto l'obbligo di develop, in contrasto con DD-019) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
7.7 KiB
Operatività: ambienti, variabili e procedure
Come si allestisce, si configura e si rilascia CrAPP. Le scelte di fondo sono in PORTABILITA.md (cosa lega l'app a un fornitore, come spostarla) e in ARCHITECTURE.md; il worker delle email ha il suo manuale in WORKER_EMAIL.md.
Ambienti
| Ambiente | Dove | Note |
|---|---|---|
| Produzione | Vercel (main) + Supabase proprietario |
Project Ref kfkcldwncxqaixetsjes. Il vecchio hetycilxgkdmccelwerq è deprecato: non usarlo. |
| Preview | Vercel, da develop e dai branch |
develop è fermo indietro rispetto a main (DD-019): non rappresenta lo stato attuale. |
| Locale | npm run dev (8080) + npx supabase start |
Database in Docker con migration e seed. Dev e produzione possono condividere lo stesso progetto Supabase: vedi «Attenzione». |
| Worker | Raspberry Pi con Docker (mailer/) |
Email e push dei promemoria. Vedi WORKER_EMAIL.md. |
Lovable Cloud non è più il backend di CrAPP (DD-001).
Variabili d'ambiente
Nomi usati dal codice; i valori stanno in .env / .env.local (mai nel repository) e nelle
Environment Variables di Vercel (Preview e Production).
| Variabile | Dove serve | Per cosa |
|---|---|---|
VITE_SUPABASE_URL, VITE_SUPABASE_PUBLISHABLE_KEY |
client (browser) | Connessione pubblica a Supabase |
SUPABASE_URL, SUPABASE_PUBLISHABLE_KEY |
server | Come sopra, lato route |
SUPABASE_SERVICE_ROLE_KEY |
server e worker | Bypassa la RLS: solo nelle route src/routes/api/public/ e nel worker. Mai al client. |
VAPID_PUBLIC_KEY, VAPID_PRIVATE_KEY, VAPID_SUBJECT |
server e worker | Firma delle notifiche push. Le chiavi devono essere le stesse nell'app e nel worker. |
SMTP_HOST, SMTP_PORT, SMTP_SECURE, SMTP_USER, SMTP_PASS |
worker | Invio email via Gmail (password per app) |
MAILER_FILE_SALUTE |
worker | File usato dall'healthcheck del container |
SUPABASE_AUTH_GOOGLE_CLIENT_ID, SUPABASE_AUTH_GOOGLE_SECRET |
Supabase locale | Solo per provare il login Google sullo stack locale |
Se aggiungi una variabile, aggiungila anche qui.
Migration
Ordine obbligatorio (vedi anche AGENTS.md, sezione Database):
- si progetta e si documenta in DATABASE.md;
- si crea una nuova migration in
supabase/migrations/(mai riscrivere quelle applicate); - si prova in locale con
npx supabase db resetenpm run test:all; - solo dopo
npx supabase db pushverso il cloud; - si verifica con
npx supabase migration listche locale e remoto coincidano.
Rilascio
main è la produzione: ogni commit deve lasciare l'app funzionante. Il deploy è quello di Vercel
sul push di main; un cron giornaliero (/api/public/keepalive, vercel.json) evita la pausa
del progetto. Prima di dire «finito» vale la checklist «Fine lavoro» di AGENTS.md.
Per tornare indietro: promuovere il deployment precedente da Vercel; le migration, essendo
additive, non si annullano ma si correggono con una migration nuova.
Allestire un ambiente: autenticazione e primo admin
In produzione su main. Il login è l'unica via d'accesso (31/08/2026): la selezione
libera del giocatore non esiste più, senza sessione Google si resta su /benvenuto, e i
permessi di amministrazione arrivano solo da user_roles.
Attenzione all'ordine: finché il provider Google è spento in Supabase, «Accedi con Google» risponde
{"code":400,"error_code":"validation_failed","msg":"Unsupported provider: provider is not enabled"}
e nessuno entra nell'app. Vale ancora per chi allestisce un ambiente nuovo (per esempio lo stack Supabase locale): il passo 1 qui sotto va fatto per primo.
Passaggi in ordine, nessuno dei quali è reversibile a metà. Stato al 04/09/2026: fatti i passaggi 1, 2, 3 e 5 (M4 applicata); il passaggio 4 è un processo continuo (7 dei 16 giocatori attivi hanno già fatto il primo accesso).
- Provider Google in Supabase — Google Cloud Console: consent screen External (scope
emaileprofile, non sensibili: nessuna verifica richiesta, e la modalità Testing regge fino a 100 utenti, più che sufficiente per la squadra), credenziale Web application con redirect URIhttps://kfkcldwncxqaixetsjes.supabase.co/auth/v1/callback. Client ID e secret in Authentication → Providers → Google. In URL Configuration: Site URL di produzione, piùlocalhost:8080e il wildcard delle preview Vercel tra i Redirect URLs. Per provare sullo stack locale invece che sul cloud servono ancheenabled = truein[auth.external.google]disupabase/config.toml, le due variabiliSUPABASE_AUTH_GOOGLE_*in.enve una credenziale con redirect URIhttp://127.0.0.1:54321/auth/v1/callback. - Migration M2 (
supabase db push). È unCREATEpuro: si può applicare in produzione senza toccare il comportamento attuale. - Primo admin, dopo il primo login (l'ID esiste solo da quel momento):
INSERT INTO public.user_roles (user_id, role) SELECT id, 'admin' FROM auth.users WHERE email = '<mail>'; - Collegamento degli account: ciascuno accede con Google e viene collegato in
automatico al proprio giocatore per email (DD-018) — nessuna scelta manuale. Finché
l'email di un giocatore non è impostata, il suo accesso mostra un errore; da
/adminsi imposta l'email di un giocatore (nuovo o esistente) senza bisogno di una migration. Da settembre 2026 tutti i giocatori attivi hanno l'email registrata, ma il collegamento vero e proprio (auth_user_id) avviene solo al primo login di ciascuno, quindi resta un processo continuo che si ripete a ogni nuovo giocatore aggiunto a stagione in corso. Uno slot già collegato può essere liberato solo da un admin. - Solo a squadra collegata: migration
m4_solo_autenticati, che toglie al ruoloanonl'accesso alle tabelle v1.0. Da lì in poi i dati sono raggiungibili solo con una sessione; le route insrc/routes/api/public/usano la service role e continuano a funzionare. Applicata in produzione il 03/09/2026 — non è più necessario aspettare che l'intera rosa abbia già fatto login: il login era già l'unica via d'accesso lato app, quindi i giocatori non ancora collegati non erano comunque impattati; M4 chiudeva solo un residuo di accesso diretto al database bypassando l'app.
Attenzione: dev e produzione condividono lo stesso progetto Supabase. Un account di prova che collega uno slot lo occupa anche in produzione, e va liberato da un admin.