Guia Prático

N8N

Automação de workflows self-hosted — do zero ao servidor em produção.

01 — O que é

Filosofia: fluxo vs código

O N8N é uma ferramenta de automação de workflows com interface visual — você conecta nodes (nós) em um canvas, define gatilhos e deixa o fluxo rodar sozinho. É o equivalente open-source do Zapier ou do Make, mas que você instala e controla no seu próprio servidor.

Zapier / Make (SaaS)

Roda na nuvem deles.
Você paga por execução.
Dados passam por servidores deles.
Limite de steps/mês.
Sem acesso ao código interno.

N8N self-hosted

Roda no seu VPS.
Sem custo por execução.
Dados ficam no seu servidor.
Ilimitado (memória é o limite).
Código aberto, extensível.
📌 Conceito-chave O N8N pode substituir scripts cron escritos manualmente, integrações entre sistemas, notificações automáticas, sincronização de dados entre APIs — qualquer coisa que seja "se X acontecer, faça Y".

Quando o N8N faz sentido?

02 — Primeiros passos

Instalação

O N8N pode ser instalado de três formas. Para um VPS Ubuntu com NGINX, o Docker é o caminho recomendado — isola o processo, facilita updates e não conflita com o PHP-FPM da stack existente.

Via Docker (recomendado para VPS)

1. Instalar Docker se ainda não tiver

curl -fsSL https://get.docker.com | sh systemctl enable docker && systemctl start docker

2. Criar volume para persistir dados

docker volume create n8n_data

3. Rodar o container

docker run -d \
  --name n8n \
  --restart unless-stopped \
  -p 127.0.0.1:5678:5678 \
  -e N8N_HOST=n8n.seudominio.com \
  -e N8N_PORT=5678 \
  -e N8N_PROTOCOL=https \
  -e WEBHOOK_URL=https://n8n.seudominio.com/ \
  -e GENERIC_TIMEZONE=America/Belem \
  -v n8n_data:/home/node/.n8n \
  docker.n8n.io/n8nio/n8n
📌 127.0.0.1:5678 O bind em 127.0.0.1 expõe a porta apenas internamente. O NGINX fará o proxy reverso público. Nunca exponha a porta 5678 diretamente na internet sem autenticação.

Via npm (sem Docker)

⚠ Atenção Requer Node.js 18+. Conflitos com versões globais do node podem ocorrer. Prefira Docker em produção.
npm install -g n8n N8N_HOST=localhost N8N_PORT=5678 n8n start

Para desenvolvimento local (rápido)

npx n8n

Abre em http://localhost:5678. Dados ficam em ~/.n8n.

Verificar se está rodando

docker ps | grep n8n curl http://localhost:5678/healthz

Resposta esperada: {"status":"ok"}

03 — Orientação visual

Interface

Ao abrir o N8N pela primeira vez, você cria uma conta local (admin). A interface tem três áreas principais:

ÁreaO que faz
CanvasÁrea de edição visual onde você conecta nodes e testa o workflow
Sidebar esquerdaLista de workflows salvos, credenciais, execuções e configurações
Painel direitoConfiguração do node selecionado, parâmetros, mapeamento de dados

Ações essenciais no canvas

AçãoComo fazer
Adicionar nodeClique no + à direita de qualquer node, ou clique com botão direito no canvas
Conectar nodesArraste a bolinha de saída de um node até a entrada do próximo
Testar um nodeClique no node → botão Execute node (triângulo) no painel
Testar tudoBotão Execute workflow no topo da tela
Ver dadosClique no node após executar — mostra input e output de cada item
Mover canvasClique e arraste no fundo, ou scroll para zoom
Ativar workflowToggle no canto superior direito — ativa o gatilho automático
💡 Dica Quando um node executa com sucesso, ele mostra um número verde indicando quantos itens processou. Vermelho indica erro — clique nele para ver a mensagem de erro completa.
04 — Fundamentos

Conceitos essenciais

Workflow

Um workflow é um fluxo de automação salvo. Ele começa com um trigger (gatilho) e encadeia nodes até completar a tarefa. Um workflow pode estar ativo (roda automaticamente) ou inativo (só executa manualmente).

Node

Cada bloco no canvas é um node. Ele recebe dados, processa, e passa adiante. Há três tipos:

Item

A unidade de dados que flui entre nodes. Um node pode produzir um item (um registro) ou vários (uma lista). O próximo node recebe todos os itens e processa cada um.

# Estrutura de um item
{
  "json": {
    "nome": "Daniel",
    "email": "daniel@exemplo.com"
  }
}

Execução

Cada vez que o workflow roda é uma execução. O N8N guarda o histórico de execuções com status (sucesso/erro), tempo e dados de cada etapa. Acesse em Executions na sidebar.

📌 Fluxo de dados Os dados fluem sempre da esquerda para a direita. A saída de um node vira a entrada do seguinte. Você pode acessar dados de qualquer etapa anterior via expressões.

Trigger vs. Polling

TipoComo funcionaExemplo
WebhookUma URL recebe uma chamada e dispara o workflowGitHub envia um POST ao fazer push
Cron / ScheduleExecuta em horário fixo (igual a um cron job)Todo dia às 08h00
PollingVerifica a fonte a cada X minutos em busca de mudançasNovo e-mail no Gmail a cada 5 min
ManualRoda só quando você clica no botãoÚtil para testes
05 — Catálogo

Nodes essenciais

O N8N tem mais de 400 integrações. Conhecer os nodes fundamentais permite construir qualquer automação — o resto é só configuração específica de serviço.

Webhook
Gera uma URL que inicia o workflow ao receber um POST/GET
Schedule Trigger
Executa em horário definido — igual a cron, mas visual
HTTP Request
Faz chamadas a qualquer API REST ou endpoint HTTP
Set
Define, renomeia ou remove campos dos itens
IF
Divide o fluxo em dois caminhos: verdadeiro ou falso
Switch
Divide o fluxo em múltiplos caminhos por condição
Loop Over Items
Itera sobre uma lista processando um item por vez
Merge
Une dados de dois fluxos paralelos em um só
Code
Executa JavaScript arbitrário para transformações complexas
Wait
Pausa a execução por tempo ou até receber um webhook
Send Email
Envia e-mail via SMTP ou serviços como SendGrid
Respond to Webhook
Retorna uma resposta HTTP para o webhook que iniciou o fluxo

Node HTTP Request — o mais importante

Conecta o N8N a qualquer API. Configurações principais:

CampoO que preencher
MethodGET, POST, PUT, PATCH, DELETE
URLEndpoint da API — pode usar expressões: {{ $json.url }}
AuthenticationEscolha uma credencial salva (Bearer, Basic, API Key…)
BodyJSON, Form Data ou Raw — para POST/PUT
Query ParametersParâmetros de URL adicionados automaticamente
ResponseEscolha JSON para já receber o objeto parseado

Node Code — JavaScript nativo

Quando os nodes visuais não bastam, use o node Code. Dois modos:

Run Once for All Items

// Recebe todos os itens de uma vez
const items = $input.all();
const result = items.map(item => ({
  json: {
    nome: item.json.name.toUpperCase(),
    total: item.json.qty * item.json.price
  }
}));
return result;

Run Once for Each Item

// Roda uma vez por item
// $input.item é o item atual
const nome = $input.item.json.name;
const preco = $input.item.json.price;

return {
  json: {
    resumo: `${nome}: R$ ${preco}`
  }
};
💡 Dica no node Code Você tem acesso a $input, $json, $node, $workflow e $execution. Para chamadas HTTP dentro do Code, use o node HTTP Request separado — é mais limpo e mantém as credenciais fora do código.
06 — Sintaxe

Expressões

Expressões permitem usar dados dinâmicos em qualquer campo de qualquer node. A sintaxe é {{ expressão }} e usa JavaScript dentro das chaves duplas.

Acessar dados do node anterior

# Item atual (saída do node imediatamente anterior)
{{ $json.campo }}
{{ $json.objeto.campo_aninhado }}
{{ $json.lista[0] }}

# Todos os itens do node anterior
{{ $input.all() }}
{{ $input.first().json.campo }}
{{ $input.last().json.campo }}

Referenciar nodes específicos por nome

# Acessa a saída de um node com nome exato
{{ $('Nome do Node').item.json.campo }}
{{ $('Nome do Node').all() }}
{{ $('Nome do Node').first().json.email }}
📌 Nome do Node O nome entre aspas deve ser exatamente igual ao nome exibido no canvas — incluindo espaços e maiúsculas. Renomeie os nodes com nomes descritivos para facilitar as expressões.

Variáveis de contexto

VariávelO que retorna
$jsonDados JSON do item atual
$nowData/hora atual (objeto Luxon)
$todayData de hoje no início do dia
$workflow.idID do workflow
$workflow.nameNome do workflow
$execution.idID único desta execução
$vars.NOMEVariável de ambiente definida nas configurações
$parameter.campoParâmetro estático do próprio node

Exemplos práticos

# Formatar data
{{ $now.toFormat('dd/MM/yyyy') }}
{{ $now.minus({ days: 1 }).toISO() }}

# Concatenar texto
{{ 'Olá, ' + $json.nome + '!' }}
{{ `Pedido #${$json.id} — R$ ${$json.total.toFixed(2)}` }}

# Condicional inline
{{ $json.status === 'ativo' ? 'Ativo' : 'Inativo' }}

# Tratar valor nulo
{{ $json.email ?? 'sem-email@exemplo.com' }}

# Acessar campo com espaço no nome
{{ $json['nome completo'] }}
⚠ Atenção Se uma expressão retornar undefined ou causar erro, o node inteiro falha. Sempre use ?? (nullish coalescing) para valores que podem ser nulos.
07 — Autenticação

Credenciais

Credenciais armazenam chaves de API, senhas e tokens de forma criptografada. Você configura uma vez e reutiliza em qualquer node sem expor os valores nos workflows.

Criar uma credencial

1
Acesse Settings → Credentials na sidebar esquerda Ou clique em "Create new credential" dentro de qualquer node que precise de autenticação.
2
Escolha o tipo de credencial HTTP Request genérico → escolha entre Bearer Token, Basic Auth, API Key, OAuth2, etc.
3
Preencha os campos e salve Os valores ficam criptografados no banco de dados do N8N — nunca aparecem em texto puro.
4
Selecione a credencial no node Campo "Credential to use" — aparece na lista todas as credenciais compatíveis com aquele tipo de node.

Tipos comuns de credencial

TipoQuando usar
HTTP Header AuthAPI que usa header customizado (X-Api-Key, Authorization…)
HTTP Basic AuthAutenticação usuário/senha em chamadas HTTP
Bearer TokenJWTs e tokens estáticos de API
OAuth2Google, GitHub, Slack e qualquer serviço OAuth — o N8N gerencia o refresh
SMTPServidor de e-mail para o node Send Email
Postgres / MySQLConexão direta a banco de dados
💡 Variáveis de ambiente como credenciais Para senhas ou chaves que mudam entre ambientes, salve-as como variáveis de ambiente no container Docker (-e MINHA_CHAVE=valor) e acesse com $vars.MINHA_CHAVE nas expressões. Isso evita credenciais hardcoded no banco.
08 — Servidor

Self-hosting com NGINX

Com o container rodando em 127.0.0.1:5678, configure o NGINX como proxy reverso para expor o N8N num subdomínio com HTTPS.

/etc/nginx/sites-available/n8n

server {
    listen 80;
    server_name n8n.seudominio.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name n8n.seudominio.com;

    # Gerenciado pelo Certbot:
    ssl_certificate     /etc/letsencrypt/live/n8n.seudominio.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/n8n.seudominio.com/privkey.pem;
    include             /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam         /etc/letsencrypt/ssl-dhparams.pem;

    # Tamanho máximo do body — útil para workflows com uploads
    client_max_body_size 50M;

    location / {
        proxy_pass         http://127.0.0.1:5678;
        proxy_http_version 1.1;

        # WebSockets — necessário para o editor do N8N
        proxy_set_header   Upgrade    $http_upgrade;
        proxy_set_header   Connection 'upgrade';

        proxy_set_header   Host       $host;
        proxy_set_header   X-Real-IP  $remote_addr;
        proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto $scheme;
        proxy_cache_bypass $http_upgrade;

        # Timeout maior para workflows longos
        proxy_read_timeout 3600;
        proxy_send_timeout 3600;
    }
}
⚠ WebSockets obrigatório O editor visual do N8N usa WebSockets para atualizar o canvas em tempo real. Sem os headers Upgrade e Connection, a interface fica sem resposta após alguns segundos.

Ativar o site e emitir certificado

ln -s /etc/nginx/sites-available/n8n /etc/nginx/sites-enabled/ nginx -t && systemctl reload nginx certbot --nginx -d n8n.seudominio.com nginx -t && systemctl reload nginx

Proteger com autenticação básica (opcional)

Se quiser uma camada extra de proteção antes do login do N8N:

apt install apache2-utils -y htpasswd -c /etc/nginx/.htpasswd seu_usuario

Adicione dentro do bloco location /:

auth_basic           "N8N";
auth_basic_user_file /etc/nginx/.htpasswd;
⚠ Webhooks com auth_basic Se você usar Webhook nodes, os serviços externos não conseguirão chamar a URL com autenticação básica ativa. Crie um location /webhook/ separado sem auth_basic para os endpoints de webhook.

Location para webhooks sem auth

location /webhook/ {
    proxy_pass         http://127.0.0.1:5678;
    proxy_http_version 1.1;
    proxy_set_header   Host              $host;
    proxy_set_header   X-Forwarded-Proto $scheme;
    # Sem auth_basic aqui
}
09 — Dia a dia

Comandos essenciais

ComandoO que faz
docker ps | grep n8nVer se o container está rodando
docker logs n8n -fVer logs em tempo real
docker restart n8nReiniciar o container
docker stop n8nParar o container
docker start n8nIniciar o container parado
docker rm -f n8nRemover o container (dados no volume ficam)

Atualizar para nova versão

docker pull docker.n8n.io/n8nio/n8n docker stop n8n && docker rm n8n

Rode novamente o comando docker run da instalação — o volume n8n_data preserva todos os workflows e credenciais.

Backup dos dados

Os dados ficam no volume Docker. Para exportar:

docker run --rm -v n8n_data:/data -v $(pwd):/backup alpine tar czf /backup/n8n_backup.tar.gz -C /data .

Para restaurar:

docker run --rm -v n8n_data:/data -v $(pwd):/backup alpine tar xzf /backup/n8n_backup.tar.gz -C /data

Exportar/importar workflows via CLI

# Exportar todos os workflows para JSON
docker exec n8n n8n export:workflow --all --output=/tmp/workflows.json
docker cp n8n:/tmp/workflows.json ./workflows.json

# Importar workflows de um arquivo
docker cp ./workflows.json n8n:/tmp/workflows.json
docker exec n8n n8n import:workflow --input=/tmp/workflows.json
💡 Dica Exporte os workflows regularmente e salve no GitHub — assim você tem controle de versão da sua automação. Workflows são JSON puro e comparam bem no git diff.

Fluxo de trabalho recomendado

# 1. Criar e testar o workflow no editor visual
# 2. Ativar o toggle "Active" quando pronto
# 3. Monitorar as primeiras execuções
docker logs n8n -f --since=10m

# 4. Verificar execuções com erro na interface
#    Workflows → Executions → filtrar por "Error"

# 5. Fazer backup antes de atualizações
docker exec n8n n8n export:workflow --all --output=/tmp/backup.json
10 — Referência rápida

Referência geral

Expressões — cola rápida

ExpressãoO que faz
{{ $json.campo }}Campo do item atual
{{ $json.lista[0].campo }}Primeiro item de uma lista aninhada
{{ $('Node').first().json.campo }}Primeiro item de um node específico
{{ $now.toISO() }}Data/hora atual em ISO 8601
{{ $now.toFormat('dd/MM/yyyy HH:mm') }}Data formatada em PT-BR
{{ $json.valor ?? 'padrão' }}Valor ou fallback se nulo
{{ $json.numero.toFixed(2) }}Número com 2 casas decimais
{{ $json.texto.toUpperCase() }}Texto em maiúsculas
{{ $json.texto.includes('palavra') }}Verifica se texto contém substring
{{ $vars.MINHA_CHAVE }}Variável de ambiente do container

Nodes por categoria

CategoriaNodes
TriggersWebhook, Schedule Trigger, Email Trigger, Manual Trigger
HTTP / APIsHTTP Request, GraphQL, RSS Feed, FTP
LógicaIF, Switch, Merge, Loop Over Items, Wait, Stop and Error
TransformaçãoSet, Edit Fields, Filter, Sort, Limit, Remove Duplicates, Code
Banco de dadosPostgres, MySQL, SQLite, Redis, MongoDB
ComunicaçãoSend Email, Telegram, Slack, Discord, WhatsApp
ArquivosRead/Write Files, Extract from File, Convert to File, Compression
UtilidadesRespond to Webhook, Execute Command, SSH, Crypto, HTML Extract

Variáveis de ambiente do container

VariávelValor de exemploPara que serve
N8N_HOSTn8n.seudominio.comHostname público
N8N_PROTOCOLhttpsProtocolo para links internos
WEBHOOK_URLhttps://n8n.seudominio.com/Base URL dos webhooks
GENERIC_TIMEZONEAmerica/BelemTimezone para Schedule nodes
N8N_BASIC_AUTH_ACTIVEtrueAtiva login com usuário/senha
N8N_BASIC_AUTH_USERadminUsuário do login básico
N8N_BASIC_AUTH_PASSWORDsenha_forteSenha do login básico
EXECUTIONS_DATA_PRUNEtrueApaga execuções antigas automaticamente
EXECUTIONS_DATA_MAX_AGE168Horas para manter histórico (168 = 7 dias)
✅ Checklist de produção
↑ voltar ao topo