From 342b457ee70e8009d87b3cd9c7db4b295999d29a Mon Sep 17 00:00:00 2001 From: Davide Grilli Date: Sun, 27 Sep 2026 14:34:57 +0200 Subject: [PATCH] Cifra il backup di default e aggiunge tar.gz + istruzioni decompressione MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Prima --encrypt era opt-in; dato che i dump contengono dati sensibili (hash password, documenti d'identità) la cifratura ora è il comportamento di default, disattivabile con --no-encrypt. Co-Authored-By: Claude Sonnet 5 --- backups/README.md | 45 +++++++++++++++++++++++++++++++++------------ backups/backup.sh | 20 +++++++++++++------- 2 files changed, 46 insertions(+), 19 deletions(-) diff --git a/backups/README.md b/backups/README.md index 7981cfb..7eca022 100644 --- a/backups/README.md +++ b/backups/README.md @@ -35,7 +35,7 @@ Da fare una volta sola per host (poi il backup si rilancia semplicemente con 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. -5. **(Solo se userai `--encrypt`) Verifica che gpg sia installato**: +5. **Verifica che gpg sia installato** (serve per cifrare, di default): ```bash gpg --version ``` @@ -46,15 +46,21 @@ A questo punto sei pronto per lanciare il backup vero e proprio (vedi sotto). ## Uso ```bash -./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 +./backups/backup.sh # crea backups/YYYYMMDD_HHMM/, poi comprime e cifra + # in backups/YYYYMMDD_HHMM.tar.gz.gpg (chiede una + # passphrase a te scelta) e cancella cartella+tar.gz + # in chiaro +./backups/backup.sh --no-encrypt # come sopra ma lascia solo il tar.gz in chiaro + # (nessuna passphrase richiesta) ``` -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ù. +La passphrase non è salvata da nessuna parte: la scegli tu al momento (gpg la +chiede due volte, per conferma) e ti serve identica per decifrare in seguito — +se la perdi, il backup cifrato è irrecuperabile. Tienila in un password manager. + +Ogni esecuzione crea una cartella/archivio nuovo 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 @@ -70,6 +76,23 @@ Il backup contiene: | `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) | +## Decomprimere + +Archivio cifrato (caso di default), chiede la passphrase scelta al momento +del backup: + +```bash +gpg -d backups/AAAAMMGG_hhmm.tar.gz.gpg | tar xz -C backups/ +``` + +Ricrea `backups/AAAAMMGG_hhmm/` con dentro i file elencati sopra. + +Archivio non cifrato (generato con `--no-encrypt`): + +```bash +tar xzf backups/AAAAMMGG_hhmm.tar.gz -C backups/ +``` + ## Ripristino 1. Nuovo progetto Supabase (o `supabase start` in locale via Docker). @@ -83,8 +106,6 @@ Il backup contiene: 5. 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 login` interattivo, non @@ -98,8 +119,8 @@ 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 `--encrypt` o cifra tu - l'archivio a mano; +- se sposti un backup fuori da questo host, usa l'archivio cifrato (default) + invece del tar.gz in chiaro generato con `--no-encrypt`; - cancella i backup in chiaro quando non ti servono più. ## File di questa cartella diff --git a/backups/backup.sh b/backups/backup.sh index 28dc98d..e1479b2 100755 --- a/backups/backup.sh +++ b/backups/backup.sh @@ -1,8 +1,8 @@ #!/usr/bin/env bash # Backup completo di disaster recovery: schema + dati DB, utenti auth, file storage. # Uso: -# ./backups/backup.sh crea backups/YYYYMMDD_HHMM/ con dentro tutto -# ./backups/backup.sh --encrypt come sopra, poi comprime e cifra con gpg (chiede una passphrase) +# ./backups/backup.sh crea backups/YYYYMMDD_HHMM/, comprime e cifra con gpg (chiede una passphrase) +# ./backups/backup.sh --no-encrypt come sopra ma lascia solo il tar.gz in chiaro # # Richiede: essere già collegati al progetto Supabase (supabase login + link, già fatto # in questo repo) e avere .env con VITE_SUPABASE_URL e SUPABASE_SERVICE_ROLE_KEY. @@ -33,11 +33,17 @@ node "$SCRIPT_DIR/download-storage.mjs" "$RUN_DIR/storage" echo "==> Backup completato: $RUN_DIR" -if [[ "${1:-}" == "--encrypt" ]]; then - ARCHIVE="$RUN_DIR.tar.gz.gpg" - echo "==> Comprimo e cifro in $ARCHIVE (verrà chiesta una passphrase)" - tar -C "$SCRIPT_DIR" -czf - "$STAMP" | gpg --symmetric --cipher-algo AES256 -o "$ARCHIVE" - rm -rf "$RUN_DIR" +TARBALL="$RUN_DIR.tar.gz" +echo "==> Comprimo in $TARBALL" +tar -C "$SCRIPT_DIR" -czf "$TARBALL" "$STAMP" + +if [[ "${1:-}" == "--no-encrypt" ]]; then + echo "==> Archivio pronto: $TARBALL" +else + ARCHIVE="$TARBALL.gpg" + echo "==> Cifro in $ARCHIVE (verrà chiesta una passphrase)" + gpg --symmetric --cipher-algo AES256 -o "$ARCHIVE" "$TARBALL" + rm -rf "$RUN_DIR" "$TARBALL" echo "==> Archivio cifrato pronto: $ARCHIVE" echo " Per estrarlo: gpg -d $ARCHIVE | tar xz" fi