infraestrutura oom killer n8n & evolution api cloudflare serverless
Publicado em 17/10/2026 · Bancada de Engenharia de Sistemas Real Make IA

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.

TELEMETRIA DE BANCADA (PILHA DOCKER COMPLETA vs. ARQUITETURA HÍBRIDA):
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çãoCausa Técnica da Expansão de Memória
Evolution API v2 (Node.js + Prisma)380 MB790 MB – 1.050 MBCache em memória de mensagens/contatos, pool de conexões do Prisma ORM e objetos de criptografia Signal do WebSocket.
n8n Main + Worker320 MB640 MB – 880 MBHistó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 MB340 MB – 460 MBAlocação de work_mem por conexão aberta simultaneamente pelo n8n e pelo Prisma da Evolution API.
Redis + Proxy Reverso (Traefik/Caddy)110 MB160 MB – 220 MBFilas BullMQ e certificados TLS em memória.
TOTAL ACUMULADO NA MÁQUINA1.000 MB1.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

Diagnóstico de Alocação de Memória Kernel Linux:
2.140 MB
Pico Estimado (Stack Docker)
98 MB
Consumo Gateway Baileys Puro
R$ 1.020
Economia Anual (Serverless)

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:

  1. 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.
  2. 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.js utiliza diretamente o motor @whiskeysockets/baileys com 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%.

OFERTA UNIFICADA FULL-STACK · ECONOMIZE R$ 17,00

🚀 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).

⚡ Baixar Combo Completo (2 Kits por R$ 47,00) 🔒 Pix & Cartão
Ou adquira individualmente: Kit Vídeos IA v2.0 (R$ 27,00) · Kit Gateway WhatsApp v7 (R$ 37,00)

🔗 Dossiês Relacionados no Laboratório Real Make IA

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.