[{"data":1,"prerenderedAt":1159},["ShallowReactive",2],{"blog-it-supabase-backup-github-action":3,"blog-index-it":813},{"id":4,"title":5,"body":6,"category":766,"cover":767,"coverAlt":768,"description":769,"draft":770,"extension":771,"faq":772,"image":790,"keywords":791,"meta":800,"navigation":801,"ogTitle":802,"path":803,"published":804,"seo":805,"stem":806,"tldr":807,"updated":811,"__hash__":812},"blog_it\u002Fblog\u002Fsupabase-backup-github-action.md","Backup gratis di Supabase con una GitHub Action, e il tranello",{"type":7,"value":8,"toc":750},"minimark",[9,13,21,24,29,40,49,57,60,64,72,82,85,137,144,151,155,158,175,189,195,198,201,205,214,223,231,240,243,247,250,253,333,336,339,344,347,355,358,362,375,396,402,405,408,414,420,457,463,466,470,473,476,513,516,520,528,546,550,553,569,577,582,590,599,605,608,612,615,643,647,652,695,708,712,742],[10,11,12],"p",{},"Il tuo progetto Supabase è sul piano gratuito, quindi niente viene copiato da\nnessuna parte, oppure è su Pro e ogni copia che fa vive dentro l'account che hai\npaura di perdere. In un thread proprio su questo, qualcuno ha detto che la\nrisposta è una GitHub Action di backup di Supabase: un piccolo file in un\nrepository che esporta il tuo database ogni notte e non costa nulla.",[10,14,15,16,20],{},"Il consiglio era buono. Supabase pubblica il workflow in prima persona, e per\nmolte app è la cosa da mettere in piedi questa settimana. Ecco la parte che quei\nthread lasciano fuori: ",[17,18,19],"strong",{},"non costa denaro, eppure ha un prezzo."," Ogni\nesecuzione scarica tutto il tuo database, e Supabase misura quel download.",[10,22,23],{},"Pensalo come i giga della tua offerta telefonica. Il piano ha una quota mensile,\ntutto quello che fa la tua app ci attinge, e un backup è un download pesante\nsulla stessa offerta. Sul piano gratuito, una copia notturna di un database\nvicino al suo limite di dimensione si mangia la quota di tutto il mese in una\ndecina di giorni. Questo, e una connection string che GitHub non riesce a\nraggiungere, sono le due cose tra te e un backup che funziona, e nessuna delle\ndue sta sulla pagina di Supabase.",[25,26,28],"h2",{"id":27},"puoi-fare-il-backup-di-supabase-gratis-con-una-github-action","Puoi fare il backup di Supabase gratis con una GitHub Action?",[10,30,31,32,39],{},"Sì, e Supabase documenta come. La sua pagina sui\n",[33,34,38],"a",{"href":35,"rel":36},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fdeployment\u002Fci\u002Fbackups",[37],"nofollow","backup automatici con GitHub Actions","\nfornisce un workflow che installa la CLI di Supabase, esporta ruoli, schema e\ndati in tre file e ne fa il commit nel repository secondo un orario.",[10,41,42,43,48],{},"Nemmeno GitHub ti fa pagare, entro certi limiti. Un repository privato su GitHub\nFree riceve\n",[33,44,47],{"href":45,"rel":46},"https:\u002F\u002Fdocs.github.com\u002Fen\u002Fbilling\u002Fconcepts\u002Fproduct-billing\u002Fgithub-actions",[37],"2.000 minuti di Actions al mese",",\ne un dump notturno di un database piccolo ne usa una piccola parte.",[10,50,51,52,56],{},"Quello che ottieni è una copia che esce da Supabase ogni notte e atterra sui\nserver di un'altra azienda. È proprio ciò che i backup di Supabase non possono\ndarti, perché le copie giornaliere di un piano a pagamento\n",[33,53,55],{"href":54},"\u002Fblog\u002Fdownload-your-supabase-backup","restano dentro l'account che proteggono",".",[10,58,59],{},"È la risposta giusta quando valgono tre cose. La tua app vive già in un\nrepository GitHub, come succede se hai attivato la sincronizzazione con GitHub\nin Lovable o in un builder simile. Modificare un file YAML non ti preoccupa. E\nil tuo database è piccolo rispetto alla quota di egress del tuo piano. Le prime\ndue le sai già. La terza è aritmetica, e ha una sezione tutta sua più sotto.",[25,61,63],{"id":62},"il-workflow-con-lorario-e-il-secret","Il workflow, con l'orario e il secret",[10,65,66,67,71],{},"Salva questo come ",[68,69,70],"code",{},".github\u002Fworkflows\u002Fsupabase-backup.yml"," in un repository\nprivato che non contenga nient'altro:",[73,74,80],"pre",{"className":75,"code":77,"language":78,"meta":79},[76],"language-yaml","name: supabase-backup\n\non:\n  schedule:\n    - cron: '17 3 * * *' # ogni giorno alle 03:17 UTC\n  workflow_dispatch:\n\njobs:\n  backup:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    env:\n      SUPABASE_DB_URL: ${{ secrets.SUPABASE_DB_URL }}\n    steps:\n      - uses: actions\u002Fcheckout@v7\n      - uses: supabase\u002Fsetup-cli@v3\n        with:\n          version: latest\n      - name: Back up roles\n        run: supabase db dump --db-url \"$SUPABASE_DB_URL\" -f roles.sql --role-only\n      - name: Back up schema\n        run: supabase db dump --db-url \"$SUPABASE_DB_URL\" -f schema.sql\n      - name: Back up data\n        run: >\n          supabase db dump --db-url \"$SUPABASE_DB_URL\" -f data.sql --use-copy --data-only\n          -x \"storage.buckets_vectors\" -x \"storage.vector_indexes\"\n      - uses: stefanzweifel\u002Fgit-auto-commit-action@v7\n        with:\n          commit_message: Supabase backup\n","yaml","",[68,81,77],{"__ignoreMap":79},[10,83,84],{},"È il workflow di Supabase con tre modifiche.",[86,87,88,99,122],"ul",{},[89,90,91,94,95,98],"li",{},[17,92,93],{},"Gira secondo l'orario e quando premi il pulsante, e in nessun altro\nmomento."," La versione di Supabase gira anche a ogni push e a ogni pull\nrequest su ",[68,96,97],{},"main",". Ogni esecuzione è un download completo del tuo database,\nquindi in un repository che contiene anche la tua app ogni modifica che\npubblichi costerebbe la quota di un backup.",[89,100,101,104,105,110,111,114,115,118,119,56],{},[17,102,103],{},"Gira alle 03:17, fuori dall'ora esatta."," GitHub dice che le esecuzioni\nprogrammate\n",[33,106,109],{"href":107,"rel":108},"https:\u002F\u002Fdocs.github.com\u002Fen\u002Factions\u002Freference\u002Fworkflows-and-actions\u002Fevents-that-trigger-workflows#schedule",[37],"possono essere ritardate all'inizio di ogni ora",",\ne che con un carico sufficiente alcuni job in coda vengono scartati. L'esempio\ndi Supabase usa ",[68,112,113],{},"0 0 * * *",", che cade allo scoccare dell'ora. Gli orari sono\nUTC a meno che tu non aggiunga un ",[68,116,117],{},"timezone",", e va bene qualsiasi minuto\ndiverso da ",[68,120,121],{},"0",[89,123,124,132,133,136],{},[17,125,126,127],{},"La riga dei dati corrisponde alla\n",[33,128,131],{"href":129,"rel":130},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fplatform\u002Fmigrating-within-supabase\u002Fbackup-restore",[37],"guida attuale di Supabase su backup e ripristino",",\nche aggiunge due esclusioni ",[68,134,135],{},"-x"," assenti dalla pagina del workflow. Così i\nfile che conservi sono quelli per cui sono scritte le istruzioni di\nripristino di Supabase.",[10,138,139,140,143],{},"Poi il secret. Nel repository apri Settings, poi Secrets and variables, poi\nActions, e aggiungi un secret di repository chiamato ",[68,141,142],{},"SUPABASE_DB_URL",". Quello\nche ci metti dentro decide se tutto questo funziona, quindi ha la prossima\nsezione tutta per sé.",[10,145,146,147,150],{},"Una volta salvato, avvia il workflow a mano dalla scheda Actions, così la prima\nesecuzione avviene mentre guardi. ",[68,148,149],{},"workflow_dispatch"," è la riga che ti dà il\npulsante Run workflow.",[25,152,154],{"id":153},"quale-connection-string-va-nel-secret","Quale connection string va nel secret?",[10,156,157],{},"La stringa del Session pooler, dal pulsante Connect in cima al tuo progetto\nSupabase. Usala anche se la pagina del workflow di Supabase mostra la\nconnessione diretta nel suo esempio.",[10,159,160,161,164,165,168,169,174],{},"Il motivo è IPv6, il tipo più recente di indirizzo internet. La connessione\ndiretta di Supabase, l'host che comincia con ",[68,162,163],{},"db."," e finisce con ",[68,166,167],{},"supabase.co",",\n",[33,170,173],{"href":171,"rel":172},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fplatform\u002Fipv4-address",[37],"usa IPv6 per impostazione predefinita",",\ne la stessa pagina mette GitHub Actions tra i servizi che accettano solo IPv4.\nIl runner riceve un indirizzo verso cui non ha strada, e il primo dump fallisce\nprima di scrivere un solo byte. L'errore dice che il nome host non si è potuto\ntradurre, o che la rete non è raggiungibile, spesso con accanto un lungo\nindirizzo pieno di due punti. Quell'indirizzo è quello IPv6. Sembra una password\nsbagliata o un database giù, e la vera causa è una rete su cui il runner non si\ntrova.",[10,176,177,178,181,182,185,186,56],{},"La guida di Supabase su backup e ripristino dice di usare per impostazione\npredefinita la stringa del Session pooler, e quella diretta solo se la tua rete\nsupporta IPv6 o se paghi l'add-on IPv4. Riconosci la stringa del pooler da tre\ncose: il nome utente è ",[68,179,180],{},"postgres."," seguito dal riferimento del tuo progetto,\nl'host finisce con ",[68,183,184],{},"pooler.supabase.com"," e la porta è ",[68,187,188],{},"5432",[190,191],"diagram",{"alt":192,"caption":193,"src":194},"Un runner di GitHub a sinistra con due strade in uscita. Quella in alto porta l'host diretto db.[ref].supabase.co, è segnata IPv6 e si ferma contro un muro con una croce prima del database. Quella in basso porta l'host pooler.supabase.com, è segnata IPv4 e raggiunge il database con una spunta.","Il runner non ha strada verso l'indirizzo IPv6 della connessione diretta. Il Session pooler risponde su IPv4 e raggiunge lo stesso database.","\u002Fblog\u002Fsupabase-backup-github-action\u002Fwhich-string-reaches-the-runner-1600x620.png",[10,196,197],{},"La password al suo interno è la password del tuo database, quella impostata\nquando è stato creato il progetto, non una chiave API. Se nessuno l'ha annotata,\nSupabase ti permette di reimpostarla in Database Settings; qualsiasi altra cosa\nche si collega con quella vecchia smette di funzionare finché non le dai quella\nnuova.",[10,199,200],{},"Quella stringa può leggere e modificare ogni riga del tuo database. Vive nel\nsecret e da nessun'altra parte: mai nel file del workflow, mai in un messaggio\ndi commit e mai incollata in un assistente di IA insieme all'errore di cui\nvolevi chiedere.",[25,202,204],{"id":203},"un-backup-di-supabase-conta-contro-il-mio-egress","Un backup di Supabase conta contro il mio egress?",[10,206,207,208,213],{},"Sì, tutto quanto. Supabase conta come\n",[33,209,212],{"href":210,"rel":211},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fplatform\u002Fmanage-your-usage\u002Fegress",[37],"egress",",\ncioè traffico in uscita, i dati che uno qualsiasi dei suoi servizi manda\nall'esterno, e un dump attraverso il pooler viene registrato come Shared Pooler\nEgress nella stessa quota del tuo traffico API, dei download di file e di tutto\nil resto che la tua app serve.",[10,215,216,217,222],{},"Torniamo all'offerta telefonica. La quota si azzera a ogni mese di\nfatturazione, ogni servizio che la tua app usa ci attinge, e un backup è un\naltro download pesante. È anche un piano famiglia: Supabase applica la quota a\n",[33,218,221],{"href":219,"rel":220},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fplatform\u002Fbilling-on-supabase",[37],"tutta la tua organizzazione",",\nquindi tutti i progetti che contiene condividono la stessa quota.",[10,224,225,226,230],{},"Il 26 settembre 2026, la pagina dei prezzi di Supabase dava al piano gratuito\n5 GB di egress al mese e un limite di 500 MB per il database di ogni progetto, e\nal piano Pro 250 GB di egress. Sul piano gratuito ci sono altri 5 GB di cached\negress, che coprono i file serviti dalla CDN di Supabase, e un backup non li\ntocca mai. Gli altri limiti del piano gratuito, e ",[33,227,229],{"href":228},"\u002Fblog\u002Fsupabase-free-plan-limits","cosa fa ognuno quando lo superi",", hanno un articolo tutto loro.",[10,232,233,234,239],{},"Superare la quota sul piano gratuito non produce una fattura. Supabase\n",[33,235,238],{"href":236,"rel":237},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fplatform\u002Fbilling-faq",[37],"ti avvisa e ti concede un periodo di tolleranza",",\ne se continui a superarla limita ogni progetto dell'organizzazione. Secondo\nSupabase questo può voler dire richieste API respinte con un errore 402, un\ndatabase messo in sola lettura o progetti in pausa. Per un'app con dei clienti,\nè un disservizio che ha avviato il tuo backup.",[10,241,242],{},"Vale per qualsiasi backup che esce da Supabase, compreso quello che vendiamo\nnoi. Una copia tenuta fuori dall'account deve essere scaricata per arrivarci.",[25,244,246],{"id":245},"ogni-quanto-dovrebbe-girare-il-backup","Ogni quanto dovrebbe girare il backup?",[10,248,249],{},"Tanto spesso quanto la tua quota può pagare, e tutto si riduce a una sola\nmoltiplicazione: la dimensione del database per le esecuzioni del mese.",[10,251,252],{},"Supabase mostra la dimensione del tuo database nel report Database, sotto\nObservability nel tuo progetto. Un dump non è esattamente di quella dimensione.\nLascia fuori gli indici, che vengono ricostruiti dalle loro definizioni, e\nscrive ogni valore come testo. È abbastanza vicino per pianificare, ed è il\nnumero che puoi andare a vedere.",[254,255,256,275],"table",{},[257,258,259],"thead",{},[260,261,262,266,269,272],"tr",{},[263,264,265],"th",{},"Dimensione del database",[263,267,268],{},"Giornaliero (30 esecuzioni)",[263,270,271],{},"Due volte a settimana",[263,273,274],{},"Settimanale",[276,277,278,293,306,320],"tbody",{},[260,279,280,284,287,290],{},[281,282,283],"td",{},"50 MB",[281,285,286],{},"1,5 GB",[281,288,289],{},"0,4 GB",[281,291,292],{},"0,2 GB",[260,294,295,298,301,304],{},[281,296,297],{},"100 MB",[281,299,300],{},"3 GB",[281,302,303],{},"0,9 GB",[281,305,289],{},[260,307,308,311,314,317],{},[281,309,310],{},"250 MB",[281,312,313],{},"7,5 GB",[281,315,316],{},"2,2 GB",[281,318,319],{},"1,1 GB",[260,321,322,325,328,331],{},[281,323,324],{},"500 MB",[281,326,327],{},"15 GB",[281,329,330],{},"4,3 GB",[281,332,316],{},[10,334,335],{},"Un mese ha circa 4,3 settimane, ed è da lì che vengono le ultime due colonne.",[10,337,338],{},"Sul piano gratuito, le due cifre giornaliere in fondo consumano più della quota\ndi tutto il mese prima che la tua app abbia risposto a una sola richiesta. Un\norario giornaliero consuma tutti i 5 GB intorno ai 160 MB, e il traffico della\ntua app esce dalla stessa quota, quindi guarda l'egress del mese scorso nella\npagina Usage della tua organizzazione prima di scegliere. Il settimanale ci sta\ncon qualsiasi dimensione consentita dal piano gratuito.",[190,340],{"alt":341,"caption":342,"src":343},"Un database con un simbolo di ripetizione accanto a due colonne di blocchi: trenta copie in un mese a sinistra, quattro a destra. Una linea tratteggiata segna la quota mensile. La colonna di sinistra la supera a un terzo della sua altezza e i blocchi sopra la linea sono ambra. Quella di destra resta molto più in basso, in turchese.","Un database al limite di 500 MB del piano gratuito, con backup giornaliero e settimanale. La linea tratteggiata sono i 5 GB di egress del piano gratuito per il mese.","\u002Fblog\u002Fsupabase-backup-github-action\u002Fthirty-copies-four-copies-1600x680.png",[10,345,346],{},"La riga del cron è l'unica cosa che cambi:",[73,348,353],{"className":349,"code":351,"language":352},[350],"language-text","17 3 * * *      ogni giorno alle 03:17 UTC\n17 3 * * 1,4    il lunedì e il giovedì\n17 3 * * 0      la domenica\n","text",[68,354,351],{"__ignoreMap":79},[10,356,357],{},"Su Pro l'aritmetica quasi smette di contare. 250 GB al mese pagano un dump\ngiornaliero di un progetto fino a circa 8 GB, che è lo spazio su disco che il\npiano Pro include per progetto.",[25,359,361],{"id":360},"perché-il-mio-workflow-fallisce-con-un-errore-di-versione-di-pg_dump","Perché il mio workflow fallisce con un errore di versione di pg_dump?",[10,363,364,365,368,369,371,372,374],{},"Perché il ",[68,366,367],{},"pg_dump"," che ha eseguito è più vecchio del tuo database. Succede\nsolo a un workflow che chiama ",[68,370,367],{}," direttamente invece che attraverso la\nCLI di Supabase. La CLI si porta il suo ",[68,373,367],{},", ed è uno dei motivi per cui\nil workflow qui sopra la usa.",[10,376,377,378,381,382,387,388,390,395],{},"Il runner ",[68,379,380],{},"ubuntu-latest"," di GitHub arriva con\n",[33,383,386],{"href":384,"rel":385},"https:\u002F\u002Fgithub.com\u002Factions\u002Frunner-images\u002Fblob\u002Fmain\u002Fimages\u002Fubuntu\u002FUbuntu2404-Readme.md",[37],"PostgreSQL 16 installato",".\nI progetti Supabase possono girare su Postgres 17, e Postgres documenta che\n",[68,389,367],{},[33,391,394],{"href":392,"rel":393},"https:\u002F\u002Fwww.postgresql.org\u002Fdocs\u002Fcurrent\u002Fapp-pgdump.html",[37],"non esporta da un server di una versione principale più recente della sua",",\ne preferisce rifiutarsi piuttosto che rischiare un file difettoso. L'esecuzione\nsi ferma con:",[73,397,400],{"className":398,"code":399,"language":352},[350],"pg_dump: error: aborting because of server version mismatch\npg_dump: detail: server version: 17.…; pg_dump version: 16.…\n",[68,401,399],{"__ignoreMap":79},[10,403,404],{},"La versione del tuo progetto è sotto Project Settings, poi General, se vuoi\nconfermarla. Le tue credenziali non c'entrano.",[10,406,407],{},"La soluzione sono due passaggi. Aggiungi il repository dei pacchetti di\nPostgreSQL stesso, così il runner può installare il client della versione 17,\npoi chiama quel client con il suo percorso completo:",[73,409,412],{"className":410,"code":411,"language":78,"meta":79},[76],"- name: Install the Postgres 17 client\n  run: |\n    sudo apt-get install -y postgresql-common\n    sudo \u002Fusr\u002Fshare\u002Fpostgresql-common\u002Fpgdg\u002Fapt.postgresql.org.sh -y\n    sudo apt-get install -y postgresql-client-17\n- name: Back up\n  run: \u002Fusr\u002Flib\u002Fpostgresql\u002F17\u002Fbin\u002Fpg_dump \"$SUPABASE_DB_URL\" …\n",[68,413,411],{"__ignoreMap":79},[10,415,416,417,419],{},"Tieni dopo la connection string gli argomenti che avevi già. Il percorso\ncompleto conta: su Ubuntu il semplice ",[68,418,367],{}," è un wrapper che sceglie una\nversione al posto tuo, e sul runner c'è già un'installazione di PostgreSQL 16\nda scegliere.",[10,421,422,423,425,426,429,430,438,439,442,443,446,447,449,450,453,454,456],{},"Anche il ",[68,424,367],{}," della CLI ha una versione, e non viene dal tuo progetto.\nSenza un ",[68,427,428],{},"supabase\u002Fconfig.toml"," accanto al workflow, come in un repository che\nnon contiene altro, la CLI\n",[33,431,434,435,437],{"href":432,"rel":433},"https:\u002F\u002Fgithub.com\u002Fsupabase\u002Fcli\u002Fblob\u002F66ccc6f63a9a26b29c368698994a0843d23b80be\u002Fapps\u002Fcli\u002Fsrc\u002Fcommand-internal\u002Fdb-config.toml-read.ts#L176",[37],"usa ",[68,436,367],{}," 17",".\nSu un progetto ancora su Postgres 15, il ",[68,440,441],{},"data.sql"," che scrive contiene allora\n",[68,444,445],{},"SET transaction_timeout = 0",", un'impostazione che Postgres 15 non ha, e il\ncaricamento si ferma su quella riga in qualsiasi database Postgres 15, compreso\nil progetto da cui viene il file. L'abbiamo riprodotto il 4 ottobre 2026 con\n",[68,448,367],{}," 17.11 e Postgres 15.19. Se il tuo progetto è su 15, aggiungi una riga\nal blocco ",[68,451,452],{},"env"," del job così la CLI usa il ",[68,455,367],{}," corrispondente:",[73,458,461],{"className":459,"code":460,"language":78,"meta":79},[76],"env:\n  SUPABASE_DB_URL: ${{ secrets.SUPABASE_DB_URL }}\n  SUPABASE_DB_MAJOR_VERSION: '15'\n",[68,462,460],{"__ignoreMap":79},[10,464,465],{},"Il backup in sé finisce senza errori in entrambi i casi, quindi senza quella\nriga la differenza si vede solo il giorno in cui ricarichi il file.",[25,467,469],{"id":468},"posso-fare-il-commit-del-backup-nel-mio-repository","Posso fare il commit del backup nel mio repository?",[10,471,472],{},"In uno privato, sì. È quello che fa il workflow di Supabase, e la sua pagina\ndice due volte di non fare mai il backup dei dati in un repository pubblico.",[10,474,475],{},"Tre cose su un repository come casa di un database, nessuna delle quali sta su\nquella pagina:",[86,477,478,492,498],{},[89,479,480,483,484,486,487,491],{},[17,481,482],{},"Chiunque può leggere il repository può leggere i tuoi utenti."," ",[68,485,441],{},"\ncontiene ogni riga: indirizzi email, nomi, qualsiasi cosa tengano le tue\ntabelle, e ",[33,488,490],{"href":489},"\u002Fblog\u002Fsupabase-backup-auth-users","anche i tuoi account",". Per\nquesto il workflow ha un repository tutto suo senza nessun altro dentro, e non\nquello in cui vive il codice della tua app, che il tuo builder magari\nsincronizza e in cui un giorno potresti invitare un freelance.",[89,493,494,497],{},[17,495,496],{},"La copia di ogni notte resta nella cronologia."," Git conserva ogni versione\ndi ogni file. Quando qualcuno tra i tuoi clienti ti chiede di cancellare il\nproprio account, la sua riga resta in ogni commit precedente di quel\nrepository finché non ne riscrivi la cronologia.",[89,499,500,503,504,509,510,512],{},[17,501,502],{},"Smette di funzionare a 100 MiB."," GitHub avvisa sopra i 50 MiB e\n",[33,505,508],{"href":506,"rel":507},"https:\u002F\u002Fdocs.github.com\u002Fen\u002Frepositories\u002Fworking-with-files\u002Fmanaging-large-files\u002Fabout-large-files-on-github",[37],"blocca i file oltre i 100 MiB",",\ne la stessa pagina dice che Git non è pensato per gestire file SQL grandi. La\nnotte in cui ",[68,511,441],{}," supera quella soglia, il passaggio di commit fallisce,\ne ogni esecuzione successiva fallisce allo stesso modo.",[10,514,515],{},"Quando ti avvicini, lo stesso workflow può caricare i tre file in un bucket di\nstorage tuo invece di farne il commit. Oppure è il punto in cui farlo da te ha\nsmesso di essere economico, ed è lì che comincia l'ultima sezione.",[25,517,519],{"id":518},"cosa-non-copia-il-workflow","Cosa non copia il workflow?",[10,521,522,523,527],{},"I tuoi file caricati. Supabase Storage tiene ogni file fuori dal database e una\nriga che lo descrive dentro, quindi il dump porta con sé la riga e non\nl'immagine. ",[33,524,526],{"href":525},"\u002Fblog\u002Fsupabase-storage-backup","Fare il backup di Storage"," è un\nlavoro a parte, su qualsiasi strada.",[10,529,530,531,534,535,538,539,541,542,545],{},"I tuoi utenti invece ci sono. Il dump dei dati attraversa lo schema ",[68,532,533],{},"auth"," in\ncui vivono i tuoi account, e cercare ",[68,536,537],{},"auth.users"," in ",[68,540,441],{}," te li mostra. Il\nprogetto intorno al database no: Edge Functions, impostazioni dei provider di\nautenticazione, chiavi API e secret sono configurazione e non dati, e\n",[33,543,544],{"href":54},"l'elenco di ciò che non c'è in nessuna delle due copie","\nè quello da leggere prima che ti serva.",[25,547,549],{"id":548},"unesecuzione-verde-vuol-dire-che-il-backup-ha-funzionato","Un'esecuzione verde vuol dire che il backup ha funzionato?",[10,551,552],{},"Vuol dire che il job è finito senza errori, che è un'affermazione più piccola.\nTre risultati molto diversi finiscono con la stessa spunta verde:",[554,555,556,559,562],"ol",{},[89,557,558],{},"Un buon dump del progetto giusto.",[89,560,561],{},"Un dump del progetto sbagliato, perché nel secret c'è la stringa di una\ncopia di staging.",[89,563,564,565,568],{},"Un dump senza nessuna riga, perché qualcuno ha modificato la riga dei dati e\n",[68,566,567],{},"--data-only"," è sparito, il che la trasforma di nuovo nel dump dello schema.",[10,570,571,572,576],{},"Un risultato non lascia alcuna traccia. Un'esecuzione programmata che GitHub\nscarta sotto carico non compare come fallimento, perché non c'è nessuna\nesecuzione che possa fallire. E quando un'esecuzione fallisce davvero, GitHub\nmanda la notifica\n",[33,573,575],{"href":107,"rel":574},[37],"alla persona che ha modificato per ultima la riga del cron",".\nSe te l'ha configurato un freelance, l'email sul tuo backup arriva nella sua\ncasella.",[190,578],{"alt":579,"caption":580,"src":581},"Un job concluso, con una spunta verde. Ne esce una linea che si divide verso due pannelli di file identici. Nel file in alto tutte le righe sono piene. In quello in basso le righe finiscono dopo due e il resto sono contorni tratteggiati vuoti.","Entrambi i file sono usciti da un'esecuzione finita senza errori. Nulla nell'esecuzione ti dice quale dei due hai.","\u002Fblog\u002Fsupabase-backup-github-action\u002Fgreen-run-short-file-1600x740.png",[10,583,584,585,589],{},"Solo un ripristino li distingue. Riproduci i tre file in un progetto Supabase\nusa e getta o in uno locale, confronta il numero di righe delle tabelle che ti\ninteressano con quelle vere ed entra come un utente vero.\n",[33,586,588],{"href":587},"\u002Fblog\u002Fhow-to-restore-a-supabase-backup","Come ripristinare un backup di Supabase","\nha i comandi, nell'ordine indicato da Supabase. Fallo una volta adesso, e di\nnuovo ogni volta che cambi il workflow.",[10,591,592,593,598],{},"Puoi anche lasciare il ripristino e il conteggio a ogni esecuzione. Abbiamo\npubblicato una versione di questo workflow come una GitHub Action open source,\n",[33,594,597],{"href":595,"rel":596},"https:\u002F\u002Fgithub.com\u002FReeve-page\u002Fsupabase-backup-action",[37],"Reeve-page\u002Fsupabase-backup-action",".\nFa gli stessi tre dump, conserva la copia come artefatto del workflow o in\nun bucket S3 o R2, poi la riproduce in un database Supabase usa e getta sul\nrunner e confronta il numero di righe di ogni tabella con il file. L'esecuzione\ndiventa verde solo quando ogni tabella è tornata con le righe che il file\ncontiene:",[73,600,603],{"className":601,"code":602,"language":78,"meta":79},[76],"- uses: Reeve-page\u002Fsupabase-backup-action@v1\n  with:\n    db-url: ${{ secrets.SUPABASE_DB_URL }}\n",[68,604,602],{"__ignoreMap":79},[10,606,607],{},"È gratuita e con licenza MIT. Ogni esecuzione scarica comunque l'intero\ndatabase, quindi il calcolo dell'egress qui sopra vale identico, e provare\nl'accesso resta compito tuo.",[25,609,611],{"id":610},"quando-dovrei-smettere-di-farlo-per-conto-mio","Quando dovrei smettere di farlo per conto mio?",[10,613,614],{},"Quando l'aritmetica non torna più, quando il file non ci sta più nel repository\no quando nessuno ripristina le copie. Ne basta una.",[86,616,617,623,631,637],{},[89,618,619,622],{},[17,620,621],{},"Il tuo database ha superato la quota gratuita."," Pro porta l'egress a\n250 GB e aggiunge i backup giornalieri di Supabase, conservati sette giorni,\nche si ripristinano con un pulsante. Lascia il workflow attivo accanto a loro,\nperché quelle copie vivono dentro l'account.",[89,624,625,630],{},[17,626,627,629],{},[68,628,441],{}," si avvicina ai 100 MiB."," Spostarlo in un bucket vuol dire più\nYAML, e più cose che qualcuno deve tenere in funzione.",[89,632,633,636],{},[17,634,635],{},"Nessuno ha mai ripristinato una copia."," Il workflow continuerà a scrivere\nfile, che si aprano o no.",[89,638,639,642],{},[17,640,641],{},"I tuoi utenti caricano file."," Il workflow non li raggiunge, e il job che li\nraggiunge è un secondo job da tenere in vita.",[25,644,646],{"id":645},"dove-si-inserisce-reeve-care","Dove si inserisce Reeve Care",[10,648,649],{},[17,650,651],{},"Care fa la copia secondo un orario, la tiene fuori dal tuo account Supabase e\ncontrolla ogni copia prima che conti.",[86,653,654,660,666,672,678],{},[89,655,656,659],{},[17,657,658],{},"Ogni giorno con Care, e più spesso con i piani superiori",", senza niente nel\ntuo repository e senza connection string in una CI.",[89,661,662,665],{},[17,663,664],{},"Riletta e contata."," Ogni copia viene aperta e contata rispetto a ciò che ci\nè entrato, e la data nella tua dashboard è quella dell'ultima copia che ha\nsuperato il controllo, mai quella dell'ultima esecuzione.",[89,667,668,671],{},[17,669,670],{},"I tuoi account ci sono",", e anche i tuoi file caricati arrivano non appena\ncolleghi una credenziale di Storage.",[89,673,674,677],{},[17,675,676],{},"Ripristinare è un pulsante",", e prima di sostituire qualsiasi cosa viene\nfatta una copia dello stato attuale.",[89,679,680,683,684,687,688,690,691,694],{},[17,681,682],{},"Ogni copia si scarica come zip"," con ",[68,685,686],{},"schema.sql",", ",[68,689,441],{}," e ",[68,692,693],{},"roles.sql",",\ngli stessi tre file che fa questo workflow, più il numero di righe di ogni\ntabella.",[10,696,697,698,702,703,707],{},"Care conserva una copia del tuo database Supabase. La copia, il controllo e il\nripristino sono disegnati passo per passo nella\n",[33,699,701],{"href":700},"\u002Fsupabase-backups","pagina sui backup di Supabase",", e\n",[33,704,706],{"href":705},"\u002Fpricing","cosa include ogni piano"," è nella pagina dei prezzi.",[25,709,711],{"id":710},"cosa-fare-questa-settimana","Cosa fare questa settimana",[713,714,715],"key-takeaways",{},[86,716,717,720,725,728,736,739],{},[89,718,719],{},"Controlla la dimensione del tuo database e l'egress del mese scorso, e scegli l'orario dalla tabella prima di scrivere la riga del cron.",[89,721,722,723,56],{},"Crea un repository privato che contenga solo il workflow, e metti la stringa del Session pooler nel suo secret ",[68,724,142],{},[89,726,727],{},"Se hai cominciato dall'esempio di Supabase, cancella i trigger di push e pull request e sposta il cron fuori dall'ora esatta.",[89,729,730,731,483,733,735],{},"Avvialo una volta a mano dalla scheda Actions, poi cerca in ",[68,732,441],{},[68,734,537],{}," e una tabella che sai avere delle righe.",[89,737,738],{},"Ripristina una copia in un progetto usa e getta ed entra come un utente vero.",[89,740,741],{},"Copia i tuoi file di Storage con un job a parte.",[10,743,744,745,749],{},"Prima di chiudere questa scheda, apri in Supabase la pagina Usage della tua\norganizzazione e leggi l'egress del mese scorso. Quella cifra, accanto alla\ndimensione del tuo database, sceglie la tua riga del cron. E se stai ancora\nconfrontando la strada gratuita con quelle a pagamento,\n",[33,746,748],{"href":747},"\u002Fblog\u002Fsupabase-backup-tools-compared","i quattro tipi di strumento di backup per Supabase","\nsono messi a confronto uno accanto all'altro.",{"title":79,"searchDepth":751,"depth":751,"links":752},3,[753,755,756,757,758,759,760,761,762,763,764,765],{"id":27,"depth":754,"text":28},2,{"id":62,"depth":754,"text":63},{"id":153,"depth":754,"text":154},{"id":203,"depth":754,"text":204},{"id":245,"depth":754,"text":246},{"id":360,"depth":754,"text":361},{"id":468,"depth":754,"text":469},{"id":518,"depth":754,"text":519},{"id":548,"depth":754,"text":549},{"id":610,"depth":754,"text":611},{"id":645,"depth":754,"text":646},{"id":710,"depth":754,"text":711},"Backups","\u002Fblog\u002Fsupabase-backup-github-action\u002Fcover-1200x630.png","Un database in un contenitore Supabase, un tubo che passa da un contatore con l'ago nella fascia ambra, e una fila di file notturni.","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.",false,"md",[773,776,779,781,784,787],{"q":774,"a":775},"Posso fare il backup di Supabase gratis?","Sì. Supabase documenta un workflow di GitHub Actions che installa la sua CLI, esporta ruoli, schema e dati in tre file secondo un orario e ne fa il commit nel repository. Un repository privato su GitHub Free riceve 2.000 minuti di Actions al mese, e un dump notturno di un database piccolo ne usa una piccola parte. Quello che il backup consuma davvero è la tua quota di egress su Supabase, perché ogni esecuzione scarica l'intero database.",{"q":777,"a":778},"Ogni quanto dovrebbe girare un cron di backup di Supabase?","Tanto spesso quanto la tua quota di egress può pagare. Moltiplica la dimensione del database per le esecuzioni del mese: un database da 100 MB esportato ogni giorno sposta circa 3 GB, uno da 500 MB circa 15 GB. Il piano gratuito include 5 GB per tutta l'organizzazione, condivisi con il traffico della tua app. Metti il job su un minuto che non sia allo scoccare dell'ora, perché GitHub dice che le esecuzioni programmate all'inizio di ogni ora possono essere ritardate, e alcune scartate.",{"q":204,"a":780},"Sì. Supabase conta come egress i dati che uno qualsiasi dei suoi servizi manda all'esterno, e un dump attraverso il connection pooler viene registrato come Shared Pooler Egress, nella stessa quota del tuo traffico API. La quota appartiene a tutta l'organizzazione, non a un singolo progetto. Sul piano gratuito, superarla più volte porta a restrizioni su ogni progetto dell'organizzazione.",{"q":782,"a":783},"Perché il mio workflow di backup fallisce alla prima esecuzione?","Ci sono due errori tipici di questa configurazione. Il primo è la connection string: la connessione diretta di Supabase usa IPv6 a meno che tu non paghi l'add-on IPv4, e Supabase mette GitHub Actions tra i servizi che raggiungono solo IPv4, quindi usa la stringa del Session pooler. Il secondo colpisce i workflow che chiamano pg_dump direttamente: il client PostgreSQL 16 del runner si rifiuta di esportare un progetto su Postgres 17 e si ferma con aborting because of server version mismatch.",{"q":785,"a":786},"Posso fare il commit del mio backup di Supabase nel mio repository GitHub?","In uno privato sì, ed è quello che fa il workflow di Supabase. In uno pubblico mai, e Supabase lo dice due volte nella stessa pagina. Dagli un repository tutto suo che nessun altro possa leggere, perché il file dei dati contiene gli indirizzi email dei tuoi utenti. E mettiti in conto di spostarlo quando il database cresce: GitHub avvisa sopra i 50 MiB e rifiuta i file oltre i 100 MiB.",{"q":788,"a":789},"Come faccio a sapere se il file di backup è buono?","Ripristinalo. Un'esecuzione verde significa che il job è finito senza errori, e un dump del progetto sbagliato o un dump senza nessuna riga finiscono allo stesso modo. Riproduci i tre file in un progetto Supabase usa e getta o in uno locale, confronta il numero di righe delle tabelle che ti interessano ed entra come un utente vero. È questo il controllo che ti dice se il file si apre.","\u002Fblog\u002Fsupabase-backup-github-action\u002Fcard-800x500.png",[792,793,794,795,796,797,798,799],"supabase backup github action","automatizzare backup supabase","backup supabase cron","backup supabase gratis","supabase pg_dump github actions","backup programmato supabase","workflow backup supabase","backup automatico supabase piano gratuito",{},true,"Backup gratis di Supabase con una GitHub Action","\u002Fblog\u002Fsupabase-backup-github-action","2026-09-27",{"title":5,"description":769},"blog\u002Fsupabase-backup-github-action",[808,809,810],"Una GitHub Action di backup di Supabase esegue la CLI di Supabase secondo un orario e fa il commit del dump in un repository privato. Non costa nulla, e per molte app è la risposta giusta.","Ogni esecuzione scarica tutto il tuo database, e Supabase lo conta come egress. Il piano gratuito include 5 GB al mese per tutta l'organizzazione, e un dump giornaliero di un database vicino al limite di 500 MB ne consuma circa tre volte tanto.","L'esempio della stessa Supabase si collega con una stringa che i runner di GitHub non riescono a raggiungere. Metti nel secret la stringa del Session pooler, e ripristina una copia prima di fidarti delle altre.","2026-10-05","HecxlvzDSRJT4io56fzLiLvUFhXMLXOHEwWGE0k3GyM",[814,821,827,833,839,845,850,856,862,868,874,880,885,891,892,897,902,908,914,919,925,931,937,943,949,955,961,967,972,978,984,990,996,1002,1008,1014,1020,1026,1032,1038,1044,1049,1055,1061,1067,1073,1079,1085,1091,1096,1102,1108,1114,1120,1125,1131,1137,1143,1148,1154],{"path":815,"title":816,"description":817,"published":818,"category":819,"image":820,"draft":770},"\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","Basi della sicurezza","\u002Fblog\u002Fbase44-security-scan\u002Fcard-800x500.png",{"path":822,"title":823,"description":824,"published":825,"category":819,"image":826,"draft":770},"\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":828,"title":829,"description":830,"published":831,"category":819,"image":832,"draft":770},"\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":834,"title":835,"description":836,"published":837,"category":819,"image":838,"draft":770},"\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":840,"title":841,"description":842,"published":843,"category":819,"image":844,"draft":770},"\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":846,"title":847,"description":848,"published":811,"category":819,"image":849,"draft":770},"\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":851,"title":852,"description":853,"published":854,"category":819,"image":855,"draft":770},"\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":857,"title":858,"description":859,"published":860,"category":819,"image":861,"draft":770},"\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":863,"title":864,"description":865,"published":866,"category":819,"image":867,"draft":770},"\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":869,"title":870,"description":871,"published":872,"category":819,"image":873,"draft":770},"\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":875,"title":876,"description":877,"published":878,"category":819,"image":879,"draft":770},"\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":228,"title":881,"description":882,"published":883,"category":819,"image":884,"draft":770},"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":886,"title":887,"description":888,"published":889,"category":766,"image":890,"draft":770},"\u002Fblog\u002Ftest-your-supabase-backup","Testa il tuo backup di Supabase prima del giorno in cui serve","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.","2026-09-28","\u002Fblog\u002Ftest-your-supabase-backup\u002Fcard-800x500.png",{"path":803,"title":5,"description":769,"published":804,"category":766,"image":790,"draft":770},{"path":54,"title":893,"description":894,"published":895,"category":766,"image":896,"draft":770},"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":898,"title":899,"description":900,"published":895,"category":819,"image":901,"draft":770},"\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":903,"title":904,"description":905,"published":906,"category":819,"image":907,"draft":770},"\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":909,"title":910,"description":911,"published":912,"category":819,"image":913,"draft":770},"\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":489,"title":915,"description":916,"published":917,"category":766,"image":918,"draft":770},"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":920,"title":921,"description":922,"published":923,"category":819,"image":924,"draft":770},"\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":926,"title":927,"description":928,"published":929,"category":819,"image":930,"draft":770},"\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":932,"title":933,"description":934,"published":935,"category":819,"image":936,"draft":770},"\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":938,"title":939,"description":940,"published":941,"category":819,"image":942,"draft":770},"\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":944,"title":945,"description":946,"published":947,"category":819,"image":948,"draft":770},"\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":950,"title":951,"description":952,"published":953,"category":819,"image":954,"draft":770},"\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":956,"title":957,"description":958,"published":959,"category":819,"image":960,"draft":770},"\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":962,"title":963,"description":964,"published":965,"category":819,"image":966,"draft":770},"\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":525,"title":968,"description":969,"published":970,"category":766,"image":971,"draft":770},"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":973,"title":974,"description":975,"published":976,"category":766,"image":977,"draft":770},"\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":979,"title":980,"description":981,"published":982,"category":766,"image":983,"draft":770},"\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":985,"title":986,"description":987,"published":988,"category":819,"image":989,"draft":770},"\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":991,"title":992,"description":993,"published":994,"category":819,"image":995,"draft":770},"\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":997,"title":998,"description":999,"published":1000,"category":819,"image":1001,"draft":770},"\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":1003,"title":1004,"description":1005,"published":1006,"category":819,"image":1007,"draft":770},"\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":1009,"title":1010,"description":1011,"published":1012,"category":819,"image":1013,"draft":770},"\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":1015,"title":1016,"description":1017,"published":1018,"category":819,"image":1019,"draft":770},"\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":1021,"title":1022,"description":1023,"published":1024,"category":819,"image":1025,"draft":770},"\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":1027,"title":1028,"description":1029,"published":1030,"category":819,"image":1031,"draft":770},"\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":1033,"title":1034,"description":1035,"published":1036,"category":819,"image":1037,"draft":770},"\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":1039,"title":1040,"description":1041,"published":1042,"category":819,"image":1043,"draft":770},"\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":747,"title":1045,"description":1046,"published":1047,"category":766,"image":1048,"draft":770},"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":1050,"title":1051,"description":1052,"published":1053,"category":819,"image":1054,"draft":770},"\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":1056,"title":1057,"description":1058,"published":1059,"category":766,"image":1060,"draft":770},"\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":1062,"title":1063,"description":1064,"published":1065,"category":819,"image":1066,"draft":770},"\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":1068,"title":1069,"description":1070,"published":1071,"category":819,"image":1072,"draft":770},"\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":1074,"title":1075,"description":1076,"published":1077,"category":819,"image":1078,"draft":770},"\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":1080,"title":1081,"description":1082,"published":1083,"category":819,"image":1084,"draft":770},"\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":1086,"title":1087,"description":1088,"published":1089,"category":766,"image":1090,"draft":770},"\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":587,"title":1092,"description":1093,"published":1094,"category":766,"image":1095,"draft":770},"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":1097,"title":1098,"description":1099,"published":1100,"category":819,"image":1101,"draft":770},"\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":1103,"title":1104,"description":1105,"published":1106,"category":819,"image":1107,"draft":770},"\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":1109,"title":1110,"description":1111,"published":1112,"category":766,"image":1113,"draft":770},"\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":1115,"title":1116,"description":1117,"published":1118,"category":819,"image":1119,"draft":770},"\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":1121,"title":1122,"description":1123,"published":1118,"category":819,"image":1124,"draft":770},"\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":1126,"title":1127,"description":1128,"published":1129,"category":819,"image":1130,"draft":770},"\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":1132,"title":1133,"description":1134,"published":1135,"category":766,"image":1136,"draft":770},"\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":1138,"title":1139,"description":1140,"published":1141,"category":819,"image":1142,"draft":770},"\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":1144,"title":1145,"description":1146,"published":1141,"category":766,"image":1147,"draft":770},"\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":1149,"title":1150,"description":1151,"published":1152,"category":766,"image":1153,"draft":770},"\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":1155,"title":1156,"description":1157,"published":1152,"category":819,"image":1158,"draft":770},"\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",1791618973712]