Como instalar o n8n em uma VPS Ubuntu
Você precisa de um servidor Linux com Docker, um subdomínio apontado para o IP da VPS e cerca de 30 minutos. Este guia usa Docker Compose + PostgreSQL + Nginx + Let's Encrypt, o método recomendado para ambientes de produção. Ao final o n8n estará rodando em https com persistência de dados.
Antes de começar
- VPS mínima
- 1 vCPU · 2 GB RAM · 20 GB SSD (Runstack Micro ou superior)
- Sistema
- Ubuntu 24.04 LTS
- Também
- Acesso root ou usuário com sudo
- Subdomínio DNS apontado para o IP da VPS (ex.: n8n.seudominio.com.br)
- Porta 80 e 443 abertas no firewall da VPS
Instalação passo a passo
- 1
Atualizar o sistema
Antes de instalar qualquer pacote, sincronize o índice de repositórios e aplique atualizações pendentes.
bashapt update && apt upgrade -y apt install -y curl wget git - 2
Instalar Docker e Docker Compose
Use o script oficial do Docker, que detecta a distribuição e configura o repositório correto. O plugin `docker-compose-plugin` (comando `docker compose`) é instalado junto.
bashcurl -fsSL https://get.docker.com -o get-docker.sh sh get-docker.sh # Verificar instalação docker --version docker compose version - 3
Criar o diretório do projeto
Centralizar os arquivos de configuração em `/opt/n8n` facilita backups e atualizações.
bashmkdir -p /opt/n8n cd /opt/n8n - 4
Criar o arquivo de variáveis de ambiente (.env)
Gere uma chave de encriptação segura e preencha o `.env`. A chave protege as credenciais de integrações armazenadas no banco. Se perder a chave, as credenciais existentes ficam inacessíveis.
bash# Gerar chave segura de 48 caracteres hexadecimais openssl rand -hex 24 - 5
Configurar variáveis no .env
Crie o arquivo `.env` substituindo os valores pelos seus. Nunca commite este arquivo em repositórios públicos.
.env# /opt/n8n/.env POSTGRES_PASSWORD=troque_por_senha_forte_aqui N8N_HOST=n8n.seudominio.com.br N8N_ENCRYPTION_KEY=coloque_aqui_a_chave_gerada_acima GENERIC_TIMEZONE=America/Sao_Paulo - 6
Criar o docker-compose.yml
Esta configuração sobe o n8n com PostgreSQL (recomendado para produção) e expõe o n8n apenas em localhost. O Nginx fará o proxy público.
docker-compose.yml# /opt/n8n/docker-compose.yml services: postgres: image: postgres:16-alpine restart: always environment: POSTGRES_DB: n8n POSTGRES_USER: n8n POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} volumes: - postgres_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U n8n"] interval: 5s timeout: 5s retries: 10 n8n: image: docker.n8n.io/n8nio/n8n:latest restart: always ports: - "127.0.0.1:5678:5678" environment: - DB_TYPE=postgresdb - DB_POSTGRESDB_HOST=postgres - DB_POSTGRESDB_PORT=5432 - DB_POSTGRESDB_DATABASE=n8n - DB_POSTGRESDB_USER=n8n - DB_POSTGRESDB_PASSWORD=${POSTGRES_PASSWORD} - N8N_HOST=${N8N_HOST} - N8N_PORT=5678 - N8N_PROTOCOL=https - WEBHOOK_URL=https://${N8N_HOST}/ - N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY} - GENERIC_TIMEZONE=${GENERIC_TIMEZONE} - TZ=${GENERIC_TIMEZONE} volumes: - n8n_data:/home/node/.n8n depends_on: postgres: condition: service_healthy volumes: postgres_data: n8n_data: - 7
Subir os containers
Suba os serviços em background e acompanhe os logs do n8n para confirmar que iniciou corretamente.
bashcd /opt/n8n docker compose up -d # Acompanhar logs (aguarde "Editor is now accessible via:") docker compose logs n8n --follow - 8
Instalar e configurar o Nginx
O Nginx age como reverse proxy: recebe requisições HTTPS externas e encaminha para o n8n local na porta 5678.
bashapt install -y nginx # Criar o arquivo de configuração do virtual host cat > /etc/nginx/sites-available/n8n << 'NGINXEOF' server { listen 80; server_name n8n.seudominio.com.br; return 301 https://$host$request_uri; } server { listen 443 ssl; server_name n8n.seudominio.com.br; # Certificados SSL — serão preenchidos pelo Certbot ssl_certificate /etc/letsencrypt/live/n8n.seudominio.com.br/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/n8n.seudominio.com.br/privkey.pem; location / { proxy_pass http://127.0.0.1:5678; 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; # WebSocket — necessário para o editor em tempo real proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_buffering off; proxy_read_timeout 3600s; } } NGINXEOF # Ativar o site e testar a configuração ln -s /etc/nginx/sites-available/n8n /etc/nginx/sites-enabled/n8n nginx -t - 9
Configurar SSL com Certbot (Let's Encrypt)
O Certbot obtém um certificado gratuito e configura a renovação automática.
bashapt install -y certbot python3-certbot-nginx # Obter certificado (substitua os valores) certbot --nginx \ -d n8n.seudominio.com.br \ --non-interactive \ --agree-tos \ --email seu@email.com # Reiniciar Nginx com SSL ativo systemctl reload nginx - 10
Configurar firewall UFW
Libere apenas as portas necessárias. A porta 5678 do n8n permanece bloqueada externamente: apenas o Nginx a acessa internamente.
bashufw allow 22/tcp comment 'SSH' ufw allow 80/tcp comment 'HTTP (redirect para HTTPS)' ufw allow 443/tcp comment 'HTTPS' ufw --force enable # Verificar regras ativas ufw status verbose - 11
Verificar a instalação
Confirme que todos os containers estão rodando e que o n8n responde via HTTPS.
bash# Status dos containers docker compose -f /opt/n8n/docker-compose.yml ps # Testar resposta HTTPS curl -I https://n8n.seudominio.com.br # Verificar logs de erro (se necessário) docker compose -f /opt/n8n/docker-compose.yml logs n8n --tail=50
Não quer configurar manualmente?
Implante o n8n em menos de 5 minutos com a Runstack. Infraestrutura da OPEN Datacenter, com servidores em São Paulo.
Se der problema
Verifique os logs para identificar a causa. O motivo mais comum é o n8n não conseguir conectar ao PostgreSQL antes que o healthcheck passe.
docker compose logs n8n --tail=50
# Se o erro for "Connection refused" ao postgres, aguarde mais 30s e tente:
docker compose restart n8nO Nginx está rodando mas o n8n não está acessível em 127.0.0.1:5678. Confirme que o container n8n está de pé e que a porta está correta no proxy_pass.
# Verificar se o n8n está respondendo localmente
curl http://127.0.0.1:5678
# Verificar status do container
docker compose psA variável `WEBHOOK_URL` deve refletir exatamente a URL pública do n8n, incluindo a barra final. Verifique e reinicie os containers.
# No .env, confirme:
# WEBHOOK_URL=https://n8n.seudominio.com.br/
# Depois:
docker compose up -dAs credenciais são encriptadas com `N8N_ENCRYPTION_KEY`. Se a chave mudar (ou for omitida), o n8n não consegue decifrar os dados existentes. Mantenha sempre a mesma chave.
O usuário do container não tem permissão no volume. Ajuste o owner do diretório para o UID 1000 (usuário `node` no container do n8n).
chown -R 1000:1000 /opt/n8n
docker compose up -dPerguntas frequentes
Para uso individual com poucos workflows e sem redundância, o SQLite (padrão do n8n) funciona bem. Para equipes, automações críticas ou alto volume de execuções, o PostgreSQL é recomendado: suporta múltiplas conexões simultâneas, é mais resiliente e permite backups lógicos mais granulares.
Faça backup do banco antes. Depois: `docker compose pull && docker compose up -d`. O n8n aplica migrações de banco automaticamente ao subir a nova versão. Consulte as release notes em github.com/n8n-io/n8n/releases para verificar breaking changes.
Para backup do PostgreSQL: `docker compose exec postgres pg_dump -U n8n n8n > backup_$(date +%Y%m%d).sql`. Para workflows e credenciais individualmente, use a exportação nativa do n8n (Menu → Settings → Import/Export). Os arquivos em `/home/node/.n8n` (mapeados no volume) também contêm configurações.
O n8n self-hosted com licença fair-code não limita o número de workflows nem de execuções. Recursos como LDAP, SSO e ambientes múltiplos fazem parte do plano Enterprise. Para uso individual e pequenas equipes, a versão community cobre todos os casos de uso.
O consumo base com PostgreSQL fica em torno de 300-500 MB de RAM. Em um plano Micro da Runstack (2 GB RAM), o n8n roda confortavelmente com até 30-50 workflows ativos em paralelo. Para cargas maiores, o plano Basic (2 GB) ou Pro (4 GB) é recomendado.