Files
todolist-fullstack/SUPABASE_SELFHOSTED_SETUP.md

8.3 KiB

🔧 Supabase Self-Hosted Configuration Guide

📌 O que é Supabase Self-Hosted?

Supabase self-hosted é uma implementação da plataforma Supabase que você hospeda em sua própria infraestrutura (servidor, VPS, Docker, etc.) ao invés de usar o serviço cloud em supabase.co.

Sua URL: https://supabase.stackbackup.cloud/


🚀 Configuração no Backend (NestJS)

Passo 1: Arquivo .env do Backend

# ============================================================================
# SUPABASE CONFIGURATION (Self-Hosted)
# ============================================================================
SUPABASE_URL=https://supabase.stackbackup.cloud
SUPABASE_ANON_KEY=seu_anon_key_aqui
SUPABASE_SERVICE_KEY=seu_service_key_aqui

# ============================================================================
# JWT CONFIGURATION
# ============================================================================
JWT_SECRET=sua_chave_secreta_minimo_32_caracteres
JWT_EXPIRATION=7d

# ============================================================================
# DATABASE (Opcional - se precisar acesso direto)
# ============================================================================
# DATABASE_URL=postgresql://user:password@seu-host:5432/postgres

# ============================================================================
# APP CONFIGURATION
# ============================================================================
NODE_ENV=development
PORT=3000
API_PREFIX=/api

# ============================================================================
# CORS CONFIGURATION
# ============================================================================
CORS_ORIGIN=http://localhost:3000,http://localhost:3001

Passo 2: Verificar Conexão com Supabase Self-Hosted

Ao rodar o backend:

cd backend-api
npm run start:dev

Você deve ver no console:

Supabase client initialized successfully
Connected to: https://supabase.stackbackup.cloud

Passo 3: Encontrar suas Chaves API

  1. Acesse: https://supabase.stackbackup.cloud/
  2. Vá para: Projeto → Settings → API
  3. Copie:
    • SUPABASE_URL - URL base do seu Supabase
    • SUPABASE_ANON_KEY - Chave anônima (pública, ok expor no frontend)
    • SUPABASE_SERVICE_KEY - Chave de serviço (SECRETA! só backend)

🌐 Configuração no Frontend (Next.js)

Passo 1: Arquivo .env.local do Frontend

# ============================================================================
# API Backend
# ============================================================================
NEXT_PUBLIC_API_URL=http://localhost:3000/api
NEXT_PUBLIC_API_TIMEOUT=10000

# ============================================================================
# Supabase (Self-Hosted)
# ============================================================================
NEXT_PUBLIC_SUPABASE_URL=https://supabase.stackbackup.cloud
NEXT_PUBLIC_SUPABASE_ANON_KEY=seu_anon_key_aqui

# ============================================================================
# Aplicação
# ============================================================================
NEXT_PUBLIC_APP_NAME=Task Manager
NEXT_PUBLIC_APP_VERSION=1.0.0

Passo 2: Usar no Frontend (se necessário)

Se quiser integração direta com Supabase no frontend:

import { createClient } from '@supabase/supabase-js';

const supabase = createClient(
  process.env.NEXT_PUBLIC_SUPABASE_URL!,
  process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,
);

🔐 Diferenças entre ANON_KEY e SERVICE_KEY

Propriedade ANON_KEY SERVICE_KEY
Localização Frontend (público) Backend (secreto)
Permissões Limitadas (usuário autenticado) Total (sem verificação RLS)
Segurança Ok expor ⚠️ NUNCA expor
Uso Autenticação, queries do usuário Admin tasks, bypass RLS

Seu arquivo .env.example:

# Público - OK no frontend
NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

# Secreto - NUNCA EXPOR! Apenas backend
SUPABASE_SERVICE_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

🔗 Fluxo de Autenticação

Frontend                          Backend                    Supabase
   |                               |                            |
   |--- Clica Login                |                            |
   |                               |                            |
   |--- POST /auth/login --------> |                            |
   |     (email, password)          |--- Autentica com -------> |
   |                               |   ANON_KEY                 |
   |                               |<--- JWT token -------------|
   |<---- Retorna JWT -------------|                            |
   |                               |                            |
   | (Armazena token)              |                            |
   |                               |                            |
   |--- GET /tasks                 |                            |
   |     Authorization: Bearer {token}                          |
   |                               |--- Valida JWT             |
   |                               |--- SELECT * from tasks    |
   |                               |    WHERE user_id = xxx    |
   |                               |    (RLS aplica) --------> |
   |<--- Retorna tarefas ----------|<--- Tarefas do usuário ---|

🧪 Testar Configuração

1. Backend - Testar Conexão

# Rodar backend
cd backend-api
npm run start:dev

# Em outro terminal, testar endpoint
curl http://localhost:3000/api/auth/me \
  -H "Authorization: Bearer seu_token_jwt"

Esperado:

  • Retorna dados do usuário
  • 401 se token inválido
  • 500 se não conseguir conectar Supabase

2. Frontend - Testar Conexão

# Rodar frontend
cd frontend-next
npm run dev

# Abrir http://localhost:3000
# Tentar fazer login

# Ver console do navegador
# Deve mostrar: "API conectada com sucesso"

3. Verificar URLs

# Backend deve conseguir alcançar Supabase
curl https://supabase.stackbackup.cloud/auth/v1/health

# Esperado: {"version":"1.x.x"}

⚠️ Troubleshooting

Erro: "ENOTFOUND supabase.stackbackup.cloud"

Problema: DNS não está resolvendo a URL
Solução:

  1. Verificar se supabase.stackbackup.cloud está acessível
  2. Testar: ping supabase.stackbackup.cloud
  3. Verificar firewall/proxy

Erro: "Invalid API key"

Problema: ANON_KEY ou SERVICE_KEY incorreta
Solução:

  1. Ir para: https://supabase.stackbackup.cloud/ → Settings → API
  2. Copiar chaves novamente (sem espaços extras)
  3. Atualizar .env
  4. Reiniciar servidores

Erro: "CORS error"

Problema: Frontend não consegue chamar backend
Solução:

  1. Verificar NEXT_PUBLIC_API_URL no frontend
  2. Verificar CORS_ORIGIN no backend
  3. Certificar que URLs correspondem

Backend .env:

CORS_ORIGIN=http://localhost:3000,https://seu-frontend.com

Erro: "RLS policy violation"

Problema: Usuário não consegue acessar dados por RLS
Solução:

  1. Executar SQL de RLS no Supabase:
    • https://supabase.stackbackup.cloud/ → SQL Editor
    • Colar SQL_TASKS_TABLE_RLS.sql
    • Clicar RUN

📚 Referências


Checklist de Configuração

Para seu setup com supabase.stackbackup.cloud:

  • Backend .env:

    • SUPABASE_URL=https://supabase.stackbackup.cloud
    • SUPABASE_ANON_KEY=... (copiar correto)
    • SUPABASE_SERVICE_KEY=... (copiar correto)
    • JWT_SECRET=... (minimo 32 chars)
  • Frontend .env.local:

    • NEXT_PUBLIC_API_URL=http://localhost:3000/api
    • NEXT_PUBLIC_SUPABASE_URL=https://supabase.stackbackup.cloud
    • NEXT_PUBLIC_SUPABASE_ANON_KEY=... (copiar correto)
  • Testar Conexão:

    • Backend inicia sem erros
    • Frontend consegue fazer login
    • Consegue criar/listar tarefas
    • RLS está isolando dados por usuário

Status: 🟢 Configurado para Supabase Self-Hosted
URL: https://supabase.stackbackup.cloud/