Logosulfite.app
rafagazani/sulfite 999999

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.