← Tutte le idee Gestionali per aziende

Databasus

Backup automatici dei database, con verifica che si possano davvero ripristinare

Cosa fa

Uno strumento per fare backup dei database PostgreSQL, tornare indietro a un momento preciso e verificare che i backup funzionino davvero.

Come guadagna

Progetto open source su GitHub con oltre 9.000 stelle, che non dichiara incassi. Ha licenza Apache 2.0: puoi partire dal suo codice, anche per un prodotto a pagamento, mantenendo le note sugli autori. Idee nostre per guadagnare: versione gestita in abbonamento: molti pagano per non doverci pensare.

Rendilo tuo

  • Backup gestito per le piccole aziende italiane che hanno un gestionale sul loro server.
  • Report mensile chiaro: "i tuoi dati sono al sicuro".

Le frasi da scrivere all'AI

1. Base del sito e grafica

Crea un'app web in italiano chiamata "Backup Sicuro": un servizio che fa i backup automatici dei database PostgreSQL (anche Supabase) ogni notte, li conserva cifrati, e soprattutto verifica ogni settimana che si possano davvero ripristinare. Usa React, Vite, TypeScript e Tailwind CSS.

Pagine da creare:
1. Pagina iniziale con il problema ("un backup mai provato non è un backup") e i prezzi
2. Registrazione e aggiunta del database da proteggere
3. Backup: elenco con data, dimensione, esito della verifica
4. Ripristino guidato: scarica o ripristina in un nuovo database
5. Avvisi e impostazioni di conservazione

Stile: affidabile e tecnico: sfondo bianco, blu acciaio #1E3A8A, verde #16A34A per "verificato", rosso #DC2626 per gli errori, carattere "Inter" e "JetBrains Mono" per i dettagli. Nessuna immagine generica di stock.

Tutto deve funzionare perfettamente da telefono. Tutti i testi in italiano, chiari e senza parole tecniche.

2. Database, account e sicurezza

Collega il progetto a Supabase e attiva la registrazione con email e password.

Crea queste tabelle:
- "database": nome, stringa di connessione (cifrata, solo lato server), frequenza, giorni di conservazione
- "backup": database, data, dimensione, posizione del file cifrato, esito della verifica, tabelle e righe contate

Regole di sicurezza obbligatorie:
- ogni utente vede solo i suoi database e backup
- le credenziali dei database non sono mai leggibili dal browser
- i file di backup sono cifrati prima di essere salvati

Usa esattamente il codice SQL che trovi nei "Dettagli tecnici" di questa scheda: eseguilo nel SQL Editor di Supabase prima di continuare, poi collega le pagine alle tabelle.

3. Backup e verifica automatica

I backup non si possono fare dentro una Edge Function (serve pg_dump e tempo): girano su un piccolo server di lavoro (es. un container programmato), che ogni notte esegue pg_dump, cifra il file con una chiave del cliente e lo carica in uno storage di oggetti in un'altra regione.

Ogni settimana la verifica: il backup più recente viene ripristinato in un database temporaneo, si contano tabelle e righe delle tabelle principali e si confrontano con il database originale (script nei Dettagli tecnici). Se qualcosa non torna, avviso immediato.

All'utente si chiede un utente del database con permessi di sola lettura: mai l'utente principale.

4. Ripristino e conservazione

Ripristino guidato: scaricare il file e le istruzioni per ripristinarlo, oppure ripristinarlo in un nuovo database indicato dall'utente. Conservazione a scelta (7 backup giornalieri, 4 settimanali, 12 mensili) con cancellazione automatica dei vecchi.

Avvisi via email e Slack per backup falliti o verifiche non riuscite.

5. Pagamenti con Stripe

Aggiungi un abbonamento a 15 € al mese per database. Gratis l'utente ha: un database fino a 1 GB, backup settimanale. Con il piano Pro sblocca: backup ogni notte, verifica automatica settimanale, conservazione lunga e ripristino guidato.

A pagamento riuscito il webhook porta l'utente al piano Pro; se l'abbonamento viene disdetto o non rinnovato lo riporta al piano gratuito.

Per la sessione di pagamento e il webhook segui la guida "Pagamenti con Stripe" di Fattibile.

6. Controlli specifici di questo progetto

Oltre ai controlli della guida "Controllo finale", verifica in particolare:
1. Ripristino: cancella una tabella in un database di prova e ripristinala dal backup di stanotte seguendo solo la guida del sito.
Correggi quello che non va e scrivimi cosa hai cambiato.

Dettagli tecnici

Backup cifrato e verifica del ripristino

Lo script che gira sul server di lavoro: backup con pg_dump, cifratura, caricamento, poi ripristino di prova in un database temporaneo e confronto del numero di righe.

#!/usr/bin/env bash
set -euo pipefail

# Variabili fornite dal servizio (mai scritte nel codice):
# DB_URL (utente in sola lettura), DB_TEMP_URL, CHIAVE_PUBBLICA (age), DESTINAZIONE (s3://...)
DATA=$(date -u +%Y-%m-%dT%H-%M)
FILE="backup-$DATA.dump"

# 1. Backup in formato "custom" (compresso, ripristinabile tabella per tabella)
pg_dump "$DB_URL" --format=custom --no-owner --no-privileges --file="$FILE"

# 2. Cifratura con la chiave pubblica del cliente, poi caricamento
age --recipient "$CHIAVE_PUBBLICA" --output "$FILE.age" "$FILE"
aws s3 cp "$FILE.age" "$DESTINAZIONE/$FILE.age"

# 3. Verifica: ripristino nel database temporaneo
pg_restore --clean --if-exists --no-owner --dbname="$DB_TEMP_URL" "$FILE"

# 4. Confronto del numero di righe di ogni tabella (conteggio esatto)
CONTA="select table_name, (xpath('/row/c/text()', query_to_xml(format('select count(*) as c from %I.%I', table_schema, table_name), false, true, '')))[1]::text from information_schema.tables where table_schema = 'public' and table_type = 'BASE TABLE' order by 1"
diff <(psql "$DB_URL" -qAtc "$CONTA") <(psql "$DB_TEMP_URL" -qAtc "$CONTA")   && echo "VERIFICA OK" || { echo "VERIFICA FALLITA"; exit 1; }

rm -f "$FILE" "$FILE.age"

Backup e verifiche

Il registro dei backup con l'esito della verifica, e la query per gli avvisi: database senza un backup verificato negli ultimi 8 giorni.

create table database_protetti (
  id uuid primary key default gen_random_uuid(),
  utente_id uuid not null references auth.users(id) on delete cascade,
  nome text not null,
  conservazione_giorni int not null default 30
);
alter table database_protetti enable row level security;
create policy "le mie righe" on database_protetti
  for all using (auth.uid() = utente_id) with check (auth.uid() = utente_id);

-- Credenziali separate: nessuna regola, le legge solo il server di lavoro
create table credenziali (
  database_id uuid primary key references database_protetti(id) on delete cascade,
  url_cifrato text not null
);
alter table credenziali enable row level security;

create table backup (
  id bigint generated always as identity primary key,
  database_id uuid not null references database_protetti(id) on delete cascade,
  fatto_il timestamptz not null default now(),
  dimensione_byte bigint,
  percorso text not null,
  verificato boolean,
  dettagli_verifica text
);
alter table backup enable row level security;
create policy "i miei backup" on backup for select using (exists (
  select 1 from database_protetti d where d.id = database_id and d.utente_id = auth.uid()));

-- Da segnalare: nessun backup verificato negli ultimi 8 giorni
select d.id, d.nome from database_protetti d
where not exists (select 1 from backup b where b.database_id = d.id and b.verificato and b.fatto_il > now() - interval '8 days');

Pezzi comuni a tutti i progetti

Glossario

pg_dump
Il programma ufficiale di PostgreSQL per salvare un intero database in un file.
Verifica del ripristino
Provare davvero a rimettere in piedi il database dal backup: l'unico modo per sapere che il backup funziona.