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.



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
Decisões técnicas e trade-offs
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.
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.
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.
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