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.

    ~30 minjunho/2026 · Ubuntu 24.04 LTS

    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. 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
      Dica
      O 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. 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, as credenciais existentes ficam inacessíveis.

      bash
      # Gerar chave segura de 48 caracteres hexadecimais
      openssl rand -hex 24
      Dica
      Copie o valor gerado pelo comando acima. Ele será o valor de N8N_ENCRYPTION_KEY no próximo passo.
    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
      Atenção
      Nunca 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. 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:
      Dica
      A porta 5678 está vinculada a 127.0.0.1 para não ficar exposta publicamente. O acesso externo será feito via Nginx + HTTPS.
    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
      Dica
      O 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. 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
      Atenção
      Substitua todas as ocorrências de `n8n.seudominio.com.br` pelo seu subdomínio real antes de continuar.
    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
      Dica
      O Certbot renova automaticamente o certificado 30 dias antes do vencimento via systemd timer. Verifique com: `systemctl status certbot.timer`
    10. 10

      Configurar firewall UFW

      Libere apenas as portas necessárias. A porta 5678 do n8n permanece bloqueada externamente — apenas Nginx acessa ela 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
      Dica
      Acesse 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.