Como instalar o Supabase self-hosted em uma VPS Ubuntu

O Supabase é uma alternativa open-source ao Firebase com PostgreSQL, autenticação, storage, funções e API REST automática. A instalação self-hosted usa o repositório oficial com Docker Compose e inclui mais de 10 serviços. Reserve 60 minutos e um servidor com pelo menos 4 GB de RAM.

cerca de 60 minjunho/2026 · Ubuntu 24.04 LTS

Antes de começar

VPS mínima
2 vCPU · 4 GB RAM · 40 GB SSD (Runstack Pro)
Sistema
Ubuntu 24.04 LTS
Também
  • Docker e Docker Compose instalados
  • Git instalado
  • Subdomínio apontado para o IP da VPS (ex.: supabase.seudominio.com.br)
  • Portas 80 e 443 abertas no firewall

Instalação passo a passo

  1. 1

    Atualizar o sistema e instalar dependências

    Instale Docker, Docker Compose e Git.

    bash
    apt update && apt upgrade -y
    apt install -y git curl
    
    # Instalar Docker
    curl -fsSL https://get.docker.com -o get-docker.sh && sh get-docker.sh
    docker --version && docker compose version
  2. 2

    Clonar o repositório oficial do Supabase

    A configuração Docker oficial fica na pasta `docker/` do monorepo do Supabase.

    bash
    git clone --depth 1 https://github.com/supabase/supabase
    cd supabase/docker
  3. 3

    Copiar o arquivo de exemplo de variáveis

    O repositório inclui um `.env.example` completo com todos os valores padrão.

    bash
    cp .env.example .env
  4. 4

    Gerar segredos de produção

    Gere valores seguros para JWT_SECRET, POSTGRES_PASSWORD e DASHBOARD_PASSWORD. O repositório oficial inclui scripts auxiliares para geração das chaves JWT.

    bash
    # Gerar JWT_SECRET (mínimo 32 caracteres)
    openssl rand -base64 48
    
    # Gerar POSTGRES_PASSWORD
    openssl rand -hex 24
    
    # Gerar DASHBOARD_PASSWORD
    openssl rand -hex 16
    
    # Para ANON_KEY e SERVICE_ROLE_KEY: use o script oficial
    # (requer as instruções em supabase/docker/README.md)
    cd supabase/docker
    cat README.md | grep -A 10 "generate"
  5. 5

    Editar o arquivo .env

    Atualize as variáveis críticas de segurança no arquivo .env.

    .env
    # Variáveis obrigatórias a alterar em /supabase/docker/.env:
    
    POSTGRES_PASSWORD=senha_postgres_muito_segura
    
    JWT_SECRET=seu_jwt_secret_com_minimo_32_caracteres
    
    # Gerados com base no JWT_SECRET — veja README do repositório
    ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
    SERVICE_ROLE_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
    
    DASHBOARD_USERNAME=supabase
    DASHBOARD_PASSWORD=senha_dashboard_segura
    
    # URL pública do Supabase
    SITE_URL=https://supabase.seudominio.com.br
    API_EXTERNAL_URL=https://supabase.seudominio.com.br
  6. 6

    Subir todos os serviços

    O Docker Compose oficial do Supabase sobe mais de 10 serviços: Studio, Kong, Auth, PostgREST, Realtime, Storage, ImgProxy, Meta, Functions e banco PostgreSQL.

    bash
    cd supabase/docker
    docker compose up -d
    
    # Acompanhar a inicialização
    docker compose ps
    
    # Verificar logs do banco (primeiro serviço a inicializar)
    docker compose logs db --tail=30
  7. 7

    Configurar Nginx como reverse proxy

    Exponha o Studio (porta 3000) e o Kong API Gateway (porta 8000) via HTTPS.

    bash
    apt install -y nginx
    
    cat > /etc/nginx/sites-available/supabase << 'NGINXEOF'
    server {
        listen 80;
        server_name supabase.seudominio.com.br;
        return 301 https://$host$request_uri;
    }
    
    server {
        listen 443 ssl;
        server_name supabase.seudominio.com.br;
    
        ssl_certificate /etc/letsencrypt/live/supabase.seudominio.com.br/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/supabase.seudominio.com.br/privkey.pem;
    
        # Kong API Gateway (porta 8000)
        location / {
            proxy_pass http://127.0.0.1:8000;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
        }
    }
    NGINXEOF
    
    ln -s /etc/nginx/sites-available/supabase /etc/nginx/sites-enabled/supabase
    nginx -t && systemctl reload nginx
  8. 8

    Obter certificado SSL

    Emita o certificado gratuito com Let's Encrypt.

    bash
    apt install -y certbot python3-certbot-nginx
    
    certbot --nginx \
      -d supabase.seudominio.com.br \
      --non-interactive \
      --agree-tos \
      --email seu@email.com
    
    systemctl reload nginx
  9. 9

    Configurar firewall UFW

    Restrinja as portas expostas.

    bash
    ufw allow 22/tcp comment 'SSH'
    ufw allow 80/tcp comment 'HTTP'
    ufw allow 443/tcp comment 'HTTPS'
    ufw --force enable
    ufw status verbose
  10. 10

    Verificar e acessar o Studio

    Confirme que todos os serviços estão saudáveis e acesse o painel.

    bash
    # Verificar todos os containers
    docker compose -f supabase/docker/docker-compose.yml ps
    
    # Testar o Kong gateway
    curl -s http://127.0.0.1:8000/rest/v1/ \
      -H "apikey: SUA_ANON_KEY" | head -c 100

Não quer configurar manualmente?

Implante o Supabase em menos de 5 minutos com a Runstack. Infraestrutura da OPEN Datacenter, com servidores em São Paulo.

Se der problema

Verifique se ANON_KEY e SERVICE_ROLE_KEY no .env são JWTs válidos assinados com o mesmo JWT_SECRET. Chaves inconsistentes causam falhas silenciosas.

Remova o volume corrompido e reinicie.

bash
docker compose down -v
docker compose up -d

O Studio demora para carregar na primeira vez. Aguarde 3-5 minutos após o `docker compose up -d` e recarregue a página.

As ANON_KEY e SERVICE_ROLE_KEY devem ser geradas especificamente com o JWT_SECRET definido no .env. Chaves do exemplo do repositório não funcionam se JWT_SECRET foi alterado.

O Supabase com todos os serviços consome 2-3 GB em idle. Certifique-se de ter pelo menos 4 GB de RAM disponível. Considere o Runstack Pro (4 GB) como mínimo.

Perguntas frequentes

Sim. A versão self-hosted oferece o mesmo PostgreSQL, Auth, Storage e API REST. A principal diferença é que Edge Functions locais têm algumas limitações comparadas ao Cloud. Para projetos de médio porte, o self-hosted é uma opção viável e econômica.

Ambas são JWTs assinados com HS256 usando o JWT_SECRET. O repositório oficial inclui instruções e scripts em `supabase/docker/`. Também é possível usar jwt.io (temporariamente, offline) para gerar os tokens com o payload correto.

Faça `git pull` na pasta do repositório clonado, revise o `.env.example` por novas variáveis, e execute `docker compose pull && docker compose up -d`.

Sim. Por padrão, os arquivos são armazenados em volume local. Para produção com alto volume de arquivos, configure o backend S3 nas variáveis de ambiente do serviço Storage.

Para uso interno, é possível acessar via IP:8000 (Kong) e IP:3000 (Studio) sem domínio. Para produção e autenticação com magic link ou OAuth, um domínio com SSL é necessário.