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
| Recurso | n8n Cloud | n8n Self-Hosted (Recomendado) |
|---|---|---|
| Custo de Licenciamento | Assinaturas mensais (limite de execuções) | Grátis para uso interno comercial |
| Custo de Infraestrutura | Incluso no plano | Custo da VPS (U$ 5 a U$ 20/mês) |
| Volume de Execuções | Limitado conforme o plano contratado | Ilimitado (depende do hardware da VPS) |
| Persistência de Dados | Compartilhada na infraestrutura n8n Cloud | Localizada no seu banco PostgreSQL privado |
| Segurança e Rede | Apenas conexões públicas via Internet | Permite rodar sob VPNs e firewalls locais |
| Execução de Código | Sandbox restrito | Suporta 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:
- VPS: Instância com Ubuntu 22.04 LTS (mínimo de 1 vCPU e 2GB de RAM recomendado).
- Docker & Docker Compose: Isolamento e execução dos serviços.
- 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.
- 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)
- DNS Configurado: Certifique-se de que o seu subdomínio (ex:
n8n.suaempresa.com.br) possui um apontamento do tipoAna sua zona de DNS apontando para o IP público da sua VPS antes de subir o Caddy. - Fechamento de Portas: O Caddy deve expor apenas as portas
80e443para a internet. As portas5678(n8n) e5432(PostgreSQL) não devem ser mapeadas nosports:do docker-compose para evitar varreduras de segurança externas. - 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. - 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=truenas variáveis de ambiente do n8n no seu docker-compose.