A decisão de reparar um backend Supabase
Saiba quando reparar um backend Supabase ou migrá-lo ao medir consultas, expansão de RLS, funções Edge, conformidade e custo projetado.

Isso parece óbvio até que um aplicativo com falhas em produção faça todo defeito parecer um defeito da plataforma. Já vi equipes planejarem uma migração de seis semanas porque um índice ausente deixava um painel lento. Também as vi passar meses ajustando políticas em torno de um modelo de dados que nunca conseguiria expressar as permissões prometidas aos clientes. A decisão precisa de provas do sistema em funcionamento, não da frustração com o último incidente.
Use cinco testes: complexidade das consultas, expansão de RLS, dependência de funções Edge, requisitos de conformidade e custo projetado. Nenhum funciona sozinho. Uma consulta complexa pode estar perfeitamente saudável. Cinquenta políticas podem ser mais fáceis de confiar do que cinco vagas. Uma conta de hospedagem baixa pode esconder uma recuperação manual cara. A pergunta útil é se cada fonte de dificuldade pode ser reparada no local e se o sistema reparado ainda atenderá aos próximos dois anos de uso esperado.
Repare os defeitos enquanto a arquitetura ainda servir
O reparo é a melhor opção quando os limites pretendidos do backend ainda correspondem ao produto. Se PostgreSQL continua sendo um sistema de registro adequado, o acesso direto pelo cliente ainda combina com o aplicativo e Supabase Auth, Storage ou Realtime atendem aos requisitos reais, mudar de plataforma troca defeitos conhecidos por um novo conjunto de incógnitas.
Classifique cada reclamação antes de discutir um destino. Coloque-a em uma de quatro categorias: defeito de implementação, falta de disciplina operacional, incompatibilidade arquitetônica ou requisito externo. Uma chave estrangeira ausente, um segredo de função de serviço exposto e um predicado de política sem índice são defeitos de implementação. Alterações de esquema feitas apenas pelo painel de produção indicam falta de disciplina. Um fluxo que exige tarefas longas e intensivas em CPU pode ser incompatível com funções Edge. Um contrato que exige uma região de implantação ou um controle de auditoria indisponível no plano escolhido é um requisito externo.
Somente as duas últimas categorias tornam a migração provável. As duas primeiras normalmente pedem reparo. Essa classificação evita uma falha conhecida: a equipe migra as tabelas e depois recria no outro provedor a mesma autorização permissiva, a falta de migrações e o monitoramento fraco.
O reparo também vence quando a equipe não consegue declarar uma arquitetura de destino verificada. «Um backend personalizado» não é um destino. É uma obrigação de escolher framework de API, sistema de identidade, hospedagem de banco, estratégia de conexão, armazenamento de objetos, executor de tarefas em segundo plano, sistema de segredos, conjunto de logs, processo de backup e caminho de implantação. Cada escolha precisa de um responsável. Se essas decisões não foram tomadas, a estimativa da migração contém principalmente espaços em branco.
Defina o limite do reparo antes de começar. Por exemplo: restaurar o histórico de migrações, retirar do navegador o acesso a credenciais privilegiadas, fazer os testes de autorização passarem, colocar as jornadas mais lentas dentro de um orçamento de latência acordado e documentar ensaios de restauração. Se esse reparo delimitado produzir um backend que a equipe consegue operar, a migração não tem justificativa comercial. Se o limite continuar aumentando porque cada correção revela uma premissa incompatível, essa prova favorece a mudança.
A complexidade das consultas exige planos, não opiniões
SQL complexo não justifica uma migração por si só. PostgreSQL executa o banco por baixo do Supabase, portanto mover o mesmo esquema e as mesmas consultas para outro serviço PostgreSQL gerenciado não fará desaparecer joins ruins, índices ausentes, leituras de linhas largas ou o excesso de trocas com o cliente.
Comece com provas da carga. A documentação do Supabase recomenda pg_stat_statements para localizar instruções frequentes e caras. Capture chamadas, tempo total de execução, tempo médio, linhas e a consulta normalizada. Não ordene apenas pelo tempo médio. Uma consulta que leva 40 milissegundos e roda um milhão de vezes pode consumir mais capacidade do que um relatório de dois segundos aberto duas vezes por dia.
Esta consulta fornece um primeiro recorte útil:
select
queryid,
calls,
round(total_exec_time::numeric, 1) as total_ms,
round(mean_exec_time::numeric, 1) as mean_ms,
rows,
left(query, 180) as sample
from pg_stat_statements
where calls >= 20
order by total_exec_time desc
limit 25;
A saída tem uma linha por instrução normalizada, com identificador da consulta, número de chamadas, tempo acumulado, tempo médio, linhas afetadas e uma amostra abreviada. Salve esse resultado durante um período representativo da atividade. Um banco de homologação tranquilo prova pouco sobre o tráfego de produção.
Para as instruções que dominam a latência ou o tempo do banco, execute EXPLAIN (ANALYZE, BUFFERS, FORMAT JSON) com dados representativos e seguros. ANALYZE executa a instrução, então use uma transação que possa ser revertida para escritas e não rode isso às cegas em produção. Procure varreduras sequenciais em relações grandes, diferenças severas entre linhas estimadas e reais, loops repetidos, leituras de disco e ordenações que transbordam. Esses achados apontam para índices, predicados reescritos, estatísticas melhores, seleções mais estreitas ou um modelo de dados diferente.
Repare quando um pequeno número de planos identificáveis responder pela maior parte do problema e mudanças comuns no PostgreSQL resolvê-lo. Considere a migração quando a própria carga entrar em conflito com o formato do serviço escolhido: análises contínuas que interferem no tráfego transacional, extensões necessárias indisponíveis, comportamento de conexão que não atende ao modelo de concorrência do aplicativo, ou dados que precisam ficar próximos de outro sistema e um tempo de rede medido domina as solicitações.
Não confunda número de solicitações à API com complexidade de consulta. Um frontend gerado por IA costuma buscar uma lista e depois solicitar os dados relacionados uma vez por linha. O banco pode executar consultas simples enquanto a página sofre com as idas e vindas. Consolidar o acesso em uma view, função RPC ou um único endpoint de servidor é um reparo. Mover esse padrão intacto só muda o lugar em que a conta da latência chega.
Teste os reparos contra uma carga, não contra uma consulta escolhida a dedo. Capture um conjunto reproduzível de operações de leitura e escrita das jornadas mais movimentadas, retire dados pessoais dos dados de teste e rode-o antes e depois de cada mudança. Registre mediana e tempo das solicitações lentas, CPU do banco, número de conexões, linhas lidas e taxa de erros. Um índice novo que ajuda um filtro pode atrasar escritas ou consumir armazenamento suficiente para mudar o cálculo de custos. Uma view materializada pode acelerar um relatório e introduzir uma defasagem de atualização que o produto não aceita.
A pressão das conexões precisa do mesmo diagnóstico. Clientes no navegador, processos do servidor, poolers de transação e sessões diretas do banco se comportam de maneiras diferentes. Conte sessões ativas e em espera durante picos e descubra qual componente é responsável por elas. Se um aplicativo gerado abre novas conexões de servidor a cada solicitação, corrija a reutilização antes de comprar mais computação. Mude apenas quando os requisitos verificados de concorrência e transação continuarem incompatíveis depois da correção do cliente e da configuração do pool.
A expansão de RLS é medida pelo comportamento
A expansão de RLS vira sinal de migração quando ninguém consegue prever ou testar com confiança quem pode ler e alterar cada linha. A contagem de políticas sozinha quase não diz nada. Um conjunto maior de políticas estreitas pode ser mais seguro do que uma política compacta cheia de verificações aninhadas de associação e claims JWT mutáveis.
Faça o inventário das políticas no banco em vez de confiar em um diagrama:
select
schemaname,
tablename,
policyname,
roles,
cmd,
permissive,
qual,
with_check
from pg_policies
order by schemaname, tablename, cmd, policyname;
Revise a saída como uma matriz de autorização. Para cada tabela e operação exposta, indique as funções atuantes, a condição de linha, a verificação de inserção ou atualização e a negação esperada. Marque subconsultas de associação duplicadas, políticas que dependem de metadados editáveis pelo usuário, condições amplas com true, colunas de tenant inconsistentes e tabelas expostas pela API sem uma política intencional.
O guia de RLS do Supabase faz uma distinção clara que muitos aplicativos gerados ignoram. Os usuários podem atualizar raw_user_meta_data, então esse não é um lugar seguro para claims de autorização. raw_app_meta_data não pode ser alterado pelo usuário e pode armazenar dados de autorização, embora o conteúdo do JWT possa ficar desatualizado até a renovação do token. Isso não é um detalhe pequeno de nomenclatura. Coloque uma função no claim errado e um usuário pode conceder acesso a si mesmo.
Correções de desempenho vêm depois da correção funcional. Crie índices nas colunas usadas nos predicados das políticas. Quando a semântica permitir, envolver auth.uid() em uma subconsulta escalar deixa o planejador criar um plano inicial e evita avaliar a função para cada linha. Mantenha filtros explícitos nas consultas do aplicativo mesmo quando uma política já impõe o mesmo limite de tenant, pois o filtro ajuda o planejador a escolher um caminho mais estreito. Nenhuma dessas mudanças corrige um modelo de autorização que a equipe não consegue descrever.
Crie testes de negação antes de mudar as políticas. Faça as mesmas tentativas de seleção, inserção, atualização e exclusão como usuário anônimo, membro comum, membro de outro tenant, administrador e conta suspensa, se esse estado existir. Verifique tanto as linhas permitidas quanto as proibidas. Testes com a função de serviço não substituem testes de usuário porque o acesso privilegiado pode contornar RLS.
Repare RLS quando o produto tiver um modelo de tenants estável e as políticas puderem ser reduzidas a predicados reutilizáveis nomeados, com uma matriz completa de testes. Migre ou introduza uma camada dedicada de autorização quando as permissões dependerem de relações que mudam rapidamente, as decisões exigirem contexto externo ao PostgreSQL, os clientes precisarem de explicações que o modelo atual não produz, ou cada recurso novo exigir mudanças em dezenas de políticas sem relação. Mesmo assim, a migração não elimina a necessidade de proteção no banco. Ela muda onde a decisão principal acontece.
Preste atenção à propriedade durante as escritas. Uma política de seleção pode esconder corretamente as linhas de outro tenant, enquanto uma condição with check incompleta deixa um usuário inserir uma linha com o identificador de tenant de outra pessoa. Atualizações precisam tanto de uma regra sobre quais linhas existentes o usuário pode atingir quanto de outra sobre o que a nova linha pode conter. Teste esses caminhos separadamente. Aplicativos gerados costumam exercitar apenas leituras bem-sucedidas, por isso a elevação pela escrita sobrevive até a produção.
Funções auxiliares centrais podem reduzir predicados repetidos, mas também podem esconder privilégios. Inspecione o proprietário, o caminho de pesquisa do esquema, o modo de execução e as permissões de cada função security definer citada por uma política. Qualifique os nomes de relações e mantenha pequena a superfície que pode ser chamada. Se a equipe não consegue explicar por que uma função auxiliar roda com direitos elevados, expandi-la pelo esquema aumenta o risco em vez de simplificar o sistema.
A dependência de funções Edge define o tamanho da mudança
As funções Edge importam porque revelam quanto do backend vai além do banco de dados. Um projeto com dois handlers de webhook é uma migração diferente de outro em que toda escrita privilegiada, retorno de pagamento, tarefa programada, ação de e-mail e integração externa passa por funções Deno.
Crie um registro de funções com uma linha para cada função implantada. Anote quem chama, método de autenticação, segredos, operações de banco, serviços externos, comportamento de timeout, política de repetição, mecanismo de idempotência, comando de implantação e média e pico de invocações. Os arquivos de código não revelam um segredo do painel do provedor nem um webhook externo configurado meses atrás.
O Supabase documenta as funções Edge como funções TypeScript em um runtime compatível com Deno. Isso dá alguma portabilidade ao código, mas o comportamento ao redor ainda exige trabalho: roteamento do gateway, tratamento de JWT, segredos de ambiente, invocações programadas, entrega de logs, implantação e execução regional. Trate «o código é TypeScript» como um fato útil, não como um plano de migração.
Repare quando as funções forem adaptadores finos. Um bom reparo extrai regras de negócio para módulos comuns, valida entradas na fronteira, usa timeouts explícitos para chamadas externas, torna o processamento de webhooks idempotente e move trabalhos longos para uma fila ou worker adequado à duração. Os limites oficiais incluem memória, tempo de CPU, duração total, inatividade da solicitação, tamanho do pacote e número de segredos. Consulte os limites atuais do plano ativo em vez de copiar um número para um documento de arquitetura que ficará velho.
A migração fica atraente quando o limite do runtime faz parte da carga normal, em vez de ser um defeito ocasional. Processamento de imagens, conversão de documentos grandes, tarefas longas de IA, exportações pesadas de dados e fluxos duráveis costumam precisar de workers com concorrência controlada, filas persistentes e estado explícito de repetição. Você pode manter Supabase para PostgreSQL e Auth enquanto move apenas essas tarefas. Uma migração parcial muitas vezes elimina a restrição sem substituir o banco.
Estime a mudança por dependência, não por quantidade de arquivos. Um webhook de pagamento com 80 linhas e comportamento de repetição não documentado pode trazer mais risco do que vinte endpoints somente de leitura. Para cada função, exija um teste de contrato que envie a mesma solicitação às implementações antiga e nova, normalize campos gerados pelo provedor e compare status, corpo, efeitos no banco e chamadas de saída. Sem esse teste, as equipes descobrem diferenças semânticas pelos relatos dos clientes.
A conformidade pode se impor à conveniência técnica
A conformidade só justifica a migração quando um requisito por escrito não pode ser atendido pelo serviço, plano, configuração e processo operacional disponíveis. A ansiedade vaga sobre dados regulamentados desperdiça tempo. Uma cláusula assinada com o cliente, uma declaração de controle do auditor ou uma restrição legal oferece algo que pode ser testado.
Transforme o requisito em uma matriz de controles. Indique os dados no escopo, regiões permitidas, expectativas de criptografia, período de retenção, procedimento de exclusão, objetivo de recuperação, regras de acesso da equipe, provas de auditoria, termos de notificação de incidente, subprocessadores e documentos contratuais. Atribua cada linha à plataforma ou à sua equipe. A hospedagem gerenciada nunca transfere toda a responsabilidade ao fornecedor.
Confira os controles necessários na documentação atual do plano e nos documentos contratuais do Supabase. Recursos como logs de auditoria, retenção de logs, recuperação para um ponto no tempo, login único, funções de projeto, redes privadas, escolha de regiões e suporte a cargas regulamentadas podem variar conforme plano e contrato. Um controle ausente no plano atual pode exigir um upgrade, não uma migração. Compare o upgrade com um destino realista que inclua as mesmas obrigações de prova e suporte.
Backups merecem cuidado especial. A documentação de backup do Supabase diz que os backups do banco não contêm os objetos armazenados pela API Storage, apenas os metadados. Restaurar o banco, portanto, não restaura um objeto excluído. Se o seu plano de recuperação pressupõe que um botão reverte os dois, o plano está errado. Corrija-o com proteção separada dos objetos e um ensaio de restauração, ou escolha uma arquitetura cujos controles de recuperação atendam ao requisito.
A migração é justificada quando o fornecedor não consegue assinar o contrato necessário, a região ou o limite de rede exigido não está disponível, a retenção de provas não atende ao contrato, ou a organização precisa controlar a infraestrutura de um modo que o serviço hospedado não permite. Registre o controle que falhou e a prova do destino antes da mudança. A hospedagem própria pode dar controle, mas também torna a equipe responsável por atualizações, monitoramento, integridade dos backups, revisões de acesso e provas de incidentes.
Não use a migração para evitar o entendimento dos fluxos de dados. Você precisa do mesmo inventário para migrar com segurança: tabelas, buckets de objetos, registros de autenticação, logs, segredos, réplicas, exportações analíticas e processadores externos. O trabalho de conformidade costuma revelar fluxos não documentados. Essa descoberta pode levar a um reparo menor ou confirmar que o projeto atual precisa mudar.
O custo projetado inclui pessoas e risco de transição
O custo projetado deve comparar o sistema reparado, o estado estável após a migração e a própria transição com a mesma previsão de demanda. Comparar a conta atual do Supabase com apenas a linha do banco de outro fornecedor produz uma ficção.
Modele o custo por fator de carga. Use usuários ativos mensais quando afetarem autenticação, crescimento da computação e do armazenamento do banco, tráfego de saída por origem e destino, mensagens Realtime e pico de conexões, volume e operações de Storage, invocações de funções Edge, volume e retenção de logs, recursos de backup ou recuperação, suporte e complementos exigidos pelo plano. Obtenha os preços unitários atuais dos dois fornecedores quando a decisão for tomada. Guarde cada preço e cota incluída em uma planilha de premissas com a data da captura, pois os preços mudam.
Use três cenários de demanda em vez de uma previsão falsamente precisa: esperado, alto e contração. A fórmula pode continuar simples:
monthly platform cost =
base plans
+ database compute and storage
+ network egress
+ authentication usage
+ realtime usage
+ function usage
+ logs, backups, and support
monthly operating cost =
engineering hours
+ incident response
+ security and compliance work
+ vendor management
Estime as horas de engenharia pelo trabalho real: implantações que falharam, revisões manuais de políticas, ajuste do banco, depuração de funções, testes de restauração e escaladas de suporte. Não atribua zero ao trabalho absorvido por um fundador. Ele ainda atrasa o trabalho de produto e vendas.
O custo de transição inclui ambientes paralelos, cópia de dados, cópia de objetos, captura de mudanças quando necessária, escritas duplas se forem escolhidas, testes de contrato, atualizações dos clientes, observabilidade, revisão de segurança, suporte ao corte e capacidade de retorno. Adicione como intervalo a exposição de receita ou contratual causada por indisponibilidade e dados inconsistentes, não como um número exato inventado. Uma migração que economiza algumas centenas por mês pode levar anos para se pagar.
Calcule o mês de equilíbrio:
break_even_month =
transition_cost /
(repaired_monthly_cost - migrated_monthly_cost)
Se o denominador for zero ou negativo, o custo não favorece a migração. Se o resultado ultrapassar a provável vida útil da arquitetura, a economia é teórica. Rode a fórmula de novo no cenário de demanda alta, porque um destino pode ficar mais barato somente depois de certo limite, e na contração, porque infraestrutura e equipe fixas podem penalizar o uso menor.
Repare quando ajuste, redimensionamento, arquivamento ou mudança de uma carga alterarem a curva o suficiente. Migre quando um fator estrutural de custo continuar após o reparo, como tráfego de saída inevitável, um plano premium exigido principalmente por um controle, ou trabalho gasto para compensar uma incompatibilidade persistente da plataforma.
Uma decisão pontuada expõe premissas fracas
Uma tabela de pontuação só ajuda quando cada nota aponta para uma prova. Ela não deve esconder o julgamento atrás da aritmética. Use-a para mostrar quais premissas mudam a recomendação e quais perguntas continuam sem resposta.
Dê uma nota de 0 a 3 a cada fator tanto para o reparo quanto para a migração. Zero significa que a opção não atende ao requisito. Três significa que atende com provas demonstradas. Trate conformidade e segurança como portas: se uma opção não consegue cumprir um controle obrigatório, sua pontuação total não a salva.
Use estes fatores:
- Adequação à carga de consultas, sustentada por estatísticas de instruções e planos de execução.
- Clareza da autorização, sustentada pelo inventário de políticas e testes de negação.
- Adequação do runtime, sustentada pelo registro de funções Edge e pela duração da carga.
- Adequação à conformidade, sustentada pela matriz de controles e documentos contratuais.
- Custo durante o período projetado, incluindo transição e trabalho.
Acrescente operação, habilidade da equipe, qualidade do retorno e interrupção das entregas se puderem mudar a escolha. Registre um nível de confiança ao lado de cada nota. Uma nota de custo criada com um mês de dados de uso incompletos não deve parecer igual a uma nota de conformidade confirmada em contrato assinado.
Defina as regras da decisão antes de pontuar. Uma regra prática é reparar quando todas as portas obrigatórias passam, o escopo do reparo está delimitado e o retorno da migração fica fora do período projetado. Migre quando uma porta obrigatória falhar sem um plano confiável ou quando várias restrições medidas sobreviverem a um reparo com tempo limitado. Escolha um híbrido quando um serviço, normalmente computação longa ou análise, causar a maior parte da incompatibilidade.
A tabela também interrompe argumentos de custo afundado. O esforço passado não torna o backend atual adequado, e a irritação não torna uma alternativa adequada. As provas podem mudar durante a avaliação. Se adicionar dois índices e corrigir um predicado de tenant eliminar o suposto problema de escala, atualize a nota sem defender a ideia original da migração.
FixMyMess usa diagnóstico do código e verificação de especialistas para separar defeitos reparáveis em aplicativos gerados por IA de uma arquitetura que precisa ser reconstruída, e sua auditoria de código gratuita pode fornecer esse primeiro inventário delimitado. A decisão continua pertencendo aos responsáveis pelo aplicativo, principalmente quando envolve contratos, tolerância ao risco e carga futura.
Faça o corte somente com um retorno comprovado
Uma decisão de migração está incompleta até a equipe conseguir descrever movimento dos dados, validação, corte e retorno. «Exportar e importar PostgreSQL» cobre apenas parte de um backend Supabase.
Faça o inventário de esquemas de banco, extensões, funções, políticas RLS, funções SQL, gatilhos, tarefas agendadas, usuários do Auth e mapeamentos de identidade, objetos e metadados do Storage, assinaturas Realtime, funções Edge, segredos, registros de webhooks, DNS e todas as configurações dos clientes. Decida o que muda, o que fica e o que será removido. Preserve identificadores estáveis de usuário quando possível ou faça um mapeamento explícito, pois as linhas de autorização e propriedade costumam depender deles.
Escolha uma migração com indisponibilidade para um produto pequeno quando uma janela de manutenção for aceitável. Ela é mais fácil de entender do que escritas duplas. Para uma mudança com pouca indisponibilidade, estabeleça uma cópia inicial, replique alterações posteriores no banco, copie objetos com checksums, congele mudanças de esquema, valide o atraso e planeje como as escritas finais serão transferidas. A escrita dupla no código do aplicativo parece segura, mas cria regras de conflito e combinações de falhas que muitas equipes pequenas não conseguem testar.
Defina as verificações de aceitação antes de copiar os dados. Compare contagens de linhas por tenant e tabela, somas ou hashes de campos estáveis escolhidos, contagens de órfãos, contagem e checksums de objetos, resultados dos testes de políticas, testes de contratos da API e uma amostra das jornadas essenciais. Os totais podem bater enquanto a propriedade está errada, então valide relações e acesso por meio de funções reais de usuário.
Mantenha a origem somente para leitura ou recuperável de outra forma durante um período acordado após o corte. Declare o gatilho de retorno em termos mensuráveis: taxa de erros, registros ausentes, falha de autenticação, divergência no retorno de pagamento ou atraso inaceitável da replicação. Declare quem pode ordenar o retorno e como as escritas feitas após o corte voltarão ao sistema antigo. Um plano de retorno que perde novas escritas é uma troca de emergência, não uma reversão completa.
Para um reparo, use a mesma disciplina em escala menor. Faça um backup verificado, aplique migrações por arquivos versionados, rode testes de políticas e contratos, acompanhe erros do banco e do aplicativo e prepare uma mudança reversível quando PostgreSQL permitir. O guia de migração do Supabase alerta que mudanças remotas pelo painel ignoram o histórico local de migrações; extraia o estado remoto existente, reconcilie o histórico e pare de fazer alterações de produção não registradas.
A autenticação precisa do próprio ensaio. Hashes de senhas, vínculos de identidades sociais, cadastro multifator, tokens de atualização, modelos de e-mail, regras de redirecionamento e duração das sessões não são transferidos automaticamente com as tabelas. Decida se os usuários mantêm sessões ativas, entram de novo ou redefinem credenciais. Teste convite, recuperação de senha, vínculo de contas e exclusão de conta no destino. Uma migração que preserva linhas de perfil, mas bloqueia seus donos, falhou.
O Storage também precisa de duas validações. Primeiro compare inventário de objetos, tamanho em bytes, tipo de conteúdo e checksum. Depois exercite o acesso como o aplicativo faz, incluindo acesso assinado, objetos públicos, substituição e exclusão. Linhas do banco podem apontar para objetos nunca copiados, enquanto objetos copiados podem se tornar públicos por causa de uma regra de bucket alterada. Guarde os logs da transferência por tempo suficiente para investigar um relato de cliente após o corte.
Faça um ensaio geral com uma cópia recente e sem dados sensíveis e registre a duração de cada fase. O ensaio deve produzir os comandos, responsáveis, pontos de controle e condições de aborto que serão usados no dia real. Se a sincronização final levar mais tempo do que a janela de manutenção ou a validação não terminar antes da reabertura das escritas, mude o plano antes da produção em vez de esperar que os operadores trabalhem mais rápido sob pressão.
A escolha está pronta quando uma opção passou pelos controles obrigatórios, resistiu a testes representativos e mostrou uma carga total menor sob previsões confiáveis. Se nenhuma opção fez isso, continue investigando. Os dados de produção não recompensam confiança maior do que as provas.
Perguntas Frequentes
É mais barato reparar um backend Supabase do que migrá-lo?
Normalmente, se as falhas forem índices ausentes, políticas quebradas, segredos expostos ou mudanças de esquema não rastreadas. Compare o trabalho do reparo com o custo de construir a migração, hospedagem paralela, transferência de dados, validação, corte e trabalho contínuo de operar o destino.
Quantas políticas RLS são demais?
Não existe um número fixo útil. As políticas ficaram complexas demais quando a equipe não consegue declarar e testar o comportamento permitido e negado para cada função, tabela e operação.
Consultas lentas do Supabase podem ser corrigidas sem migração?
Sim, em muitos casos. Use pg_stat_statements e planos de execução para encontrar varreduras caras, estimativas ruins, chamadas repetidas e índices ausentes antes de culpar a plataforma de hospedagem.
Posso migrar apenas as funções Edge do Supabase?
Sim. Mover tarefas longas ou computação especializada para workers e manter Supabase para PostgreSQL, Auth ou Storage pode retirar a principal restrição com menos risco do que uma migração completa.
Mudar para outro host PostgreSQL elimina a complexidade de RLS?
Não. As políticas PostgreSQL e o modelo de permissões ainda precisam de projeto e testes, ou a decisão de autorização deve ir para uma camada separada do aplicativo que você também terá de operar.
O que devo auditar antes de uma migração do Supabase?
Audite esquemas, extensões, funções, políticas, identidades do Auth, objetos do Storage, uso de Realtime, funções Edge, segredos, webhooks, backups, clientes e fluxos de dados. Inclua configurações não documentadas do painel porque o controle de versão não as mostrará.
Um backend personalizado é mais seguro que o Supabase?
Não automaticamente. Um backend personalizado oferece controles diferentes e mais responsabilidade, e uma autorização ou gestão de segredos fraca continua fraca depois da reescrita.
Quando requisitos de conformidade forçam uma migração?
Eles forçam a mudança quando um controle obrigatório por escrito não pode ser atendido pelo plano, configuração, processo ou contrato disponíveis. Verifique se o destino satisfaz esse controle antes de tratar a migração como resposta.
Qual deve ser o prazo de retorno de uma migração?
Ele deve ser menor do que a vida útil esperada da arquitetura de destino e aceitável para a empresa. Teste o resultado com demanda esperada, alta e em contração, em vez de confiar em uma previsão.
Qual é a estratégia mais segura para migrar o Supabase?
Use a estratégia mais simples que atenda ao requisito de indisponibilidade, com inventários explícitos, testes de contrato, validação de dados e gatilho de retorno. Produtos pequenos muitas vezes reduzem o risco com uma janela de manutenção planejada em vez de escritas duplas mal testadas.