Uma arquitetura robusta, segura e ultra-performática construída em Rust, utilizando as melhores práticas da linguagem para entregar tipagem estática, máxima concorrência assíncrona, arquitetura modular e aderência perfeita às premissas de LGPD, Auditoria, Observabilidade e RBAC do Mage Compliance Standard.
O projeto utiliza o estado da arte do ecossistema Rust assíncrono:
- Runtime Assíncrono: Tokio (O padrão da indústria para alta concorrência)
- Framework Web: Axum (Altamente modular, rápido e baseado na stack robusta de
towerehyper) - ORM: Sea-ORM (ORM premium assíncrono com tipagem segura baseado em SQLx)
- Database: PostgreSQL (Principal) & Redis (Cache, Controle de Sessão e Rate Limit)
- Mensageria (RabbitMQ): lapin (Cliente AMQP 0.9.1 puro em Rust assíncrono)
- Documentação: Swagger (OpenAPI 3.0) via
utoipacom UI integrada em/v1/docs - Linter & Formatter: Clippy & Rustfmt (Garantia de 100% clean-code)
- Mensageria de E-mail: Lettre 0.11 (Integração assíncrona robusta via SMTP)
- RBAC Dinâmico e Modular: Controle de acesso baseado em perfis (Roles) com permissões granulares por feature (
view,create,delete,activate) encapsulado em uma macro declarativa limpa e intuitiva:auth_route!. - Gerenciamento de Sessão via Redis (Session Epoch): Rastreamento de tokens JWT em tempo real no cache Redis com invalidação O(1) atômica via padrão de versionamento (session epoch). Um único
INCRinvalida todas as sessões de um usuário instantaneamente — sem varredura de chaves. - Rate Limiting Global com Lua Script: Middleware nativo Axum integrado ao Redis com script Lua atômico via
EVAL, eliminando race conditions TOCTOU entreZCARDeZADD. - CORS Configurável por Ambiente: Controlado via variável
CORS_ALLOWED_ORIGINS. Em produção, origens são restritas à lista configurada; em desenvolvimento, permite qualquer origem como fallback.
- Core CRUD Genérico: Sistema de CRUD genérico através de traits (
CrudEntity,CrudActiveModel) e da macro declarativaimpl_crud_traits!, centralizando operações comuns de banco de dados (busca por ID, criação com mapeamento de conflitos, atualização, exclusão lógica, alteração de status) e reduzindo drasticamente o código repetitivo em novos módulos. - Arquitetura Sem Repositório Boilerplate (DIP): Chamadas diretas do banco a partir dos Services com Sea-ORM, mantendo o código conciso, ágil e livre de padrões redundantes que poluem o projeto.
- Response Mappings Elegantes: Implementação idiomática da trait
Frompara converter registros do banco de dados em DTOs de resposta, eliminando mapeamentos manuais repetitivos dos Services. - Filtragem Dinâmica: Módulo
QueryValidatorrobusto capaz de validar campos, ordenar dinamicamente, impor limites rígidos de paginação e validar ranges de data de forma automática. - Paginação Genérica DRY: Helper genérico
.paginate()integrado ao parse de filtros que reduz a lógica de busca e contagem do banco a uma linha simples de código. - Soft Delete e LGPD: Suporte nativo a exclusão lógica (
is_deleted), combinado com a anonimização automática de dados de usuário em conformidade com as regras da LGPD.
- Decoupled Architecture: Abstração completa através da trait assíncrona
EmailService, permitindo injeção limpa de drivers. - Mock Driver:
MockEmailServicepara simulação visual de e-mails em console durante testes e desenvolvimento. - SMTP Driver:
SmtpEmailServiceassíncrono completo que utiliza a bibliotecalettre0.11 com suporte a TLS, credenciais e variáveis de ambiente configuráveis.
- MessagingProvider Abstraído: Gerenciador global de conexão AMQP com RabbitMQ integrado opcionalmente via
.env(MESSAGING_ENABLED=true). - Publicação e Consumo Resilientes: Suporta reconexão automática, publicação de mensagens JSON tipadas e tratamento resiliente de erros/rejeição com
nack.
- Interface Abstraída: Suporta uploads transparentes através de
StorageProviderglobal que encapsula a traitStorageService. - Provedor Local Nódigo:
LocalStorageServicepadrão para armazenar arquivos em diretório local durante o desenvolvimento com suporte a rota pública Axum de serving estático. - CLI Scaffold Generator: CLI interativa (
make generate-storage) que instala e configura provedores de produção sob demanda (AWS S3, Google Cloud Storage (GCS), Azure Blob Storage) com dependências automáticas e variáveis.env. - Suporte Offline Automático: Drivers gerados possuem fallback mock resiliente quando as credenciais não estão definidas em desenvolvimento.
- Zero Memory Footprint: O backend funciona como um proxy de streaming direto para o microserviço de PDF. O payload gerado em bytes é transmitido instantaneamente ao cliente sem carregar dados em memória ou disco local.
- Endpoints de Debug: Rotas GET/POST dedicadas para validar visualmente templates PDF.
- Circuit Breaker Integrado: Proteção contra cascata de falhas com estados
Closed/Open/HalfOpen. Após 3 falhas consecutivas, o circuito abre por 10 segundos antes de tentar novamente, evitando timeouts em massa.
- Interface administrativa construída diretamente no backend que permite consultar, auditar e inspecionar logs de auditoria e ocorrências de erros registradas no banco de dados.
- Métricas Nativas: Endpoint
/metricsexportando dados em tempo real sobre requisições, latências e concorrência para Prometheus. - Painéis de Grafana Prontos: Grafana local pré-configurado via Docker Compose para visualização visual de CPU, memória, RPS e taxas de status HTTP das rotas Axum.
- Health Checks em 3 Níveis:
/healthe/liveness— liveness simples (processo ativo)/ready— deep health check que valida conectividade com PostgreSQL (SELECT 1) e Redis (PING), retornando 503 se alguma dependência crítica estiver fora
- Correlation ID (Request ID): Middleware que lê/gera
X-Request-ID, propaga viatracing::Spanem todos os logs e métricas, e retorna no header da resposta para rastreabilidade ponta a ponta.
- Graceful Shutdown: Tratamento de
SIGINTeSIGTERMviatokio::signal. O servidor aguarda requests em voo concluírem e desconecta RabbitMQ ordenadamente antes de desligar. - Boot Resiliente com Retry: Todas as dependências externas (PostgreSQL, Redis, RabbitMQ, migrações, bootstrap, StorageProvider) utilizam retry com 5 tentativas e sleep de 2s entre falhas, com log estruturado antes de abortar.
- Sanitização de Erros Internos: Erros de banco de dados (
DbErr) são logados internamente comtracing::error!e retornam ao cliente apenas a mensagem genérica"Erro interno ao processar a requisição", sem vazar schema/queries/nomes de tabela.
O backend-rust suporta dois modos de operação para autenticação:
| Modo | Descrição | Uso |
|---|---|---|
AUTH_MODE=local (default) |
Auth gerenciado pelo próprio monólito | Desenvolvimento simples, MVP |
AUTH_MODE=remote |
Auth delegado ao auth-service-rust |
Alta concorrência, escalabilidade |
# backend-rust/.env
AUTH_MODE=localNenhuma configuração extra — o monólito gerencia login, refresh, logout e sessão como sempre.
# backend-rust/.env
AUTH_MODE=remoteNeste modo:
- O
backend-rustremove os endpoints/v1/auth/login,/v1/auth/refreshe/v1/auth/logout - O middleware JWT continua funcionando — valida o token localmente
- O middleware RBAC continua funcionando — lê permissões do Redis
- A sessão Redis continua funcionando —
auth-service-rustcria as sessões no mesmo Redis - O frontend passa a chamar o
auth-service-rust(porta 8001) para operações de auth
Nenhuma alteração no middleware, RBAC ou sessão. Apenas 3 handlers são desligados.
FRONTEND AUTH SERVICE (8001) MONOLITH (8888)
│ │ │
├─ POST /login ────────────→│ │
│ ├─ SELECT User+Auth+Role │
│ ├─ bcrypt verify │
│ ├─ JWT (HS256) │
│ ├─ Redis: session + perms │
│←── { token, refresh } ────│ │
│ │
├─ GET /api (JWT) ───────────────────────────────────→│
│ ├─ valida JWT local │
│ ├─ lê permissions do Redis │
│ ├─ RBAC sem chamada de rede │
│←─────────────────────────────────────────────────────│
# Modo monolítico
cp .env.rust .env && make test-rust # 48 testes
# Modo auth-service
cp .env.auth.rust .env && make test-auth-rust # 48 testes- Docker Multi-Stage:
Dockerfilecom dois estágios — compilação emrust:1.83-slim-bookworme imagem final mínima emdebian:bookworm-slimcom usuário não-root.
Como o Rust possui uma verbosidade natural devido à sua forte tipagem estática e segurança em tempo de compilação, adicionamos uma ferramenta de CLI interativa para automatizar todo o processo de criação de novos recursos.
Com um único comando, o gerador automatiza a criação do CRUD completo, a migration correspondente, a documentação Swagger OpenAPI, as permissões RBAC no banco de dados, e a suíte completa de testes de integração.
Basta digitar o seguinte comando no terminal:
make generateSe nenhum argumento for fornecido, a CLI iniciará o assistente interativo por prompts com seleção por setas e Enter:
- Nome da Entidade: Digite em PascalCase (ex:
ProductCategory). - Definição de Campos: Digite o nome do campo. Em seguida, selecione o tipo e o nível de obrigatoriedade usando as setas:
- Tipos disponíveis:
string(VARCHAR(255)),text(TEXT),int(INTEGER),bool(BOOLEAN),decimal(NUMERIC(10,2)),float(DOUBLE PRECISION),date(TIMESTAMP WITH TIME ZONE). - Obrigatoriedade:
Nullable (opcional)(padrão) ouNot Null (obrigatório).
- Tipos disponíveis:
- Registro no RBAC: Escolha se deseja registrar a feature no sistema de controle de acesso (RBAC). Se sim, informe o ID, nome e descrição da feature.
Você também pode rodar o comando fornecendo os argumentos diretamente no terminal:
make generate name=Category fields="name:string:notnull description:text active:bool"Formato: campo:tipo (opcional/nullable por padrão) ou campo:tipo:notnull (obrigatório).
Ao rodar o gerador para a entidade Category, ele criará e registrará a seguinte estrutura de arquivos:
- 📄
src/models/category.rs- Entidade de banco mapeada via Sea-ORM. - 📄
src/modules/category/schemas.rs- DTOs de entrada e saída (CreateRequest, UpdateRequest, Response). - 📄
src/modules/category/service.rs- Regras de negócio, paginação DRY e filtragem dinâmica. - 📄
src/modules/category/controller.rs- Handlers Axum mapeando requisições e OpenAPI Docs. - 📄
src/modules/category/routes.rs- Definição de rotas HTTP protegidas por RBAC. - 📄
src/modules/category/mod.rs- Arquivo centralizador do módulo. - 📄
src/migration/mYYYYMMDD_HHMMSS_create_category_table.rs- Script de migration SQL para o banco. - 📄
tests/compliance/t17_category.rs- Arquivo contendo todos os cenários de testes de integração do CRUD. - 📝
src/models/mod.rs- Auto-registro do model. - 📝
src/modules/mod.rs- Auto-registro do módulo Axum. - 📝
src/migration/mod.rs- Auto-registro do script de migração. - 📝
src/modules/observability.rs- Integração automática aos Swagger OpenAPI Docs. - 📝
src/infra/bootstrap.rs- Auto-registro da nova feature nos perfis RBAC do banco. - 📝
tests/compliance/mod.rs&tests/integration_tests.rs- Inclusão da suite de testes de conformidade.
Para evitar a escrita repetitiva de rotinas CRUD (Create, Read, Update, Delete), o projeto possui uma infraestrutura genérica de CRUD centralizada em src/core/crud.rs.
-
Implementação de Traits no Modelo (
src/models/): Utilizando a macroimpl_crud_traits!, declaramos as capacidades de filtragem, busca, ordenação e tratamento de erros do modelo:crate::impl_crud_traits!( Entity, ActiveModel, Column::IsDeleted, Column::Active, "Entidade não encontrada", |_| "Conflito ao criar registro".to_string(), |_| "Conflito ao atualizar registro".to_string(), { // Definições de filtros dinâmicos vec![FilterDefinition::contains("name", (Entity, Column::Name))] }, // Definições de busca por string vec![SearchDefinition::contains("name", (Entity, Column::Name))], // Definições de ordenação vec![OrderDefinition::column("createdAt", (Entity, Column::CreatedAt))], Column::CreatedAt // Coluna de ordenação padrão );
-
Validação Automática no Controller (
src/modules/): Valide parâmetros de consulta, busca e ordenação enviados via Query String diretamente no controller:let parsed_filters = crate::core::crud::validate_and_parse::<user::Entity>(¶ms)?;
-
Uso Simplificado no Service (
src/modules/): Os métodos de serviço podem delegar o trabalho pesado aos utilitários genéricos:- Listagem:
crate::core::crud::list_recordsoulist_records_with_querypara queries com JOINs. - Busca por ID:
crate::core::crud::get_by_id::<Entity>(id, db)(lança erroNotFoundformatado automaticamente). - Criação:
crate::core::crud::create_record::<Entity, _>(db, active_model)(lança erroConflictformatado automaticamente). - Atualização:
crate::core::crud::update_record::<Entity, _>(db, active_model). - Status (Ativo/Inativo):
crate::core::crud::toggle_status::<Entity, ActiveModel>(id, active, db).
- Listagem:
Para adicionar drivers de armazenamento em nuvem sob demanda, use o utilitário CLI:
make generate-storageSelecione o provedor desejado:
- AWS S3
- Google Cloud Storage (GCS)
- Azure Blob Storage
A CLI irá automaticamente copiar o template otimizado, instalar as dependências necessárias no Cargo.toml, registrar o novo provedor no bootstrap do StorageProvider e configurar as variáveis no arquivo .env.
Mantemos um padrão de elite absoluto de integridade e limpeza de código:
Para registrar o hook de commit nativo no repositório local, execute uma única vez:
make init-hooksEste hook interceptará os commits locais e garantirá:
cargo fmt: O código deve estar 100% formatado segundo as regras da linguagem.cargo clippy: Zero warnings permitidas!- Detector de Comentários Legados: Proíbe o commit de restos de códigos comentados (ex:
// let x = 1;). - Doc-Comments: Evita documentações de código vazias ou incompletas.
- Comentários Inline: Proíbe comentários de linha (
//ou///) em arquivos de código fonte para manter o código autodescritivo. - Cobertura Mínima de Testes (Tarpaulin): Garante que a cobertura de linhas esteja em no mínimo 95% antes de aceitar o commit.
Antes de compilar, instale os cabeçalhos de desenvolvimento do PostgreSQL e OpenSSL em seu sistema Linux:
sudo apt update
sudo apt install -y build-essential libssl-dev pkg-config libpq-devCopie o arquivo .env.example para .env e configure suas variáveis locais:
cp .env.example .envmake infra-up # Sobe Postgres, Redis e RabbitMQ em segundo plano
make infra-stop # Pausa os containers de infraestrutura
make infra-down # Remove os containers locais de infraestrutura
make infra-clean # Remove containers, volumes persistidos e imagens locaismake dev # Inicia o servidor com hot-reload (cargo watch)cargo test # Roda todos os testes (unitários e integração em paralelo)
make coverage # Gera relatório detalhado de cobertura (cargo tarpaulin)A cada push ou pull request nas branches main e develop, o pipeline automatizado realiza as seguintes validações em ambiente limpo:
- Setup de Infraestrutura: Inicializa o Postgres, Redis e RabbitMQ via Docker Compose e aguarda a saúde dos serviços.
- Format Check: Executa
cargo fmt --all -- --check. - Clippy Static Analysis: Executa
cargo clippy --all-targets --all-features -- -D warnings. - Testes Unitários e de Integração: Roda
cargo testpara atestar a funcionalidade completa da plataforma.
Portas e URLs padrão dos serviços locais:
- Swagger UI (OpenAPI 3.0):
http://localhost:8888/v1/docs - Health Check:
http://localhost:8888/health - Prometheus Metrics:
http://localhost:8888/metrics - Liveness Probe:
http://localhost:8888/liveness - PDF Debug Template (GET/POST):
http://localhost:8888/v1/debug/pdf - Audit Explorer UI:
http://localhost:8888/v1/audit/explore