- npm run typecheck (tsc --noEmit) entra nella checklist di fine lavoro: bun esegue i test senza controllare i tipi, ed è così che si erano accumulati errori di tipo con la suite verde. - La logica pura del download dello storage passa in storage-core.ts, testata con dati finti (nessuna lettura del .env reale). - Il download dello storage esce con errore se anche un solo file non si scarica, così backup.sh non dichiara completo un backup parziale. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Backup di disaster recovery
Script per scaricare su questo host un backup completo del progetto Supabase: schema DB, dati, utenti auth e file storage. Serve per poter ripartire in fretta se il progetto Supabase (o Vercel) venisse perso.
Preparazione, passo per passo
Da fare una volta sola per host (poi il backup si rilancia semplicemente con
./backups/backup.sh).
- Installa/aggiorna la CLI Supabase (via
npx, non serve installarla a parte):npx supabase --version - Accedi con il tuo account Supabase:
Si apre il browser per l'OAuth; il token resta salvato in locale.
npx supabase login - Collega il repo al progetto Supabase (il
project_idè già insupabase/config.toml, quindi in genere basta):Verifica che sia andato a buon fine connpx supabase link --project-ref <project_id>npx supabase projects list(il progetto deve comparire con"linked":true). - Crea/controlla il file
.envnella root del repo (accanto apackage.json, non dentrobackups/) con almeno queste due chiavi:Le trovi su supabase.com/dashboard → progetto → Project Settings → API. La service role key è quella con permessi pieni (bypassa le RLS): serve solo per scaricare i file dai bucket, non va mai esposta lato client né committata.VITE_SUPABASE_URL="https://<project_id>.supabase.co" SUPABASE_SERVICE_ROLE_KEY="<service role key>" - (Solo se userai
--encrypt) Verifica che gpg sia installato:Su Debian/Ubuntu:gpg --versionsudo apt install gnupgse manca.
A questo punto sei pronto per lanciare il backup vero e proprio (vedi sotto).
Uso
./backups/backup.sh # crea backups/YYYYMMDD_HHMM/ con tutto dentro
./backups/backup.sh --encrypt # come sopra, poi comprime e cifra in un unico
# backups/YYYYMMDD_HHMM.tar.gz.gpg (chiede una
# passphrase) e cancella la cartella in chiaro
Ogni esecuzione crea una cartella nuova con timestamp: non sovrascrive backup precedenti. Non c'è pulizia automatica dei vecchi backup — cancellali a mano quando non servono più.
Se un passaggio fallisce (un dump o anche un solo file dello storage non scaricato), lo script si ferma con un errore e non stampa «Backup completato»: un backup incompleto non va considerato valido, rilancialo.
Il backup contiene:
| File/cartella | Contenuto |
|---|---|
schema_public.sql |
schema delle tabelle applicative (tabelle, funzioni, RLS) |
data_public.sql |
dati delle tabelle applicative |
schema_auth.sql |
schema utenti Supabase Auth |
data_auth.sql |
utenti reali, incluso l'hash della password |
storage/ |
tutti i file dei bucket (avatar-giocatori, profili-giocatore: foto, documenti d'identità, certificati) |
Ripristino
- Nuovo progetto Supabase (o
supabase startin locale via Docker). - Importa nell'ordine:
schema_public.sql→schema_auth.sql→data_auth.sql→data_public.sql(gli utenti auth prima dei dati pubblici, perchégiocatori.auth_user_idreferenziaauth.users.id). - Ricrea i bucket
avatar-giocatorieprofili-giocatoree ricarica il contenuto distorage/. - Reimposta le variabili d'ambiente su Vercel/locale (non incluse in questo backup — vedi sotto).
- Redeploy dal repo git (il codice non serve backupparlo qui, è già su GitHub e Gitea).
Per un archivio cifrato: gpg -d backups/AAAAMMGG_hhmm.tar.gz.gpg | tar xz.
Cosa NON è incluso
- Variabili d'ambiente Vercel: richiede
vercel logininterattivo, non automatizzabile da questo script. Esportale a mano convercel env pull. - Codice applicativo: vive nel repo git, non nel database.
Sicurezza
Questi backup contengono password hash, documenti d'identità e altri dati personali reali. Per questo:
- la cartella
backups/è in.gitignore(tranne questo README e gli script: quelli sì restano in git) — non committare mai i dati generati; - se sposti un backup fuori da questo host, usa sempre
--encrypto cifra tu l'archivio a mano; - cancella i backup in chiaro quando non ti servono più.
File di questa cartella
| File | Ruolo |
|---|---|
backup.sh |
Punto di ingresso: esegue dump e download in ordine |
download-storage.mjs |
Scarica i file dei bucket (usa la service role key del .env) |
storage-core.ts |
Logica pura (lettura del .env, elenco dei file), coperta da test/unit/backup-storage.test.ts |