Sulfite Server#
O sulfite_server é o servidor backend do Sulfite. Ele expõe o motor de relatórios como uma
REST API completa — pense nele como um JasperReports Server para Dart.
O que ele faz#
┌──────────┐ ┌──────────────────┐ ┌──────────────┐
│ Cliente │────▶│ Sulfite Server │────▶│ PDF / HTML │
│ (HTTP) │◀────│ (REST API) │◀────│ CSV / Excel │
└──────────┘ └──────────────────┘ └──────────────┘
▲
│
┌─────┴─────┐
│ PostgreSQL │
│ REST APIs │
│ Supabase │
└────────────┘
Com o servidor, você pode:
-
Armazenar relatórios — CRUD completo de templates JSON e pacotes
.sulfite - Gerar relatórios via API — envie dados, receba PDF/HTML/CSV/Excel
- Geração assíncrona — jobs com polling e Server-Sent Events (SSE)
- Gerenciar conexões — registre bancos de dados e APIs, com criptografia AES-256-GCM
- Controlar acesso — tokens com permissões granulares e refresh rotation
- Assinar relatórios — assinatura digital por role com cadeia de confiança
- Compartilhar relatórios — links públicos com código de acesso, expiração e rate limiting
- Modo consumer — API simplificada e read-only para usuários finais
Instalação#
dependencies:
sulfite_server:
git:
url: https://github.com/rafaelgazani/sulfite.git
path: packages/sulfite_server
Quick Start#
import 'package:sulfite_core/sulfite_core_server.dart';
import 'package:sulfite_server/sulfite_server.dart';
void main() async {
final config = ServerConfig.fromEnvironment();
final engine = SulfiteEngineImpl();
final repository = InMemoryReportRepository();
final server = SulfiteServer(
config: config,
repository: repository,
engine: engine,
);
await server.serve();
// Servidor rodando em http://0.0.0.0:8080
}
Ou use o binário pronto:
cd packages/sulfite_server
dart run bin/sulfite_server.dart
Visão geral da API#
| Área | Endpoints | Descrição |
|---|---|---|
| Relatórios | GET/POST/PUT/DELETE /reports |
CRUD de templates |
| Geração | POST /generate, /reports/:id/generate |
Gerar PDF/HTML/CSV/Excel |
| Jobs | GET /jobs/:id, /jobs/:id/stream |
Geração assíncrona com SSE |
| Conexões | GET/POST/PUT/DELETE /connections |
Gerenciar bancos e APIs |
| Hub externo | JWT RS256/JWKS + registry remoto | Usar auth e conexões de um hub externo multi-tenant |
| Autorização por tenant | sulfite_authorized_users |
Restringir permissões por usuário no banco do tenant |
| Datasources | POST /datasources/resolve, /introspect |
Resolver e introspectar fontes de dados |
| Tokens | POST /tokens, /tokens/refresh |
Autenticação e permissões |
| Grupos de relatórios | GET/POST/PUT/DELETE /groups |
Coleções tenant/global e permissões C3 por grupo |
| Assinatura | POST /reports/:id/sign, /port |
Assinatura digital de relatórios |
| Exportação Verificada | GET /export/policy, POST /export/verify, POST /export/confirm |
Download com verificação de identidade via OTP |
| Edição Protegida | GET /edit/policy, POST /edit/verify, POST /edit/confirm |
Acesso ao Studio com verificação de identidade via OTP |
| Compartilhamento | POST /share, GET/DELETE /shares, GET /s/:slug |
Links públicos com controle de acesso |
| Consumer | GET /consumer/reports |
API read-only para usuários finais |
| Health | GET /health, /health/security |
Status e diagnóstico |
Próximos passos#
- Configuração — variáveis de ambiente e opções do servidor
- Autenticação — sistema de tokens com permissões granulares
- Hub externo — JWT RS256 via JWKS e registry remoto de conexões
-
Autorização por tenant — view
sulfite_authorized_users -
Grupos de relatórios — coleções tenant/global e view
sulfite_group_permissions - API de Relatórios — CRUD e geração
- Segurança — hardening, SSRF guard, criptografia
- Testes de Carga — suíte k6 com resultados de referência (Mac Air M1)