n8n e Evolution API Travando em VPS de 2GB RAM (Erro OOM Killer / Exit Code 137): A Autópsia Técnica e a Migração para Serverless
Todo mês, milhares de desenvolvedores e operadores de automação contratam uma VPS de entrada (1 vCPU, 1 GB ou 2 GB de RAM) para rodar uma pilha Docker com Traefik/Nginx + n8n + Evolution API + PostgreSQL + Redis. Funciona perfeitamente nas primeiras 48 horas — até que, às 03h15 da manhã, o webhook para de responder, o WhatsApp desconecta e o container morre com Exit Code 137. Neste dossiê, abrimos a telemetria de memória dessa falha e mostramos como zeramos esse custo migrando a recepção de webhooks para a borda da Cloudflare Pages.
Consumo médio em repouso da stack Docker (n8n + Evolution + Postgres + Redis): 1.840 MB a 2.350 MB RAM · Consumo do nosso Gateway Baileys v7 puro + Cloudflare Pages: 92 MB RAM locais e R$ 0,00/mês de VPS.
1. Por Que a Sua VPS de 2 GB Morre de Madrugada (Anatomia do SIGKILL / Exit Code 137)
A maioria dos tutoriais de "infraestrutura de automação em 1 clique" (usando painéis como EasyPanel, Portainer ou Portainer Stacks) omite um fato básico de engenharia de sistemas operacionais Linux: cada serviço empilhado em containers separados carrega seu próprio runtime, seu próprio coletor de lixo (Garbage Collector V8 no Node.js) e seus próprios buffers de conexão.
Quando medimos via docker stats --no-stream e dmesg -T | grep -i oom uma instância real rodando apenas 2 fluxos de webhook e 1 sessão de WhatsApp conectada, encontramos o seguinte mapa de alocação física de memória:
| Container / Serviço na VPS | Consumo Inicial (Boot) | Consumo Após 72h de Produção | Causa Técnica da Expansão de Memória |
|---|---|---|---|
| Evolution API v2 (Node.js + Prisma) | 380 MB | 790 MB – 1.050 MB | Cache em memória de mensagens/contatos, pool de conexões do Prisma ORM e objetos de criptografia Signal do WebSocket. |
| n8n Main + Worker | 320 MB | 640 MB – 880 MB | Histórico de execuções JSON retido no heap do V8 quando EXECUTIONS_DATA_PRUNE não está agressivamente calibrado. |
| PostgreSQL 16 (Shared Buffers + Conexões) | 190 MB | 340 MB – 460 MB | Alocação de work_mem por conexão aberta simultaneamente pelo n8n e pelo Prisma da Evolution API. |
| Redis + Proxy Reverso (Traefik/Caddy) | 110 MB | 160 MB – 220 MB | Filas BullMQ e certificados TLS em memória. |
| TOTAL ACUMULADO NA MÁQUINA | 1.000 MB | 1.930 MB a 2.610 MB (💥 OOM) | Quando o pico ultrapassa 2.048 MB sem swap rápida, o kernel Linux aciona o oom_killer e mata o processo de maior oom_score (geralmente a Evolution API ou o n8n). |
2. 🛠️ Simulador Interativo: Calculadora de Risco OOM Killer & Economia Anual de Infraestrutura
Selecione abaixo a quantidade de memória RAM da sua VPS atual, os containers ativos e o volume diário de eventos para calcular a pressão real de memória (em MB) e a probabilidade de queda por Out of Memory:
🔬 Simulador de Pressão de RAM (Docker Stack) vs. Arquitetura Serverless + Baileys
3. Como Desacoplar a Recepção do Webhook da Execução do WhatsApp
O erro arquitetural de colocar tudo dentro de uma mesma VPS barata é misturar uma tarefa que exige disponibilidade pública 24/7 na borda (receber o POST da Stripe, Kiwify, Hotmart ou formulário de lead em menos de 200ms e validar a assinatura criptográfica) com uma tarefa que exige apenas um socket WebSocket leve (despachar a mensagem no WhatsApp).
Quando você separa essas duas camadas seguindo o padrão do laboratório Real Make IA:
- Camada 1 — Borda Imortal (Cloudflare Pages Functions): O endpoint do webhook roda gratuitamente na rede global da Cloudflare. Ele nunca sofre OOM Killer, aguenta picos de milhares de requisições simultâneas e valida o HMAC-SHA256 via Web Crypto API em 4 milissegundos.
- Camada 2 — Micro-Gateway Baileys v7 Enxuto (Sem Prisma, Sem Postgres, Sem Redis): Em vez de subir um monolito pesado de 900 MB de RAM para enviar alertas transacionais, nosso
server.jsutiliza diretamente o motor@whiskeysockets/baileyscom persistência leve em disco (useMultiFileAuthState) e limite estrito de heap V8 (--max-old-space-size=256), consumindo menos de 95 MB de RAM.
4. Se Você Precisar Manter uma VPS: Os 3 Flags Obrigatórios de Sobrevivência
Caso a sua operação exija manter o n8n ou um container Node.js em uma VPS Linux de 2 GB de RAM, nunca suba o docker-compose.yml sem aplicar estas três travas imediatas no sistema hospedeiro e nas variáveis de ambiente:
# 1. Criar arquivo de Swap de 4GB em disco NVMe para evitar SIGKILL imediato em picos
sudo fallocate -l 4G /swapfile && sudo chmod 600 /swapfile
sudo mkswap /swapfile && sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
# 2. Limitar o Garbage Collector V8 do Node.js no docker-compose.yml (n8n e Baileys)
environment:
- NODE_OPTIONS=--max-old-space-size=512
- EXECUTIONS_DATA_PRUNE=true
- EXECUTIONS_DATA_MAX_AGE=24
- EXECUTIONS_DATA_SAVE_ON_SUCCESS=none
Repare na variável EXECUTIONS_DATA_SAVE_ON_SUCCESS=none: por padrão, o n8n salva no banco de dados e mantém em buffer todos os JSONs de execuções bem-sucedidas. Desativar a gravação completa dos payloads de sucesso reduz o consumo de memória e de I/O de disco em mais de 65%.
🚀 Combo Full-Stack Automação IA: Fábrica de Vídeos v2.0 + Gateway WhatsApp Baileys v7
Leve os 2 Deploy Kits Oficiais do Laboratório em um único download imediato: a esteira completa de geração de vídeos verticais em Python + FFmpeg + Legendas .ASS (vendida separadamente por R$ 27) MAIS o Gateway de WhatsApp Baileys v7 com Painel QR Web e Auto-Tunnel Cloudflare (vendido por R$ 37).
🔗 Dossiês Relacionados no Laboratório Real Make IA
- Baileys v7 Erro 401 e 515: Como Construir um Gateway de WhatsApp Próprio com Túnel Cloudflare Auto-Sincronizado
- Stripe no WhatsApp sem VPS: Alertas de Vendas em 184ms com Cloudflare Pages Functions e HMAC-SHA256
- Transcrição e Legendas .ASS Verticais em Python: Superando o Erro 429/PoToken com Whisper e FFmpeg
Perguntas Frequentes de Engenharia (FAQ Técnico & Benchmarks de Produção)
1. Por que o Docker da Evolution API + PostgreSQL + Redis consome mais de 2.4 GB de RAM mesmo ocioso?
Na arquitetura tradicional em containers, cada instância da Evolution API carrega o runtime completo do Node.js somado ao ORM Prisma, pool de conexões do PostgreSQL, cache de estados no Redis e buffers de mídia em memória. Quando o n8n executa workflows com múltiplos nós de transformação JSON na mesma VPS de 2 GB ou 4 GB, o pico de alocação do V8 ultrapassa o limite físico da máquina virtual e aciona o oom-kill do kernel Linux, derrubando o processo principal e corrompendo as chaves criptográficas Signal da sessão.
2. Como o Baileys v7 puro em PM2 evita o erro 515 Stream Errored durante o pareamento inicial?
O erro 515 ocorre quando o servidor do WhatsApp fecha o socket WebSocket após o scan do QR Code para forçar a renegociação da sessão autenticada. Nossa implementação intercepta o evento connection.update, distingue o código de status 515 (restartRequired) de um logout real (401), preserva o estado de useMultiFileAuthState em disco com escrita atômica e reconecta em menos de 400ms sem exigir novo QR Code.
3. É seguro expor o webhook local via Cloudflare Quick Tunnel (trycloudflare.com)?
Sim. O binário cloudflared estabelece conexões de saída (outbound-only) HTTP/2 ou QUIC até a borda da Cloudflare sem abrir nenhuma porta no firewall local nem exigir IP fixo. Quando o daemon detecta rotação de URL ou queda de link, ele captura a nova URL HTTPS do túnel em tempo real e atualiza automaticamente o endpoint de callback.
4. Quantas mensagens por minuto o microserviço suporta em 120 MB de RAM?
Em nossos testes de carga contínuos de 72 horas, o processo Node.js com --max-old-space-size=192 manteve consumo médio de 94 MB a 118 MB de RAM processando até 180 eventos por minuto com latência média de despacho de webhook inferior a 35ms.