docs(supabase): Add self-hosted configuration guide and update env templates
This commit is contained in:
277
SUPABASE_SELFHOSTED_SETUP.md
Normal file
277
SUPABASE_SELFHOSTED_SETUP.md
Normal file
@@ -0,0 +1,277 @@
|
|||||||
|
# 🔧 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
|
||||||
|
|
||||||
|
```dotenv
|
||||||
|
# ============================================================================
|
||||||
|
# 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:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
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
|
||||||
|
|
||||||
|
```dotenv
|
||||||
|
# ============================================================================
|
||||||
|
# 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:
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
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`**:
|
||||||
|
```dotenv
|
||||||
|
# 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
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 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
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 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
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 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`**:
|
||||||
|
```dotenv
|
||||||
|
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
|
||||||
|
|
||||||
|
- 📖 [Supabase Self-Hosted Docs](https://supabase.com/docs/guides/hosting/overview)
|
||||||
|
- 📖 [Supabase API Keys](https://supabase.com/docs/guides/api/api-keys)
|
||||||
|
- 📖 [JWT & RLS](https://supabase.com/docs/guides/auth/row-level-security)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ✅ 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/`
|
||||||
@@ -1,6 +1,8 @@
|
|||||||
# ======================================
|
# ======================================
|
||||||
# SUPABASE CONFIGURATION
|
# SUPABASE CONFIGURATION (Self-Hosted)
|
||||||
# ======================================
|
# ======================================
|
||||||
|
# URL: https://supabase.stackbackup.cloud/
|
||||||
|
# Obter chaves em: Projeto → Settings → API
|
||||||
SUPABASE_URL=https://supabase.stackbackup.cloud
|
SUPABASE_URL=https://supabase.stackbackup.cloud
|
||||||
SUPABASE_ANON_KEY=your_supabase_anon_key_here
|
SUPABASE_ANON_KEY=your_supabase_anon_key_here
|
||||||
SUPABASE_SERVICE_KEY=your_supabase_service_key_here
|
SUPABASE_SERVICE_KEY=your_supabase_service_key_here
|
||||||
|
|||||||
Reference in New Issue
Block a user