Deploy: PostgreSQL#
Produção single-node com todos os stores persistidos no Postgres. Relatórios, tokens, jobs, share links e conexões sobrevivem a restarts e atualizações.
Quando usar: produção com uma instância, Supabase, RDS, Cloud SQL, ou Postgres próprio.
Configuração#
cd examples/server
cp .env.postgres.example .env.postgres
Edite .env.postgres:
POSTGRES_PASSWORD=senha-segura # senha do banco local (Docker Compose)
AUTH_SECRET=<openssl rand -hex 32> # segredo JWT
ENCRYPTION_KEY=<openssl rand -base64 32> # opcional — criptografia at-rest
Subindo com Docker Compose#
O compose sobe o Sulfite + um Postgres local automaticamente:
docker compose -f docker-compose.postgres.yml --env-file .env.postgres up --build
O servidor aguarda o Postgres estar saudável antes de iniciar. A URL de conexão é montada internamente:
postgresql://sulfite:<POSTGRES_PASSWORD>@postgres:5432/sulfite.
Usando Postgres externo (Supabase, RDS, etc.)#
Substitua o serviço postgres do compose pela URL do seu banco:
# .env.postgres
DATABASE_URL=postgresql://usuario:senha@db.supabase.co:5432/postgres?sslmode=require
POSTGRES_PASSWORD= # não necessário quando DATABASE_URL está definido
E rode apenas o serviço server:
docker compose -f docker-compose.postgres.yml --env-file .env.postgres up server --build
Variáveis relevantes#
STORAGE_BACKEND=postgres # relatórios em Postgres
DATABASE_URL=postgresql://... # string de conexão completa (ou variáveis PG_*)
AUTH_SECRET=... # obrigatório
ENCRYPTION_KEY=... # opcional — relatórios criptografados em repouso
TOKEN_STORE_BACKEND=postgres # tokens JWT persistidos
JOB_QUEUE_BACKEND=postgres # jobs assíncronos persistidos
SHARE_LINK_STORE_BACKEND=postgres # share links persistidos
BANNED_IP_STORE_BACKEND=postgres # banimentos de IP persistidos
CONNECTION_REGISTRY_BACKEND=postgres # conexões de datasource persistidas
Schema#
O servidor aplica o schema automaticamente no boot com CREATE TABLE IF NOT EXISTS. Não é necessário executar migrations manualmente.
Verificando#
curl http://localhost:8090/health
# → {"status":"ok","storage":"postgres","version":"..."}
Criptografia at-rest#
Com ENCRYPTION_KEY definido, os relatórios armazenados no Postgres são criptografados com AES-256-GCM. A chave é um base64 de 32 bytes:
ENCRYPTION_KEY=$(openssl rand -base64 32)
Para rotacionar a chave sem downtime, defina ENCRYPTION_KEY_PREV com a chave antiga enquanto o servidor re-encripta os relatórios existentes.
Próximo passo#
Quando precisar de múltiplas instâncias ou zero-downtime em escala → Cluster.