Skip to content

install.sh/update.sh: o mesmo SUPABASE_DB_URL faz o DDL e o runtime do app #192

Description

@melgarafael

Achado e descrito por @ygorebos, instalando numa VPS com Supabase self-hosted. Ele o deixou
registrado como fora do escopo do PR #188; eu confirmei no código da main 9249e6f e abro aqui
para não se perder — o fork dele foi apagado e o PR fechou junto.

O que ele descreveu

install.sh e update.sh usam o mesmo SUPABASE_DB_URL para instalar schema e para o app rodar.
São necessidades diferentes: create extension e o baseline.sql exigem o dono do banco, enquanto
o app quer a role menor. Num Supabase da nuvem isso não aparece porque a connection string do
pooler já é privilegiada; self-hosted obriga a trocar a role antes e depois, na mão.

Confirmado no código

Uma variável, dois papéis:

papel onde
DDL — aplica baseline.sql, cria extensões, promove o dono install.sh:1175, :1190, :1196, :1208, :1218, :1243; update.sh:129, :134
runtime do app — vai para o .env que os contêineres leem install.sh:1067 (envq SUPABASE_DB_URL "$SUPABASE_DB_URL")

E o projeto já recomenda a separação em outro lugar — docs/deploy-selfhost/README.md:76:

Crie também a role dedicada do worker (mais seguro que usar o superusuário):

create role agent_worker login password 'TROQUE-ESTA-SENHA' bypassrls;

Então a doutrina escrita e o instalador discordam: o doc manda separar, o install.sh não tem onde
receber a segunda role.

Por que não aparece na nuvem

Na nuvem a connection string do Session pooler já é postgres.<ref>, privilegiada o bastante para as
duas coisas. O acoplamento existe lá também — só não dói. Num Supabase próprio, dói na primeira
instalação, e a saída hoje é editar o .env na mão entre uma etapa e outra.

Encaminhamento sugerido (não é decisão minha)

Duas variáveis, com a de DDL sendo opcional e caindo na outra quando ausente — assim a nuvem não muda
nada e o self-host ganha o encaixe:

  • SUPABASE_DB_URL — a do app (a role menor)
  • SUPABASE_DB_ADMIN_URL — a do schema; se vazia, usa a de cima

Se for por aí: a var nova entra em .env.example e em lib/env.ts como opcional (§5 do
complemento-do-ci.md), e o update.sh precisa da mesma distinção — ele reaplica o baseline.sql.

NÃO MEDIDO

Não instalei numa VPS com Supabase self-hosted para ver a falha acontecer. O que eu confirmei foi o
acoplamento no código e a recomendação conflitante no doc; o relato da falha em campo é do @ygorebos.

Metadata

Metadata

Assignees

No one assigned

    Labels

    area/kitArea tocada: kit

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions