[{"data":1,"prerenderedAt":1222},["ShallowReactive",2],{"blog-it-test-your-supabase-backup":3,"blog-index-it":869},{"id":4,"title":5,"body":6,"category":824,"cover":825,"coverAlt":826,"description":827,"draft":828,"extension":829,"faq":830,"image":846,"keywords":847,"meta":856,"navigation":857,"ogTitle":858,"path":859,"published":860,"seo":861,"stem":862,"tldr":863,"updated":867,"__hash__":868},"blog_it\u002Fblog\u002Ftest-your-supabase-backup.md","Testa il tuo backup di Supabase prima del giorno in cui serve",{"type":7,"value":8,"toc":808},"minimark",[9,13,21,24,29,32,35,39,42,146,155,161,165,172,186,211,221,238,243,247,250,275,301,319,329,332,347,351,354,429,437,470,474,477,483,491,494,504,510,513,574,578,584,590,596,617,623,627,635,638,644,647,651,658,673,676,680,683,686,689,693,698,747,759,763,795],[10,11,12],"p",{},"Da qualche parte c'è un file con dentro il tuo database. Una GitHub Action ne\nscrive uno ogni notte, oppure hai lanciato una volta i tre comandi di backup di\nSupabase, oppure il tuo piano fa copie giornaliere. Ha il nome giusto e più o\nmeno la dimensione che ti aspetteresti. Nessuno l'ha mai aperto.",[10,14,15,16,20],{},"Ecco la parte che le guide di configurazione rimandano a dopo: ",[17,18,19],"strong",{},"un backup che\nnon è mai stato ripristinato è una promessa, non una copia."," L'unico modo per\ntestare un backup di Supabase è ripristinarlo, apposta, in un posto dove non\nconta, e guardare cosa torna. Un dump troncato a metà, un dump senza nemmeno\nuna riga e un dump del progetto sbagliato stanno tutti nello storage con\nesattamente l'aspetto di uno buono.",[10,22,23],{},"Pensa a una prova di evacuazione. Un edificio la fa in una mattina qualunque,\nquando non brucia niente, perché nessuno dovrebbe scendere quelle scale per la\nprima volta il giorno in cui si riempiono di fumo. Fuori, qualcuno fa l'appello\nsulla lista di chi era dentro, e qualcuno annota la data sul foglio vicino alla\nporta. Una prova di ripristino è la stessa cosa: fare il percorso, contare,\nannotare.",[25,26,28],"h2",{"id":27},"come-faccio-a-sapere-se-il-mio-backup-di-supabase-funziona-davvero","Come faccio a sapere se il mio backup di Supabase funziona davvero?",[10,30,31],{},"Ripristinalo e guarda. È l'unico test che esista, perché niente nel file in sé\nsepara un backup buono da uno rotto.",[10,33,34],{},"La prova prende la tua copia più recente, la ricarica in un progetto che non\nconta e fa tre domande al risultato. C'è ogni tabella, con più o meno tante\nrighe quante quella in produzione? La riga più recente è della notte in cui è\nstata fatta la copia? Riesci ad accedere come te stesso? Un file buono risponde\nsì a tutte e tre, e ogni modo in cui un backup va storto ne fallisce almeno una.",[25,36,38],{"id":37},"cinque-modi-in-cui-un-backup-è-sbagliato-e-sembra-giusto-lo-stesso","Cinque modi in cui un backup è sbagliato e sembra giusto lo stesso",[10,40,41],{},"Tutti e cinque finiscono nella notte senza errori, e tutti e cinque lasciano un\nfile con il solito nome nel solito posto. Si distinguono solo quando il file\nviene ricaricato.",[43,44,45,61],"table",{},[46,47,48],"thead",{},[49,50,51,55,58],"tr",{},[52,53,54],"th",{},"Cosa non va nel file",[52,56,57],{},"Come ci arriva, di solito",[52,59,60],{},"Il passo della prova che lo scopre",[62,63,64,88,106,124,135],"tbody",{},[49,65,66,70,85],{},[67,68,69],"td",{},"Si ferma a metà",[67,71,72,73,77,78,81,82,84],{},"Uno script che passa ",[74,75,76],"code",{},"pg_dump"," a ",[74,79,80],{},"gzip"," riporta cosa ha fatto ",[74,83,80],{},". Un dump morto a metà viene salvato, e il job dice che è andato tutto bene. Un disco pieno o un caricamento che si è arreso fanno lo stesso",[67,86,87],{},"La riga finale, poi i conteggi",[49,89,90,93,103],{},[67,91,92],{},"Ha le tue tabelle e nessuna delle righe",[67,94,95,98,99,102],{},[74,96,97],{},"supabase db dump"," è stato lanciato senza ",[74,100,101],{},"--data-only",", e così scrive solo la struttura",[67,104,105],{},"I conteggi: ogni tabella a zero",[49,107,108,111,117],{},[67,109,110],{},"Ha le righe e nessuno degli account",[67,112,113,114],{},"Il dump ha nominato solo il tuo schema, e i tuoi utenti vivono in uno chiamato ",[74,115,116],{},"auth",[67,118,119,120,123],{},"La ricerca di ",[74,121,122],{},"auth.users",", poi l'accesso",[49,125,126,129,132],{},[67,127,128],{},"Sono i dati di un altro progetto",[67,130,131],{},"La connection string punta a una copia di staging o a un vecchio progetto",[67,133,134],{},"La riga più recente, del giorno sbagliato",[49,136,137,140,143],{},[67,138,139],{},"Non si carica affatto",[67,141,142],{},"Un dump di Postgres 17 ricaricato in Postgres 15, o righe di proprietario che il nuovo progetto rifiuta",[67,144,145],{},"Il ripristino si ferma con un errore",[10,147,148,149,154],{},"Il secondo e il terzo sono l'argomento di\n",[150,151,153],"a",{"href":152},"\u002Fblog\u002Fsupabase-backup-auth-users","perché il tuo dump di Supabase non ha utenti",",\ned entrambi nascono da un comando di dump lanciato con meno opzioni di quelle\nche servivano. Il primo ci ha sorpreso, quindi ha una sezione tutta sua.",[156,157],"diagram",{"alt":158,"caption":159,"src":160},"Sei file sigillati identici in fila, ognuno scende in un database ripristinato. Il primo ha tabelle piene e un registro di persone, con la spunta. Cinque sono barrati: una tabella troncata accanto a una vuota, tutte le tabelle vuote, un registro vuoto, righe grigie segnate come diverse e un caricamento fermato da una barra.","Nello storage i sei file sembrano uguali. Ricaricato, solo il primo ti restituisce il database che avevi.","\u002Fblog\u002Ftest-your-supabase-backup\u002Fsix-files-one-good-copy-1600x760.png",[25,162,164],{"id":163},"un-file-di-backup-troncato-fallisce-al-ripristino","Un file di backup troncato fallisce al ripristino?",[10,166,167,168,171],{},"Non sempre. Ne abbiamo troncato uno a metà di una tabella, l'abbiamo ricaricato\ncon le opzioni che usa la guida stessa di Supabase, e ",[74,169,170],{},"psql"," ha finito senza\nalcun errore.",[10,173,174,175,177,178,181,182,185],{},"Il test era piccolo e facile da ripetere. Il 27 settembre 2026 abbiamo fatto il\ndump di un database con due tabelle, una da 5.000 righe e una da 300, troncato\nil file in tre punti diversi e ricaricato ogni versione con ",[74,176,170],{}," di Postgres\n17.11. Ogni caricamento ha usato ",[74,179,180],{},"--single-transaction"," e\n",[74,183,184],{},"--variable ON_ERROR_STOP=1",", le due opzioni che servono a fermare un\nripristino al primo problema e annullare tutto.",[187,188,189,199,205],"ul",{},[190,191,192,195,196,198],"li",{},[17,193,194],{},"Troncato a metà di un valore",", ",[74,197,170],{}," si è fermato con un errore e non ha\nscritto niente. È il risultato che ti augureresti.",[190,200,201,204],{},[17,202,203],{},"Troncato dentro l'ultima colonna di una riga",", è finito con codice di\nuscita 0, che è il modo in cui un programma dice di aver avuto successo. La\nprima tabella è tornata con 2.596 delle sue 5.000 righe, all'ultima mancava\nmetà del testo, e la seconda tabella è tornata vuota.",[190,206,207,210],{},[17,208,209],{},"Troncato esattamente tra le due tabelle",", è finito anche lui con 0. La\nprima tabella era completa e la seconda vuota.",[10,212,213,214,217,218,220],{},"Il motivo sta nel modo in cui un dump conserva le righe. Le righe di ogni\ntabella stanno in un blocco che finisce con una riga che contiene solo ",[74,215,216],{},"\\.",", e\nquando il file finisce prima di quella riga, ",[74,219,170],{}," prende la fine del file per\nla fine del blocco. L'unico segno che doveva esserci dell'altro è una riga che\nsarebbe dovuta stare proprio alla fine.",[10,222,223,224,226,227,230,231,234,235,237],{},"Quella riga è la firma di ",[74,225,76],{},". Un dump completo contiene le parole\n",[74,228,229],{},"PostgreSQL database dump complete"," verso la fine, e uno troncato no. Dei tre\nfile che scrive la CLI di Supabase, la riga sopravvive solo in ",[74,232,233],{},"data.sql",",\nperché la CLI toglie tutti i commenti dal file dello schema (verificato con la\nversione 2.111 della CLI). Quindi ",[74,236,233],{}," è il file in cui cercare, e quella\nricerca è il secondo passo della prova.",[156,239],{"alt":240,"caption":241,"src":242},"Un file con il bordo inferiore strappato entra in un passo di ripristino segnato ON_ERROR_STOP=1 con una spunta verde. Oltre, due tabelle: la prima piena circa a metà, 2596 su 5000, con l'ultima riga strappata; la seconda vuota, 0 su 300.","Il caricamento ha riportato successo. La prima tabella è tornata piena a metà e la seconda vuota.","\u002Fblog\u002Ftest-your-supabase-backup\u002Fa-short-file-restores-clean-1600x680.png",[25,244,246],{"id":245},"dove-dovrei-ripristinarlo","Dove dovrei ripristinarlo?",[10,248,249],{},"In un progetto Supabase che non conta: un progetto di prova nel tuo account, o\nun Supabase che gira sul tuo computer. Mai nel progetto che usa la tua app.",[10,251,252,255,256,262,263,268,269,274],{},[17,253,254],{},"Un progetto di prova su Supabase"," è la cosa più simile al tuo progetto\nreale, ed è la destinazione per cui è scritta\n",[150,257,261],{"href":258,"rel":259},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fplatform\u002Fmigrating-within-supabase\u002Fbackup-restore",[260],"nofollow","la guida di Supabase a backup e ripristino",":\nil suo primo passo è creare un nuovo progetto. Con il piano gratuito\n",[150,264,267],{"href":265,"rel":266},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fplatform\u002Fbilling-faq",[260],"hai diritto a due progetti gratuiti attivi",",\ne quelli in pausa non contano, quindi un progetto di prova di solito non costa\nniente finché il tuo database sta nel piano gratuito. In un'organizzazione a\npagamento, il calcolo di un nuovo progetto viene\n",[150,270,273],{"href":271,"rel":272},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fplatform\u002Fmanage-your-usage\u002Fcompute",[260],"addebitato a ore",",\nquindi eliminalo quando la prova è finita.",[10,276,277,280,281,292,293,296,297,300],{},[17,278,279],{},"Supabase sul tuo computer"," non costa niente e non richiede un account. La\nCLI di Supabase fa girare tutto lo stack in locale con Docker:\n",[150,282,285,288,289],{"href":283,"rel":284},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Flocal-development\u002Fcli\u002Fgetting-started",[260],[74,286,287],{},"supabase init",", poi ",[74,290,291],{},"supabase start",",\ne mostra un indirizzo del database sulla porta 54322 e una publishable key per\nil progetto locale. Prima di avviarlo, apri ",[74,294,295],{},"supabase\u002Fconfig.toml"," e imposta\n",[74,298,299],{},"major_version"," sulla versione principale di Postgres del tuo progetto. Il\ncommento sopra quell'impostazione dice che devono coincidere, e la versione\ndel tuo progetto è in Project Settings, poi General.",[10,302,303,304,306,307,310,311,313,314,318],{},"Su Postgres 15 c'è un tranello. A meno che il job di backup non abbia fissato\nuna versione, la CLI ha fatto la copia con ",[74,305,76],{}," 17, e il file dei dati\ncontiene allora, vicino all'inizio, ",[74,308,309],{},"SET transaction_timeout = 0",",\nun'impostazione che Postgres 15 non riconosce, quindi il caricamento si ferma su\nquella riga. Per la prova, imposta ",[74,312,299],{}," su 17. Poi applica al job di\nbackup la correzione di una riga descritta\nnell'",[150,315,317],{"href":316},"\u002Fblog\u002Fsupabase-backup-github-action","articolo sulla GitHub Action",", perché\nil progetto in cui ripristineresti davvero è ancora su 15.",[10,320,321,322,324,325,328],{},"Un Postgres nudo in Docker, senza niente di Supabase dentro, non basta. Un dump\ndi Supabase fa riferimento a cose che crea solo Supabase, come lo schema ",[74,323,116],{},"\nin cui vivono i tuoi utenti e il ruolo ",[74,326,327],{},"authenticated"," nominato dalle tue\nregole di sicurezza, e il ripristino si ferma alla prima riga che ne menziona\nuna.",[10,330,331],{},"Una cautela, perché il progetto di prova ora contiene una copia reale. Ci sono\ndentro gli indirizzi email dei tuoi utenti, quindi non collegarci né la tua app\nné i suoi webhook, ed eliminalo quando hai finito.",[10,333,334,335,338,339,342,343,346],{},"I job pianificati sono la parte che non arriva. Se il tuo progetto li esegue con\nl'estensione ",[74,336,337],{},"pg_cron",", i tre file della CLI riportano l'estensione e nessuno\ndei suoi job, perché i job sono righe di ",[74,340,341],{},"cron.job"," e il dump dei dati lascia\nfuori quelle righe. L'abbiamo verificato il 4 ottobre 2026 con la versione 2.119\ndella CLI, ripristinando un database che aveva un job pianificato. Il progetto\ndi prova resta quindi tranquillo, e anche un ripristino vero da questi file\nparte senza alcun job pianificato, quindi tieni le tue chiamate a\n",[74,344,345],{},"cron.schedule"," in un posto da cui puoi rieseguirle.",[25,348,350],{"id":349},"come-testare-un-backup-di-supabase-passo-per-passo","Come testare un backup di Supabase, passo per passo",[10,352,353],{},"Sei passi, e i primi tre avvengono prima di ripristinare qualsiasi cosa.",[355,356,357,363,386,402,417,423],"ol",{},[190,358,359,362],{},[17,360,361],{},"Trova la copia più recente e leggi la sua data."," Se è più vecchia\ndell'ultima esecuzione programmata, il job si è fermato, ed è la tua prima\nscoperta.",[190,364,365,375,376],{},[17,366,367,368,371,372,374],{},"Cerca ",[74,369,370],{},"dump complete"," in ",[74,373,233],{},"."," Un risultato significa che il file\nè arrivato alla fine. Nessuno significa che è stato troncato, qualunque sia\nla sua dimensione. La ricerca di un editor di testo funziona quanto un\nterminale:",[377,378,383],"pre",{"className":379,"code":381,"language":382},[380],"language-text","grep -c 'dump complete' data.sql\n","text",[74,384,381],{"__ignoreMap":385},"",[190,387,388,391,392,395,396],{},[17,389,390],{},"Cercaci dentro i tuoi utenti."," Una riga che inizia con\n",[74,393,394],{},"COPY \"auth\".\"users\""," con delle righe sotto significa che i tuoi account\nsono nel file:",[377,397,400],{"className":398,"code":399,"language":382},[380],"grep -n 'COPY .*auth.*users' data.sql\n",[74,401,399],{"__ignoreMap":385},[190,403,404,407,408,374,411],{},[17,405,406],{},"Ricaricalo nel progetto di prova"," con il comando della guida di\nSupabase, puntato sulla connection string del progetto di prova. Su un\nSupabase locale quella stringa è\n",[74,409,410],{},"postgresql:\u002F\u002Fpostgres:postgres@127.0.0.1:54322\u002Fpostgres",[377,412,415],{"className":413,"code":414,"language":382},[380],"psql \\\n  --single-transaction \\\n  --variable ON_ERROR_STOP=1 \\\n  --file roles.sql \\\n  --file schema.sql \\\n  --command 'SET session_replication_role = replica' \\\n  --file data.sql \\\n  --dbname \"postgresql:\u002F\u002F…the spare's connection string…\"\n",[74,416,414],{"__ignoreMap":385},[190,418,419,422],{},[17,420,421],{},"Conta le righe e leggi la più recente",", in entrambi i database. La query\nè nella prossima sezione.",[190,424,425,428],{},[17,426,427],{},"Accedi al progetto di prova come te stesso."," Il comando è nella sezione\nsuccessiva.",[10,430,431,432,436],{},"Se il passo 4 si ferma con un errore, la prova ha già fatto il suo lavoro. Le\nnote di risoluzione dei problemi in fondo alla guida di Supabase coprono i due\nerrori più comuni, entrambi sui ruoli, e\n",[150,433,435],{"href":434},"\u002Fblog\u002Fhow-to-restore-a-supabase-backup","come ripristinare un backup di Supabase","\nspiega da cosa ti protegge ogni opzione di quel comando.",[10,438,439,440,443,444,447,448,451,452,455,456,459,460,463,464,469],{},"Mancano in quelle note altri due arresti in ",[74,441,442],{},"roles.sql",". Li abbiamo incontrati\nentrambi il 4 ottobre 2026, ricaricando i file di due database Postgres 17, uno\ndei quali un progetto Supabase, in una copia locale nuova di Supabase:\n",[74,445,446],{},"\"supabase_admin\" is a reserved role, only superusers can modify it",", su una\nriga che inizia con ",[74,449,450],{},"ALTER ROLE \"supabase_admin\"",", e\n",[74,453,454],{},"permission denied for parameter log_min_messages",", su una riga che inizia con\n",[74,457,458],{},"GRANT SET ON PARAMETER",". Entrambe le righe configurano ruoli che Supabase crea\nda sé in ogni progetto, quindi metti ",[74,461,462],{},"--"," all'inizio di ciascuna per\ntrasformarla in un commento e riesegui il comando.\n",[150,465,468],{"href":466,"rel":467},"https:\u002F\u002Fgithub.com\u002FReeve-page\u002Fsupabase-backup-action",[260],"La nostra Action di backup","\nle commenta già quando fa la copia.",[25,471,473],{"id":472},"cosa-contare-e-rispetto-a-cosa","Cosa contare, e rispetto a cosa",[10,475,476],{},"Conta ogni tabella nel progetto di prova e nel tuo progetto in produzione con\nla stessa query, e metti le due liste una accanto all'altra. La copia dovrebbe\nessere una notte indietro rispetto al database in produzione: un po' più bassa\nsu una tabella che cresce, e mai a zero su una tabella che aveva righe.",[10,478,479,480,482],{},"È l'appello sulla lista di chi era dentro. Incolla la query nell'editor SQL di\nogni progetto e premi Run. Conta le righe di ogni tabella del tuo schema e di\n",[74,481,116],{},":",[377,484,489],{"className":485,"code":487,"language":488,"meta":385},[486],"language-sql","select table_schema, table_name,\n       (xpath('\u002Frow\u002Fn\u002Ftext()',\n         query_to_xml(format('select count(*) as n from %I.%I', table_schema, table_name),\n                      false, true, '')))[1]::text::bigint as row_count\n  from information_schema.tables\n where table_schema in ('public', 'auth')\n   and table_type = 'BASE TABLE'\n order by table_schema, table_name;\n","sql",[74,490,487],{"__ignoreMap":385},[10,492,493],{},"Legge ogni riga di ogni tabella, quindi su un database grande lanciala fuori\ndalle tue ore più affollate.",[10,495,496,497,500,501,482],{},"Poi leggi la riga più recente di una tabella che conosci, solo nel progetto di\nprova. Va bene qualsiasi tabella con una colonna ",[74,498,499],{},"created_at","; metti il suo\nnome al posto di ",[74,502,503],{},"orders",[377,505,508],{"className":506,"code":507,"language":488,"meta":385},[486],"select max(created_at) from public.orders;\n",[74,509,507],{"__ignoreMap":385},[10,511,512],{},"La risposta dovrebbe essere vicina all'ora in cui è girato il backup. Una data\npiù vecchia di settimane, o righe che non riconosci, significano che il file\nviene da un altro progetto.",[43,514,515,528],{},[46,516,517],{},[49,518,519,522,525],{},[52,520,521],{},"Controllo",[52,523,524],{},"Dove",[52,526,527],{},"Cosa mostra una copia buona",[62,529,530,541,552,564],{},[49,531,532,535,538],{},[67,533,534],{},"Le righe di ogni tabella",[67,536,537],{},"Entrambi",[67,539,540],{},"Le stesse tabelle, ognuna un po' indietro rispetto alla produzione, nessuna vuota che avesse righe",[49,542,543,546,549],{},[67,544,545],{},"La riga più recente",[67,547,548],{},"Progetto di prova",[67,550,551],{},"Un'ora della notte in cui è stata fatta la copia",[49,553,554,557,559],{},[67,555,556],{},"Il tuo account",[67,558,548],{},[67,560,561,562],{},"La tua email in ",[74,563,122],{},[49,565,566,569,571],{},[67,567,568],{},"Un accesso",[67,570,548],{},[67,572,573],{},"Torna un token",[25,575,577],{"id":576},"perché-laccesso-è-il-test-che-dimostra-i-tuoi-account","Perché l'accesso è il test che dimostra i tuoi account",[10,579,580,581,583],{},"Un conteggio di ",[74,582,122],{}," dimostra che le righe sono arrivate. Un accesso\ndimostra che funzionano: che la password salvata, il servizio di accesso del\nprogetto di prova e il tuo indirizzo email vanno ancora d'accordo.",[10,585,586,587,589],{},"Usa il tuo account, con una password che conosci. L'indirizzo del progetto e\nla publishable key del progetto di prova sono nel suo pannello Connect, o\nnell'output di ",[74,588,291],{}," su un Supabase locale:",[377,591,594],{"className":592,"code":593,"language":382},[380],"curl -X POST 'https:\u002F\u002F…the spare's project ref….supabase.co\u002Fauth\u002Fv1\u002Ftoken?grant_type=password' \\\n  -H \"apikey: sb_publishable_…\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"email\": \"you@example.com\", \"password\": \"…\"}'\n",[74,595,593],{"__ignoreMap":385},[10,597,598,599,604,605,608,609,612,613,616],{},"È la chiamata di accesso della\n",[150,600,603],{"href":601,"rel":602},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fauth\u002Fpasswords",[260],"documentazione di Supabase stessa",",\ndiretta al progetto di prova. Una risposta che contiene ",[74,606,607],{},"access_token","\nsignifica che il tuo account è arrivato con una password che funziona.\n",[74,610,611],{},"Invalid login credentials",", per un account che accede senza problemi alla tua\napp in produzione, significa che non è arrivato, e\n",[150,614,615],{"href":152},"perché un dump arriva senza gli account"," è\nl'articolo per quel risultato.",[10,618,619,620,622],{},"Se tutti accedono alla tua app con Google, questa chiamata non ha niente da\ntestare, perché nel progetto di prova non c'è un accesso con Google\nconfigurato. Cerca invece la tua email in ",[74,621,122],{}," dopo il ripristino.\nQuesto mostra che la riga dell'account è arrivata, anche se non che la sua\npassword funziona.",[25,624,626],{"id":625},"i-file-la-metà-che-un-ripristino-del-database-non-può-testare","I file: la metà che un ripristino del database non può testare",[10,628,629,630,634],{},"La copia del database contiene una riga per ogni file caricato e nessuno dei\nfile. Se copi i tuoi bucket di Storage con un job a parte, che\n",[150,631,633],{"href":632},"\u002Fblog\u002Fsupabase-storage-backup","è l'unico modo in cui vengono copiati",", fai\nfare la prova anche a quella copia.",[10,636,637],{},"Prendi le tre righe più recenti dal database ripristinato:",[377,639,642],{"className":640,"code":641,"language":488,"meta":385},[486],"select bucket_id, name from storage.objects order by created_at desc limit 3;\n",[74,643,641],{"__ignoreMap":385},[10,645,646],{},"Trova quei tre percorsi nella tua copia dei file e aprili uno per uno. Un\npercorso senza un file dietro è un'immagine che i tuoi utenti vedrebbero rotta\ndopo un vero ripristino.",[25,648,650],{"id":649},"posso-testare-i-backup-che-supabase-fa-per-me","Posso testare i backup che Supabase fa per me?",[10,652,653,654,374],{},"Con un piano a pagamento sì, con Restore to a New Project. È l'unico modo per\naprire una delle copie giornaliere di Supabase, perché sui progetti attuali\n",[150,655,657],{"href":656},"\u002Fblog\u002Fdownload-your-supabase-backup","non puoi scaricarle",[10,659,660,661,666,667,195,669,672],{},"Supabase descrive la funzione come un modo per\n",[150,662,665],{"href":663,"rel":664},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fplatform\u002Fclone-project",[260],"fare test in sicurezza",".\nScegli una copia nella scheda Restore to a New Project della pagina Backups, e\nSupabase ne costruisce un nuovo progetto con i tuoi utenti e le loro password\nhashate, pronto per gli stessi conteggi e lo stesso accesso. Due cose da sapere\nprima di premere. Il nuovo progetto viene fatturato come un progetto a sé, e\nSupabase ti mostra il costo prima di partire. E copia tutto, job pianificati\ncompresi: Supabase dice che i job di ",[74,668,337],{},[74,670,671],{},"pg_net"," e dei wrapper partono\nappena il ripristino è completato, senza modo di metterli in pausa prima. Se un\njob della tua app manda email o addebita una carta, lo farà anche il progetto di\ntest.",[10,674,675],{},"Se tieni anche un file fuori dall'account, quel file ha bisogno di una prova\ntutta sua.",[25,677,679],{"id":678},"ogni-quanto-dovrei-testare-un-ripristino","Ogni quanto dovrei testare un ripristino?",[10,681,682],{},"Una volta adesso, poi ogni tre mesi, e di nuovo ogni volta che cambia qualcosa\nnel modo in cui viene fatto il backup.",[10,684,685],{},"I cambiamenti che contano sono quelli che rompono un backup in silenzio: un\nworkflow nuovo o modificato, una password del database reimpostata, il\npassaggio a un nuovo piano o a una nuova versione di Postgres, una nuova\ntabella in cui la tua app ha cominciato a scrivere. Dopo ognuno di questi, la\nprova del trimestre scorso non descrive più il file di questo trimestre.",[10,687,688],{},"Poi annotalo: è il foglio vicino alla porta. Una riga per prova, in un posto\nche raggiungi senza ciò che si è rotto: la data, quale file, i conteggi che\ncontavano, se l'accesso ha funzionato e quanto è durata tutta la prova. Basta\nun file di testo nel repository del backup, e va bene anche un evento\nricorrente nel calendario con i risultati incollati dentro. La data risponde a\n«quando l'abbiamo dimostrato l'ultima volta» nell'ora in cui qualcuno ha\nbisogno di saperlo, e la durata è la tua prima stima di quanto un vero\nripristino terrebbe ferma la tua app.",[25,690,692],{"id":691},"dove-si-inserisce-reeve-care","Dove si inserisce Reeve Care",[10,694,695],{},[17,696,697],{},"Care conserva copie del tuo database Supabase fuori dal tuo account\nSupabase, secondo l'orario del tuo piano, controlla ogni copia mentre viene\nfatta e la rimette al suo posto con un pulsante.",[187,699,700,706,715,721,727,733],{},[190,701,702,705],{},[17,703,704],{},"Le copie seguono l'orario del tuo piano",", da una volta al giorno fino a\nogni sei ore.",[190,707,708,711,712,714],{},[17,709,710],{},"Una copia troncata viene scoperta mentre viene fatta."," La riga finale di\n",[74,713,76],{}," deve essere nel file, altrimenti la copia non supera il controllo e\nnon diventa mai la data nella tua dashboard.",[190,716,717,720],{},[17,718,719],{},"Ogni tabella viene contata mentre la copia viene scritta."," Quando una\ntabella che aveva righe nella copia precedente non ne ha nessuna in questa,\nuna persona di Reeve lo viene a sapere.",[190,722,723,726],{},[17,724,725],{},"I tuoi account ci sono",", e anche i tuoi file caricati arrivano non appena\ncolleghi una credenziale di Storage.",[190,728,729,732],{},[17,730,731],{},"Ripristinare è un pulsante",", e prima di sostituire qualsiasi cosa viene\nfatta una copia dello stato attuale.",[190,734,735,738,739,195,742,195,744,746],{},[17,736,737],{},"Ogni copia si scarica come zip"," con ",[74,740,741],{},"schema.sql",[74,743,233],{},[74,745,442],{},"\ne un manifest con il numero di righe di ogni tabella, che è la metà\n«rispetto a cosa» di questo articolo, già scritta.",[10,748,749,750,451,754,758],{},"Una prova trimestrale dimostra la copia che hai scelto quel giorno, e il\ncontrollo gira su ogni copia mentre viene fatta. La copia, il controllo e il\nripristino sono disegnati passo per passo nella\n",[150,751,753],{"href":752},"\u002Fsupabase-backups","pagina sui backup di Supabase",[150,755,757],{"href":756},"\u002Fpricing","cosa include ogni piano",", orario compreso, è nella pagina dei\nprezzi.",[25,760,762],{"id":761},"cosa-fare-questa-settimana","Cosa fare questa settimana",[764,765,766],"key-takeaways",{},[187,767,768,771,781,787,790,792],{},[190,769,770],{},"Trova il tuo backup più recente e leggi la sua data. Se è più vecchio dell'ultima esecuzione programmata, sistema il job prima di tutto.",[190,772,367,773,775,776,371,778,780],{},[74,774,370],{}," e ",[74,777,394],{},[74,779,233],{},". Due ricerche ti dicono se il file arriva alla fine e se i tuoi account ci sono.",[190,782,783,784,786],{},"Crea un progetto di prova, o avvia Supabase sul tuo computer, e ricarica il file con il comando ",[74,785,170],{}," della guida di Supabase.",[190,788,789],{},"Lancia la query di conteggio su entrambi i database e metti le due liste una accanto all'altra. Leggi la riga più recente di una tabella che conosci.",[190,791,427],{},[190,793,794],{},"Annota la data, i conteggi e quanto è durata, poi elimina il progetto di prova.",[10,796,797,798,800,801,803,804,807],{},"Prima di chiudere questa scheda, cerca ",[74,799,370],{}," nel tuo ",[74,802,233],{}," più\nrecente. È una sola ricerca, e ti dice se il file che chiami backup arriva alla\nsua ultima riga. Se non hai ancora un file in cui cercare,\n",[150,805,806],{"href":316},"una GitHub Action gratuita"," è il modo più\nrapido per cominciare a produrne.",{"title":385,"searchDepth":809,"depth":809,"links":810},3,[811,813,814,815,816,817,818,819,820,821,822,823],{"id":27,"depth":812,"text":28},2,{"id":37,"depth":812,"text":38},{"id":163,"depth":812,"text":164},{"id":245,"depth":812,"text":246},{"id":349,"depth":812,"text":350},{"id":472,"depth":812,"text":473},{"id":576,"depth":812,"text":577},{"id":625,"depth":812,"text":626},{"id":649,"depth":812,"text":650},{"id":678,"depth":812,"text":679},{"id":691,"depth":812,"text":692},{"id":761,"depth":812,"text":762},"Backups","\u002Fblog\u002Ftest-your-supabase-backup\u002Fcover-1200x630.png","Una fila di file di backup sigillati e identici, il primo illuminato, accanto a un database vuoto tratteggiato che aspetta di riceverne uno.","Come testare il tuo backup di Supabase: ripristinarlo in un progetto di prova, contare le righe, accedere e cercare la riga che manca a un file troncato.",false,"md",[831,833,835,838,841,844],{"q":28,"a":832},"Ripristinalo in un progetto che non conta e guarda cosa torna. Confronta il numero di righe di ogni tabella con il database in produzione, controlla che la riga più recente sia della notte in cui è stata fatta la copia e accedi come te stesso. Niente nel file in sé distingue un dump buono da uno rotto: nome, dimensione e la spunta verde accanto al job sono uguali in entrambi i casi.",{"q":679,"a":834},"Una volta adesso, poi ogni tre mesi, e di nuovo ogni volta che cambia il modo in cui viene fatto il backup: un workflow nuovo o modificato, una password del database reimpostata, un nuovo piano o una nuova versione di Postgres, o una nuova tabella in cui scrive la tua app. Annota la data ogni volta, con i conteggi e quanto è durata, così la domanda su quando è stato dimostrato l'ultima volta ha una risposta.",{"q":836,"a":837},"Posso testare un ripristino senza toccare il database in produzione?","Sì, ed è sempre così che dovresti farlo. Ripristina in un progetto di prova su Supabase, cosa che il piano gratuito consente, o in un Supabase che gira sul tuo computer con la CLI e Docker. L'unica cosa che la prova fa al database in produzione è leggerlo una volta per contarne le righe. Elimina il progetto di prova alla fine, perché contiene una copia reale dei tuoi utenti.",{"q":839,"a":840},"Cosa dovrei controllare dopo aver ripristinato un backup?","Quattro cose. Il numero di righe di ogni tabella accanto a quello in produzione, dove la copia dovrebbe essere un po' indietro e mai a zero per una tabella che aveva righe. La riga più recente di una tabella che conosci, che dovrebbe essere della notte della copia. La tua email in auth.users. E un accesso come te stesso, l'unico controllo che dimostra che gli account funzionano e non solo che sono arrivati.",{"q":842,"a":843},"Il ripristino ha funzionato, ma nessuno riesce ad accedere. Perché?","Quasi sempre perché il file non ha mai contenuto i tuoi account. Supabase li tiene in uno schema chiamato auth, e un dump che ha nominato solo il tuo schema, o un supabase db dump senza opzioni, li lascia fuori mentre ogni tua tabella si ripristina senza problemi. Cerca prima COPY \"auth\".\"users\" nel file. Se manca, fai un dump dei dati con --data-only, che attraversa lo schema auth e porta con sé i tuoi utenti.",{"q":164,"a":845},"Non sempre. Abbiamo troncato un file di pg_dump in tre punti e ricaricato ogni versione con --single-transaction e ON_ERROR_STOP, le opzioni della guida al ripristino di Supabase. Un taglio a metà di un valore si è fermato con un errore. Un taglio dentro l'ultima colonna di una riga e un taglio tra due tabelle sono finiti entrambi senza errori, con le tabelle incomplete. Un dump completo contiene la riga PostgreSQL database dump complete verso la fine, quindi cercala prima di fidarti di un file.","\u002Fblog\u002Ftest-your-supabase-backup\u002Fcard-800x500.png",[848,849,850,851,852,853,854,855],"testare backup supabase","verificare backup supabase","test di ripristino supabase","come testare un backup del database","ripristinare un backup in un database di prova","il mio backup supabase funziona","verifica backup supabase","prova di ripristino",{},true,"Testa il backup di Supabase prima che ti serva","\u002Fblog\u002Ftest-your-supabase-backup","2026-09-28",{"title":5,"description":827},"blog\u002Ftest-your-supabase-backup",[864,865,866],"Per testare un backup di Supabase, ripristinalo in un progetto che non conta, confronta i numeri di righe con il database in produzione e accedi come te stesso. Solo un ripristino distingue un file buono da uno rotto.","Abbiamo troncato un dump a metà di una tabella e l'abbiamo ricaricato con le opzioni che raccomanda Supabase. psql ha finito senza alcun errore, e le tabelle sono tornate incomplete.","Fai la prova una volta adesso, poi ogni tre mesi e dopo ogni cambiamento nel modo in cui viene fatto il backup, e annota la data ogni volta.","2026-10-05","RUKXWLiNuHuXr-McGOolbjwczcuIHpMk31j1MyHbLYA",[870,877,883,889,895,901,907,912,918,924,930,936,942,948,949,954,959,964,970,976,981,987,993,999,1005,1011,1017,1023,1029,1034,1040,1046,1052,1058,1064,1070,1076,1082,1088,1094,1100,1106,1112,1118,1124,1130,1136,1142,1148,1154,1159,1165,1171,1177,1183,1188,1194,1200,1206,1211,1217],{"path":871,"title":872,"description":873,"published":874,"category":875,"image":876,"draft":828},"\u002Fblog\u002Fstorage-upload-violates-row-level-security","\"Row-level security policy for table objects\" in upload","\"New row violates row-level security policy for table objects\" vuol dire che al tuo upload manca una regola insert. Rendere pubblico il bucket non ne aggiunge.","2026-10-11","Basi della sicurezza","\u002Fblog\u002Fstorage-upload-violates-row-level-security\u002Fcard-800x500.png",{"path":878,"title":879,"description":880,"published":881,"category":875,"image":882,"draft":828},"\u002Fblog\u002Fbase44-security-scan","Scansione di sicurezza Base44: ciò che vede solo lei","La scansione di sicurezza Base44 controlla sette tipi di problema dall’interno. Ecco la metà che legge e che nessun altro legge, e quella che non guarda mai.","2026-10-10","\u002Fblog\u002Fbase44-security-scan\u002Fcard-800x500.png",{"path":884,"title":885,"description":886,"published":887,"category":875,"image":888,"draft":828},"\u002Fblog\u002Fapi-key-leaked-what-to-do","La tua chiave API è trapelata. L'ordine in cui muoverti","Una chiave API è trapelata e non sai da cosa cominciare. Non tutte le chiavi nel frontend lo sono, e l'ordine conta più della velocità.","2026-10-09","\u002Fblog\u002Fapi-key-leaked-what-to-do\u002Fcard-800x500.png",{"path":890,"title":891,"description":892,"published":893,"category":875,"image":894,"draft":828},"\u002Fblog\u002Finfinite-recursion-in-policy-for-relation","\"Infinite recursion detected in policy\" senza disattivare RLS","\"Infinite recursion detected in policy for relation\" significa che la tua policy ha interrogato la tabella che protegge. Ecco come rompere il cerchio.","2026-10-08","\u002Fblog\u002Finfinite-recursion-in-policy-for-relation\u002Fcard-800x500.png",{"path":896,"title":897,"description":898,"published":899,"category":875,"image":900,"draft":828},"\u002Fblog\u002Fno-api-key-found-in-request","\"No API key found in request\" su Supabase, e la correzione sbagliata","\"No API key found in request\" significa che la tua richiesta è arrivata a Supabase senza chiave. Quasi tutte le risposte indicano le regole del database.","2026-10-07","\u002Fblog\u002Fno-api-key-found-in-request\u002Fcard-800x500.png",{"path":902,"title":903,"description":904,"published":905,"category":875,"image":906,"draft":828},"\u002Fblog\u002Fis-base44-safe","Base44 è sicuro? Cosa abbiamo trovato in 5.442 app","Base44 è sicuro? Abbiamo passato nove controlli su 5.442 app Base44 online. Quasi tutte hanno preso B, per motivi che il proprietario non ha mai scelto.","2026-10-06","\u002Fblog\u002Fis-base44-safe\u002Fcard-800x500.png",{"path":908,"title":909,"description":910,"published":867,"category":875,"image":911,"draft":828},"\u002Fblog\u002Fmove-a-secret-to-an-edge-function","Nascondere una chiave API: spostala in una Edge Function Supabase","Nascondere una chiave API vuol dire toglierla dal browser, e una Edge Function Supabase è il posto più piccolo dove metterla. Due passaggi contano di più.","\u002Fblog\u002Fmove-a-secret-to-an-edge-function\u002Fcard-800x500.png",{"path":913,"title":914,"description":915,"published":916,"category":875,"image":917,"draft":828},"\u002Fblog\u002Fenv-file-exposed-on-your-server","Il tuo file .env è esposto? I dodici percorsi da provare","Il tuo file .env è esposto sul tuo server web? Dodici indirizzi te lo dicono, e una risposta significa che tutto quello che contiene è già pubblico.","2026-10-04","\u002Fblog\u002Fenv-file-exposed-on-your-server\u002Fcard-800x500.png",{"path":919,"title":920,"description":921,"published":922,"category":875,"image":923,"draft":828},"\u002Fblog\u002Fis-v0-safe","Sicurezza di v0: tutte le 1.790 app v0 analizzate hanno preso A","La sicurezza di v0 misurata su 1.790 app v0 online: tutte hanno preso A. Solo 17 nominavano un database, ed è soprattutto questo che misura quella A.","2026-10-03","\u002Fblog\u002Fis-v0-safe\u002Fcard-800x500.png",{"path":925,"title":926,"description":927,"published":928,"category":875,"image":929,"draft":828},"\u002Fblog\u002Fis-bolt-safe","Bolt è sicuro? Cosa abbiamo trovato in 1.123 app Bolt","Bolt è sicuro? Abbiamo passato 1.123 app Bolt online per nove controlli. L’hosting era pulito. I rilievi erano chiavi e tabelle aperte dentro le app.","2026-10-02","\u002Fblog\u002Fis-bolt-safe\u002Fcard-800x500.png",{"path":931,"title":932,"description":933,"published":934,"category":875,"image":935,"draft":828},"\u002Fblog\u002Fis-supabase-down-or-your-app","Supabase è down o è la tua app? Come capirlo","Supabase è down o è la tua app? Un progetto in pausa, un database pieno e un tuo errore sembrano la stessa cosa. Quattro controlli li separano.","2026-10-01","\u002Fblog\u002Fis-supabase-down-or-your-app\u002Fcard-800x500.png",{"path":937,"title":938,"description":939,"published":940,"category":875,"image":941,"draft":828},"\u002Fblog\u002Fdoes-supabase-encrypt-my-data","Supabase crittografa i miei dati? Sì. Ecco da cosa protegge","Supabase crittografa i dati? Sì: AES-256 a riposo, TLS in transito, SOC 2 e ISO 27001. Cosa copre ciascuno, e la fuga di dati che nessuno di questi ferma.","2026-09-30","\u002Fblog\u002Fdoes-supabase-encrypt-my-data\u002Fcard-800x500.png",{"path":943,"title":944,"description":945,"published":946,"category":875,"image":947,"draft":828},"\u002Fblog\u002Fsupabase-free-plan-limits","Supabase: prezzi e limiti del piano gratuito, uno per uno","Prezzi e limiti del piano gratuito di Supabase: 500 MB di database, 5 GB di egress e nessun backup. Cosa succede a ogni soglia e cosa cambia Pro a $25.","2026-09-29","\u002Fblog\u002Fsupabase-free-plan-limits\u002Fcard-800x500.png",{"path":859,"title":5,"description":827,"published":860,"category":824,"image":846,"draft":828},{"path":316,"title":950,"description":951,"published":952,"category":824,"image":953,"draft":828},"Backup gratis di Supabase con una GitHub Action, e il tranello","Un backup di Supabase con una GitHub Action è gratis e va bene per molte app. Il workflow, la connection string giusta e l'egress di ogni esecuzione.","2026-09-27","\u002Fblog\u002Fsupabase-backup-github-action\u002Fcard-800x500.png",{"path":656,"title":955,"description":956,"published":957,"category":824,"image":958,"draft":828},"Perché non puoi scaricare il tuo backup di Supabase","Non puoi scaricare il tuo backup di Supabase su un progetto recente, perché la copia giornaliera è uno snapshot fisico. Come verificarlo e tenere una copia tua.","2026-09-26","\u002Fblog\u002Fdownload-your-supabase-backup\u002Fcard-800x500.png",{"path":960,"title":961,"description":962,"published":957,"category":875,"image":963,"draft":828},"\u002Fblog\u002Fsupabase-permission-denied-for-table","Supabase \"permission denied for table\": il grant mancante","Dal 30 ottobre una nuova tabella di Supabase risponde \"permission denied for table\" finché non concedi l'accesso. Il grant della mail è metà della soluzione.","\u002Fblog\u002Fsupabase-permission-denied-for-table\u002Fcard-800x500.png",{"path":965,"title":966,"description":967,"published":968,"category":875,"image":969,"draft":828},"\u002Fblog\u002Fopen-api-endpoint-exposed","Un endpoint API aperto è un problema di sicurezza? Leggi il JSON","La tua scansione ha segnalato un endpoint API aperto. Quanto conti dipende da che cosa è tornato, e la maggior parte di quelli trovati era della piattaforma.","2026-09-25","\u002Fblog\u002Fopen-api-endpoint-exposed\u002Fcard-800x500.png",{"path":971,"title":972,"description":973,"published":974,"category":875,"image":975,"draft":828},"\u002Fblog\u002Flovable-security-scan","Scansione di sicurezza Lovable: cosa non può dimostrare","Scansione di sicurezza Lovable: cosa controllano Quick scan e Deep scan, quando parte ciascuno, e l’unica cosa che nessuna scansione dall’interno dimostra.","2026-09-24","\u002Fblog\u002Flovable-security-scan\u002Fcard-800x500.png",{"path":152,"title":977,"description":978,"published":979,"category":824,"image":980,"draft":828},"Perché nel tuo dump Supabase non ci sono utenti","Lancia supabase db dump da solo e ottieni la forma del tuo database e nessuna delle sue righe, senza lo schema auth in cui vivono i tuoi utenti.","2026-09-23","\u002Fblog\u002Fsupabase-backup-auth-users\u002Fcard-800x500.png",{"path":982,"title":983,"description":984,"published":985,"category":875,"image":986,"draft":828},"\u002Fblog\u002Fdomain-and-certificate-expiry","Dominio scaduto, sito offline: cosa succede adesso","Il tuo dominio è scaduto e il sito è offline. Il conto alla rovescia che parte, perché il certificato è il problema minore, e come controllarli entrambi.","2026-09-22","\u002Fblog\u002Fdomain-and-certificate-expiry\u002Fcard-800x500.png",{"path":988,"title":989,"description":990,"published":991,"category":875,"image":992,"draft":828},"\u002Fblog\u002Fis-lovable-safe","Lovable è sicuro? Cosa abbiamo trovato in 18.554 app Lovable","Lovable è sicuro? Abbiamo passato 18.554 app Lovable online per nove controlli. La piattaforma è risultata la più pulita di cinque. I rilievi stavano nelle app.","2026-09-21","\u002Fblog\u002Fis-lovable-safe\u002Fcard-800x500.png",{"path":994,"title":995,"description":996,"published":997,"category":875,"image":998,"draft":828},"\u002Fblog\u002Fvibe-coded-app-security-checklist","La checklist di sicurezza del vibe coding, in nove controlli","Una checklist di sicurezza del vibe coding in nove voci, ognuna verificabile dall’esterno sulla tua app dal vivo, e ognuna con un test di una riga.","2026-09-20","\u002Fblog\u002Fvibe-coded-app-security-checklist\u002Fcard-800x500.png",{"path":1000,"title":1001,"description":1002,"published":1003,"category":875,"image":1004,"draft":828},"\u002Fblog\u002Fstripe-secret-key-in-frontend","Una chiave segreta Stripe nel frontend può muovere denaro","Una chiave segreta Stripe esposta nel tuo frontend può rimborsare, addebitare e leggere ogni scheda cliente che hai. La tua chiave pk_live_ ci sta bene.","2026-09-19","\u002Fblog\u002Fstripe-secret-key-in-frontend\u002Fcard-800x500.png",{"path":1006,"title":1007,"description":1008,"published":1009,"category":875,"image":1010,"draft":828},"\u002Fblog\u002Fvite-and-next-public-env-vars","Variabili d’ambiente Vite esposte: il prefisso vuol dire pubblica","Variabili d’ambiente Vite esposte: la tua app ha fatto ciò che il prefisso chiedeva. VITE_ e NEXT_PUBLIC_ vogliono dire pubblica, e l’IA non sapeva il costo.","2026-09-18","\u002Fblog\u002Fvite-and-next-public-env-vars\u002Fcard-800x500.png",{"path":1012,"title":1013,"description":1014,"published":1015,"category":875,"image":1016,"draft":828},"\u002Fblog\u002Fbase44-source-maps","Sicurezza Base44: cosa segnala uno scan e cosa tocca a te sistemare","Sicurezza Base44 su 5.438 app scansionate: tre segnalazioni su quasi tutte sono della piattaforma, la source map è il badge di Base44, la tua parte è corta.","2026-09-17","\u002Fblog\u002Fbase44-source-maps\u002Fcard-800x500.png",{"path":1018,"title":1019,"description":1020,"published":1021,"category":875,"image":1022,"draft":828},"\u002Fblog\u002Fis-cursor-ai-safe","Cursor AI è sicuro? L’editor, il codice e l’app che hai pubblicato","Cursor AI è sicuro? Tre domande in una ricerca: cosa tiene Cursor, cosa sbaglia il codice che scrive, e se l’app che hai pubblicato è aperta.","2026-09-16","\u002Fblog\u002Fis-cursor-ai-safe\u002Fcard-800x500.png",{"path":1024,"title":1025,"description":1026,"published":1027,"category":875,"image":1028,"draft":828},"\u002Fblog\u002Fis-replit-safe","Replit è sicuro? Cosa abbiamo trovato in 3.042 app Replit online","Replit è sicuro? Abbiamo passato 3.042 app Replit online per nove controlli esterni. I rilievi stavano nell’app pubblicata, non nell’host.","2026-09-15","\u002Fblog\u002Fis-replit-safe\u002Fcard-800x500.png",{"path":632,"title":1030,"description":1031,"published":1032,"category":824,"image":1033,"draft":828},"Supabase storage backup: la copia del database non ha nessun file","Un Supabase storage backup è un lavoro a parte. I backup del database tengono la lista dei tuoi file e nessuno dei file, quindi ogni upload resta rotto.","2026-09-14","\u002Fblog\u002Fsupabase-storage-backup\u002Fcard-800x500.png",{"path":1035,"title":1036,"description":1037,"published":1038,"category":824,"image":1039,"draft":828},"\u002Fblog\u002Fsupabase-point-in-time-recovery","Point-in-time recovery di Supabase: prezzo e limiti","Il point-in-time recovery di Supabase riavvolge il database a qualsiasi secondo della settimana scorsa. $100 al mese oltre a Pro, e copre solo il database.","2026-09-13","\u002Fblog\u002Fsupabase-point-in-time-recovery\u002Fcard-800x500.png",{"path":1041,"title":1042,"description":1043,"published":1044,"category":824,"image":1045,"draft":828},"\u002Fblog\u002Fsupabase-project-paused-recover","Progetto Supabase in pausa? I tuoi dati sono ancora lì","Supabase ha messo in pausa il tuo progetto dopo una settimana senza attività. Non è cancellato niente, Ripristina è accanto al nome e hai un anno di tempo.","2026-09-12","\u002Fblog\u002Fsupabase-project-paused-recover\u002Fcard-800x500.png",{"path":1047,"title":1048,"description":1049,"published":1050,"category":875,"image":1051,"draft":828},"\u002Fblog\u002Fsafest-ai-app-builder","Qual è il builder di app con IA più sicuro? 30.998 app testate","Qual è il builder di app con IA più sicuro? Abbiamo scansionato 30.998 app online di Lovable, Base44, Replit, v0 e Bolt. Non è il builder a decidere il voto.","2026-09-11","\u002Fblog\u002Fsafest-ai-app-builder\u002Fcard-800x500.png",{"path":1053,"title":1054,"description":1055,"published":1056,"category":875,"image":1057,"draft":828},"\u002Fblog\u002Fenable-rls-on-every-supabase-table","Attiva Row Level Security su ogni tabella Supabase, poi verificalo","Attivare Row Level Security su Supabase senza una policy chiude del tutto la tabella. Una policy senza il flag non fa nulla. Ecco lo SQL, e la verifica.","2026-09-10","\u002Fblog\u002Fenable-rls-on-every-supabase-table\u002Fcard-800x500.png",{"path":1059,"title":1060,"description":1061,"published":1062,"category":875,"image":1063,"draft":828},"\u002Fblog\u002Fsupabase-rls-disabled-in-public","Supabase \"RLS disabled in public\": cosa non vede l'avviso","Supabase segnala \"RLS disabled in public\" come errore. Non dice nulla della policy di lettura che lascia la tua tabella altrettanto aperta.","2026-09-09","\u002Fblog\u002Fsupabase-rls-disabled-in-public\u002Fcard-800x500.png",{"path":1065,"title":1066,"description":1067,"published":1068,"category":875,"image":1069,"draft":828},"\u002Fblog\u002Frotate-supabase-service-role-key","Come ruotare una chiave service_role Supabase trapelata","Supabase dice di chiudere prima la falla. Altre guide dicono di ruotare subito. Quale sia giusto dipende da dove è finita la tua chiave service_role.","2026-09-08","\u002Fblog\u002Frotate-supabase-service-role-key\u002Fcard-800x500.png",{"path":1071,"title":1072,"description":1073,"published":1074,"category":875,"image":1075,"draft":828},"\u002Fblog\u002Fvibe-coding-security-scanners-compared","Scanner di sicurezza per vibe coding a confronto, il nostro incluso","Il miglior scanner di sicurezza per vibe coding dipende da tre domande che nessun elenco di funzioni affronta. Dieci strumenti a confronto, con i prezzi.","2026-09-07","\u002Fblog\u002Fvibe-coding-security-scanners-compared\u002Fcard-800x500.png",{"path":1077,"title":1078,"description":1079,"published":1080,"category":875,"image":1081,"draft":828},"\u002Fblog\u002Fsupabase-security-checker","Supabase security checker: i cinque controlli da fare da soli","Un Supabase security checker legge la tua app pubblicata invece delle impostazioni del progetto. Ecco i cinque controlli che esegue e come farli da solo.","2026-09-06","\u002Fblog\u002Fsupabase-security-checker\u002Fcard-800x500.png",{"path":1083,"title":1084,"description":1085,"published":1086,"category":875,"image":1087,"draft":828},"\u002Fblog\u002Fvibe-coding-security-scanner","Scanner di sicurezza per vibe coding: cosa si perde","Uno scanner di sicurezza per vibe coding legge la tua app dal vivo, da fuori. Cosa copre, le quattro cose che non può vedere e come leggere il risultato.","2026-09-05","\u002Fblog\u002Fvibe-coding-security-scanner\u002Fcard-800x500.png",{"path":1089,"title":1090,"description":1091,"published":1092,"category":875,"image":1093,"draft":828},"\u002Fblog\u002Fmissing-security-headers","Intestazioni di sicurezza mancanti: quando contano","Le intestazioni di sicurezza mancanti sono il rilievo che il nostro scanner stampa più spesso. Da cosa proteggono e quando sono la riga meno urgente.","2026-09-04","\u002Fblog\u002Fmissing-security-headers\u002Fcard-800x500.png",{"path":1095,"title":1096,"description":1097,"published":1098,"category":875,"image":1099,"draft":828},"\u002Fblog\u002Fopenai-api-key-exposed-in-frontend","La tua chiave API OpenAI è esposta nel frontend. Ruotala.","Una chiave API OpenAI esposta nel frontend non si può legare a nessun dominio. Ruotala oggi, sposta la chiamata sul tuo server e metti un tetto di spesa.","2026-09-03","\u002Fblog\u002Fopenai-api-key-exposed-in-frontend\u002Fcard-800x500.png",{"path":1101,"title":1102,"description":1103,"published":1104,"category":875,"image":1105,"draft":828},"\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps","Chiave API esposta nel frontend: cosa spediscono 30.998 app","Una chiave API esposta nel tuo frontend è quasi sempre una chiave di Google Maps. Abbiamo scansionato 30.998 app vibe-coded e contato cosa esce davvero.","2026-09-02","\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps\u002Fcard-800x500.png",{"path":1107,"title":1108,"description":1109,"published":1110,"category":824,"image":1111,"draft":828},"\u002Fblog\u002Fsupabase-backup-tools-compared","Strumenti di backup Supabase a confronto, il nostro incluso","Quattro tipi di strumento di backup Supabase, cosa copia davvero ognuno, e il caso in cui una GitHub Action gratuita batte il pagare chiunque, noi inclusi.","2026-09-01","\u002Fblog\u002Fsupabase-backup-tools-compared\u002Fcard-800x500.png",{"path":1113,"title":1114,"description":1115,"published":1116,"category":875,"image":1117,"draft":828},"\u002Fblog\u002Freplit-secrets-explained","Come usare i secret su Replit, e cosa viene comunque pubblicato","Come usare i secret su Replit: aggiungerne uno, rileggerlo e risolvere le due cause dell'undefined. E le chiavi che lo strumento non riesce a proteggere.","2026-08-31","\u002Fblog\u002Freplit-secrets-explained\u002Fcard-800x500.png",{"path":1119,"title":1120,"description":1121,"published":1122,"category":824,"image":1123,"draft":828},"\u002Fblog\u002Fback-up-supabase-free-tier","Backup del piano gratuito Supabase: farne uno senza terminale","Sul piano gratuito Supabase non esistono backup: la copia la fai tu. Come farne uno dalla dashboard e che cosa si lascia dietro la via del CSV.","2026-08-30","\u002Fblog\u002Fback-up-supabase-free-tier\u002Fcard-800x500.png",{"path":1125,"title":1126,"description":1127,"published":1128,"category":875,"image":1129,"draft":828},"\u002Fblog\u002Fis-supabase-secure","Supabase è sicuro? Sì. Il tuo progetto è un'altra questione","Supabase è sicuro? La piattaforma è certificata, cifrata e sottoposta a pentest. La loro documentazione dice dove finisce quello e iniziano le tue impostazioni.","2026-08-29","\u002Fblog\u002Fis-supabase-secure\u002Fcard-800x500.png",{"path":1131,"title":1132,"description":1133,"published":1134,"category":875,"image":1135,"draft":828},"\u002Fblog\u002Fwhere-to-find-supabase-api-keys","Dove trovare le chiavi API di Supabase: anon, service_role e URL","L'URL del progetto, la chiave anon e la chiave service_role stanno su una pagina della dashboard. Ecco dove si trova e quale dei quattro va nella tua app.","2026-08-28","\u002Fblog\u002Fwhere-to-find-supabase-api-keys\u002Fcard-800x500.png",{"path":1137,"title":1138,"description":1139,"published":1140,"category":875,"image":1141,"draft":828},"\u002Fblog\u002Fnew-row-violates-row-level-security-policy","New row violates row-level security policy su Supabase. E adesso?","\"New row violates row-level security policy\" significa che Supabase ha rifiutato una scrittura. La soluzione veloce riapre la tabella a chiunque.","2026-08-27","\u002Fblog\u002Fnew-row-violates-row-level-security-policy\u002Fcard-800x500.png",{"path":1143,"title":1144,"description":1145,"published":1146,"category":875,"image":1147,"draft":828},"\u002Fblog\u002Fcors-wildcard-security-risk","Un wildcard CORS è un rischio di sicurezza? Quasi mai.","Un wildcard CORS è un rischio di sicurezza? Di solito è il valore predefinito del tuo builder e non consegna nulla che il tuo server non desse già a chiunque.","2026-08-26","\u002Fblog\u002Fcors-wildcard-security-risk\u002Fcard-800x500.png",{"path":1149,"title":1150,"description":1151,"published":1152,"category":824,"image":1153,"draft":828},"\u002Fblog\u002Fsupabase-branching-is-not-a-backup","Il branching di Supabase non è un backup. Va solo in avanti.","Perché il branching di Supabase non è un backup: un branch parte senza i tuoi dati e un merge sposta solo lo schema. A cosa serve davvero e cosa usare invece.","2026-08-25","\u002Fblog\u002Fsupabase-branching-is-not-a-backup\u002Fcard-800x500.png",{"path":434,"title":1155,"description":1156,"published":1157,"category":824,"image":1158,"draft":828},"Come ripristinare un backup Supabase, e cosa si rompe dopo","Come ripristinare un backup Supabase dalla dashboard o da un file di dump, che cosa sostituisce il ripristino e perché la tua app può restare rotta lo stesso.","2026-08-24","\u002Fblog\u002Fhow-to-restore-a-supabase-backup\u002Fcard-800x500.png",{"path":1160,"title":1161,"description":1162,"published":1163,"category":875,"image":1164,"draft":828},"\u002Fblog\u002Fsupabase-storage-bucket-public","Il tuo bucket Supabase Storage è pubblico. È un problema?","Un bucket Supabase Storage pubblico significa che chi ha l'URL di un file può aprirlo. Non significa che qualcuno possa elencare quello che c'è dentro.","2026-08-23","\u002Fblog\u002Fsupabase-storage-bucket-public\u002Fcard-800x500.png",{"path":1166,"title":1167,"description":1168,"published":1169,"category":875,"image":1170,"draft":828},"\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend","Una chiave API Google nel frontend è un problema?","Una chiave API Google esposta nel frontend è la chiave che il nostro scanner trova più spesso, e di solito va bene così. Lo decide una impostazione gratuita.","2026-08-22","\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend\u002Fcard-800x500.png",{"path":1172,"title":1173,"description":1174,"published":1175,"category":824,"image":1176,"draft":828},"\u002Fblog\u002Fai-agent-deleted-my-database","Un agente IA ha cancellato i miei dati Supabase. Cosa recupero?","Un agente IA ha cancellato dati dal tuo database. Quello che puoi recuperare era già deciso prima che partisse, e i prossimi minuti decidono il resto.","2026-08-21","\u002Fblog\u002Fai-agent-deleted-my-database\u002Fcard-800x500.png",{"path":1178,"title":1179,"description":1180,"published":1181,"category":875,"image":1182,"draft":828},"\u002Fblog\u002Fcan-anyone-read-your-supabase-database","Chiunque può leggere il tuo database Supabase? 3.680 app testate","Chiunque può leggere il tuo database Supabase senza fare login? Abbiamo scansionato 30.998 app online create con i builder IA e misurato quante rispondono sì.","2026-08-18","\u002Fblog\u002Fcan-anyone-read-your-supabase-database\u002Fcard-800x500.png",{"path":1184,"title":1185,"description":1186,"published":1181,"category":875,"image":1187,"draft":828},"\u002Fblog\u002Fsource-maps-exposed-in-production","Source map esposte: la tua app sta pubblicando il codice originale","Una source map esposta permette a chiunque di leggere il codice originale della tua app, commenti inclusi. Il controllo da 30 secondi e cosa conta davvero.","\u002Fblog\u002Fsource-maps-exposed-in-production\u002Fcard-800x500.png",{"path":1189,"title":1190,"description":1191,"published":1192,"category":875,"image":1193,"draft":828},"\u002Fblog\u002Fsupabase-new-api-keys","Le nuove chiavi API di Supabase: quale va nella tua app?","Supabase ha sostituito anon e service_role con chiavi pubblicabili e segrete. Quale sta bene nella tua app, e quale non deve starci mai?","2026-08-12","\u002Fblog\u002Fsupabase-new-api-keys\u002Fcard-800x500.png",{"path":1195,"title":1196,"description":1197,"published":1198,"category":824,"image":1199,"draft":828},"\u002Fblog\u002Fdoes-supabase-back-up-my-database","Supabase fa il backup del mio database? Dipende dal tuo piano.","Supabase fa il backup del tuo database? Ogni giorno sui piani a pagamento, mai su quello gratuito. Come capire cosa hai e cosa quella copia non copre.","2026-08-11","\u002Fblog\u002Fdoes-supabase-back-up-my-database\u002Fcard-800x500.png",{"path":1201,"title":1202,"description":1203,"published":1204,"category":875,"image":1205,"draft":828},"\u002Fblog\u002Fsupabase-rls-on-but-table-still-public","Supabase Row Level Security è attivo. La tabella resta pubblica.","Attivare Supabase Row Level Security non protegge una tabella. Lo fanno le policy, e quella che ha rimesso in piedi la tua app può far entrare chiunque.","2026-08-10","\u002Fblog\u002Fsupabase-rls-on-but-table-still-public\u002Fcard-800x500.png",{"path":1207,"title":1208,"description":1209,"published":1204,"category":824,"image":1210,"draft":828},"\u002Fblog\u002Fversion-history-is-not-a-backup","La cronologia delle versioni non è un backup dei tuoi dati.","Lovable e Bolt tengono una cronologia delle versioni del codice. Il tuo database è un servizio a parte, e tornare indietro non ti restituisce i dati.","\u002Fblog\u002Fversion-history-is-not-a-backup\u002Fcard-800x500.png",{"path":1212,"title":1213,"description":1214,"published":1215,"category":824,"image":1216,"draft":828},"\u002Fblog\u002Fthree-ways-to-back-up-a-supabase-database","Tre modi per fare il backup di un database Supabase, e cosa manca","Il pannello, pg_dump e un servizio gestito. Che cosa salva davvero ciascuno, cosa lascia fuori senza dirlo e quale sopravvive alla perdita dell'account.","2026-08-09","\u002Fblog\u002Fthree-ways-to-back-up-a-supabase-database\u002Fcard-800x500.png",{"path":1218,"title":1219,"description":1220,"published":1215,"category":875,"image":1221,"draft":828},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","Quali chiavi API sono sicure nel browser e quali no","La tua chiave anon di Supabase è fatta per essere pubblica. La chiave service_role no, e ignora ogni regola che imposti. Come distinguerle.","\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend\u002Fcard-800x500.png",1791705965146]