Deploy Automático do N8N em VPS: CI/CD com GitHub Actions

5 min 2 N8n

Deploy automático do N8N em VPS significa eliminar o passo manual de logar via SSH toda vez que existe uma atualização: um pipeline de CI/CD (GitHub Actions, na prática mais comum) conecta ao servidor a cada git push e roda docker compose pull && docker compose up -d sozinho. Combinado com restart policies do Docker e, opcionalmente, uma unit systemd supervisionando o daemon, o N8N também volta sozinho depois de um crash ou reboot do VPS — sem ninguém precisar intervir. Este guia cobre o pipeline completo: do workflow do GitHub Actions ao auto-restart e rollback.

Por que automatizar o deploy do N8N (e não só instalar manualmente)

A maioria dos guias de N8N em VPS para no docker compose up -d rodado manualmente na primeira instalação — e é aí que o processo de manutenção some. Toda vez que sai uma nova versão do N8N, ou que você muda uma variável de ambiente, alguém precisa logar no servidor via SSH e repetir os comandos. Isso não escala: some com o histórico de mudanças, ninguém revisa o que está indo pra produção, e é fácil esquecer de atualizar por semanas. Um pipeline de CI/CD resolve isso transformando "atualizar o N8N" em um git push.

Pipeline com GitHub Actions: o setup completo

O pipeline mais simples e mais usado para este caso de uso conecta ao VPS via SSH e reaplica o docker-compose.yml. Primeiro, cadastre 3 secrets no repositório (Settings → Secrets and variables → Actions): VPS_HOST, VPS_USER e VPS_SSH_KEY (a chave privada correspondente à chave pública já autorizada no authorized_keys do servidor). Nunca coloque essas credenciais direto no arquivo de workflow.

# .github/workflows/deploy.yml
name: Deploy N8N
on:
  push:
    branches: [main]
    paths:
      - 'docker-compose.yml'
      - '.env.production'
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Deploy via SSH
        uses: appleboy/ssh-action@v1
        with:
          host: ${{ secrets.VPS_HOST }}
          username: ${{ secrets.VPS_USER }}
          key: ${{ secrets.VPS_SSH_KEY }}
          script: |
            cd /opt/n8n
            docker compose pull
            docker compose up -d
            docker image prune -f

O gatilho paths evita disparar o deploy quando você só edita a documentação do repositório — só roda quando o docker-compose.yml ou o arquivo de ambiente mudam. O docker image prune -f no final evita acumular imagens antigas do N8N a cada deploy.

Auto-restart: systemd e restart policies do Docker

Deploy automático resolve metade do problema — a outra metade é o servidor se recuperar sozinho de uma falha sem ninguém acordar de madrugada pra reiniciar o container. Duas camadas resolvem isso:

CamadaO que fazConfiguração
Restart policy do containerReinicia o container do N8N se ele cair (crash, OOM kill)restart: unless-stopped no docker-compose.yml
systemd do DockerGarante que o Docker daemon (e os containers com restart policy) voltem depois de reboot do VPSsystemctl enable docker
Healthcheck do containerDetecta quando o N8N está travado, não só quando o processo morreuhealthcheck no compose, apontando pra rota /healthz do N8N

Sem essas três camadas, um crash do N8N às 3h da manhã só é resolvido quando alguém percebe manualmente. Com elas, o container volta sozinho em segundos.

Auto-update controlado vs. auto-update total

Existem duas filosofias para manter o N8N atualizado automaticamente, e a diferença importa em produção:

  • Auto-update total (Watchtower): o Watchtower monitora o Docker Hub e aplica qualquer nova versão da imagem n8nio/n8n assim que ela sai, sem revisão. Rápido de configurar, mas arriscado em produção — uma breaking change do N8N entra no ar sem ninguém validar antes.
  • Auto-update controlado (CI/CD): o pipeline de GitHub Actions só atualiza quando você faz o push — geralmente depois de fixar a versão da imagem (image: n8nio/n8n:1.x.x) e testar em um ambiente de staging. Mais trabalho de setup, mas dá controle sobre quando cada mudança entra no ar.

Para produção, a recomendação é CI/CD controlado. Watchtower fica melhor reservado para ambientes de teste, onde uma versão quebrada não afeta ninguém além de você.

Rollback: voltando para a versão anterior rapidamente

Se um deploy quebrar algo, o rollback com essa estrutura é simples: fixe a tag da imagem no docker-compose.yml (em vez de usar latest), guarde o histórico de versões no Git, e para reverter basta dar git revert no commit problemático e deixar o pipeline rodar de novo — ele vai puxar a imagem da versão anterior e reaplicar o docker compose up -d. Sem tag fixa, não existe rollback confiável: o docker compose pull sempre traz a versão mais recente, mesmo que você reverta o código.

Segurança do pipeline: o que não fazer

Alguns erros comuns em pipelines de deploy via SSH:

  • Chave SSH sem restrição: use uma chave dedicada ao deploy, com permissões restritas via command= no authorized_keys, em vez de reaproveitar a chave de acesso administrativo completo ao VPS.
  • Secrets direto no workflow YAML: sempre via GitHub Secrets — nunca hardcoded no arquivo, mesmo em repositório privado.
  • Sem timeout no job: defina timeout-minutes no job de deploy para o pipeline não ficar travado indefinidamente se o SSH cair no meio do processo.

Para quem já roda o N8N em VPS mas ainda instalou tudo manualmente (veja nosso guia de deploy do N8N em VPS com Docker), migrar para esse pipeline não exige reinstalar nada — só adicionar o workflow do GitHub Actions apontando para o mesmo diretório onde o docker-compose.yml já está.

Qual VPS usar para rodar esse pipeline

O requisito técnico para o VPS que recebe o deploy automático é o mesmo de uma instalação manual do N8N — o pipeline de CI/CD não adiciona carga ao servidor, só automatiza os comandos. Para produção com deploy automático e N8N respondendo webhooks em tempo real, o VPS Brasil Básico (4GB RAM, 4 vCPUs, 100GB NVMe, R$99/mês) evita que o N8N trave durante o próprio deploy — o container antigo só é substituído depois que a nova imagem termina de subir. Veja também nosso guia geral sobre CI/CD para deploys em VPS se você quiser aplicar esse mesmo pipeline a outras aplicações além do N8N.

Conclusão

Automatizar o deploy do N8N com GitHub Actions transforma manutenção manual (SSH, comandos digitados na mão, sem histórico) em um processo versionado: cada atualização é um commit, cada deploy é rastreável, e o container se recupera sozinho de falhas graças às restart policies do Docker e do systemd. O investimento inicial é pequeno — um arquivo de workflow e 3 secrets — e o retorno é não depender de ninguém lembrar de atualizar o servidor manualmente.

Quero meu VPS para rodar N8N com deploy automático

Leia também: Veja mais tutoriais de N8N

Perguntas Frequentes

Com um pipeline de CI/CD (GitHub Actions é o mais comum) que conecta ao VPS via SSH a cada push e roda 'docker compose pull && docker compose up -d'. As credenciais (host, usuário, chave SSH) ficam em GitHub Secrets. Combine com 'restart: unless-stopped' no docker-compose.yml para o container voltar sozinho após falhas.

No deploy manual, alguém loga via SSH e roda os comandos toda vez que existe uma atualização — sem histórico, sem revisão, fácil de esquecer. No deploy automático via CI/CD, cada atualização é um commit no Git, o pipeline aplica sozinho, e existe rastreabilidade de quando e o que mudou em produção.

Watchtower funciona bem para ambientes de teste, aplicando qualquer nova versão da imagem sem revisão. Para produção, um pipeline de CI/CD (GitHub Actions) é mais seguro, porque só atualiza quando você faz push, dando controle sobre quando cada mudança entra no ar.

Um workflow em .github/workflows/deploy.yml usando a action appleboy/ssh-action (ou similar), 3 secrets no repositório (host, usuário SSH e chave SSH privada), e o N8N já rodando via Docker Compose no VPS. O pipeline conecta via SSH e reaplica o docker-compose.yml a cada push na branch principal.

Fixe a tag da versão da imagem no docker-compose.yml (em vez de usar 'latest'), mantenha o histórico no Git, e para reverter use 'git revert' no commit problemático — o pipeline vai reaplicar a versão anterior automaticamente. Sem tag fixa, o rollback não é confiável, porque 'docker compose pull' sempre traz a versão mais recente.

O restart policy do Docker ('restart: unless-stopped' ou 'always') já reinicia o container do N8N em caso de crash. O systemd entra para garantir que o próprio Docker daemon suba automaticamente após um reboot do VPS ('systemctl enable docker') — sem isso, os containers não voltam sozinhos depois de uma reinicialização do servidor.

Sim, desde que a chave SSH usada seja dedicada ao deploy (não a chave de administração geral do servidor), com permissões restritas quando possível, e as credenciais armazenadas em GitHub Secrets — nunca hardcoded no arquivo de workflow, mesmo em repositórios privados.

Sim, desde que o VPS tenha Docker e Docker Compose instalados e permita conexão SSH por chave. O pipeline de CI/CD não exige recursos extras de hardware — a carga é a mesma de uma atualização manual, só que automatizada.

Comentários (0)

Ainda não há comentários. Seja o primeiro!