Pular para o conteúdo principal

Supabase Self-Hosted — Guia do usuário

Guia do produto Supabase Self-Hosted do marketplace: o que é, para que serve, em que difere do Supabase Cloud e como acessar e operar o que é instalado.


1. O que é​

O Supabase é uma alternativa open-source ao Firebase. Ele entrega, num único pacote, o backend completo de uma aplicação em cima de um banco PostgreSQL:

ComponentePara que serve
PostgreSQLBanco de dados relacional, com acesso direto por string de conexão
API REST e GraphQLAPI gerada automaticamente a partir das tabelas (PostgREST)
AuthCadastro, login (e-mail/senha, magic link, OAuth), sessões e JWT
StorageUpload e entrega de arquivos, com regras de acesso
RealtimeEventos em tempo real (mudanças no banco, broadcast, presença)
Edge FunctionsFunções serverless em Deno/TypeScript
StudioPainel web para administrar tudo isso

Este produto instala a versão self-hosted oficial (self-hosted/v0.8.2), seguindo a documentação do Supabase, num nó Docker do seu ambiente, com HTTPS (certificado Let's Encrypt) pelo proxy Caddy.

2. Para que serve​

  • Ter o backend de um app (web ou mobile) — banco, login, arquivos e API — sem escrever um servidor do zero.
  • Manter os dados na sua infraestrutura, na região do seu ambiente (útil para LGPD e políticas internas).
  • Ter custo previsível, pelos recursos do ambiente, sem cobrança por usuário ativo, requisição ou armazenamento do Supabase.
  • Ambientes de desenvolvimento, homologação ou produção que você controla por completo.

3. Self-hosted × Supabase Cloud: o que muda​

Só as diferenças que afetam o uso no dia a dia:

TemaSupabase Cloud (hosted)Este produto (self-hosted)
ProjetosVários projetos por organizaçãoUm projeto por ambiente (para outro projeto, instale outro ambiente)
AtualizaçõesFeitas pelo SupabaseVersão fixa (v0.8.2); atualizar é manual
Config. de Auth (SMTP, provedores OAuth, URLs de redirect)Pelo painelPelo arquivo .env + reinício (ver seção 8.2)
E-mails de AuthSMTP embutido (com limites)Sem SMTP real: configure o seu antes de liberar cadastro por e-mail
Painel (Studio)Completo: organizações, billing, branchingReduzido: um projeto, sem billing/branching
Edge FunctionsDeploy pela CLI (supabase functions deploy)Código em /home/supabase/volumes/functions no servidor
Escala e recursosGerenciados pelo SupabaseRecursos do nó ajustáveis por você

Resumo: você ganha controle, dados no seu servidor e custo fixo; em troca, backups, atualizações, e-mail e monitoramento passam a ser seus.

4. Instalação​

4.1 Opções​

OpçãoPadrãoO que faz
Habilitar MCPDesmarcadaExpõe o servidor MCP do Supabase em https://<domínio>/mcp, protegido por token (ver seções 6.3 e 7). Pode ser habilitado ou desabilitado depois, pelo add-on MCP.

4.2 O que é criado​

Um nó Docker Engine com IP público, portas 80/443, até 32 cloudlets (mínimo reservado de 8) e 30 GB de disco. Tudo do Supabase fica em /home/supabase (volume persistente).

Durante a instalação, automaticamente:

  1. São gerados a senha do painel, a senha do PostgreSQL, as chaves JWT/API e, se marcado, o token do MCP.
  2. Os arquivos oficiais do Supabase são baixados e o .env é configurado com o domínio do ambiente.
  3. As imagens Docker são baixadas e os serviços iniciados enquanto o add-on Let's Encrypt Free SSL emite o certificado (em paralelo, para instalar mais rápido).
  4. O Caddy sobe com o certificado e o HTTPS é testado.
  5. São instalados os add-ons Senha do painel Supabase, Custom Domain e MCP.

Ao final, a tela de sucesso (também enviada por e-mail) traz todos os acessos. Guarde esse e-mail — ele é o único lugar com todas as senhas e chaves juntas.

5. Acessos​

Nos exemplos, <domínio> é o domínio do ambiente (ex.: env-1234567.sp1.br.saveincloud.net.br) ou o seu domínio próprio, se configurado.

5.1 Studio (painel)​

AcessoValor
URLhttps://<domínio>
Usuáriosupabase
Senhaa do e-mail de instalação (troque pelo add-on Senha do painel Supabase)

O Studio é o painel de administração: tabelas, SQL Editor, usuários do Auth, buckets do Storage, políticas (RLS) e chaves.

5.2 API (para os apps)​

A URL do projeto é https://<domínio> — a mesma que vai no SDK:

import { createClient } from '@supabase/supabase-js'
const supabase = createClient('https://<domínio>', '<publishable key>')
ChaveOnde usar
Publishable key (sb_publishable_…)Frontend e apps mobile. É pública; o acesso é limitado pelas políticas RLS.
Secret key (sb_secret_…)Só no backend. Ignora o RLS: nunca coloque em código de navegador/app.
Anon key (legado)Equivalente à publishable, para bibliotecas antigas.
Service role key (legado)Equivalente à secret, para bibliotecas antigas. Só no backend.

Endpoints disponíveis: /rest/v1, /graphql/v1, /auth/v1, /storage/v1, /realtime/v1 e /functions/v1.

5.3 PostgreSQL (conexão direta)​

A conexão passa pelo pooler (Supavisor). O usuário leva o nome do ambiente:

postgresql://postgres.<nome-do-ambiente>:<senha-do-postgres>@<domínio>:5432/postgres
PortaModoQuando usar
5432SessionFerramentas (DBeaver, pgAdmin, psql), migrações, apps com conexão longa
6543TransactionServerless e muitas conexões curtas

Se a conexão de fora não abrir, verifique se o firewall do ambiente libera as portas 5432/6543. Se não precisar de acesso externo ao banco, mantenha-as fechadas.

6. Add-ons​

Ficam na aba Add-Ons do nó. Todos pedem confirmação antes de agir.

6.1 Senha do painel Supabase​

Botão Redefinir senha: gera uma senha nova para o Studio (usuário supabase), aplica e envia por e-mail. A senha anterior para de funcionar na hora. O painel fica indisponível por alguns segundos.

6.2 Custom Domain​

Aplica um domínio próprio (ex.: api.suaempresa.com.br) nas configurações do Supabase. Ele não emite certificado. A ordem é:

  1. No DNS, aponte o domínio para o ambiente: CNAME para o domínio do ambiente ou registro A para o IP público do nó.
  2. No add-on Let's Encrypt Free SSL → Configure, adicione o domínio.
  3. No add-on Custom Domain, informe o domínio e clique em Configurar domínio.

Os containers são reiniciados (até ~1 minuto fora do ar). O Supabase passa a responder no domínio novo e continua no domínio do ambiente. Depois, atualize a URL nos seus apps. Para voltar, informe o próprio domínio do ambiente.

6.3 MCP​

O MCP (Model Context Protocol) permite que assistentes de IA (Claude, Cursor, VS Code etc.) consultem e administrem o projeto: listar tabelas, rodar SQL, ver a documentação.

BotãoO que faz
Habilitar / gerar novo tokenHabilita o endpoint (se ainda não estiver) e gera um token novo, enviado por e-mail. Um token anterior deixa de funcionar.
DesabilitarBloqueia o /mcp, remove o token e desfaz a configuração do MCP, voltando ao padrão da instalação.

Nos dois casos o proxy e o api-gw são reiniciados (alguns segundos fora do ar).

⚠️ Quem tem o token tem acesso administrativo ao projeto. Trate-o como a secret key: não publique, não coloque em repositório e gere outro se vazar.

7. Uso do MCP​

7.1 Conexão​

CampoValor
URLhttps://<domínio>/mcp
HeaderAuthorization: Bearer <token>

Sem o header correto, o /mcp responde 401. Com o MCP desabilitado, a rota fica bloqueada (403).

7.2 Exemplo de configuração no cliente​

A maioria dos clientes MCP aceita um JSON como este:

{
"mcpServers": {
"supabase": {
"type": "http",
"url": "https://<domínio>/mcp",
"headers": { "Authorization": "Bearer <token>" }
}
}
}

8. Operação​

O acesso ao servidor é pelo Web SSH do nó (usuário root). Os comandos abaixo rodam em /home/supabase.

8.1 Comandos​

ComandoO que faz
sh run.sh startAplica mudanças do .env (recria só o que mudou)
sh run.sh statusEstado dos containers
sh run.sh logsAcompanha os logs (sh run.sh logs auth para um serviço; Ctrl+C para sair)
sh run.sh restartReinicia os serviços

Toda a configuração fica em /home/supabase/.env. Depois de editar, rode sh run.sh start.

8.2 Configurações de Auth e e-mail​

O .env vem sem servidor de e-mail real. Sem SMTP, os e-mails do Auth (confirmação de cadastro, magic link, recuperação de senha) não são entregues — e, como a confirmação de e-mail vem ligada, usuários novos não conseguem confirmar o cadastro.

Antes de liberar cadastro por e-mail, ajuste no .env:

VariávelPara quê
SMTP_HOST, SMTP_PORT, SMTP_USER, SMTP_PASSSeu provedor de e-mail
SMTP_ADMIN_EMAIL, SMTP_SENDER_NAMERemetente dos e-mails
SITE_URLURL do seu app (destino padrão dos links de e-mail)
ADDITIONAL_REDIRECT_URLSOutras URLs permitidas para redirect, separadas por vírgula
DISABLE_SIGNUPtrue para bloquear novos cadastros
ENABLE_EMAIL_AUTOCONFIRMtrue dispensa a confirmação por e-mail (não recomendado em produção)

Provedores OAuth (Google, GitHub etc.) também se configuram por variáveis de ambiente do serviço auth — veja a documentação do Supabase.

8.3 Onde ficam os dados​

CaminhoConteúdo
/home/supabase/volumes/db/dataDados do PostgreSQL
/home/supabase/volumes/storageArquivos do Storage
/home/supabase/volumes/functionsCódigo das Edge Functions (uma pasta por função)
/home/supabase/.envConfiguração, senhas e chaves

8.4 Backups​

Não há backup automático. Recomendado:

  • Banco: pg_dump periódico, por exemplo:
    cd /home/supabase
    docker exec supabase-db pg_dump -U postgres -Fc postgres > backup-$(date +%F).dump
    e copie o arquivo para fora do servidor.
  • Arquivos: copie /home/supabase/volumes/storage.
  • Configuração: guarde uma cópia do .env em local seguro (sem ele, as chaves JWT mudam e os tokens emitidos param de valer).

8.5 Recursos​

Se o Studio ficar lento ou containers reiniciarem por falta de memória, aumente o limite de cloudlets do nó na Topologia do Ambiente.

9. Segurança — checklist​

  • Guardar o e-mail de instalação em local seguro e trocar a senha do painel se ele for compartilhado.
  • Usar só a publishable key no frontend; secret/service role só no backend.
  • Ativar RLS em todas as tabelas expostas pela API.
  • Configurar SMTP antes de abrir cadastro por e-mail.
  • Fechar as portas 5432/6543 se não houver acesso externo ao banco.
  • Habilitar o MCP só se for usar, gerar novo token se ele vazar e desabilitar quando não precisar mais.

10. Problemas comuns​

SintomaCausa provável / o que fazer
Navegador avisa certificado inválidoCertificado ainda não emitido ou domínio fora dele: confira o add-on Let's Encrypt
Domínio próprio não abreDNS não aponta para o ambiente, ou o domínio não foi incluído no Let's Encrypt antes do Custom Domain
E-mail de confirmação não chegaSMTP não configurado (ver seção 8.2)
/mcp responde 401Token ausente/errado no header Authorization: Bearer
/mcp responde 403MCP desabilitado: use Habilitar no add-on MCP
Algo não sobesh run.sh status e sh run.sh logs <serviço>

11. Referências​