[{"data":1,"prerenderedAt":928},["ShallowReactive",2],{"blog-pt-supabase-backup-auth-users":3,"blog-index-pt":579},{"id":4,"title":5,"body":6,"category":534,"cover":535,"coverAlt":536,"description":537,"draft":538,"extension":539,"faq":540,"image":557,"keywords":558,"meta":567,"navigation":568,"ogTitle":569,"path":570,"published":571,"seo":572,"stem":573,"tldr":574,"updated":571,"__hash__":578},"blog_pt\u002Fblog\u002Fsupabase-backup-auth-users.md","Por que seu dump do Supabase não tem usuários dentro",{"type":7,"value":8,"toc":522},"minimark",[9,13,21,35,38,43,46,63,84,87,93,97,102,122,125,135,142,145,150,154,160,214,217,223,226,236,240,243,252,258,261,267,270,276,289,300,306,312,316,319,325,331,334,355,359,362,374,388,394,401,405,442,449,453,456,461,496,504,511],[10,11,12],"p",{},"Você fez a coisa responsável. Procurou como fazer backup de um banco Supabase,\nrodou o comando que encontrou e guardou o arquivo em um lugar seguro.",[10,14,15,16,20],{},"Aí um dia você precisa dele. Você despeja o arquivo em um projeto novo e a\nrestauração termina sem um único erro. Cada tabela que você já criou está lá, e\ncada uma delas está vazia. Seus usuários estão pior ainda: a parte do banco onde\neles moram, um schema chamado ",[17,18,19],"code",{},"auth",", nunca chegou ao arquivo.",[10,22,23,24,31,32,34],{},"Aqui está a parte que quase todo guia pula: ",[25,26,27,30],"strong",{},[17,28,29],{},"supabase db dump"," sozinho não é\numa cópia dos seus dados."," Sem outras flags ele escreve a forma do seu banco e\nnada do conteúdo, e deixa ",[17,33,19],{}," de fora até disso. O Supabase publica o backup\ncomo três comandos, e suas contas viajam no terceiro.",[10,36,37],{},"Ajuda pensar em um hotel. Suas tabelas são os quartos e tudo que está dentro\ndeles. O registro da recepção, aquele com o nome de cada hóspede, é do hotel. E\numa planta te mostra cada quarto do prédio sem colocar um único hóspede lá\ndentro.",[39,40,42],"h2",{"id":41},"um-backup-do-supabase-inclui-meus-usuários","Um backup do Supabase inclui meus usuários?",[10,44,45],{},"Depende de qual comando escreveu o arquivo, e o comando que a maioria roda não\ninclui.",[10,47,48,49,51,52,55,56,59,60,62],{},"Seus usuários não são linhas de uma tabela sua. O Supabase guarda eles em uma\ngaveta separada do mesmo banco, o schema ",[17,50,19],{},", junto com as senhas com hash,\nos provedores pelos quais entraram e as sessões que mantêm. Suas tabelas ficam\nem uma gaveta chamada ",[17,53,54],{},"public",", e cada coluna ",[17,57,58],{},"user_id"," nelas é uma referência\npara dentro de ",[17,61,19],{},".",[10,64,65,66,68,69,71,72,75,76,83],{},"Um schema é exatamente isso: uma gaveta com nome dentro de um banco. ",[17,67,54],{}," é\nseu. ",[17,70,19],{}," é do Supabase, e ",[17,73,74],{},"storage"," também, que guarda a linha que descreve\ncada arquivo enviado. A documentação do próprio Supabase chama esses de schemas\ngerenciados e diz que\n",[77,78,82],"a",{"href":79,"rel":80},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Flocal-development\u002Fcli-workflows",[81],"nofollow","normalmente não precisam ser puxados a menos que você os tenha modificado",",\nque é por que as ferramentas tratam eles diferente das suas tabelas.",[10,85,86],{},"Essa divisão é o que permite a um comando produzir dois arquivos que se parecem\ne contêm coisas completamente diferentes.",[88,89],"diagram",{"alt":90,"caption":91,"src":92},"Um arquivo de dump cuja seta alcança um painel sólido com quatro tabelas acesas, marcado com um visto. Uma segunda seta para em uma parede tracejada diante de um painel tracejado com a marca do Supabase, e esse painel contém uma ficha pautada com três pessoas ao lado de quatro imagens apagadas. Sobre a parede há uma cruz.","Rodado sozinho, o comando de dump copia a forma da sua gaveta e para na fronteira das duas que o Supabase administra.","\u002Fblog\u002Fsupabase-backup-auth-users\u002Fwhere-the-dump-stops-1600x620.png",[39,94,96],{"id":95},"o-que-o-comando-de-dump-escreve-sozinho","O que o comando de dump escreve sozinho",[10,98,99,100,62],{},"A planta. Nenhuma linha, e nada de ",[17,101,19],{},[10,103,104,105,108,109,114,115,118,119,62],{},"A página de referência do Supabase para o comando diz isso em duas frases. Ele\nroda ",[17,106,107],{},"pg_dump"," com flags extras para excluir os schemas gerenciados pelo\nSupabase, e entre os ignorados\n",[77,110,113],{"href":111,"rel":112},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Freference\u002Fcli\u002Fsupabase-db-dump",[81],"estão auth, storage e os criados por extensões",".\nA mesma página diz depois que o dump padrão não contém dados nem papéis\npróprios, e que você consegue esses pedindo com ",[17,116,117],{},"--data-only"," e ",[17,120,121],{},"--role-only",[10,123,124],{},"Então isto, que é o que você provavelmente rodou:",[126,127,132],"pre",{"className":128,"code":130,"language":131},[129],"language-text","supabase db dump --db-url \"postgresql:\u002F\u002F…your connection string…\" -f backup.sql\n","text",[17,133,130],{"__ignoreMap":134},"",[10,136,137,138,141],{},"produz um arquivo cheio de instruções ",[17,139,140],{},"CREATE TABLE",". Cada coluna, cada índice,\ncada policy que você escreveu nas suas tabelas, e nenhuma linha de nada.",[10,143,144],{},"A razão de isso ser pior que um arquivo obviamente vazio é que funciona. E ele\ntambém não parece pequeno: cada definição de tabela, cada índice e cada policy\nque você já escreveu estão ali, e para um app de verdade isso é muito texto. Um\nbackup vazio se anuncia sozinho. Este restaura limpo, e a primeira coisa que te\ndiz o contrário é uma tela de login que nenhuma conta consegue passar.",[88,146],{"alt":147,"caption":148,"src":149},"Dois arquivos lado a lado. O da esquerda é tracejado e contém duas grades de tabela vazias ao lado de um contorno vazio onde deveria estar uma ficha, e está riscado. O da direita contém essas mesmas duas tabelas com as linhas preenchidas e, no lugar do contorno vazio, uma ficha pautada com três pessoas. Ele está marcado com um visto.","O mesmo comando escreve os dois. Qual deles você tem na mão depende de uma flag, e os dois restauram sem erro.","\u002Fblog\u002Fsupabase-backup-auth-users\u002Fthe-plan-and-the-contents-1600x620.png",[39,151,153],{"id":152},"como-confiro-o-dump-que-eu-já-tenho","Como confiro o dump que eu já tenho?",[10,155,156,157,159],{},"Abra em um editor de texto e busque por ",[17,158,19],{},". O que aparecer coloca seu\narquivo em um de três grupos.",[161,162,163,176,193],"ol",{},[164,165,166,169,170,172,173,175],"li",{},[25,167,168],{},"Nenhuma ocorrência."," O schema ",[17,171,19],{}," não está nesse arquivo de forma\nalguma. É isso que um ",[17,174,29],{}," puro escreve.",[164,177,178,192],{},[25,179,180,181,184,185,188,189,62],{},"Ocorrências, mas só em linhas que começam com ",[17,182,183],{},"CREATE",", ",[17,186,187],{},"ALTER"," ou\n",[17,190,191],{},"GRANT"," Você tem o desenho do registro e ninguém dentro.",[164,194,195,209,210,213],{},[25,196,197,198,201,202,205,206],{},"Uma linha ",[17,199,200],{},"COPY \"auth\".\"users\""," ou ",[17,203,204],{},"COPY auth.users",", com linhas de dados\nembaixo até uma linha com ",[17,207,208],{},"\\."," Ou uma sequência de linhas começando com\n",[17,211,212],{},"INSERT INTO \"auth\".\"users\"",". Suas contas estão aí.",[10,215,216],{},"Se você preferir fazer na linha de comando, dois greps respondem a mesma\npergunta:",[126,218,221],{"className":219,"code":220,"language":131},[129],"grep -c 'auth.*users' backup.sql\ngrep -n 'COPY .*auth.*users\\|INSERT INTO .*auth.*users' backup.sql\n",[17,222,220],{"__ignoreMap":134},[10,224,225],{},"O primeiro diz se o schema chegou no arquivo. O segundo diz se as pessoas\nchegaram. Um zero dos dois, em um arquivo com que você contava, é melhor\ndescobrir hoje do que na manhã em que você precisa dele.",[10,227,228,229,231,232,62],{},"Busque por ",[17,230,74],{}," já que está aí, e leia com atenção o que encontrar. Essas\nlinhas são a lista dos seus arquivos enviados, que é uma coisa diferente dos\narquivos, e\n",[77,233,235],{"href":234},"\u002Fblog\u002Fsupabase-storage-backup","nenhum backup de banco em nenhum plano contém aqueles",[39,237,239],{"id":238},"como-exporto-os-usuários-auth-do-supabase","Como exporto os usuários auth do Supabase?",[10,241,242],{},"Com o comando de dados, que é um comando diferente do que escreve o schema.",[10,244,245,246,251],{},"O\n",[77,247,250],{"href":248,"rel":249},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fplatform\u002Fmigrating-within-supabase\u002Fbackup-restore",[81],"guia de backup e restauração","\ndo Supabase publica o backup como três arquivos, e vale ver os três juntos\nporque o formato disso é a resposta:",[126,253,256],{"className":254,"code":255,"language":131},[129],"supabase db dump --db-url \"postgresql:\u002F\u002F…\" -f roles.sql --role-only\nsupabase db dump --db-url \"postgresql:\u002F\u002F…\" -f schema.sql\nsupabase db dump --db-url \"postgresql:\u002F\u002F…\" -f data.sql --use-copy --data-only \\\n  -x \"storage.buckets_vectors\" -x \"storage.vector_indexes\"\n",[17,257,255],{"__ignoreMap":134},[10,259,260],{},"A segunda linha é a que é rodada sozinha. A terceira é a que tem seus usuários\ndentro.",[10,262,263,264,266],{},"Esses dois fatos parecem uma contradição e não são. A frase da página de\nreferência do Supabase sobre excluir ",[17,265,19],{}," descreve o dump de schema, e o dump\nde dados percorre esse schema também.",[10,268,269],{},"Se você só quer as contas, nomeie o schema e recebe aquela gaveta sozinha:",[126,271,274],{"className":272,"code":273,"language":131},[129],"supabase db dump --db-url \"postgresql:\u002F\u002F…\" -f users.sql --data-only --use-copy --schema auth\n",[17,275,273],{"__ignoreMap":134},[10,277,278,285,286,288],{},[25,279,280,281,284],{},"Antes de confiar em qualquer um desses, adicione ",[17,282,283],{},"--dry-run"," e leia o que\nvolta."," Ele imprime o comando ",[17,287,107],{}," que a ferramenta vai rodar sem rodar,\nentão você vê com os próprios olhos quais schemas entram e quais ficam de fora\nna versão que você instalou. Leia essa saída uma vez e você nunca mais precisa\nacreditar neste artigo, nem em nenhum outro, o que importa porque as flags\nrealmente se mexem entre versões e o arquivo fica com a mesma cara dos dois\njeitos.",[10,290,291,292,299],{},"Tem também o caminho direto, e\n",[77,293,295,296,298],{"href":294},"\u002Fblog\u002Fthree-ways-to-back-up-a-supabase-database","é para isso que serve um ",[17,297,107],{}," simples",":\nnomeie as gavetas que você quer e ele leva.",[126,301,304],{"className":302,"code":303,"language":131},[129],"pg_dump \"postgresql:\u002F\u002F…\" --schema public --schema auth --schema storage \\\n  --no-owner --file backup.sql\n",[17,305,303],{"__ignoreMap":134},[10,307,308,309,311],{},"Uma coisa para notar sobre o arquivo de schema, porque explica por que isso tudo\né separado. Um projeto Supabase novo chega com um schema ",[17,310,19],{}," já construído,\nna versão que o serviço de login roda hoje. Despejar por cima a versão do seu\nprojeto antigo colocaria um desenho mais velho em cima de um que funciona. O que\nvocê quer levar é o conteúdo do registro, e é isso que o arquivo de dados tem.",[39,313,315],{"id":314},"o-que-quebra-na-hora-de-devolver-os-usuários","O que quebra na hora de devolver os usuários",[10,317,318],{},"Duas coisas, e o Supabase documenta as duas.",[10,320,321,324],{},[25,322,323],{},"Os triggers, que podem criptografar uma coluna duas vezes."," O comando de\nrestauração do guia do Supabase tem no meio uma instrução fácil de ler como\nenfeite:",[126,326,329],{"className":327,"code":328,"language":131},[129],"psql \\\n  --single-transaction \\\n  --variable ON_ERROR_STOP=1 \\\n  --file roles.sql \\\n  --file schema.sql \\\n  --command 'SET session_replication_role = replica' \\\n  --file data.sql \\\n  --dbname \"postgresql:\u002F\u002F…\"\n",[17,330,328],{"__ignoreMap":134},[10,332,333],{},"Essa linha do meio desliga os triggers pelo tempo da operação, e o guia diz que\nela está ali para impedir que colunas sejam criptografadas uma segunda vez na\nentrada. Despeje um arquivo de dados sem ela e as senhas chegam já embaralhadas\npor um processo que já tinha sido aplicado nelas, e nada depois desfaz isso.",[10,335,336,339,340,343,344,347,348,343,351,354],{},[25,337,338],{},"Propriedade e permissões, que param o despejo."," Um dump tirado de um projeto\nSupabase carrega linhas que se referem a papéis que o projeto novo não deixa\nvocê tocar. As notas de solução de problemas do mesmo guia dizem para comentar\nqualquer linha com ",[17,341,342],{},"ALTER ... OWNER TO \"supabase_admin\""," em ",[17,345,346],{},"schema.sql",", e uma\nlinha específica ",[17,349,350],{},"GRANT \"postgres\" TO \"cli_login_postgres\"",[17,352,353],{},"roles.sql",". As\nduas são uma edição de texto antes de começar, e as duas param o despejo com a\nlinha em que ele engasgou impressa na sua tela.",[39,356,358],{"id":357},"meus-usuários-vão-ter-que-entrar-de-novo","Meus usuários vão ter que entrar de novo?",[10,360,361],{},"As senhas deles passam. As sessões não, a menos que você leve mais uma coisa\njunto.",[10,363,364,365,367,368,373],{},"O Supabase diz que você pode migrar cada tabela do schema ",[17,366,19],{},",\n",[77,369,372],{"href":370,"rel":371},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Ftroubleshooting\u002Fmigrating-auth-users-between-projects",[81],"usuários e suas senhas com hash incluídos",",\nentão ninguém precisa redefinir uma senha que já tinha. Nenhuma senha é legível\nem ponto nenhum disso; o que se move é o hash dela.",[10,375,376,377,118,380,383,384,62],{},"Uma sessão é outra coisa. Ela é provada por um token assinado com o segredo JWT\ndo seu projeto, e cada projeto tem o seu. O Supabase diz que se o projeto novo\nassinar com outro segredo, cada token que já está no navegador de alguém fica\ninválido e é pedido àquela pessoa que entre de novo. Você pode evitar isso\ncolocando o segredo do projeto antigo no novo, e o preço está escrito na mesma\npágina: trocar o segredo JWT regenera as chaves ",[17,378,379],{},"anon",[17,381,382],{},"service_role"," daquele\nprojeto, então seu app precisa receber as novas antes de conseguir falar com\nqualquer coisa. Qual chave é qual, e qual delas pode estar no seu app, é\n",[77,385,387],{"href":386},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","o que convém ter claro antes de colar qualquer uma",[10,389,390,391,393],{},"Então a versão honesta é que uma restauração normalmente pede a todo mundo que\nentre uma vez. Isso é um e-mail para o suporte. Não é uma conta perdida, e a\ndiferença entre as duas coisas é se o schema ",[17,392,19],{}," estava no seu arquivo.",[10,395,396,397,400],{},"Três coisas continuam de fora, faça o que fizer com as flags. Seus arquivos\nenviados, porque o Storage guarda os bytes fora do banco e\n",[77,398,399],{"href":234},"nenhum dump em nenhum plano alcança eles",". Suas\nedge functions, que são um download à parte e cujos import maps, observa o\nSupabase, não são buscados automaticamente. E as configurações do seu projeto,\nque são configuração e não dados e são redigitadas à mão.",[39,402,404],{"id":403},"o-que-fazer-esta-semana","O que fazer esta semana",[406,407,408],"key-takeaways",{},[409,410,411,417,426,432,439],"ul",{},[164,412,413,414,416],{},"Pegue o arquivo de backup mais recente que você tem e busque ",[17,415,19],{}," dentro dele. Grupo um, dois ou três da seção acima, e você sabe em um minuto.",[164,418,419,420,118,422,425],{},"Se for grupo um ou dois, tire hoje um dump de dados com ",[17,421,117],{},[17,423,424],{},"--use-copy",", e guarde ao lado do arquivo de schema em vez de no lugar dele. Você precisa dos dois.",[164,427,428,429,431],{},"Adicione ",[17,430,283],{}," ao comando que você escolher e leia a saída uma vez, para saber quais gavetas a sua versão da ferramenta leva.",[164,433,434,435,438],{},"Anote a ordem da restauração onde você vá encontrar: roles, depois schema, depois ",[17,436,437],{},"SET session_replication_role = replica",", depois data.",[164,440,441],{},"Restaure uma vez em um projeto descartável e então tente entrar como um usuário de verdade. É a única conferência que testa aquilo de que este artigo trata.",[10,443,444,445,448],{},"Fazer isso uma vez na mão vale a pena de qualquer jeito que você acabe fazendo\nbackup, porque enquanto você não abriu um dump só teve a palavra backup. Se você\ncontinua fazendo na mão é outra pergunta, e\n",[77,446,447],{"href":294},"os três caminhos e quanto cada um custa","\né onde ela é respondida.",[39,450,452],{"id":451},"onde-o-reeve-care-entra","Onde o Reeve Care entra",[10,454,455],{},"O Care tira a cópia em um calendário, e o registro vai dentro.",[88,457],{"alt":458,"caption":459,"src":460},"Um painel do Reeve Care com duas linhas. Na primeira, um contorno tracejado de conta contém um banco de dados e um registro de pessoas, e os dois saem por uma seta para um arquivo trancado que é relido com uma lupa e marcado com um visto. Na segunda, um cartão com um botão devolve as linhas do banco para dentro da conta enquanto o registro lá dentro continua aceso e intocado.","A cópia guarda suas tabelas e suas contas. O botão de restaurar devolve suas tabelas e deixa as contas onde estão.","\u002Fblog\u002Fsupabase-backup-auth-users\u002Fcare-the-register-comes-too-1600x560.png",[409,462,463,474,484,490],{},[164,464,465,169,468,470,471,473],{},[25,466,467],{},"Suas contas estão na cópia.",[17,469,19],{}," viaja junto com suas tabelas, porque uma cópia de um app Supabase sem os usuários dele é uma cópia da metade. As linhas de ",[17,472,74],{}," que descrevem seus arquivos vêm também, e os próprios arquivos assim que você conecta uma credencial do Storage.",[164,475,476,479,480,483],{},[25,477,478],{},"O botão de restaurar devolve suas tabelas e deixa as contas em paz."," Despejar ",[17,481,482],{},"auth.users"," em cima de um projeto vivo desloga todo mundo e traz de volta contas que alguém apagou de propósito, então isso continua sendo um pedido com uma pessoa em cima. Assim apertar o botão no desespero não consegue deslogar os clientes que você estava tentando ajudar.",[164,485,486,489],{},[25,487,488],{},"A cópia é relida antes de contar como tirada."," A data no seu painel é a última vez que uma cópia foi aberta e verificada, nunca a hora em que um job começou ou um arquivo chegou.",[164,491,492,495],{},[25,493,494],{},"Restaurar tira antes uma foto do estado atual",", então a própria restauração tem um desfazer.",[10,497,498,499,503],{},"O Care começa em $49 por mês para um app. Esse é um preço de tabela, e a\n",[77,500,502],{"href":501},"\u002Fpricing","página de preços"," às vezes está abaixo do número daqui e nunca acima.",[10,505,506,507,62],{},"Como uma cópia é tirada, conferida e devolvida está desenhado passo a passo na\n",[77,508,510],{"href":509},"\u002Fsupabase-backups","página de backups do Supabase",[10,512,513,514,516,517,521],{},"Antes de fechar esta aba, abra seu dump mais recente e busque ",[17,515,19],{}," nele. É o\njeito mais rápido de descobrir se aquilo que você vinha chamando de backup\ndevolveria seus clientes, e se a resposta for não,\n",[77,518,520],{"href":519},"\u002Fblog\u002Fhow-to-restore-a-supabase-backup","restaurar um do jeito certo"," é a\npróxima leitura.",{"title":134,"searchDepth":523,"depth":523,"links":524},3,[525,527,528,529,530,531,532,533],{"id":41,"depth":526,"text":42},2,{"id":95,"depth":526,"text":96},{"id":152,"depth":526,"text":153},{"id":238,"depth":526,"text":239},{"id":314,"depth":526,"text":315},{"id":357,"depth":526,"text":358},{"id":403,"depth":526,"text":404},{"id":451,"depth":526,"text":452},"Backups","\u002Fblog\u002Fsupabase-backup-auth-users\u002Fcover-1200x630.png","Um arquivo lacrado com três linhas de dados e, ao lado, um registro pautado de pessoas que ficou de fora e é cortado pela borda do quadro.","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.",false,"md",[541,543,546,548,551,554],{"q":42,"a":542},"Depende de qual comando escreveu o arquivo. Seus usuários moram em um schema chamado auth, que pertence ao serviço de login. Um supabase db dump puro deixa auth de fora e não contém nenhuma linha de nada, porque o dump padrão é só o schema. A metade de dados do dump, que é um segundo comando com a flag --data-only, é a que carrega seus usuários. É exatamente por isso que o Supabase publica o backup como três comandos.",{"q":544,"a":545},"Por que auth.users está faltando no meu dump?","Porque você quase certamente rodou o dump de schema. O Supabase documenta que o comando exclui os schemas gerenciados por ele, que entre os ignorados estão auth e storage, e que o dump padrão não contém dado nenhum. Isso é proposital: um projeto novo chega com o próprio schema auth já construído pelo serviço de login, então despejar por cima uma cópia mais velha substituiria algo que funciona. O que você quer mover é o conteúdo, e quem carrega isso é o dump de dados.",{"q":239,"a":547},"Com o comando de dados, que é separado do comando de schema. Rode supabase db dump com --data-only e --use-copy para escrever um arquivo de dados, e as tabelas de auth vêm junto. Se você só quer as contas, adicione --schema auth e recebe um arquivo com aquele schema sozinho. Antes de confiar em qualquer um dos dois, adicione --dry-run: ele imprime o comando pg_dump que a CLI vai rodar sem rodar, então você lê quais schemas entram na versão que você tem.",{"q":549,"a":550},"As senhas sobrevivem a uma restauração do Supabase?","Sim, se o schema auth estava no arquivo. O Supabase diz que você pode migrar cada tabela do schema auth, senhas com hash incluídas, então ninguém precisa redefinir nem recriar. A única coisa que pode estragar isso é despejar os dados sem desligar os triggers antes, que é a razão de o Supabase colocar SET session_replication_role = replica no meio do próprio comando de restauração dele. Pule essa linha e uma coluna já criptografada é criptografada uma segunda vez na entrada.",{"q":552,"a":553},"Meus usuários vão continuar logados depois de uma restauração?","Não, se o projeto novo assinar com outro segredo. Uma sessão é provada por um token assinado com o segredo JWT do projeto, e o Supabase diz que um segredo novo invalida os tokens existentes, então é pedido a todo mundo que entre de novo. Você pode levar o segredo antigo junto e manter todos logados, mas o Supabase também diz que trocar o segredo JWT regenera as chaves anon e service_role daquele projeto, então seu app precisa das novas.",{"q":555,"a":556},"O que mais um dump do Supabase deixa de fora?","Seus arquivos enviados, antes de tudo. O Storage guarda uma linha no seu banco para cada arquivo e o arquivo em si em outro lugar, então nenhum dump de banco em nenhum plano contém os bytes. As edge functions são um download à parte, e o Supabase observa que os import maps e os arquivos deno.json não são buscados automaticamente. As configurações do projeto, os provedores de auth e os segredos são configuração e não dados e moram no dashboard, então são redigitados à mão em um projeto novo.","\u002Fblog\u002Fsupabase-backup-auth-users\u002Fcard-800x500.png",[559,560,561,562,563,564,565,566],"supabase backup auth users","exportar usuarios do supabase","supabase db dump schema auth","migrar usuarios auth supabase","backup do supabase sem usuarios","supabase auth.users export","restaurar usuarios do supabase","supabase dump exclui auth",{},true,"Por que seu dump do Supabase não tem usuários","\u002Fblog\u002Fsupabase-backup-auth-users","2026-09-23",{"title":5,"description":537},"blog\u002Fsupabase-backup-auth-users",[575,576,577],"O Supabase publica o backup dele como três comandos. O que você provavelmente rodou é o segundo, e seus usuários estão no terceiro.","Rode supabase db dump sem outras flags e você recebe a forma das suas tabelas e nada do conteúdo delas, e o schema auth onde seus usuários moram fica de fora até disso.","Uma única busca no arquivo que você já tem diz qual de três coisas você está segurando.","7YQOrHCIS0aClsjWXKStwNsy_1Cxvy7x6SAvOipejq8",[580,587,593,599,605,611,617,623,629,635,641,647,653,659,665,671,676,682,688,689,695,701,707,713,719,725,731,737,742,748,754,760,766,772,778,784,790,796,802,808,814,820,826,832,838,844,850,856,862,867,873,879,885,891,896,902,908,914,919,924],{"path":581,"title":582,"description":583,"published":584,"category":585,"image":586,"draft":538},"\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":588,"title":589,"description":590,"published":591,"category":585,"image":592,"draft":538},"\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":594,"title":595,"description":596,"published":597,"category":585,"image":598,"draft":538},"\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":600,"title":601,"description":602,"published":603,"category":585,"image":604,"draft":538},"\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":606,"title":607,"description":608,"published":609,"category":585,"image":610,"draft":538},"\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":612,"title":613,"description":614,"published":615,"category":585,"image":616,"draft":538},"\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":618,"title":619,"description":620,"published":621,"category":585,"image":622,"draft":538},"\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":624,"title":625,"description":626,"published":627,"category":585,"image":628,"draft":538},"\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":630,"title":631,"description":632,"published":633,"category":585,"image":634,"draft":538},"\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":636,"title":637,"description":638,"published":639,"category":585,"image":640,"draft":538},"\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":642,"title":643,"description":644,"published":645,"category":585,"image":646,"draft":538},"\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":648,"title":649,"description":650,"published":651,"category":585,"image":652,"draft":538},"\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":654,"title":655,"description":656,"published":657,"category":534,"image":658,"draft":538},"\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":660,"title":661,"description":662,"published":663,"category":534,"image":664,"draft":538},"\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":666,"title":667,"description":668,"published":669,"category":534,"image":670,"draft":538},"\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":672,"title":673,"description":674,"published":669,"category":585,"image":675,"draft":538},"\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":677,"title":678,"description":679,"published":680,"category":585,"image":681,"draft":538},"\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":683,"title":684,"description":685,"published":686,"category":585,"image":687,"draft":538},"\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":570,"title":5,"description":537,"published":571,"category":534,"image":557,"draft":538},{"path":690,"title":691,"description":692,"published":693,"category":585,"image":694,"draft":538},"\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":696,"title":697,"description":698,"published":699,"category":585,"image":700,"draft":538},"\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":702,"title":703,"description":704,"published":705,"category":585,"image":706,"draft":538},"\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":708,"title":709,"description":710,"published":711,"category":585,"image":712,"draft":538},"\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":714,"title":715,"description":716,"published":717,"category":585,"image":718,"draft":538},"\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":720,"title":721,"description":722,"published":723,"category":585,"image":724,"draft":538},"\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":726,"title":727,"description":728,"published":729,"category":585,"image":730,"draft":538},"\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":732,"title":733,"description":734,"published":735,"category":585,"image":736,"draft":538},"\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":234,"title":738,"description":739,"published":740,"category":534,"image":741,"draft":538},"Supabase storage backup: sua cópia do banco não tem nenhum arquivo","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.","2026-09-14","\u002Fblog\u002Fsupabase-storage-backup\u002Fcard-800x500.png",{"path":743,"title":744,"description":745,"published":746,"category":534,"image":747,"draft":538},"\u002Fblog\u002Fsupabase-point-in-time-recovery","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":749,"title":750,"description":751,"published":752,"category":534,"image":753,"draft":538},"\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":755,"title":756,"description":757,"published":758,"category":585,"image":759,"draft":538},"\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":761,"title":762,"description":763,"published":764,"category":585,"image":765,"draft":538},"\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":767,"title":768,"description":769,"published":770,"category":585,"image":771,"draft":538},"\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":773,"title":774,"description":775,"published":776,"category":585,"image":777,"draft":538},"\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":779,"title":780,"description":781,"published":782,"category":585,"image":783,"draft":538},"\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":785,"title":786,"description":787,"published":788,"category":585,"image":789,"draft":538},"\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":791,"title":792,"description":793,"published":794,"category":585,"image":795,"draft":538},"\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":797,"title":798,"description":799,"published":800,"category":585,"image":801,"draft":538},"\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":803,"title":804,"description":805,"published":806,"category":585,"image":807,"draft":538},"\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":809,"title":810,"description":811,"published":812,"category":585,"image":813,"draft":538},"\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":815,"title":816,"description":817,"published":818,"category":534,"image":819,"draft":538},"\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":821,"title":822,"description":823,"published":824,"category":585,"image":825,"draft":538},"\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":827,"title":828,"description":829,"published":830,"category":534,"image":831,"draft":538},"\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":833,"title":834,"description":835,"published":836,"category":585,"image":837,"draft":538},"\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":839,"title":840,"description":841,"published":842,"category":585,"image":843,"draft":538},"\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":845,"title":846,"description":847,"published":848,"category":585,"image":849,"draft":538},"\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":851,"title":852,"description":853,"published":854,"category":585,"image":855,"draft":538},"\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":857,"title":858,"description":859,"published":860,"category":534,"image":861,"draft":538},"\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":519,"title":863,"description":864,"published":865,"category":534,"image":866,"draft":538},"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":868,"title":869,"description":870,"published":871,"category":585,"image":872,"draft":538},"\u002Fblog\u002Fsupabase-storage-bucket-public","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":874,"title":875,"description":876,"published":877,"category":585,"image":878,"draft":538},"\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":880,"title":881,"description":882,"published":883,"category":534,"image":884,"draft":538},"\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":886,"title":887,"description":888,"published":889,"category":585,"image":890,"draft":538},"\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":892,"title":893,"description":894,"published":889,"category":585,"image":895,"draft":538},"\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":897,"title":898,"description":899,"published":900,"category":585,"image":901,"draft":538},"\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":903,"title":904,"description":905,"published":906,"category":534,"image":907,"draft":538},"\u002Fblog\u002Fdoes-supabase-back-up-my-database","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":909,"title":910,"description":911,"published":912,"category":585,"image":913,"draft":538},"\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":915,"title":916,"description":917,"published":912,"category":534,"image":918,"draft":538},"\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":294,"title":920,"description":921,"published":922,"category":534,"image":923,"draft":538},"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":386,"title":925,"description":926,"published":922,"category":585,"image":927,"draft":538},"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",1791618971784]