Tropic Host

n8n: o que é e como instalar em um VPS com Docker Compose

9 min de leitura
Tropic
n8n: o que é e como instalar em um VPS com Docker Compose

n8n em um VPS: sua própria plataforma de automação sem tarefas manuais repetitivas

Uma solicitação chega pelo site. O n8n verifica os dados, procura duplicidades, cria uma oportunidade, prepara um rascunho de resposta com IA e avisa o responsável pelo Telegram. Uma pessoa só entra no processo quando é preciso tomar uma decisão, e não para transferir dados entre abas.

A seguir, veremos como o n8n funciona e como instalá-lo em um VPS com Docker Compose, PostgreSQL, HTTPS e execução isolada de código.

n8n em sete etapas

Plano mínimo de implantação:

  1. Crie um VPS e aponte um subdomínio para ele, por exemplo n8n.example.com.
  2. Instale o Docker e o Docker Compose.
  3. Execute o n8n com PostgreSQL, um task runner externo e Caddy.
  4. Abra a interface por HTTPS e crie a conta do proprietário.
  5. Conecte o Telegram, um CRM, o e-mail ou qualquer API externa.
  6. Configure o tratamento de erros e o período de retenção das execuções.
  7. Automatize os backups do banco de dados, dos dados e da chave de criptografia.

Para uma pequena instalação em produção, é razoável começar com 2 vCPU e 4 GB de RAM. Para testes, 2 GB muitas vezes são suficientes, mas PostgreSQL, Docker e processos paralelos consomem rapidamente a margem disponível.

O que é o n8n e como ele funciona

O n8n é uma plataforma de automação de fluxos de trabalho. Um cenário é montado com nós: um inicia o processo, os seguintes recebem e transformam os dados, e o último executa uma ação.

Um workflow simples tem esta aparência:

Webhook → verificação dos dados → CRM → Telegram → resposta ao site

O fluxo pode ser iniciado por um webhook, um agendamento, um e-mail, uma mensagem ou um evento de um serviço externo. Entre os nós, é possível usar condições, loops, filtros, esperas e tratamento de erros.

Um dos pontos fortes do n8n é que a automação não fica limitada às integrações prontas. Qualquer serviço que tenha uma API pode ser acessado por HTTP Request, enquanto uma lógica específica pode ser escrita em um Code node com JavaScript ou Python. Por isso, o n8n fica entre um construtor no-code simples e um código de servidor desenvolvido do zero.

Por que ele é mais do que um encaminhador de dados

O n8n é útil quando um processo passa por vários sistemas e exige uma decisão:

formulário → verificação → busca de duplicidade → avaliação por IA → aprovação do responsável → CRM

A pessoa pode ficar apenas no ponto de controle. Por exemplo, a IA prepara uma resposta, mas a mensagem só é enviada ao cliente depois da aprovação de um funcionário.

Cenários comuns:

  • vendas e suporte: coleta de solicitações, distribuição de leads e criação de oportunidades;
  • conteúdo e IA: elaboração de rascunhos, classificação de solicitações e publicação após aprovação;
  • DevOps: notificações de falhas, webhooks do Git e verificações de API;
  • operações internas: sincronização de planilhas, e-mails, calendários e sistemas corporativos.

Uma instalação self-hosted oferece controle sobre o processo e o banco de dados, mas não transforma serviços externos em serviços locais. Os dados enviados ao Telegram, a um CRM ou a um modelo de IA na nuvem saem do VPS.

n8n Cloud ou servidor próprio

Parâmetron8n Cloudn8n em um VPS
ImplantaçãoSem configuração de servidorExige domínio, Docker e HTTPS
AtualizaçõesFeitas pelo n8nFeitas pelo proprietário
Banco de dados e arquivosNa infraestrutura do serviçoNo servidor escolhido
EscalabilidadeConforme as condições do plano na nuvemConfigurada por conta própria
ResponsabilidadeMenos administraçãoBackups, proteção e monitoramento por conta do proprietário
Para quem é indicadoInício rápido sem DevOpsControle, personalização e processos contínuos

A Community Edition pode ser hospedada gratuitamente em um servidor próprio e usada em processos pessoais e internos da empresa. No entanto, o n8n não é distribuído sob uma licença open source tradicional, mas pelo modelo fair-code Sustainable Use License. Ela permite o uso interno e modificações, mas não permite simplesmente implantar o n8n, colocar sua própria marca e vender o acesso como um SaaS separado. Para esse tipo de produto, é necessário verificar as condições da licença separadamente.

Requisitos de servidor do n8n

A carga depende do volume de dados, do paralelismo e do tipo de operação. Arquivos, listas longas, Code nodes e fluxos com IA exigem mais memória do que o envio de pequenos objetos JSON entre APIs.

CenárioConfiguração inicial
Testes e workflows pessoais de texto1 vCPU, 2 GB de RAM, 20 GB NVMe
Pequena instalação em produção2 vCPU, 4 GB de RAM, 25–40 GB NVMe
Processos paralelos, IA ou arquivos4 vCPU, 8 GB de RAM ou mais
Vários processos worker no queue modeDimensionamento conforme o número de execuções

O SQLite é adequado para conhecer a plataforma e para uma pequena instância única. Para uma instalação em produção, o PostgreSQL é mais conveniente: facilita os backups e uma futura migração para o queue mode.

Como instalar o n8n em um VPS

Este exemplo usa Ubuntu 24.04, PostgreSQL, Caddy e um task runner externo. Substitua n8n.example.com e o fuso horário pelos seus próprios valores.

1. Configure o DNS e prepare o servidor

Crie um registro DNS A apontando para o endereço IPv4 do VPS e depois conecte-se por SSH:

ssh root@SERVER_IP
apt update && apt upgrade -y
apt install -y ca-certificates curl ufw openssl

Instale o Docker Engine e o plugin Compose a partir do repositório oficial:

install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
  -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc

cat > /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF

apt update
apt install -y docker-ce docker-ce-cli containerd.io \
  docker-buildx-plugin docker-compose-plugin
docker compose version

Abra apenas SSH, HTTP e HTTPS:

ufw allow OpenSSH
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable

Não feche a sessão SSH atual até confirmar que uma nova conexão funciona.

2. Crie as variáveis de ambiente

Prepare o diretório:

mkdir -p /opt/n8n
cd /opt/n8n

Crie o arquivo .env. Os comandos abaixo geram imediatamente segredos aleatórios diferentes para o PostgreSQL, a criptografia do n8n e o task runner:

cat > .env <<EOF
N8N_VERSION=stable
N8N_HOST=n8n.example.com
GENERIC_TIMEZONE=Europe/Berlin

POSTGRES_DB=n8n
POSTGRES_USER=n8n
POSTGRES_PASSWORD=$(openssl rand -hex 32)

N8N_ENCRYPTION_KEY=$(openssl rand -hex 32)
RUNNERS_AUTH_TOKEN=$(openssl rand -hex 32)
EOF

chmod 600 .env

A tag stable é conveniente para a primeira inicialização. Depois de verificar a instalação, é melhor fixar uma versão específica do n8n para evitar que uma próxima atualização da imagem aconteça de forma inesperada.

A N8N_ENCRYPTION_KEY não pode ser perdida. O n8n usa essa chave para criptografar senhas, tokens e outras credenciais salvas. Se você restaurar apenas o PostgreSQL sem a chave, os registros continuarão no banco de dados, mas o n8n não conseguirá lê-los.

3. Crie a configuração do Docker Compose

Crie o arquivo compose.yaml:

services:
  postgres:
    image: postgres:18-alpine
    restart: unless-stopped
    environment:
      POSTGRES_DB: ${POSTGRES_DB}
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      PGDATA: /var/lib/postgresql/data
    volumes:
      - postgres_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"]
      interval: 5s
      timeout: 5s
      retries: 10

  n8n:
    image: docker.n8n.io/n8nio/n8n:${N8N_VERSION}
    restart: unless-stopped
    environment:
      DB_TYPE: postgresdb
      DB_POSTGRESDB_HOST: postgres
      DB_POSTGRESDB_PORT: "5432"
      DB_POSTGRESDB_DATABASE: ${POSTGRES_DB}
      DB_POSTGRESDB_USER: ${POSTGRES_USER}
      DB_POSTGRESDB_PASSWORD: ${POSTGRES_PASSWORD}

      N8N_HOST: ${N8N_HOST}
      N8N_PORT: "5678"
      N8N_PROTOCOL: https
      N8N_EDITOR_BASE_URL: https://${N8N_HOST}
      N8N_WEBHOOK_URL: https://${N8N_HOST}/
      N8N_PROXY_HOPS: "1"
      GENERIC_TIMEZONE: ${GENERIC_TIMEZONE}
      TZ: ${GENERIC_TIMEZONE}

      N8N_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY}
      N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS: "true"
      N8N_BLOCK_ENV_ACCESS_IN_NODE: "true"

      N8N_RUNNERS_MODE: external
      N8N_RUNNERS_AUTH_TOKEN: ${RUNNERS_AUTH_TOKEN}
      N8N_RUNNERS_BROKER_LISTEN_ADDRESS: 0.0.0.0

      EXECUTIONS_DATA_PRUNE: "true"
      EXECUTIONS_DATA_MAX_AGE: "168"
      EXECUTIONS_DATA_PRUNE_MAX_COUNT: "10000"
    volumes:
      - n8n_data:/home/node/.n8n
    expose:
      - "5678"
    depends_on:
      postgres:
        condition: service_healthy

  n8n-runner:
    image: n8nio/runners:${N8N_VERSION}
    restart: unless-stopped
    environment:
      N8N_RUNNERS_AUTH_TOKEN: ${RUNNERS_AUTH_TOKEN}
      N8N_RUNNERS_TASK_BROKER_URI: http://n8n:5679
    depends_on:
      - n8n

  caddy:
    image: caddy:2-alpine
    restart: unless-stopped
    environment:
      N8N_HOST: ${N8N_HOST}
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - caddy_data:/data
      - caddy_config:/config
    depends_on:
      - n8n

volumes:
  postgres_data:
    name: n8n_postgres_data
  n8n_data:
    name: n8n_data
  caddy_data:
    name: n8n_caddy_data
  caddy_config:
    name: n8n_caddy_config

O task runner externo executa o código separadamente do processo principal do n8n. Isso é mais seguro do que o modo interno e reduz a possibilidade de um erro em um Code node afetar o editor e o processamento de webhooks.

4. Ative o HTTPS

Crie o arquivo Caddyfile:

{$N8N_HOST} {
    reverse_proxy n8n:5678
}

O Caddy obterá um certificado TLS automaticamente se o DNS já apontar para o VPS e as portas 80 e 443 estiverem acessíveis. A porta interna 5678 não é exposta à internet: externamente, apenas as portas 80 e 443 ficam disponíveis, enquanto o Caddy acessa o n8n pela rede Docker.

As variáveis N8N_WEBHOOK_URL e N8N_PROXY_HOPS são necessárias para que o editor gere os endereços públicos corretos dos webhooks e confie nos cabeçalhos enviados por um reverse proxy.

5. Inicie o n8n

Verifique a configuração final e inicie os contêineres:

docker compose config
docker compose up -d
docker compose ps
docker compose logs --tail=100 n8n caddy

Abra:

https://n8n.example.com

Crie a conta do proprietário. Não compartilhe a senha com colegas: para o trabalho em equipe, use contas separadas e conceda apenas o acesso necessário.

Primeiro workflow útil

Um bom teste é processar uma solicitação enviada pelo site:

  1. Adicione um nó Webhook com o método POST.
  2. Com Edit Fields, mantenha apenas o nome, o e-mail e a origem.
  3. Use um nó If para rejeitar uma solicitação sem os dados obrigatórios.
  4. Crie uma oportunidade no CRM ou envie uma solicitação por HTTP Request.
  5. Adicione uma notificação no Telegram.
  6. Finalize o fluxo com um nó Respond to Webhook.
  7. Após o teste, ative o workflow e substitua o webhook de teste pela URL de produção.

Esse exemplo verifica de uma só vez o domínio, o HTTPS, as solicitações recebidas, as credenciais e a integração externa. Em seguida, vale a pena adicionar um Error Workflow separado para avisar quando o fluxo principal falhar.

Segurança do n8n após a instalação

Um n8n instalado ainda não é um n8n confiável. Após a inicialização, verifique se:

  • o editor só pode ser acessado por HTTPS;
  • o arquivo .env tem permissões 600 e não é enviado ao Git;
  • as chaves de API externas têm apenas as permissões mínimas;
  • o webhook verifica a assinatura ou o segredo da origem;
  • o histórico de execuções é limpo automaticamente;
  • os erros de workflows críticos são enviados ao administrador.

Os Community nodes são instalados como pacotes e podem ter acesso aos dados dos workflows e ao servidor. Não adicione nós desconhecidos sem verificá-los. Se não forem necessários, desative-os com N8N_COMMUNITY_PACKAGES_ENABLED=false.

Execute a auditoria integrada:

docker compose exec n8n n8n audit

Ela ajuda a encontrar webhooks desprotegidos, nós arriscados e problemas com credenciais, mas não substitui uma verificação manual.

Histórico de execuções e dados pessoais

O n8n salva os dados de entrada e saída para depuração. Com eles, e-mails, números de telefone, documentos e respostas de API podem permanecer no banco de dados.

Na configuração acima, as execuções são excluídas após sete dias e a quantidade fica limitada a 10.000. Para processos sensíveis, defina o período conforme a política de retenção de dados e remova campos desnecessários antes do fim do workflow.

Backups e atualizações

Para restaurar o sistema, são necessários um dump do PostgreSQL, o volume n8n_data, os arquivos de configuração e o .env com a N8N_ENCRYPTION_KEY. Antes de copiar, interrompa os processadores mantendo o PostgreSQL em execução. Isso criará uma breve pausa nos workflows:

cd /opt/n8n
mkdir -p backup
docker compose stop n8n n8n-runner

docker compose exec -T postgres sh -c \
  'pg_dump -U "$POSTGRES_USER" "$POSTGRES_DB"' \
  | gzip > "backup/n8n-db-$(date +%F).sql.gz"

docker run --rm \
  -v n8n_data:/source:ro \
  -v "$PWD/backup":/backup \
  alpine sh -c \
  'tar -czf /backup/n8n-data-$(date +%F).tar.gz -C /source .'

tar -czf "backup/n8n-config-$(date +%F).tar.gz" \
  .env compose.yaml Caddyfile

docker compose start n8n n8n-runner

O arquivo que contém .env inclui segredos: criptografe-o e guarde-o fora do VPS. Verifique periodicamente a cópia realizando uma restauração de teste.

Antes de atualizar, faça um backup e consulte as notas da versão:

cd /opt/n8n
docker compose pull
docker compose up -d
docker compose ps

O task runner e o contêiner principal devem usar a mesma tag de versão.

Quando será necessário escalar

Não comece com Redis e vários workers antes de existir carga real. Uma única instância com PostgreSQL é mais simples de administrar e normalmente atende pequenos processos internos.

O queue mode será necessário quando tarefas longas atrasarem os webhooks, muitos workflows forem iniciados ao mesmo tempo ou o processamento de arquivos consumir regularmente toda a memória. Nesse caso, a instância principal recebe os eventos, o Redis distribui os trabalhos e os workers os executam em paralelo. Todos os componentes devem se conectar ao mesmo PostgreSQL e usar a mesma N8N_ENCRYPTION_KEY.

Qual VPS escolher para o n8n

Para a combinação de n8n, PostgreSQL, Caddy e task runner, é razoável começar com 2 vCPU, 4 GB de RAM e um disco NVMe. Na tropic.host, essa configuração corresponde ao plano Light: 2 vCPU, 4 GB de RAM e 25 GB NVMe. Isso é suficiente para os primeiros workflows em produção sem processamento pesado de arquivos.

Para documentos, grandes volumes de dados e muitos fluxos paralelos com IA, é melhor escolher 8 GB de RAM. Uma rede estável também é importante: webhooks, retornos do OAuth e tarefas agendadas precisam permanecer disponíveis o tempo todo.

Conclusão

O n8n transforma operações repetitivas em fluxos visuais e claros: nós prontos aceleram a implantação, HTTP Request conecta praticamente qualquer API e um Code node permite adicionar sua própria lógica.

A versão self-hosted oferece controle sobre o servidor e o banco de dados, mas exige HTTPS, chaves com permissões limitadas, limpeza do histórico e backups testados. Guarde a N8N_ENCRYPTION_KEY junto com o PostgreSQL: sem ela, as credenciais restauradas não podem ser descriptografadas.

FAQ

É possível usar o n8n gratuitamente?

Sim. A Community Edition pode ser hospedada gratuitamente no seu próprio servidor para processos pessoais e internos. A revenda de uma instância hospedada do n8n como um SaaS separado é limitada pela licença fair-code.

É possível instalar o n8n sem domínio?

Para um teste local, sim. Para webhooks públicos e OAuth, é melhor usar um domínio e HTTPS.

De quanta memória RAM o n8n precisa?

Workflows pessoais simples muitas vezes funcionam com 2 GB de RAM. Para o n8n com PostgreSQL, Caddy e um task runner, 4 GB são mais adequados; arquivos e execuções paralelas podem exigir 8 GB ou mais.

Todos os dados permanecem dentro do VPS?

Apenas os dados que o workflow não envia para fora. O banco de dados e o histórico de execuções ficam no VPS, mas os nós do Telegram, do CRM ou de um modelo externo de IA enviam os dados selecionados ao serviço correspondente.

O que deve fazer parte de um backup do n8n?

Um dump do PostgreSQL, o volume n8n_data, compose.yaml, Caddyfile e o arquivo .env com a N8N_ENCRYPTION_KEY. Guarde a cópia criptografada fora do VPS e verifique-a por meio de uma restauração.