Pular para o conteúdo
Voltar aos projetos
Entregue ao clienteFull Stack · Back-End2026

SAFER · Sistema do Sindicato

Gestão completa de um sindicato rural: filiados, mensalidades, jurídico, agenda, documentos e chat, com portal do filiado e login por reconhecimento facial.

Tela do SAFER · Sistema do Sindicato
Chat em tempo real entre a equipe do sindicato
Chat em tempo real entre a equipe do sindicato
Digitalização de documento pelo celular com recorte automático
Digitalização de documento pelo celular com recorte automático

Prints do ambiente de teste, com dados fictícios.

O problema

O sindicato precisava centralizar o cadastro de filiados, as mensalidades, os processos jurídicos e os documentos, com acesso diferente para diretoria, secretaria, supervisão e advogados, e dar ao filiado, muitas vezes com pouca familiaridade com tecnologia, um jeito simples de mostrar a carteirinha pelo celular.

Meu papel

Projeto individual, em andamento desde ago/2026: modelagem, API, front-end, testes, infraestrutura na VPS (deploy, backup diário e hardening de SSH) e manuais de uso por cargo.

Arquitetura

Arquitetura do SAFER · Sistema do SindicatoPainel + Portal → Nginx (HTTPS); Nginx → API Spring Boot 3.5; Painel + Portal → STOMP / WebSocket (STOMP + JWT); API Spring Boot 3.5 → OpenCV; API Spring Boot 3.5 → PostgreSQL (JPA); API Spring Boot 3.5 → MinIO (S3 API); @Scheduled → PostgreSQLHTTPSSTOMP + JWTJPAS3 APIPainel + PortalReact · Vite · PWANginxTLS Let's Encrypt · proxyAPI Spring Boot 3.516 módulos · JWT · 2FASTOMP / WebSocketChat · notificaçõesOpenCVYuNet + SFace · scanner@ScheduledPrazos · mensalidadesPostgreSQLFlyway · 64 migrationsMinIODocumentos · fotos
ClienteBorda / proxyServiçoAssíncronoDados assíncrono / eventos

Decisões técnicas e trade-offs

  1. Portal do filiado sem senha: CPF + nascimento, depois selfie

    Muitos filiados não guardariam uma senha. O acesso tem duas etapas com tokens curtos: CPF e data de nascimento liberam um token de desafio de 5 minutos; a selfie tirada na hora, comparada com a foto da carteirinha, libera a sessão de 30 minutos. Quem não passa no rosto recebe um código de 6 dígitos por e-mail.

    Trade-off · Mais simples para o usuário, mas depende de foto cadastrada e de consentimento explícito para biometria, registrado na auditoria.

  2. Reconhecimento facial no próprio servidor (OpenCV)

    YuNet detecta o rosto e SFace gera um vetor de 128 posições; a decisão é a similaridade de cosseno acima do limiar de referência do modelo (0,363). Nenhuma foto sai para serviço de terceiros.

    Trade-off · Evita custo por chamada e transferência de dado biométrico (LGPD), em troca de CPU na VPS e de calibrar o limiar sozinho.

  3. Limite de tentativas por IP e por conta

    Só por IP não segura um ataque distribuído contra o e-mail da diretoria. Cinco senhas erradas na mesma conta a bloqueiam por 10 minutos e o dono recebe um único aviso; com 2FA ativo, o login só é registrado como sucesso depois do segundo fator.

    Trade-off · Um atacante pode bloquear temporariamente uma conta de propósito; o bloqueio curto limita o estrago.

  4. Geolocalização de login desligada por padrão

    O serviço gratuito de geolocalização por IP usa HTTP sem TLS, fica nos EUA e proíbe uso comercial. Por padrão o histórico guarda só o IP, e IPs privados nem são consultados.

    Trade-off · Menos contexto no histórico de acessos, em troca de não enviar dado pessoal para fora sem base legal.

Desafios

Documentos fotografados tortos pelo celular
Um "scanner" no servidor acha o maior quadrilátero da foto (bordas de Canny, com limiar adaptativo como alternativa), corrige a perspectiva e realça o texto em cor, cinza ou preto e branco. Se não achar a folha, a pessoa arrasta os 4 cantos na tela.
Notificações push travando o chat
O envio de Web Push saiu da requisição e passou a rodar em paralelo; assinaturas que o provedor responde com 404/410 são apagadas para não tentar de novo.
Operação sem equipe de infraestrutura
Deploy por script versionado, backup diário do banco e dos arquivos do MinIO com 14 dias de retenção, imagem do MinIO fixada e SSH só por chave.

Destaques

  • 16 módulos de domínio (filiados, financeiro, jurídico, agenda, mensagens, portal...) em um monolito organizado por pacote
  • 64 migrations Flyway e 183 testes automatizados, incluindo integração com PostgreSQL real via Testcontainers
  • Cinco perfis com regras próprias: diretoria, secretaria, supervisão, advogados e o filiado no portal
  • 13 rotinas agendadas (prazos, lembretes, mensalidades, limpeza de auditoria), a maioria com fuso America/Bahia
  • Front em React + Vite com testes Vitest e E2E no Playwright; manuais por cargo gerados a partir desses testes