[{"data":1,"prerenderedAt":791},["ShallowReactive",2],{"blog-pt-supabase-storage-backup":3,"blog-index-pt":443},{"id":4,"title":5,"body":6,"category":398,"cover":399,"coverAlt":400,"description":401,"draft":402,"extension":403,"faq":404,"image":420,"keywords":421,"meta":431,"navigation":432,"ogTitle":433,"path":434,"published":435,"seo":436,"stem":437,"tldr":438,"updated":435,"__hash__":442},"blog_pt\u002Fblog\u002Fsupabase-storage-backup.md","Supabase storage backup: sua cópia do banco não tem nenhum arquivo",{"type":7,"value":8,"toc":386},"minimark",[9,13,21,24,29,45,53,61,65,68,82,88,91,95,98,107,110,116,124,137,141,144,147,166,176,193,206,213,217,220,226,238,243,246,269,275,279,282,288,291,295,319,323,326,331,363,371,378],[10,11,12],"p",{},"Você configurou backups para seu app do Lovable ou do Bolt, ou paga o plano do\nSupabase que os faz, e a palavra cumpriu seu papel: você parou de se preocupar.\nAí vem uma restauração, ou uma mudança para um projeto novo, e o app volta com\numa imagem quebrada onde antes ficava cada foto de perfil. Cada tabela e cada\nlinha estão lá. As fotos sumiram, junto com cada fatura, cada exportação e cada\nanexo que um usuário já enviou.",[10,14,15,16,20],{},"Aqui está a parte que a palavra backup esconde: ",[17,18,19],"strong",{},"um Supabase storage backup é\numa tarefa à parte, porque um backup do banco de dados contém uma linha para\ncada arquivo que seus usuários enviaram e nenhum dos arquivos."," A linha está no\nseu banco. O arquivo está no Storage, um serviço separado, e nenhuma cópia do\nbanco, em nenhum plano, chega lá. Este artigo mostra como fazer essa segunda\ncópia e em que ordem as duas metades voltam, que é a parte que dá errado mesmo\nquando você tem as duas.",[10,22,23],{},"Ajuda pensar numa biblioteca. O catálogo é uma gaveta de fichas, uma para cada\nlivro, e cada ficha diz em que prateleira o livro está. Os livros estão nas\nprateleiras. Um backup do banco copia a gaveta.",[25,26,28],"h2",{"id":27},"o-supabase-faz-backup-dos-meus-arquivos-do-storage","O Supabase faz backup dos meus arquivos do Storage?",[10,30,31,32,39,40,44],{},"Não, em nenhum plano. A\n",[33,34,38],"a",{"href":35,"rel":36},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fplatform\u002Fbackups",[37],"nofollow","documentação de backups","\ndo Supabase diz que os backups não contêm os arquivos guardados pela API do\nStorage, só os metadados deles no banco, e o\n",[33,41,43],{"href":42},"\u002Fblog\u002Fsupabase-point-in-time-recovery","point-in-time recovery"," é um recurso\ndo banco de dados, então a mesma frase cobre ele também.",[10,46,47,48,52],{},"O que todo backup contém, isso sim, é a lista. O Supabase mantém no seu banco\nPostgres uma tabela chamada ",[49,50,51],"code",{},"storage.objects",", com uma linha por arquivo em cada\nbucket: em que bucket ele está, o caminho, quem enviou, o tamanho e quando\nchegou. Essa tabela é copiada junto com todo o resto, e é exatamente por isso\nque um projeto restaurado parece tão completo. Cada ficha está na gaveta.",[10,54,55,56,60],{},"Os bytes de cada arquivo estão em outro lugar. Eles vivem no armazenamento de\nobjetos, um serviço separado ao lado do seu banco, e uma ferramenta que copia um\nbanco de dados nunca lê esse lugar. O\n",[33,57,59],{"href":58},"\u002Fblog\u002Fdoes-supabase-back-up-my-database","plano gratuito não faz nenhum backup automático",",\nentão ali a pergunta nem se coloca; do Pro para cima, a cópia diária tem suas\nlinhas e nenhum dos seus uploads.",[25,62,64],{"id":63},"onde-o-supabase-guarda-seus-arquivos","Onde o Supabase guarda seus arquivos",[10,66,67],{},"Em dois lugares, e um backup do banco alcança um deles.",[10,69,70,71,73,74,77,78,81],{},"Quando um usuário envia um avatar, seu app entrega o arquivo ao Storage. O\nStorage grava os bytes no armazenamento de objetos sob o nome do bucket e o\ncaminho, e na mesma operação escreve uma linha em ",[49,72,51],{}," que o\ndescreve. Seu app então guarda esse caminho numa das próprias tabelas, digamos\numa linha de ",[49,75,76],{},"profiles"," com uma coluna ",[49,79,80],{},"avatar_url",", e monta um link a partir\ndele sempre que a imagem é necessária.",[10,83,84,85,87],{},"Então uma imagem enviada é três coisas: os bytes no armazenamento de objetos, a\nlinha em ",[49,86,51],{}," que o Storage mantém, e o caminho na sua própria\ntabela. Um backup do banco carrega as duas últimas. Restaure-o e seu app tem\ncada caminho e o Storage tem cada linha, e o link que os dois montam juntos\naponta para um lugar onde não há nada.",[10,89,90],{},"É também por isso que a falha é tão silenciosa. Cada linha bate com todas as\noutras, cada contagem fecha, e cada verificação que lê o banco passa, inclusive\na etapa de verificação da maioria das ferramentas de backup, porque os arquivos\nnunca estiveram dentro daquilo que estava sendo verificado.",[25,92,94],{"id":93},"como-fica-uma-restauração-com-só-a-metade","Como fica uma restauração com só a metade",[10,96,97],{},"Um projeto que passa em toda verificação e mostra uma imagem quebrada em cada\nlugar onde um arquivo deveria aparecer.",[10,99,100,101,106],{},"A restauração informa sucesso porque fez o que lhe pediram: as tabelas voltaram\ne as contagens de linhas batem. Abra o painel e o Storage lista cada bucket e\ncada arquivo dentro dele, com tamanhos e datas, porque essa listagem é lida da\ntabela que a restauração recolocou. O próprio\n",[33,102,105],{"href":103,"rel":104},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fplatform\u002Fmigrating-within-supabase\u002Fdashboard-restore",[37],"guia do Supabase para restaurar um backup do painel num projeto novo","\ndescreve exatamente esse estado: os buckets e os metadados dos arquivos\naparecem, e os objetos por trás deles não.",[10,108,109],{},"O jeito como você descobre é corriqueiro. A página da equipe mostra uma fileira\nde ícones de imagem quebrada onde ficavam os avatares. Um cliente responde ao\ne-mail da fatura do mês passado dizendo que o link abre um erro. Alguém clica\nnum arquivo no navegador do Storage e o download falha. A ficha diz prateleira\nquatro, terceiro da esquerda, e a prateleira quatro está vazia.",[111,112],"diagram",{"alt":113,"caption":114,"src":115},"Uma cópia salva alimenta um contorno de projeto tracejado. Dentro dele, uma tabela de três linhas acesas está marcada com um visto, e cada linha está ligada por um traço fino a uma moldura de imagem desenhada tracejada e vazia. As molduras estão riscadas.","A restauração recolocou cada linha que descreve um arquivo. Os arquivos que essas linhas descrevem nunca estiveram na cópia.","\u002Fblog\u002Fsupabase-storage-backup\u002Fthe-list-came-back-1600x620.png",[10,117,118,119,123],{},"Nada avisa você antes desse momento, porque todo aviso que você tem está ligado\nao banco de dados.\n",[33,120,122],{"href":121},"\u002Fblog\u002Fhow-to-restore-a-supabase-backup","Como restaurar um backup do Supabase","\npercorre as cinco formas de uma restauração voltar quebrada, e os arquivos são\na linha daquela tabela sem conserto, a menos que você tenha feito uma cópia\ndeles.",[10,125,126,127,131,132,136],{},"Já que a página do Storage está aberta, vale saber o que ela mostra a um\nestranho. Nossa varredura gratuita lê seu app ao vivo de fora e pede a cada\nbucket a lista de arquivos usando nada além da chave que já está no código do\nseu app. Em agosto de 2026 ela recebeu uma lista de 792 dos 27.269 apps que\nconseguiu verificar, um número da\n",[33,128,130],{"href":129},"\u002Fresearch\u002Fvibe-coded-app-security-2026","nossa própria pesquisa",". Ela lê nomes\ne nunca baixa um arquivo, leva uns 20 segundos e não precisa de conta:\n",[33,133,135],{"href":134},"\u002Fsecurity-scanner","escaneie seu app",".",[25,138,140],{"id":139},"como-faço-backup-de-um-bucket-do-supabase-storage","Como faço backup de um bucket do Supabase Storage?",[10,142,143],{},"Pelo endpoint compatível com S3, com um único comando que copia um bucket\ninteiro para uma pasta que você guarda.",[10,145,146],{},"O Supabase Storage fala o protocolo S3, o que significa que as ferramentas\ncomuns feitas para o armazenamento da Amazon funcionam com o seu. Este é o\núnico passo deste artigo que acontece numa linha de comando, e vale fazê-lo uma\nvez à mão, para você saber do que a cópia é feita.",[148,149,150,154,157],"ol",{},[151,152,153],"li",{},"No seu painel do Supabase, abra as configurações do Storage e ative o\nprotocolo S3. A mesma página mostra a URL do endpoint e a região do seu\nprojeto; copie os dois de lá, e não daqui.",[151,155,156],{},"Nessa página, crie um par de chaves de acesso S3. O segredo aparece uma única\nvez, então guarde-o num gerenciador de senhas antes de fechar a janela.",[151,158,159,160,165],{},"Instale a ",[33,161,164],{"href":162,"rel":163},"https:\u002F\u002Faws.amazon.com\u002Fcli\u002F",[37],"linha de comando da AWS",", dê a ela\nas duas chaves como um perfil e rode uma sincronização por bucket:",[167,168,173],"pre",{"className":169,"code":171,"language":172},[170],"language-text","aws s3 sync s3:\u002F\u002Favatars .\u002Fsupabase-files\u002Favatars \\\n  --endpoint-url https:\u002F\u002F\u003Cproject-ref>.storage.supabase.co\u002Fstorage\u002Fv1\u002Fs3 \\\n  --region \u003Cregion>\n","text",[49,174,171],{"__ignoreMap":175},"",[10,177,178,179,182,183,188,189,192],{},"Rode de novo amanhã e ele copia só o que mudou. O ",[49,180,181],{},"rclone"," faz o mesmo trabalho\nse você preferir; num bucket grande, a\n",[33,184,187],{"href":185,"rel":186},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Ftroubleshooting\u002Frclone-error-s3-protocol-error-received-listing-v1-with-istruncated-set-no-nextmarker-and-no-contents-e64d34",[37],"nota de solução de problemas","\ndo Supabase manda passar ",[49,190,191],{},"--s3-list-version 2",", senão a listagem pode parar\nantes da hora.",[10,194,195,196,201,202,136],{},"Duas coisas sobre essa chave. A\n",[33,197,200],{"href":198,"rel":199},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fstorage\u002Fs3\u002Fauthentication",[37],"página de autenticação S3","\ndo Supabase diz que uma chave de acesso S3 tem acesso total a todos os buckets\ne passa por cima do Row Level Security, então o lugar dela é um servidor ou sua\nprópria máquina, e nunca seu app. E ela consegue escrever além de ler, porque o\nSupabase não emite nenhuma chave somente leitura para o Storage; quem a tiver\nconsegue apagar arquivos com a mesma facilidade com que os copia. Trate-a como\ntrataria\n",[33,203,205],{"href":204},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","sua chave service_role",[10,207,208,209,212],{},"Depois coloque a pasta em algum lugar fora da sua conta do Supabase, pelo\n",[33,210,211],{"href":58},"mesmo motivo pelo qual uma cópia do banco deveria viver fora dela",":\num projeto suspenso ou um login perdido leva junto cada cópia guardada dentro\ndaquela conta.",[25,214,216],{"id":215},"primeiro-os-arquivos-ou-primeiro-as-linhas","Primeiro os arquivos, ou primeiro as linhas?",[10,218,219],{},"Primeiro o banco de dados, depois os arquivos, e os arquivos voltam pelo\nStorage para que o Storage escreva as linhas.",[10,221,222,223,225],{},"Todo upload que passa pelo Storage, vindo do seu app, do endpoint S3 ou da CLI\ndo Supabase, faz duas coisas numa operação só: grava os bytes e escreve a linha\nde ",[49,224,51],{}," que os descreve. O livro vai para a prateleira e a ficha é\nescrita pela mesma mão. Recoloque os arquivos por esse caminho e as linhas\nchegam com eles, e os dois não conseguem divergir.",[10,227,228,229,231,232,237],{},"A outra direção não tem mecanismo nenhum desse tipo. Copiar linhas de\n",[49,230,51],{}," de volta com uma ferramenta de banco escreve fichas e não\ncoloca nada na prateleira. Também atrapalha o passo seguinte: por padrão, o\nStorage recusa um upload para um caminho que já tem linha, com um erro dizendo\nque o recurso já existe, e o\n",[33,233,236],{"href":234,"rel":235},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fstorage\u002Fuploads",[37],"guia de uploads"," do Supabase\ndiz que isso se resolve ligando a sobrescrita. Então, quando a restauração do\nbanco já trouxe as linhas de volta, que é o que o próprio guia de migração do\nSupabase manda fazer, a cópia de arquivos que vem depois precisa ter permissão\npara sobrescrever.",[111,239],{"alt":240,"caption":241,"src":242},"Duas pistas. Na de cima, uma cópia salva entra direto num banco de dados e acende três linhas, enquanto um recipiente desenhado sob a seta continua tracejado e vazio, e a pista está riscada. Na de baixo, três imagens entram primeiro no recipiente, uma seta segue do recipiente para o banco de dados, e as mesmas três linhas acendem conforme as imagens chegam. A pista de baixo está marcada com um visto.","Um arquivo que chega pelo Storage escreve a própria linha. Uma linha que chega pelo banco de dados não traz arquivo nenhum consigo.","\u002Fblog\u002Fsupabase-storage-backup\u002Fthrough-storage-or-around-it-1600x620.png",[10,244,245],{},"A ordem, então:",[148,247,248,255,266],{},[151,249,250,251,254],{},"Restaure o banco de dados, como\n",[33,252,253],{"href":121},"aquele artigo"," descreve.",[151,256,257,258,261,262,265],{},"Copie os arquivos de volta pelo Storage, com o ",[49,259,260],{},"aws s3 sync"," rodado ao\ncontrário (primeiro a pasta, depois o bucket) ou com\n",[49,263,264],{},"supabase storage cp -r",", e com a sobrescrita ligada. Um bucket que não\nexiste mais precisa ser criado antes, com o mesmo nome e a mesma\nconfiguração de público.",[151,267,268],{},"Abra um arquivo, e depois vários outros.",[10,270,271,272,274],{},"A versão mais limpa disso pula por completo a reprodução de ",[49,273,51],{},"\nna etapa do banco e deixa os uploads escreverem cada linha do zero, de modo que\nnada precise ser sobrescrito nunca. É assim que a nossa própria restauração\nfaz. Isso exige filtrar a cópia antes de reproduzi-la, o que é um passo para a\nferramenta que executa a restauração.",[25,276,278],{"id":277},"como-conferir-que-você-tem-os-dois","Como conferir que você tem os dois",[10,280,281],{},"Abrindo arquivos, porque toda lista que você consegue puxar é lida da tabela.",[10,283,284,285,287],{},"O navegador de arquivos do painel, uma consulta em ",[49,286,51],{}," e a\ncontagem de linhas num relatório de backup descrevem todos a gaveta, e depois de\numa restauração só do banco a gaveta está perfeita. O único pedido que toca a\nprateleira é um pedido pelo arquivo em si.",[10,289,290],{},"Então, depois de uma restauração, e depois da primeira cópia que você fizer,\nabra arquivos. Pegue um punhado de cada bucket, incluindo os mais antigos, e\nabra-os pelo app do jeito que um usuário faria. Um arquivo que abre voltou. Um\narquivo que dá erro nunca esteve lá, diga o que disser a lista.",[25,292,294],{"id":293},"o-que-fazer-esta-semana","O que fazer esta semana",[296,297,298],"key-takeaways",{},[299,300,301,304,310,313,316],"ul",{},[151,302,303],{},"Abra o Storage no seu painel do Supabase e anote cada bucket e, mais ou menos, o que há nele. Tudo o que um usuário enviou vive ali e em nenhum backup do banco.",[151,305,306,307,309],{},"Ative o protocolo S3, crie uma chave de acesso e rode um ",[49,308,260],{}," por bucket para uma pasta fora da sua conta do Supabase. Guarde o segredo num gerenciador de senhas; ele apaga com a mesma facilidade com que copia.",[151,311,312],{},"Rode a sincronização de novo numa cadência que você vai cumprir, seja um lembrete no calendário ou um job num servidor.",[151,314,315],{},"Anote a ordem de restauração em algum lugar onde vai encontrá-la: primeiro o banco, depois os arquivos pelo Storage com a sobrescrita ligada.",[151,317,318],{},"Restaure uma vez num projeto descartável e abra dez arquivos, para que a primeira vez que você descobre se a cópia funciona não seja durante uma queda.",[25,320,322],{"id":321},"onde-o-reeve-care-entra","Onde o Reeve Care entra",[10,324,325],{},"O Care copia os arquivos junto com o banco de dados, na ordem que este artigo\ndescreve, e os recoloca do mesmo jeito.",[111,327],{"alt":328,"caption":329,"src":330},"Um painel do Reeve Care com duas fileiras. Na primeira, um banco de dados e uma imagem ficam dentro de um contorno de conta tracejado. O banco sai dele como um arquivo salvo que é trancado, relido por uma lupa e marcado com um visto, numerado um, e só então a imagem sai como um segundo arquivo salvo, numerado dois. Na segunda fileira, um cartão com um botão manda uma cópia de volta para a conta, numerada um, e uma segunda cópia ao longo de uma seta que atravessa um recipiente no caminho, numerada dois.","A cópia do banco é relida e aprovada antes de os arquivos serem copiados. Na volta, o banco vai primeiro, e os arquivos retornam pelo Storage.","\u002Fblog\u002Fsupabase-storage-backup\u002Fcare-database-then-files-1600x560.png",[299,332,333,339,345,351,357],{},[151,334,335,338],{},[17,336,337],{},"Os arquivos que seus usuários enviaram também são copiados",", assim que você conecta os buckets do Storage do seu app do Supabase. É uma segunda chave, pedida separadamente, porque a chave que o Supabase emite para o Storage consegue escrever além de ler, e preferimos pedir a juntá-la com a chave do banco, que não consegue.",[151,340,341,344],{},[17,342,343],{},"A cópia dos arquivos roda depois que a cópia do banco foi relida e verificada",", nunca ao lado, de modo que um ponto de restauração nunca reivindica arquivos que não copiou. Uma cópia que ficou sem tempo é marcada como parcial, com as contagens reais.",[151,346,347,350],{},[17,348,349],{},"Cada ponto de restauração registra qual caminho guardava qual arquivo."," Um banco devolvido a terça-feira recebe os arquivos de terça, e um arquivo que ainda está no lugar é deixado em paz.",[151,352,353,356],{},[17,354,355],{},"A restauração recoloca os arquivos pelo Storage",", de modo que cada linha é escrita pelo upload que carrega o arquivo. Nada do que existe hoje é sobrescrito ou apagado, o que significa que apertar o botão em pânico não consegue destruir aquilo que você estava tentando salvar.",[151,358,359,362],{},[17,360,361],{},"Restaurar é um botão",", e ele tira um instantâneo do estado atual antes de começar, de modo que a própria restauração tem um desfazer.",[10,364,365,366,370],{},"O Care começa em $49 por mês para um app. É um preço de tabela, e a\n",[33,367,369],{"href":368},"\u002Fpricing","página de preços"," às vezes fica abaixo do valor daqui e nunca acima.",[10,372,373,374,136],{},"Como uma cópia é feita, conferida e recolocada, arquivos incluídos, está\ndesenhado passo a passo na\n",[33,375,377],{"href":376},"\u002Fsupabase-backups","página de backups do Supabase",[10,379,380,381,385],{},"Antes de fechar esta aba, abra o Storage no seu painel e conte os buckets. Cada\num é um conjunto de arquivos que nenhum backup feito pelo Supabase vai conter\njamais, e o comando de sincronização acima é tudo o que é preciso para mudar\nisso. Se um bucket também se mostrou listável,\n",[33,382,384],{"href":383},"\u002Fblog\u002Fsupabase-storage-bucket-public","o que um estranho tira dessa lista"," é a\npróxima coisa a ler.",{"title":175,"searchDepth":387,"depth":387,"links":388},3,[389,391,392,393,394,395,396,397],{"id":27,"depth":390,"text":28},2,{"id":63,"depth":390,"text":64},{"id":93,"depth":390,"text":94},{"id":139,"depth":390,"text":140},{"id":215,"depth":390,"text":216},{"id":277,"depth":390,"text":278},{"id":293,"depth":390,"text":294},{"id":321,"depth":390,"text":322},"Backups","\u002Fblog\u002Fsupabase-storage-backup\u002Fcover-1200x630.png","Um banco de dados com três linhas, cada uma ligada por um traço fino a uma imagem colocada numa bandeja separada ao lado.","Um Supabase storage backup é uma tarefa à parte. Os backups do banco guardam a lista dos seus arquivos e nenhum deles, então cada upload fica quebrado.",false,"md",[405,408,411,414,417],{"q":406,"a":407},"O Supabase faz backup dos meus buckets do Storage?","Não. O Supabase diz isso na própria página de backups: os backups do banco de dados não contêm os arquivos guardados pela API do Storage, só as linhas do banco que os descrevem. Isso vale para os backups diários dos planos pagos e para o point-in-time recovery. O plano gratuito não faz nenhum backup automático, então ali a pergunta nem se coloca. Seus arquivos precisam de uma cópia própria em qualquer plano.",{"q":409,"a":410},"O point-in-time recovery cobre o Supabase Storage?","Não. O point-in-time recovery rebobina o banco de dados, e o Storage é um serviço separado do qual o banco guarda apenas caminhos. Um projeto rebobinado para terça-feira aponta para o que está nos buckets hoje, e um arquivo apagado na quarta continua apagado depois de uma recuperação que funcionou perfeitamente.",{"q":412,"a":413},"Como baixo todos os arquivos de um bucket do Supabase?","Pelo endpoint compatível com S3. Ative o protocolo S3 nas configurações do Storage no seu painel, crie um par de chaves de acesso e aponte a linha de comando da AWS ou o rclone para o endpoint e a região impressos na mesma página. Um único comando de sincronização copia um bucket inteiro para uma pasta que você guarda. O painel baixa um arquivo por vez, o que serve para um logo e não leva a nada com um bucket.",{"q":415,"a":416},"O que é storage.objects?","Uma tabela no seu banco Postgres com uma linha para cada arquivo de cada bucket: em que bucket ele está, o caminho, quem enviou, tamanho e tipo, e quando chegou. É o índice. Os bytes do arquivo não estão nela, e é por isso que um backup do banco consegue listar cada arquivo que você tem sem conter nenhum deles.",{"q":418,"a":419},"Se eu restaurar meu banco de dados, meus arquivos voltam?","Não. A restauração traz de volta as linhas de storage.objects, então o painel lista cada arquivo e seu app desenha cada link, e cada um abre um erro porque o arquivo por trás nunca esteve na cópia. Os arquivos precisam ser recolocados separadamente, pelo Storage, a partir de uma cópia que você fez deles.","\u002Fblog\u002Fsupabase-storage-backup\u002Fcard-800x500.png",[422,423,424,425,426,427,428,429,430],"supabase storage backup","backup de bucket do supabase storage","supabase faz backup do storage","supabase storage objects backup","backup de arquivos supabase","restaurar supabase storage","supabase s3 storage backup","baixar todos os arquivos de um bucket supabase","supabase storage disaster recovery",{},true,"Supabase storage backup: sua cópia não tem nenhum arquivo","\u002Fblog\u002Fsupabase-storage-backup","2026-09-14",{"title":5,"description":401},"blog\u002Fsupabase-storage-backup",[439,440,441],"Um Supabase storage backup é uma tarefa separada do backup do banco de dados. Cada backup que o Supabase faz, em qualquer plano, contém a linha que descreve cada arquivo enviado e nenhum dos arquivos em si.","Restaure só o banco de dados e você terá um app que funciona, em que cada avatar, fatura e upload abre um erro, porque o arquivo para o qual ele aponta nunca esteve na cópia.","O endpoint compatível com S3 é o jeito de copiar os arquivos para fora. O caminho de volta passa pelo próprio Storage, que escreve a linha correspondente conforme cada arquivo chega, de modo que a lista e os arquivos não conseguem divergir.","2uukeDp0IQMmueWr15UGEhCgEGhHvDbR3YCvXcYEhL0",[444,451,457,463,469,475,481,487,493,499,505,511,517,523,529,535,540,546,552,558,564,570,576,582,588,594,600,606,607,612,618,624,630,636,642,648,654,660,666,672,678,684,690,696,702,708,714,720,726,731,736,742,748,754,759,765,770,776,781,787],{"path":445,"title":446,"description":447,"published":448,"category":449,"image":450,"draft":402},"\u002Fblog\u002Fbase44-security-scan","Scan de segurança do Base44: o que só ele enxerga","O scan de segurança do Base44 verifica sete tipos de problema por dentro. Esta é a metade que ele lê e mais ninguém, e a metade que ele nunca olha.","2026-10-10","Noções de segurança","\u002Fblog\u002Fbase44-security-scan\u002Fcard-800x500.png",{"path":452,"title":453,"description":454,"published":455,"category":449,"image":456,"draft":402},"\u002Fblog\u002Fapi-key-leaked-what-to-do","Sua chave de API vazou. A ordem em que agir","Uma chave de API vazou e você não sabe o que fazer primeiro. Nem toda chave no seu frontend é um vazamento, e a ordem importa mais que a pressa.","2026-10-09","\u002Fblog\u002Fapi-key-leaked-what-to-do\u002Fcard-800x500.png",{"path":458,"title":459,"description":460,"published":461,"category":449,"image":462,"draft":402},"\u002Fblog\u002Finfinite-recursion-in-policy-for-relation","\"Infinite recursion detected in policy\" sem desligar o RLS","\"Infinite recursion detected in policy for relation\" significa que a sua policy perguntou à tabela que ela protege. Veja como quebrar o círculo.","2026-10-08","\u002Fblog\u002Finfinite-recursion-in-policy-for-relation\u002Fcard-800x500.png",{"path":464,"title":465,"description":466,"published":467,"category":449,"image":468,"draft":402},"\u002Fblog\u002Fno-api-key-found-in-request","\"No API key found in request\" no Supabase, e a correção errada","\"No API key found in request\" significa que sua requisição chegou ao Supabase sem chave. Quase toda resposta aponta para as regras do seu banco.","2026-10-07","\u002Fblog\u002Fno-api-key-found-in-request\u002Fcard-800x500.png",{"path":470,"title":471,"description":472,"published":473,"category":449,"image":474,"draft":402},"\u002Fblog\u002Fis-base44-safe","O Base44 é seguro? O que vimos em 5.442 apps Base44","O Base44 é seguro? Rodamos nove verificações em 5.442 apps Base44 no ar. Quase todas tiraram B por motivos que o dono nunca escolheu.","2026-10-06","\u002Fblog\u002Fis-base44-safe\u002Fcard-800x500.png",{"path":476,"title":477,"description":478,"published":479,"category":449,"image":480,"draft":402},"\u002Fblog\u002Fmove-a-secret-to-an-edge-function","Esconder uma chave de API: mova para uma Edge Function do Supabase","Esconder uma chave de API é tirá-la do navegador, e uma Edge Function do Supabase é o menor lugar para guardá-la. Dois passos em volta pesam mais.","2026-10-05","\u002Fblog\u002Fmove-a-secret-to-an-edge-function\u002Fcard-800x500.png",{"path":482,"title":483,"description":484,"published":485,"category":449,"image":486,"draft":402},"\u002Fblog\u002Fenv-file-exposed-on-your-server","Seu arquivo .env está exposto? Os doze caminhos para testar","Seu arquivo .env está exposto no seu próprio servidor web? Doze endereços dizem isso em um minuto, e um acerto significa que tudo nele já é público.","2026-10-04","\u002Fblog\u002Fenv-file-exposed-on-your-server\u002Fcard-800x500.png",{"path":488,"title":489,"description":490,"published":491,"category":449,"image":492,"draft":402},"\u002Fblog\u002Fis-v0-safe","Segurança do v0: os 1.790 aplicativos v0 escaneados tiraram A","A segurança do v0 medida em 1.790 aplicativos v0 no ar: todos tiraram A. Só 17 citavam um banco de dados, e é sobretudo isso que esse A mede.","2026-10-03","\u002Fblog\u002Fis-v0-safe\u002Fcard-800x500.png",{"path":494,"title":495,"description":496,"published":497,"category":449,"image":498,"draft":402},"\u002Fblog\u002Fis-bolt-safe","O Bolt é seguro? O que vimos em 1.123 aplicativos Bolt","O Bolt é seguro? Passamos 1.123 aplicativos Bolt no ar por nove verificações. A hospedagem saiu limpa. Os achados: chaves e tabelas abertas nos aplicativos.","2026-10-02","\u002Fblog\u002Fis-bolt-safe\u002Fcard-800x500.png",{"path":500,"title":501,"description":502,"published":503,"category":449,"image":504,"draft":402},"\u002Fblog\u002Fis-supabase-down-or-your-app","O Supabase caiu ou o problema é o seu app? Como saber","O Supabase caiu ou o problema é o seu app? Um projeto pausado, um banco cheio e um erro seu parecem iguais. Quatro verificações separam os casos.","2026-10-01","\u002Fblog\u002Fis-supabase-down-or-your-app\u002Fcard-800x500.png",{"path":506,"title":507,"description":508,"published":509,"category":449,"image":510,"draft":402},"\u002Fblog\u002Fdoes-supabase-encrypt-my-data","O Supabase criptografa meus dados? Sim. Veja o que isso impede","O Supabase criptografa os dados? Sim: AES-256 em repouso, TLS em trânsito, SOC 2 e ISO 27001. O que cada um cobre, e o vazamento que nenhum deles impede.","2026-09-30","\u002Fblog\u002Fdoes-supabase-encrypt-my-data\u002Fcard-800x500.png",{"path":512,"title":513,"description":514,"published":515,"category":449,"image":516,"draft":402},"\u002Fblog\u002Fsupabase-free-plan-limits","Quanto custa o Supabase? Os limites do plano gratuito","Quanto custa o Supabase: o plano gratuito tem 500 MB de banco, 5 GB de egress e nenhum backup. O que acontece em cada limite e o que o Pro de $25 muda.","2026-09-29","\u002Fblog\u002Fsupabase-free-plan-limits\u002Fcard-800x500.png",{"path":518,"title":519,"description":520,"published":521,"category":398,"image":522,"draft":402},"\u002Fblog\u002Ftest-your-supabase-backup","Teste o backup do seu Supabase antes do dia em que precisar","Como testar o backup do seu Supabase: restaurar num projeto de teste, contar as linhas, entrar e procurar a linha que falta num arquivo cortado.","2026-09-28","\u002Fblog\u002Ftest-your-supabase-backup\u002Fcard-800x500.png",{"path":524,"title":525,"description":526,"published":527,"category":398,"image":528,"draft":402},"\u002Fblog\u002Fsupabase-backup-github-action","Backup grátis do Supabase com uma GitHub Action, e a pegadinha","Um backup do Supabase com GitHub Action é grátis e serve para muitos apps. O workflow, a connection string certa e o egress de cada execução.","2026-09-27","\u002Fblog\u002Fsupabase-backup-github-action\u002Fcard-800x500.png",{"path":530,"title":531,"description":532,"published":533,"category":398,"image":534,"draft":402},"\u002Fblog\u002Fdownload-your-supabase-backup","Por que você não consegue baixar seu backup do Supabase","Você não consegue baixar seu backup do Supabase num projeto atual, porque a cópia diária é um snapshot físico. Como conferir e como ter uma cópia só sua.","2026-09-26","\u002Fblog\u002Fdownload-your-supabase-backup\u002Fcard-800x500.png",{"path":536,"title":537,"description":538,"published":533,"category":449,"image":539,"draft":402},"\u002Fblog\u002Fsupabase-permission-denied-for-table","Supabase \"permission denied for table\": o grant que falta","A partir de 30 de outubro, uma tabela nova no Supabase responde \"permission denied for table\" até receber um grant. O e-mail mostra só metade.","\u002Fblog\u002Fsupabase-permission-denied-for-table\u002Fcard-800x500.png",{"path":541,"title":542,"description":543,"published":544,"category":449,"image":545,"draft":402},"\u002Fblog\u002Fopen-api-endpoint-exposed","Um endpoint de API aberto é um problema? Leia o JSON","Seu scan apontou um endpoint de API aberto. Se isso importa depende do que voltou, e a maioria dos que encontramos era da própria plataforma.","2026-09-25","\u002Fblog\u002Fopen-api-endpoint-exposed\u002Fcard-800x500.png",{"path":547,"title":548,"description":549,"published":550,"category":449,"image":551,"draft":402},"\u002Fblog\u002Flovable-security-scan","Escaneamento de segurança do Lovable: o que ele não prova","Escaneamento de segurança do Lovable: o que o Quick scan e o Deep scan checam, quando cada um roda, e a única coisa que nenhum escaneamento por dentro prova.","2026-09-24","\u002Fblog\u002Flovable-security-scan\u002Fcard-800x500.png",{"path":553,"title":554,"description":555,"published":556,"category":398,"image":557,"draft":402},"\u002Fblog\u002Fsupabase-backup-auth-users","Por que seu dump do Supabase não tem usuários dentro","Rode supabase db dump sozinho e você recebe a forma do seu banco e nenhuma das linhas dele, sem o schema auth onde seus usuários moram.","2026-09-23","\u002Fblog\u002Fsupabase-backup-auth-users\u002Fcard-800x500.png",{"path":559,"title":560,"description":561,"published":562,"category":449,"image":563,"draft":402},"\u002Fblog\u002Fdomain-and-certificate-expiry","Domínio expirado, site fora do ar: o que acontece agora","Seu domínio expirou e seu site está fora do ar. O relógio que começa a correr, por que o certificado é o problema menor, e como conferir os dois.","2026-09-22","\u002Fblog\u002Fdomain-and-certificate-expiry\u002Fcard-800x500.png",{"path":565,"title":566,"description":567,"published":568,"category":449,"image":569,"draft":402},"\u002Fblog\u002Fis-lovable-safe","O Lovable é seguro? O que vimos em 18.554 aplicativos Lovable","O Lovable é seguro? Passamos 18.554 aplicativos Lovable no ar por nove verificações. A plataforma foi a mais limpa de cinco. Os achados estavam nos aplicativos.","2026-09-21","\u002Fblog\u002Fis-lovable-safe\u002Fcard-800x500.png",{"path":571,"title":572,"description":573,"published":574,"category":449,"image":575,"draft":402},"\u002Fblog\u002Fvibe-coded-app-security-checklist","O checklist de segurança do vibe coding, em nove verificações","Um checklist de segurança do vibe coding com nove itens, cada um verificável no seu app de fora por qualquer pessoa, e cada um com um teste de uma linha.","2026-09-20","\u002Fblog\u002Fvibe-coded-app-security-checklist\u002Fcard-800x500.png",{"path":577,"title":578,"description":579,"published":580,"category":449,"image":581,"draft":402},"\u002Fblog\u002Fstripe-secret-key-in-frontend","Uma chave secreta da Stripe no frontend pode mover dinheiro","Uma chave secreta da Stripe exposta no seu frontend pode reembolsar, cobrar e ler cada ficha de cliente que você tem. Sua chave pk_live_ é que deve estar aí.","2026-09-19","\u002Fblog\u002Fstripe-secret-key-in-frontend\u002Fcard-800x500.png",{"path":583,"title":584,"description":585,"published":586,"category":449,"image":587,"draft":402},"\u002Fblog\u002Fvite-and-next-public-env-vars","Variáveis de ambiente do Vite expostas: o prefixo diz publique isto","Variáveis de ambiente do Vite expostas no seu app: fizeram o que o prefixo pediu. VITE_ e NEXT_PUBLIC_ significam publique isto, e a IA nunca soube o custo.","2026-09-18","\u002Fblog\u002Fvite-and-next-public-env-vars\u002Fcard-800x500.png",{"path":589,"title":590,"description":591,"published":592,"category":449,"image":593,"draft":402},"\u002Fblog\u002Fbase44-source-maps","Segurança no Base44: o que um scan aponta e o que é seu para corrigir","Segurança no Base44 em 5.438 apps escaneados: três achados em quase todos são da plataforma, o source map é o selo do Base44, e a sua parte é uma lista curta.","2026-09-17","\u002Fblog\u002Fbase44-source-maps\u002Fcard-800x500.png",{"path":595,"title":596,"description":597,"published":598,"category":449,"image":599,"draft":402},"\u002Fblog\u002Fis-cursor-ai-safe","O Cursor AI é seguro? O editor, o código e o app que você publicou","O Cursor AI é seguro? Três perguntas em uma busca: o que o Cursor guarda, o que o código que ele escreve erra, e se o app que você publicou está aberto.","2026-09-16","\u002Fblog\u002Fis-cursor-ai-safe\u002Fcard-800x500.png",{"path":601,"title":602,"description":603,"published":604,"category":449,"image":605,"draft":402},"\u002Fblog\u002Fis-replit-safe","O Replit é seguro? O que vimos em 3.042 aplicativos Replit no ar","O Replit é seguro? Passamos 3.042 aplicativos Replit no ar por nove verificações externas. Os achados estavam no aplicativo publicado, não no host.","2026-09-15","\u002Fblog\u002Fis-replit-safe\u002Fcard-800x500.png",{"path":434,"title":5,"description":401,"published":435,"category":398,"image":420,"draft":402},{"path":42,"title":608,"description":609,"published":610,"category":398,"image":611,"draft":402},"Point-in-time recovery do Supabase: preço e limites","O point-in-time recovery do Supabase rebobina seu banco para qualquer segundo da última semana. Custa $100 por mês além do Pro e cobre só o banco.","2026-09-13","\u002Fblog\u002Fsupabase-point-in-time-recovery\u002Fcard-800x500.png",{"path":613,"title":614,"description":615,"published":616,"category":398,"image":617,"draft":402},"\u002Fblog\u002Fsupabase-project-paused-recover","Projeto Supabase pausado? Seus dados continuam lá","O Supabase pausou seu projeto depois de uma semana sem atividade. Nada foi apagado, Restaurar fica ao lado do nome e você tem um ano antes disso mudar.","2026-09-12","\u002Fblog\u002Fsupabase-project-paused-recover\u002Fcard-800x500.png",{"path":619,"title":620,"description":621,"published":622,"category":449,"image":623,"draft":402},"\u002Fblog\u002Fsafest-ai-app-builder","Qual builder de apps com IA é mais seguro? 30.998 apps testados","Qual builder de apps com IA é mais seguro? Escaneamos 30.998 apps no ar do Lovable, Base44, Replit, v0 e Bolt. O builder não é o que decide sua nota.","2026-09-11","\u002Fblog\u002Fsafest-ai-app-builder\u002Fcard-800x500.png",{"path":625,"title":626,"description":627,"published":628,"category":449,"image":629,"draft":402},"\u002Fblog\u002Fenable-rls-on-every-supabase-table","Ative Row Level Security em toda tabela do Supabase e comprove","Ativar Row Level Security no Supabase sem política fecha a tabela por completo. Uma política sem a chave ligada não faz nada. Aqui está o SQL, e o teste.","2026-09-10","\u002Fblog\u002Fenable-rls-on-every-supabase-table\u002Fcard-800x500.png",{"path":631,"title":632,"description":633,"published":634,"category":449,"image":635,"draft":402},"\u002Fblog\u002Fsupabase-rls-disabled-in-public","Supabase \"RLS disabled in public\": o que o aviso não vê","O Supabase marca \"RLS disabled in public\" como erro. Ele não diz nada sobre a política de leitura que deixa a sua tabela igualmente aberta.","2026-09-09","\u002Fblog\u002Fsupabase-rls-disabled-in-public\u002Fcard-800x500.png",{"path":637,"title":638,"description":639,"published":640,"category":449,"image":641,"draft":402},"\u002Fblog\u002Frotate-supabase-service-role-key","Como rotacionar uma chave service_role do Supabase vazada","O Supabase manda fechar o vazamento primeiro. Outros guias mandam rotacionar agora. O que vale depende de para onde a sua chave service_role vazou.","2026-09-08","\u002Fblog\u002Frotate-supabase-service-role-key\u002Fcard-800x500.png",{"path":643,"title":644,"description":645,"published":646,"category":449,"image":647,"draft":402},"\u002Fblog\u002Fvibe-coding-security-scanners-compared","Scanners de segurança para vibe coding comparados, o nosso incluído","O melhor scanner de segurança para vibe coding depende de três perguntas que nenhuma lista de recursos responde. Dez ferramentas comparadas, com preços.","2026-09-07","\u002Fblog\u002Fvibe-coding-security-scanners-compared\u002Fcard-800x500.png",{"path":649,"title":650,"description":651,"published":652,"category":449,"image":653,"draft":402},"\u002Fblog\u002Fsupabase-security-checker","Supabase security checker: faça você mesmo as cinco verificações","Um Supabase security checker lê o seu app publicado em vez das configurações do projeto. Aqui estão as cinco verificações e como fazer cada uma sozinho.","2026-09-06","\u002Fblog\u002Fsupabase-security-checker\u002Fcard-800x500.png",{"path":655,"title":656,"description":657,"published":658,"category":449,"image":659,"draft":402},"\u002Fblog\u002Fvibe-coding-security-scanner","Scanner de segurança para vibe coding: o que ele não vê","Um scanner de segurança para vibe coding lê seu app no ar, de fora. O que isso cobre, as quatro coisas que ele não consegue ver e como ler o resultado.","2026-09-05","\u002Fblog\u002Fvibe-coding-security-scanner\u002Fcard-800x500.png",{"path":661,"title":662,"description":663,"published":664,"category":449,"image":665,"draft":402},"\u002Fblog\u002Fmissing-security-headers","Cabeçalhos de segurança faltando: quando isso importa","Cabeçalhos de segurança faltando é o achado que nosso scanner mais imprime. Contra o que eles protegem e quando são a linha menos urgente do relatório.","2026-09-04","\u002Fblog\u002Fmissing-security-headers\u002Fcard-800x500.png",{"path":667,"title":668,"description":669,"published":670,"category":449,"image":671,"draft":402},"\u002Fblog\u002Fopenai-api-key-exposed-in-frontend","Sua chave de API da OpenAI está exposta no frontend. Troque-a.","Uma chave de API da OpenAI exposta no frontend não pode ser presa a um domínio. Troque-a hoje, mova a chamada para o seu servidor e limite o gasto.","2026-09-03","\u002Fblog\u002Fopenai-api-key-exposed-in-frontend\u002Fcard-800x500.png",{"path":673,"title":674,"description":675,"published":676,"category":449,"image":677,"draft":402},"\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps","Chave de API exposta no frontend: o que 30.998 apps entregam","Uma chave de API exposta no seu frontend costuma ser uma chave do Google Maps. Escaneamos 30.998 apps vibe-coded e contamos quais segredos vazam de verdade.","2026-09-02","\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps\u002Fcard-800x500.png",{"path":679,"title":680,"description":681,"published":682,"category":398,"image":683,"draft":402},"\u002Fblog\u002Fsupabase-backup-tools-compared","Ferramentas de backup do Supabase comparadas, a nossa incluída","Quatro tipos de ferramenta de backup do Supabase, o que cada uma copia de verdade e quando uma GitHub Action gratuita ganha de pagar, nós inclusive.","2026-09-01","\u002Fblog\u002Fsupabase-backup-tools-compared\u002Fcard-800x500.png",{"path":685,"title":686,"description":687,"published":688,"category":449,"image":689,"draft":402},"\u002Fblog\u002Freplit-secrets-explained","Como usar secrets no Replit, e o que ainda assim é publicado","Como usar secrets no Replit: adicionar um, ler de volta e resolver as duas causas do undefined. E as chaves que a ferramenta Secrets não consegue proteger.","2026-08-31","\u002Fblog\u002Freplit-secrets-explained\u002Fcard-800x500.png",{"path":691,"title":692,"description":693,"published":694,"category":398,"image":695,"draft":402},"\u002Fblog\u002Fback-up-supabase-free-tier","Backups do plano gratuito do Supabase: como fazer sem terminal","No plano gratuito do Supabase não existe backup nenhum: a cópia é você que faz. Como fazer uma pelo painel e o que a rota do CSV deixa para trás.","2026-08-30","\u002Fblog\u002Fback-up-supabase-free-tier\u002Fcard-800x500.png",{"path":697,"title":698,"description":699,"published":700,"category":449,"image":701,"draft":402},"\u002Fblog\u002Fis-supabase-secure","O Supabase é seguro? É. Seu projeto é outra pergunta","O Supabase é seguro? A plataforma é auditada, criptografada e passa por pentests. A documentação deles diz onde isso termina e começam suas configurações.","2026-08-29","\u002Fblog\u002Fis-supabase-secure\u002Fcard-800x500.png",{"path":703,"title":704,"description":705,"published":706,"category":449,"image":707,"draft":402},"\u002Fblog\u002Fwhere-to-find-supabase-api-keys","Onde ficam as chaves de API do Supabase: anon, service_role e URL","A URL do projeto, a chave anon e a chave service_role ficam todas numa página do painel. Aqui está onde ela fica, e qual dos quatro valores vai no seu app.","2026-08-28","\u002Fblog\u002Fwhere-to-find-supabase-api-keys\u002Fcard-800x500.png",{"path":709,"title":710,"description":711,"published":712,"category":449,"image":713,"draft":402},"\u002Fblog\u002Fnew-row-violates-row-level-security-policy","New row violates row-level security policy no Supabase. E agora?","\"New row violates row-level security policy\" significa que o Supabase recusou uma escrita. O conserto rápido reabre a tabela para qualquer um.","2026-08-27","\u002Fblog\u002Fnew-row-violates-row-level-security-policy\u002Fcard-800x500.png",{"path":715,"title":716,"description":717,"published":718,"category":449,"image":719,"draft":402},"\u002Fblog\u002Fcors-wildcard-security-risk","Um curinga CORS é um risco de segurança? Quase nunca.","Um curinga CORS é um risco de segurança? Em geral é o padrão do seu builder e não entrega nada que o seu servidor já não desse a qualquer um que pedisse.","2026-08-26","\u002Fblog\u002Fcors-wildcard-security-risk\u002Fcard-800x500.png",{"path":721,"title":722,"description":723,"published":724,"category":398,"image":725,"draft":402},"\u002Fblog\u002Fsupabase-branching-is-not-a-backup","Branching do Supabase não é backup. Ele só anda para a frente.","Por que o branching do Supabase não é backup: um branch começa sem os seus dados e um merge só leva o esquema. Para que ele serve e o que usar no lugar.","2026-08-25","\u002Fblog\u002Fsupabase-branching-is-not-a-backup\u002Fcard-800x500.png",{"path":121,"title":727,"description":728,"published":729,"category":398,"image":730,"draft":402},"Como restaurar um backup do Supabase, e o que quebra depois","Como restaurar um backup do Supabase pelo painel ou por um arquivo de dump, o que a restauração substitui e por que o seu app pode continuar quebrado no fim.","2026-08-24","\u002Fblog\u002Fhow-to-restore-a-supabase-backup\u002Fcard-800x500.png",{"path":383,"title":732,"description":733,"published":734,"category":449,"image":735,"draft":402},"Seu bucket do Supabase Storage é público. Isso é um problema?","Um bucket público do Supabase Storage significa que quem tem a URL de um arquivo pode abri-lo. Não significa que alguém possa listar o que está lá dentro.","2026-08-23","\u002Fblog\u002Fsupabase-storage-bucket-public\u002Fcard-800x500.png",{"path":737,"title":738,"description":739,"published":740,"category":449,"image":741,"draft":402},"\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend","Uma chave de API do Google no frontend é um problema?","Uma chave de API do Google exposta no seu frontend é a chave que nosso scanner mais encontra, e quase sempre está tudo bem. Um ajuste gratuito decide isso.","2026-08-22","\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend\u002Fcard-800x500.png",{"path":743,"title":744,"description":745,"published":746,"category":398,"image":747,"draft":402},"\u002Fblog\u002Fai-agent-deleted-my-database","Um agente de IA apagou meus dados do Supabase. O que eu recupero?","Um agente de IA apagou dados do seu banco. O que você recupera já estava decidido antes de ele rodar, e os próximos minutos decidem o resto.","2026-08-21","\u002Fblog\u002Fai-agent-deleted-my-database\u002Fcard-800x500.png",{"path":749,"title":750,"description":751,"published":752,"category":449,"image":753,"draft":402},"\u002Fblog\u002Fcan-anyone-read-your-supabase-database","Qualquer um consegue ler seu banco Supabase? Testamos 3.680 apps","Qualquer um consegue ler seu banco de dados Supabase sem fazer login? Escaneamos 30.998 apps no ar criadas com builders de IA e medimos quantas dizem que sim.","2026-08-18","\u002Fblog\u002Fcan-anyone-read-your-supabase-database\u002Fcard-800x500.png",{"path":755,"title":756,"description":757,"published":752,"category":449,"image":758,"draft":402},"\u002Fblog\u002Fsource-maps-exposed-in-production","Source maps expostos: seu app está publicando o código original","Um source map exposto deixa qualquer um ler o código original do seu app, comentários incluídos. A verificação de 30 segundos e o que importa de verdade.","\u002Fblog\u002Fsource-maps-exposed-in-production\u002Fcard-800x500.png",{"path":760,"title":761,"description":762,"published":763,"category":449,"image":764,"draft":402},"\u002Fblog\u002Fsupabase-new-api-keys","As novas chaves de API do Supabase: qual vai no seu app?","O Supabase trocou anon e service_role por chaves publicáveis e secretas. Qual delas pertence ao seu app e qual nunca deve estar lá?","2026-08-12","\u002Fblog\u002Fsupabase-new-api-keys\u002Fcard-800x500.png",{"path":58,"title":766,"description":767,"published":768,"category":398,"image":769,"draft":402},"O Supabase faz backup do meu banco de dados? Depende do plano.","O Supabase faz backup do seu banco de dados? Todo dia nos planos pagos, e nada no gratuito. Como descobrir o que você tem e o que essa cópia não cobre.","2026-08-11","\u002Fblog\u002Fdoes-supabase-back-up-my-database\u002Fcard-800x500.png",{"path":771,"title":772,"description":773,"published":774,"category":449,"image":775,"draft":402},"\u002Fblog\u002Fsupabase-rls-on-but-table-still-public","O Supabase Row Level Security está ligado. A tabela continua pública.","Ligar o Supabase Row Level Security não protege uma tabela. Quem protege são as políticas, e a que consertou o seu app pode deixar qualquer um entrar.","2026-08-10","\u002Fblog\u002Fsupabase-rls-on-but-table-still-public\u002Fcard-800x500.png",{"path":777,"title":778,"description":779,"published":774,"category":398,"image":780,"draft":402},"\u002Fblog\u002Fversion-history-is-not-a-backup","O histórico de versões não é backup. Ele não desfaz um delete.","Lovable e Bolt guardam um histórico de versões do seu código. Seu banco de dados é um serviço à parte, e voltar atrás não traz os seus dados de volta.","\u002Fblog\u002Fversion-history-is-not-a-backup\u002Fcard-800x500.png",{"path":782,"title":783,"description":784,"published":785,"category":398,"image":786,"draft":402},"\u002Fblog\u002Fthree-ways-to-back-up-a-supabase-database","Três formas de fazer backup de um banco Supabase, e o que falta","O painel, o pg_dump e um serviço gerenciado. O que cada um salva de verdade, o que deixa de fora sem avisar e qual sobrevive a perder a conta.","2026-08-09","\u002Fblog\u002Fthree-ways-to-back-up-a-supabase-database\u002Fcard-800x500.png",{"path":204,"title":788,"description":789,"published":785,"category":449,"image":790,"draft":402},"Quais chaves de API são seguras no navegador e quais não são","Sua chave anon do Supabase foi feita para ser pública. Sua chave service_role não, e ela ignora todas as regras que você criar. Como diferenciar as duas.","\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend\u002Fcard-800x500.png",1791618971822]