Pular para conteúdo

Blog

MLflow no DGB: uma plataforma de experimentos atrás do IAP — e o JWT que a lib assina sozinha

Até esta semana, cada experimento de ciência de dados do DGB vivia e morria na máquina de quem o rodou: métricas num notebook, o modelo num .pkl perdido numa pasta, e nenhum rastro compartilhado de "o que foi treinado, com quais dados, e quão bom ficou". A plataforma ganhou agora um servidor MLflow compartilhado — tracking de experimentos, Model Registry e ferramentas de GenAI — rodando em Cloud Run atrás do IAP, com uma biblioteca cliente que faz a autenticação sumir: import dgb_mlflow; dgb_mlflow.configure() e o resto é o mlflow de sempre. Este post conta o que foi construído, e o gotcha de autenticação que virou a peça central do desenho.

Fonte única de dados: o desacoplamento BD→GraphQL e os bugs que só o navegador pegou

Cinco dias depois de a fachada GraphQL entrar no ar, ela ainda dividia o trabalho com o passado: o portal falava GraphQL, sim — mas atrás de feature flags, com fallback REST por baixo, e várias páginas públicas ainda liam o Firestore e o Typesense direto. Existir não era o suficiente; faltava ser o único caminho. Este post conta a história de cortar esse último cabo — Fases 1 a 4 do desacoplamento — e de como um punhado de bugs que o build jurava não existir só apareceu quando um navegador de verdade exercitou o caminho browser → portal → graphql-api.

Uma fachada GraphQL para o DGB: arquitetura e um novo paradigma de dados

Por meses, cada parte da plataforma falou direto com os backends de dados: o portal lia o Firestore via Firebase Admin, consultava o PostgreSQL para temas e órgãos, batia no Typesense para busca — e os workers liam o Postgres direto via DATABASE_URL. Esse post conta a decisão de colocar uma fachada GraphQL única no meio disso, como ela ficou por dentro, e — principalmente — convida o time a explorar a documentação nova e se apropriar do paradigma que ela inaugura. É um relato de design para quem vai construir em cima dela.

Março na DGB — da busca semântica ao pentest, passando pelo clipping

Em 24 dias, a plataforma DGB recebeu cerca de 100 PRs em 11 repositórios, tocando desde a experiência de busca do portal até a correção de vulnerabilidades identificadas em pentest. O mês trouxe três grandes movimentos: um sistema de clipping completo, o hardening de segurança pós-pentest, e a ativação da busca semântica.

Três frentes em paralelo: scraper, Telegram e Keycloak

Entre 4 e 6 de março, o projeto avançou em paralelo em três direções distintas: o scraper ganhou uma otimização de performance que evita re-processar artigos já conhecidos, o serviço de push notifications cresceu de WebPush para um ecossistema Telegram completo, e a infraestrutura de autenticação ganhou um SSO centralizado com Keycloak.

Bot Telegram e scraper resiliente: push notifications v2 e otimização de coleta

O pipeline event-driven disparava notificações web push, mas faltava o canal mais direto: Telegram. Em paralelo, o scraper ganhou otimizações que cortaram requests HTTP pela metade e corrigiram agências com falha persistente. ~12 PRs em 5 repos, incluindo 2 repos novos (push-notifications, telegram-bot) e infraestrutura completa no Cloud Run.

Umami, GrowthBook, Auth e v1.0.0: dois dias até o release do Portal

Sábado de manhã o portal não tinha analytics, nem autenticação, nem feature flags. Domingo à noite, tínhamos Umami Analytics com IAP, GrowthBook com dual-service, autenticação Google OAuth, push notifications com service worker, e a tag v1.0.0 no ar. Foram ~25 PRs em 6 repos, com 3 serviços novos no Cloud Run, e uma release que consolida semanas de trabalho.

De DAGs batch para event-driven: a migração Pub/Sub em 48 horas

Dois dias depois de desmembrar o monolito, o pipeline inteiro de processamento de notícias ganhou uma nova arquitetura: event-driven com Pub/Sub. Scrapers publicam eventos, workers processam em cadeia, e o que antes rodava a cada 15 minutos via DAGs agora reage em segundos. Foram ~25 PRs em 8 repos, com 3 workers novos, 1 repo novo (push-notifications), e a aposentadoria do Cogfy como motor de enriquecimento.

🏗️ 6 dias, 36 PRs, 3 repos novos: desmembrando o monolito data-platform

Na quinta passada, o data-platform era um monolito: scrapers, DAGs, sync de datasets e integração com LLM — tudo num repo só 😅. Hoje, uma semana depois, cada domínio vive no seu repo, deploya suas próprias DAGs e tem autonomia de release. Pelo caminho, o servidor ActivityPub ganhou pipeline de publicação e entramos no Fediverso 🌐. Foram 36 PRs mergeados em 9 repos, 3 repos novos criados, 4 issues fechadas e 5 avançadas — tudo sem parar o pipeline em produção.