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.

cerca de 30 minjunho/2026 · Ubuntu 24.04 LTS

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. 1

    Atualizar o sistema

    Antes de instalar qualquer pacote, sincronize o índice de repositórios e aplique atualizações pendentes.

    bash
    apt update && apt upgrade -y
    apt install -y curl wget git
  2. 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.

    bash
    curl -fsSL https://get.docker.com -o get-docker.sh
    sh get-docker.sh
    
    # Verificar instalação
    docker --version
    docker compose version
  3. 3

    Criar o diretório do projeto

    Centralizar os arquivos de configuração em `/opt/n8n` facilita backups e atualizações.

    bash
    mkdir -p /opt/n8n
    cd /opt/n8n
  4. 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. 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. 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. 7

    Subir os containers

    Suba os serviços em background e acompanhe os logs do n8n para confirmar que iniciou corretamente.

    bash
    cd /opt/n8n
    docker compose up -d
    
    # Acompanhar logs (aguarde "Editor is now accessible via:")
    docker compose logs n8n --follow
  8. 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.

    bash
    apt 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. 9

    Configurar SSL com Certbot (Let's Encrypt)

    O Certbot obtém um certificado gratuito e configura a renovação automática.

    bash
    apt 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. 10

    Configurar firewall UFW

    Libere apenas as portas necessárias. A porta 5678 do n8n permanece bloqueada externamente: apenas o Nginx a acessa internamente.

    bash
    ufw 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. 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.

bash
docker compose logs n8n --tail=50
# Se o erro for "Connection refused" ao postgres, aguarde mais 30s e tente:
docker compose restart n8n

O 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.

bash
# Verificar se o n8n está respondendo localmente
curl http://127.0.0.1:5678
# Verificar status do container
docker compose ps

A variável `WEBHOOK_URL` deve refletir exatamente a URL pública do n8n, incluindo a barra final. Verifique e reinicie os containers.

bash
# No .env, confirme:
# WEBHOOK_URL=https://n8n.seudominio.com.br/
# Depois:
docker compose up -d

As 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).

bash
chown -R 1000:1000 /opt/n8n
docker compose up -d

Perguntas 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.