Voltar para o Blog
02 de maio de 2026 n8n Docker VPS Infraestrutura

Como utilizar o n8n Self-Hosted na VPS (Docker) de forma segura e com custo quase zero

Como utilizar o n8n Self-Hosted na VPS (Docker) de forma segura e com custo quase zero

Passo a passo técnico para rodar o n8n no seu próprio servidor usando Docker, garantindo controle total dos dados e economia em assinaturas SaaS.

Muitas empresas iniciam suas jornadas de automação de APIs contratando soluções no-code baseadas em SaaS. No entanto, à medida que o volume de dados e o número de integrações crescem, a fatura dessas ferramentas escala de forma insustentável. É nesse cenário que o n8n desponta como uma alternativa poderosa: sua licença fair-code permite a instalação e execução da plataforma em infraestrutura própria (self-hosted).

Rodar o n8n self-hosted em uma VPS (Virtual Private Server) usando Docker garante controle absoluto sobre seus fluxos, independência contra reajustes de preços e total soberania dos dados. Tudo isso com um custo fixo que pode variar de U$ 5 a U$ 20 mensais.

Neste tutorial técnico, você aprenderá o passo a passo para implantar o n8n em produção usando Docker Compose, garantindo segurança corporativa, banco de dados persistente PostgreSQL e criptografia SSL automatizada.


O que é o n8n Self-Hosted?

[!NOTE] Definição Direta: O n8n Self-Hosted é o deploy da plataforma n8n dentro de servidores gerenciados pela sua própria empresa (seja na nuvem ou localmente), utilizando tecnologias de conteinerização como o Docker. Essa abordagem remove os limites de execuções mensais impostos pela versão em nuvem e permite que a aplicação acesse diretamente a rede interna e execute bibliotecas personalizadas de programação.


Comparativo: n8n Cloud vs. n8n Self-Hosted

Recurson8n Cloudn8n Self-Hosted (Recomendado)
Custo de LicenciamentoAssinaturas mensais (limite de execuções)Grátis para uso interno comercial
Custo de InfraestruturaIncluso no planoCusto da VPS (U$ 5 a U$ 20/mês)
Volume de ExecuçõesLimitado conforme o plano contratadoIlimitado (depende do hardware da VPS)
Persistência de DadosCompartilhada na infraestrutura n8n CloudLocalizada no seu banco PostgreSQL privado
Segurança e RedeApenas conexões públicas via InternetPermite rodar sob VPNs e firewalls locais
Execução de CódigoSandbox restritoSuporta importação de qualquer biblioteca NPM

Arquitetura de Implantação Recomendada

Para um ambiente de produção resiliente e seguro, utilizaremos a seguinte pilha de tecnologias:

  1. VPS: Instância com Ubuntu 22.04 LTS (mínimo de 1 vCPU e 2GB de RAM recomendado).
  2. Docker & Docker Compose: Isolamento e execução dos serviços.
  3. PostgreSQL: Banco de dados relacional para persistência de dados das execuções do n8n, substituindo o SQLite padrão que costuma corromper sob alta concorrência.
  4. Caddy Server: Servidor web leve e de alta performance que gerencia rotas e realiza o provisionamento e renovação automática de certificados de segurança SSL (HTTPS) com Let’s Encrypt de forma simplificada.

Scripts de Configuração e Deployment

1. Preparação da VPS e Instalação do Docker

Conecte-se à sua VPS via SSH e execute a atualização de pacotes do sistema operacional, seguida da instalação do Docker Engine:

# Atualiza os repositórios do sistema
sudo apt update && sudo apt upgrade -y

# Instala o Docker e utilitários de rede
sudo apt install curl git docker.io docker-compose -y

# Adiciona o usuário do sistema ao grupo docker
sudo usermod -aG docker $USER

(Certifique-se de deslogar e logar novamente no terminal para aplicar a alteração de grupo do usuário).

2. Criação da Estrutura de Arquivos

Crie um diretório dedicado para a aplicação e configure as pastas de persistência de dados:

mkdir -p ~/n8n-deploy/caddy_data ~/n8n-deploy/postgres_data
cd ~/n8n-deploy

3. Escrevendo o arquivo .env

O arquivo de variáveis de ambiente centraliza as configurações cruciais e credenciais confidenciais de segurança. Crie o arquivo .env no diretório principal:

# Configurações de Domínio e E-mail para Let's Encrypt
DOMAIN_NAME=n8n.suaempresa.com.br
[email protected]

# Credenciais de Segurança do Banco de Dados
POSTGRES_USER=n8n_admin
POSTGRES_PASSWORD=SubstituaPorUmaSenhaMuitoForteEComplexa123!
POSTGRES_DB=n8n_prod_db

# Chave de Criptografia do n8n (Gerada para proteger credenciais de APIs nos fluxos)
N8N_ENCRYPTION_KEY=GereUmaStringAleatoriaEGuardeNumLocalSeguro

# Configurações de fuso horário do n8n
GENERIC_TIMEZONE=America/Sao_Paulo
TZ=America/Sao_Paulo

4. Escrevendo o arquivo docker-compose.yml

O arquivo abaixo orquestra o n8n, o PostgreSQL e o Caddy Server em uma rede interna isolada:

version: '3.8'

networks:
  n8n-network:
    driver: bridge

services:
  postgres:
    image: postgres:15-alpine
    container_name: n8n-db
    restart: always
    environment:
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DB: ${POSTGRES_DB}
    volumes:
      - ./postgres_data:/var/lib/postgresql/data
    networks:
      - n8n-network
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
      interval: 10s
      timeout: 5s
      retries: 5

  n8n:
    image: docker.n8n.io/n8nio/n8n:latest
    container_name: n8n-app
    restart: always
    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_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
      - GENERIC_TIMEZONE=${GENERIC_TIMEZONE}
      - TZ=${TZ}
      - N8N_HOST=${DOMAIN_NAME}
      - N8N_PORT=5678
      - N8N_PROTOCOL=https
      - WEBHOOK_URL=https://${DOMAIN_NAME}/
      # Otimizações de Memória para VPS pequenas (2GB RAM)
      - EXECUTIONS_DATA_PRUNE=true
      - EXECUTIONS_DATA_MAX_AGE=168 # Mantém logs de execuções por apenas 7 dias
      - EXECUTIONS_DATA_PRUNE_TIMEOUT=3600
    volumes:
      - ./n8n_data:/home/node/.n8n
    depends_on:
      postgres:
        condition: service_healthy
    networks:
      - n8n-network

  caddy:
    image: caddy:2-alpine
    container_name: n8n-proxy
    restart: always
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./caddy_data:/data
      - ./Caddyfile:/etc/caddy/Caddyfile
    depends_on:
      - n8n
    networks:
      - n8n-network

5. Configurando o arquivo Caddyfile

O Caddyfile define as regras de roteamento e redirecionamento HTTPS. Crie o arquivo Caddyfile no mesmo diretório:

{$DOMAIN_NAME} {
    reverse_proxy n8n:5678 {
        header_up Host {host}
        header_up X-Real-IP {remote_host}
    }
    
    log {
        output file /data/access.log
    }
}

6. Executando a Aplicação

Com todos os arquivos criados e configurados, inicie a stack em segundo plano (detached mode):

docker-compose up -d

Verifique se todos os contêineres estão rodando corretamente:

docker-compose ps

Lista de Verificação de Segurança (Production-Ready)

  1. DNS Configurado: Certifique-se de que o seu subdomínio (ex: n8n.suaempresa.com.br) possui um apontamento do tipo A na sua zona de DNS apontando para o IP público da sua VPS antes de subir o Caddy.
  2. Fechamento de Portas: O Caddy deve expor apenas as portas 80 e 443 para a internet. As portas 5678 (n8n) e 5432 (PostgreSQL) não devem ser mapeadas nos ports: do docker-compose para evitar varreduras de segurança externas.
  3. Backup do Banco de Dados: Configure uma rotina diária no Cron da VPS para exportar o dump do banco de dados PostgreSQL (pg_dump) e enviá-lo de forma criptografada para um serviço de armazenamento S3 ou Google Drive.
  4. Desativar Registro de Novos Usuários: Após criar sua conta de proprietário (Owner) no primeiro acesso ao painel web do n8n, é recomendável desativar o registro de novos administradores adicionando a variável - N8N_DISABLE_SETTINGS_TABLE_REGISTRATION=true nas variáveis de ambiente do n8n no seu docker-compose.