O que você vai aprender¶
- A arquitetura canônica do método: n8n self-host na Hetzner + Supabase + WhatsApp Cloud API + Claude.
- Como provisionar VPS Hetzner, configurar n8n com HTTPS e backup automatizado.
- Padrões de workflow n8n para webhook WhatsApp em PME (com retry, queue, e fallback).
- Como integrar WhatsApp Cloud API direto da Meta (sem BSP no caminho crítico).
- Como configurar observabilidade básica (logs, métricas, alertas).
Por que isso importa¶
Princípio 7 do DPIA: stack composable, sem lock-in. Pesquisa E §10 e Pesquisa A §2.5 mostram que n8n self-host + Claude + Supabase + WABA direto é a stack que cabe no custo da PME (R$ 550 a R$ 1.750/mês de infra total, Pesquisa F §1.4) e ainda dá ao implementador independência total. Plataforma proprietária no caminho crítico amarra o implementador à plataforma e o cliente ao fornecedor. Quando a plataforma sobe preço ou descontinua, perde-se cliente.
A stack canônica é também o que a comunidade pode contribuir. Pesquisa C §6 e §7: a comunidade longitudinal (inema.vip) é defesa estrutural — alunos contribuem com módulos AIOS testados em campo, network effect de conteúdo. Stack proprietária não acumula contribuição.
O passo a passo¶
1. Provisionar VPS Hetzner.
- Tipo CX22 (2 vCPU, 4 GB RAM): atende projetos com até ~300 interações/dia. R$ ~45/mês.
- Tipo CX32 (4 vCPU, 8 GB RAM): atende ~1.000 interações/dia. R$ ~90/mês.
- Localização: Nuremberg ou Helsinki (latência ~250ms para Brasil — aceitável para webhook async).
- OS: Ubuntu 22.04 LTS.
- Hostname: n8n-<cliente>.<seu-dominio>.com.
2. Hardening básico. - Usuário non-root, chave SSH (sem senha). - UFW: portas 22 (SSH), 80 (HTTPS redirect), 443 (HTTPS). - Fail2ban configurado. - Sem login root, sem senha SSH. - Backup snapshot diário Hetzner (R$ ~10/mês adicional).
3. Instalar n8n via Docker. Configuração mínima:
# docker-compose.yml
services:
postgres:
image: postgres:16
environment:
POSTGRES_USER: n8n
POSTGRES_PASSWORD: <senha>
POSTGRES_DB: n8n
volumes:
- postgres-data:/var/lib/postgresql/data
restart: always
n8n:
image: n8nio/n8n:latest
environment:
DB_TYPE: postgresdb
DB_POSTGRESDB_HOST: postgres
DB_POSTGRESDB_USER: n8n
DB_POSTGRESDB_PASSWORD: <senha>
DB_POSTGRESDB_DATABASE: n8n
N8N_HOST: n8n-<cliente>.<seu-dominio>.com
N8N_PROTOCOL: https
WEBHOOK_URL: https://n8n-<cliente>.<seu-dominio>.com/
GENERIC_TIMEZONE: America/Sao_Paulo
N8N_BASIC_AUTH_ACTIVE: "true"
N8N_BASIC_AUTH_USER: <user>
N8N_BASIC_AUTH_PASSWORD: <senha-forte>
volumes:
- n8n-data:/home/node/.n8n
depends_on:
- postgres
restart: always
caddy:
image: caddy:2
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- caddy-data:/data
restart: always
Caddyfile:
Caddy resolve HTTPS via Let's Encrypt automaticamente.
4. Backup do n8n. - Backup do banco Postgres do n8n diário (workflows + credenciais). - Snapshot Hetzner diário do VPS inteiro. - Backup do Supabase (incluso no plano Pro Supabase). - Retenção: 30 dias rotativos.
Sem backup, perda de workflow do n8n é desastre — uma semana de configuração some.
5. Configurar WhatsApp Cloud API direto da Meta.
- Conta Meta Business Manager do cliente (não do implementador).
- App Meta criado na conta do cliente, com produto "WhatsApp" adicionado.
- Número de telefone do cliente verificado no Meta WABA.
- Template de mensagens submetidos para aprovação (cumprimento, espera, encerramento, escalonamento, erro técnico). Aprovação Meta: 24-72h.
- Webhook configurado apontando para https://n8n-<cliente>...com/webhook/<id>.
- Verify token configurado.
Decisão estratégica: WABA é da conta Meta do cliente, não do implementador. Quando o cliente troca de implementador, o WABA fica com ele. Isso é defesa do cliente — mas também é defesa do implementador (nunca ser preso a uma estrutura que não é sua).
6. Padrões de workflow para webhook WhatsApp.
Componentes essenciais de todo workflow WABA em PME: - Webhook receiver com verify token + assinatura. - Função de classificação rápida (Haiku ou regex) para descartar mensagens não-relevantes (ack, sticker isolado, mensagem de status). - Queue interna quando volume sobe (n8n Queue Mode com Redis). - Loop de tool use com Claude. - Retry policy em chamadas externas (Bling, Pix): 3 tentativas com backoff 2s/5s/10s. - Logging estruturado em Supabase a cada interação completa. - Alerting via webhook para Slack/Discord/WhatsApp interno em condições anormais.
7. Observabilidade básica.
Métricas a expor (em dashboard simples, Grafana ou Supabase Dashboard): - Interações/hora. - Taxa de escalonamento (rolling 24h). - Taxa de erro (rolling 24h). - Latência p50 / p95 do LLM. - Latência p50 / p95 do Bling. - Tokens consumidos / dia.
Alertas: - Taxa de erro > 5% em janela de 1 hora. - Latência LLM p95 > 12s. - Bling indisponível > 5 min seguidos. - Tokens consumidos > 2x o esperado em janela de 24h (sinal de loop ou abuso).
8. SLA documentado. Documento de 1 página que o cliente recebe: - Disponibilidade alvo: 99% (≈ 7h36 de downtime aceitável/mês). - Latência alvo: < 5s na primeira resposta em 95% dos casos. - Janela de manutenção planejada: domingo 04h-06h. - SLA de resposta a incidente: tier básico até 4h úteis; intermediário até 2h; avançado < 1h.
Exemplo aplicado — Polaris Bebidas (Joinville/SC)¶
Stack provisionada para a Polaris:
- VPS Hetzner CX22, hostname n8n-polaris.inema.club.br, localização Nuremberg.
- Custos infra: VPS R$ 45 + snapshot R$ 10 + Supabase Pro R$ 130 + WABA Meta (custo por mensagem da Meta, ~R$ 35/mês para volume Polaris) + Claude API R$ 810/mês ≈ R$ 1.030/mês. Dentro do range Pesquisa F §1.4.
- Caddy para HTTPS automático, certificado Let's Encrypt válido.
- n8n com PostgreSQL como backend, backup diário do banco + snapshot Hetzner.
- WABA configurado na conta Meta da Polaris (Sr. Roberto admin), 5 templates aprovados Meta.
- Workflow principal com Queue Mode (Redis), suporta picos de 80 interações/min.
- Dashboard Supabase com 6 métricas-chave atualizadas em tempo real.
- Slack interno da equipe Polaris (Sr. Roberto, Sr. Cláudio, Maria, aluno) com canal #agente-alertas para incidentes.
- SLA: 99% disponibilidade, latência < 5s. Janela de manutenção domingo 04h-05h.
Documento de SLA + arquitetura entregue ao Sr. Roberto em formato 2 páginas. Anexo do contrato de manutenção.
Erros comuns¶
- n8n em modo single-process sem queue. Trava quando entra rajada. Corrige: Queue Mode em produção.
- WABA na conta do implementador. Cliente vira refém. Corrige: sempre na conta Meta do cliente.
- Esquecer backup de workflow. Perda de configuração é desastre. Corrige: backup do Postgres do n8n + snapshot diário.
- Sem alerting. Problema descoberto só pelo cliente reclamando. Corrige: alertas configurados antes do go-live.
- Otimizar custo de VPS antes da hora. CX11 economiza R$ 20/mês e cliente sofre lentidão. Corrige: CX22 mínimo; otimizar só com volume real medido.
Checklist de saída¶
- VPS Hetzner provisionado, hardening básico aplicado.
- n8n via Docker + Postgres + Caddy + HTTPS funcionando.
- Backup diário configurado.
- WABA na conta Meta do cliente, templates aprovados.
- Webhook conectado, workflow ativo.
- Logging estruturado em Supabase.
- Alerting básico funcional.
- SLA de 1 página entregue ao cliente.
Vai além¶
- Manual canônico, "Stack composable" + Princípio 7.
- Pesquisa E §10 — convergência sobre n8n self-host.
- Documentação Hetzner Cloud + n8n Docker.
- Exercício prático: provisionar ambiente de produção do cliente do exercício em VPS pessoal (pode ser ambiente de homologação adaptado), com HTTPS válido e backup automatizado.