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.
Pré-requisitos
- VPS mínima: 1 vCPU · 2 GB RAM · 20 GB SSD (Runstack Micro ou superior)
- Sistema: Ubuntu 24.04 LTS
- 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 versionDicaO script get.docker.com instala a versão CE (Community Edition) mais recente. Para Ubuntu 24.04, o suporte está disponível desde Docker 24.0. - 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, as credenciais existentes ficam inacessíveis.
bash# Gerar chave segura de 48 caracteres hexadecimais openssl rand -hex 24DicaCopie o valor gerado pelo comando acima. Ele será o valor de N8N_ENCRYPTION_KEY no próximo passo. - 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_PauloAtençãoNunca use os valores de exemplo acima em produção. Gere uma senha real para POSTGRES_PASSWORD e use a chave gerada no passo anterior para N8N_ENCRYPTION_KEY. - 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:DicaA porta 5678 está vinculada a 127.0.0.1 para não ficar exposta publicamente. O acesso externo será feito via Nginx + HTTPS. - 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 --followDicaO n8n leva 20-60 segundos para subir na primeira execução enquanto inicializa o banco de dados. Pressione Ctrl+C para sair do modo de log. - 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 -tAtençãoSubstitua todas as ocorrências de `n8n.seudominio.com.br` pelo seu subdomínio real antes de continuar. - 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 nginxDicaO Certbot renova automaticamente o certificado 30 dias antes do vencimento via systemd timer. Verifique com: `systemctl status certbot.timer` - 10
Configurar firewall UFW
Libere apenas as portas necessárias. A porta 5678 do n8n permanece bloqueada externamente — apenas Nginx acessa ela 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=50DicaAcesse https://n8n.seudominio.com.br no navegador. No primeiro acesso, o n8n solicita a criação da conta de owner (administrador principal).
$ runstack deploy --plan starter
Não quer configurar manualmente?
Não quer configurar manualmente? Implante o n8n em menos de 3 minutos com a Runstack. Infraestrutura da OPEN DATACENTER, com servidores no Brasil.
Troubleshooting
Perguntas frequentes
[VERIFICAR antes de publicar]
- 1. Confirme a tag de imagem mais recente em hub.docker.com/r/n8nio/n8n antes de usar `latest` em produção — considere fixar uma versão específica (ex.: `1.x.x`).
- 2. A autenticação via owner account (primeiro acesso) substituiu `N8N_BASIC_AUTH_ACTIVE` no n8n 0.237+. Verifique em docs.n8n.io se sua versão exige configuração diferente.
- 3. Confirme se `WEBHOOK_URL` (com barra final) ainda é o nome correto da variável na versão que você usar.