De Micro-SaaS para Community Edition: Como construí um Bot de Vagas resiliente com Node.js, Puppeteer e 0% de Banco de Dados (Até o momento)
Recentemente, comecei a desenvolver um bot para agregar vagas de TI. A ideia inicial era clássica: criar um "Micro-SaaS", cobrar uma assinatura VIP e entregar as vagas em tempo real via Telegram.
Mas, no meio do caminho, o "espírito Open Source" falou mais alto. Percebi que a barreira de entrada para juniores e plenos já está alta demais para eu colocar mais um paywall na frente. Decidi pivotar: removi toda a lógica de pagamentos (Stripe/Asaas) e refatorei o projeto para ser 100% focado em performance e utilidade para a comunidade.
Queria compartilhar com vocês um pouco da arquitetura "unorthodox" (pouco ortodoxa) que utilizei e que está aguentando o tranco surpreendentemente bem.
A Stack "Keep It Simple"
O objetivo era rodar isso no servidor mais barato possível (ou até num Raspberry Pi), então descartei containers pesados de banco de dados.
Core: Node.js + Telegraf (para o bot).
Scraping: Puppeteer + puppeteer-extra-plugin-stealth (para evitar bloqueios do Cloudflare/WAF).
Banco de Dados: Nenhum. 😅
Frontend/Dashboard: Next.js com Server Actions.
Por que JSON > SQL (Neste caso)?
Para um volume de ~5.000 vagas rotativas, percebi que não precisava do overhead de um Postgres ou Mongo. Implementei uma camada de persistência usando apenas o fs-extra.
O sistema mantém 3 arquivos JSON principais:
history.json: Um hash de URLs visitadas (para evitar repostar a mesma vaga).
backlog.json: Uma fila FIFO que o Worker consome a cada 2 minutos.
stats.json: Métricas diárias de performance.
O "pulo do gato" foi usar o Next.js não só como site, mas como interface administrativa. Criei Server Actions que leem esses arquivos JSON diretamente do disco. O resultado é um Dashboard em tempo real onde posso monitorar a fila e deletar vagas "sujas" antes que o bot as envie para o canal, sem precisar de API Rest ou GraphQL no meio.
O Desafio da Categorização (Sem gastar com LLMs)
Inicialmente pensei em usar a API da OpenAI para categorizar as vagas ("Junior", "React", "Remoto"). Mas para manter o custo zero, escrevi uma engine de Regex otimizada.
Ela varre o título da vaga contra um dicionário de ~50 termos técnicos e gera as hashtags automaticamente. Se o título é "Backend Developer (Java/Spring) - Remote", o bot categoriza como #Java #Backend #Remoto instantaneamente, com custo computacional irrelevante.
O Resultado
O bot está rodando liso, processando dezenas de sites (LinkedIn, Programathor, RemoteOK, etc) e centralizando tudo em um único canal. (Depois divulgo a lista completa).
Ainda estou finalizando a documentação e limpando algumas chaves hardcoded para liberar o repositório no GitHub (aviso aqui quando sair!).
Por enquanto, quem quiser ver o resultado dessa arquitetura rodando na prática, pode acompanhar o canal onde as vagas estão caindo:
👉 t.me/vagastechpro
Fica o convite para code review assim que eu liberar o código. Alguém mais aqui tem usado JSON como banco em produção para projetos pequenos ou eu estou maluco? kkkkkkkkkk