filas e jobs, testes automatizados, observabilidade, segurança de aplicações
escala
milhares de lojistas · ~20 mil assinaturas recorrentes
local
Itapema, SC — remoto
Trabalho
LWSA — Tray, Bling e Bagy atual
E-commerce SaaS multi-tenant, milhares de lojistas.
Ownership técnico de 4 módulos em produção: promoção em lote, integração com IA, feedbacks por plataforma e o novo menu. Migração de legado, filas com RabbitMQ, observabilidade em New Relic, Graylog, Grafana e Elastic APM. Análise caixa-branca e correção de vulnerabilidades — OWASP Top 10, IDOR, Broken Access Control.
Petiko
E-commerce por assinatura, cerca de 20 mil assinaturas ativas.
Core de assinaturas e checkout, por onde passava a maior parte da receita. Integrei 3 gateways de pagamento — Pagar.me, E-Rede e MaxiPago — e 3 ERPs: Magento 2, Bling e Omie.
Domestilar
Sistema de gestão interna.
Atendimento ao cliente, dashboards em Python e desktop em Java.
Decisões
A suíte rodava duas vezes
Dois projetos centrais do painel do lojista, com cerca de 10% de cobertura. Cada release era aposta, e o pipeline levava o dobro do tempo necessário.
A segunda execução completa da suíte existia só para juntar o relatório de cobertura. Em vez de acelerar os testes, fiz cada job paralelizado persistir seu relatório parcial e uni-los no fim.
50 minutos a menos por execução de pipeline, e cobertura de 10% para 92% nos dois projetos.
Requests estourando timeout
Fluxos que rodavam inteiros dentro do request, num ambiente multi-tenant. Quanto mais dados o lojista tinha, mais perto do limite — e alguns já falhavam em produção.
Aumentar o timeout empurraria o problema para frente. Tirei o processamento do request e mandei para fila, com RabbitMQ e Jobs do Laravel: o request responde na hora e o trabalho acontece fora dele, com retry próprio.
Timeouts eliminados nos fluxos migrados. O custo assumido: a resposta deixou de ser imediata, e quem chama precisa acompanhar o estado.
Três falhas no mesmo checkout
O checkout de um e-commerce por assinatura. Análise caixa-branca apontou três falhas abertas ao mesmo tempo: account takeover, confirmação de pagamento aceita sem validação no servidor, e stored XSS.
Ordenei pelo alcance que cada uma dava a um atacante, não pela facilidade de corrigir. A conta primeiro, porque dela sai todo o resto. Depois o pagamento, movendo a confirmação para o servidor em vez de confiar no retorno do cliente. O XSS por último: alcança quem abre a página.
As três fechadas. A confirmação de pagamento passou a acontecer onde o cliente não alcança.
Container de injeção PSR-11 com autowiring por Reflection, roteador próprio, service layer e repositories. Sem framework, para entender o que o framework faz.
Worker de webhooks com backoff exponencial, limite de tentativas e dead-letter queue. O mesmo problema de entrega assíncrona que resolvo com RabbitMQ no trabalho.
Um banco por tenant, criado e migrado na criação do usuário. Isolamento por banco, não por coluna de tenant_id.
Laravel 11, TALL Stack
project-amaterasu
Agente de segurança ofensiva com RAG local. Base de conhecimento indexada em ChromaDB e ferramentas atrás de um gate de escopo fail-closed: fora do alvo declarado, nada executa. As fases retomam do último estado salvo.
Python, ChromaDB, MCP, Docker repositório privado
quest-leveling
Aplicação de produtividade gamificada. Domínio separado em serviços e DTOs, frontend em Vue 3 com Inertia, e classificação de tarefas por LLM atrás de uma interface própria — o provedor é trocável.