- Castro/
- blog/
- n8n em produção: queue mode com Redis, PostgreSQL persistente, Traefik e backup externo/
n8n em produção: queue mode com Redis, PostgreSQL persistente, Traefik e backup externo
Uma stack n8n real em Docker Compose com worker separado, Redis para queue mode, PostgreSQL persistente, Traefik e a evolução de um gap de backup até o primeiro dump externo validado.
Persistência não é backup.
Essa diferença ficou muito clara em uma stack n8n real em produção: a arquitetura já tinha PostgreSQL persistente, Redis persistente, worker separado e Traefik, mas a primeira coleta registrou explicitamente que não havia backup externo do banco identificado.
Na etapa seguinte, foi configurado um serviço de backup do PostgreSQL para armazenamento S3 e o primeiro dump manual foi enviado com sucesso.
A história é útil justamente porque não começa com uma arquitetura “perfeita”. Ela mostra um ambiente funcionando, um gap encontrado e uma camada de recuperação adicionada com evidência.
A topologia observada #
A coleta de produção mostrou uma stack Docker Compose com esta separação de responsabilidades:
| |
Os componentes estavam organizados em containers dedicados:
- Traefik para publicação HTTP/HTTPS;
- PostgreSQL 16 como banco principal;
- Redis 7 como backend de fila;
- processo principal do n8n;
- worker dedicado para execução em
queue mode.
Os dados de n8n, PostgreSQL e Redis usavam volumes persistentes.
Por que separar o worker #
Em queue mode, o processo principal não precisa executar sozinho todos os workflows.
Conceitualmente:
| |
Essa divisão facilita separar a camada que atende UI/API/webhooks da capacidade de execução de workflows.
Ela também cria novas dependências operacionais: Redis e PostgreSQL deixam de ser detalhes internos e passam a fazer parte direta da disponibilidade da plataforma.
Redis persistente não elimina a necessidade de entender a fila #
O Redis observado tinha volume próprio e persistência configurada.
Isso reduz o risco de perder estado simplesmente porque o container foi recriado, mas não transforma Redis em banco de backup do n8n.
É importante distinguir:
| |
O mesmo vale para PostgreSQL.
A primeira auditoria encontrou o gap #
A coleta inicial registrou a arquitetura como saudável, mas marcou o backup PostgreSQL/S3 como pendente.
Isso é um finding operacional simples e importante:
| |
A decisão correta não é chamar o ambiente inteiro de inseguro. É identificar exatamente qual camada de recuperação estava ausente.
O backup externo foi adicionado #
Na documentação imediatamente posterior, o ambiente já tinha um container dedicado baseado em uma imagem de backup PostgreSQL para S3.
O banco protegido era o PostgreSQL usado pelo n8n.
A primeira execução manual registrou a sequência esperada:
| |
O arquivo do primeiro dump apareceu no destino externo, portanto há evidência concreta de que o primeiro backup saiu do host e chegou ao storage.
O que isso ainda não prova #
Um primeiro dump bem-sucedido não fecha o assunto.
A própria documentação deixa pendente validar:
- a próxima execução agendada;
- a retenção recorrente configurada;
- um teste de restore.
Portanto o estado correto é:
| |
Isso evita uma das frases mais perigosas de infraestrutura:
“tem backup”.
Sem saber se executa de novo e se restaura, a afirmação ainda é incompleta.
Backup do PostgreSQL não é disaster recovery completo #
A evidência recuperada comprova backup externo do PostgreSQL.
Ela não deve ser ampliada para afirmar que toda a plataforma está protegida contra qualquer desastre.
Uma estratégia completa também deveria decidir explicitamente como tratar, conforme o ambiente:
| |
Nem tudo precisa necessariamente usar o mesmo mecanismo de backup, mas tudo que for necessário para reconstrução deve ter uma resposta documentada.
Healthcheck e ordem de inicialização importam #
Uma arquitetura n8n em queue mode depende de serviços que precisam estar disponíveis na ordem certa.
O desenho versionado relacionado à plataforma também evidencia healthchecks de PostgreSQL e Redis e dependências condicionadas ao estado dos serviços.
O princípio é simples:
| |
Esperar PostgreSQL responder e Redis aceitar conexão reduz falhas de inicialização que parecem aleatórias, mas na prática são corrida de dependências.
Traefik fecha a camada de publicação #
Na coleta de produção, o Traefik era responsável pelas portas HTTP/HTTPS e pelo roteamento do n8n.
O Docker socket estava montado em modo read-only no desenho observado, reduzindo a superfície de escrita a partir do proxy.
A configuração real também levantou um ponto de atenção sobre exposição do dashboard do Traefik. Isso reforça uma regra útil:
painel administrativo e plano de dados não deveriam ganhar a mesma exposição só porque pertencem ao mesmo componente.
Um checklist mínimo para n8n self-hosted em produção #
| |
O principal aprendizado #
A arquitetura já estava funcionando antes do backup externo existir.
Foi justamente uma coleta objetiva que permitiu separar:
| |
Depois, o primeiro dump externo fechou parte do gap — mas não autorizou marcar restore e recorrência como resolvidos sem teste.
Esse é o padrão que eu prefiro em produção: inventariar o estado real, corrigir a lacuna específica e só marcar como concluído aquilo que a evidência permite.
Leitura relacionada #
A visão mais ampla dessa plataforma está no projeto n8n self-hosted com PostgreSQL, Redis, Traefik e observabilidade.
Me chama.
Manda o contexto, os sintomas e o que já foi testado. Bora organizar as evidências antes de sair mexendo.