LGPD na prática: como configurar retenção e exclusão de dados no n8n self-hosted hospedado em VPS brasileira
O n8n self-hosted armazena dados de execução, logs e payloads por tempo indefinido por padrão. Para cumprir a LGPD (Lei Geral de Proteção de Dados), é necessário configurar políticas de retenção automática, anonimização de campos sensíveis e exclusão programada de dados pessoais — especialmente quando a plataforma processa informações de clientes brasileiros em workflows de CRM, e-commerce ou atendimento.
TL;DR: A LGPD exige que dados pessoais sejam retidos apenas pelo tempo necessário. No n8n, isso significa configurar variáveis de ambiente para excluir execuções antigas, desabilitar salvamento de dados binários sensíveis e implementar workflows de anonimização — tudo gerenciável em uma VPS com controle total.
A ANPD (Autoridade Nacional de Proteção de Dados) aplicou em 2025 multas de até 2% do faturamento (limite de R$ 50 milhões) a empresas que mantiveram dados pessoais além do período justificável. Para PMEs e SaaS que automatizam processos com n8n, o risco é real.
Por que o n8n self-hosted exige configuração específica para LGPD?
O n8n em modo self-hosted não aplica nenhuma política de retenção automática por padrão. Cada execução de workflow — sucesso ou erro — fica registrada no banco PostgreSQL ou SQLite com payload completo, incluindo dados pessoais recebidos de webhooks, APIs de CRM ou formulários.
Três problemas principais surgem:
- Armazenamento indefinido: execuções acumulam sem limite de tempo, violando o princípio de minimização (Art. 6º, III da LGPD).
- Logs verbosos: erros e retries expõem CPF, e-mail, telefone em texto plano nos registros de execução.
- Dados binários: anexos e arquivos processados (PDFs com dados sensíveis, por exemplo) persistem no filesystem ou banco.
A solução passa por três camadas: configuração de variáveis de ambiente, workflows de limpeza automatizada e boas práticas de design de fluxos.
Configurando retenção automática de execuções via variáveis de ambiente
O n8n expõe variáveis de ambiente que controlam quantas execuções são mantidas e por quanto tempo. A configuração mais eficaz combina limite de quantidade e tempo de vida.
Variáveis essenciais para compliance
Edite o arquivo .env ou as variáveis do container Docker no servidor VPS:
# Número máximo de execuções salvas (por workflow)
EXECUTIONS_DATA_MAX_AGE=168 # horas (7 dias)
EXECUTIONS_DATA_PRUNE=true
# Salvar apenas execuções com erro (não salva sucessos)
EXECUTIONS_DATA_SAVE_ON_ERROR=error
EXECUTIONS_DATA_SAVE_ON_SUCCESS=none
# Desabilitar salvamento de dados binários
EXECUTIONS_DATA_SAVE_MANUAL_EXECUTIONS=false
EXECUTIONS_DATA_MAX_AGE define a janela de retenção em horas. Para a maioria dos casos de LGPD, 7 a 30 dias (168 a 720 horas) são suficientes para debug e auditoria, após o que os dados pessoais devem ser excluídos.
EXECUTIONS_DATA_PRUNE=true ativa a rotina interna do n8n que varre o banco a cada intervalo (configurável via EXECUTIONS_PRUNE_MAX_COUNT e EXECUTIONS_PRUNE_INTERVAL) e deleta registros antigos.
EXECUTIONS_DATA_SAVE_ON_SUCCESS=none impede que workflows bem-sucedidos salvem payload completo — essencial quando o fluxo processa dados sensíveis que não precisam de log permanente (ex: webhook que recebe CPF para validação e descarta).
Restart e verificação
Após editar .env, reinicie o container ou serviço:
docker restart n8n
# ou
systemctl restart n8n
Verifique no painel Settings > Log Streaming ou diretamente no PostgreSQL:
SELECT COUNT(*), MAX(finished_at)
FROM execution_entity
WHERE finished_at < NOW() - INTERVAL '7 days';
Se a query retornar 0 após alguns dias, a rotina de prune está ativa.
Anonimizando campos sensíveis em workflows
Mesmo com retenção limitada, dados pessoais não devem aparecer em logs se não forem estritamente necessários. O n8n permite transformar payloads antes de salvar ou encaminhar.
Técnica 1: Função de hash em campos sensíveis
No nó Function ou Code, substitua CPF, e-mail ou telefone por hash SHA-256 irreversível:
const crypto = require('crypto');
const cpf = $input.item.json.cpf;
const cpfHash = crypto.createHash('sha256').update(cpf).digest('hex');
return {
json: {
cpf_hash: cpfHash,
// demais campos não sensíveis
nome: $input.item.json.nome,
pedido_id: $input.item.json.pedido_id
}
};
O workflow continua funcionando para rastreamento (o hash identifica unicamente o CPF), mas o dado original não fica gravado na execução.
Técnica 2: Remover campos desnecessários antes de salvar
Use o nó Set para criar um objeto limpo apenas com campos que precisam de log:
- Entrada: webhook com
{cpf, email, endereco, produto} - Set mantém apenas
{produto, timestamp, webhook_id} - Fluxo segue para CRM com dados completos, mas execução salva só metadados
Técnica 3: Desabilitar salvamento em workflows críticos
Para fluxos que processam dados financeiros ou de saúde, configure Workflow Settings > Save Executions como No (só salva em caso de erro).
Isso impede qualquer persistência de payload, mas exige monitoramento externo (integração com Sentry ou log estruturado em arquivo).
Workflow de exclusão programada de dados pessoais
Para cenários onde dados precisam ser apagados de sistemas externos (CRM, banco próprio, planilhas), crie um workflow n8n dedicado à exclusão.
Exemplo: excluir contatos inativos após 90 dias (conformidade com Art. 15 e 16 da LGPD)
- Schedule Trigger: executa todo domingo às 2h.
- PostgreSQL / MySQL Node: consulta tabela
contatosondeultima_interacao < NOW() - INTERVAL '90 days'econsentimento_ativo = false. - Loop over Items: para cada contato retornado:
- HTTP Request: DELETE na API do CRM.
- PostgreSQL:
UPDATE contatos SET dados_anonimizados = true, email = NULL, cpf = NULL WHERE id = {{$item.json.id}}.
- Send Email (opcional): notifica o DPO (Data Protection Officer) com resumo de quantos registros foram excluídos.
Vantagens dessa abordagem
- Auditável: cada execução do workflow fica registrada (sem dados sensíveis, apenas IDs e contadores).
- Reversível em janela de segurança: se a exclusão for acidental, há 7 dias (conforme
EXECUTIONS_DATA_MAX_AGE) para recuperar logs e investigar. - Automático: não depende de intervenção manual, reduzindo risco de esquecimento.
Logs de auditoria e segregação de dados
A LGPD exige registro de operações com dados pessoais (Art. 37). O n8n não oferece trilha de auditoria nativa, mas é possível implementar com nós de log estruturado.
Estratégia de auditoria em VPS
- n8n + Fluentd/Loki: configure o n8n para logar em formato JSON estruturado (
N8N_LOG_OUTPUT=json) e envie para Loki via Fluentd rodando no mesmo VPS. - Tabela de auditoria no PostgreSQL: crie uma tabela
audit_loge, em workflows que acessam dados sensíveis, insira registro com{timestamp, workflow_id, operacao, usuario_afetado_id}. - Webhook de auditoria: todo workflow que exclui ou altera dados sensíveis dispara webhook para sistema externo de compliance.
Exemplo de nó de auditoria
// Function node após operação sensível
const auditEntry = {
timestamp: new Date().toISOString(),
workflow_id: $workflow.id,
execution_id: $execution.id,
operacao: 'exclusao_contato',
usuario_id: $input.item.json.id,
ip_origem: $input.item.json.ip
};
// Envia para tabela de auditoria via PostgreSQL node (próximo nó)
return { json: auditEntry };
A tabela audit_log deve ter retenção maior que dados operacionais (ex: 5 anos), conforme exigência de documentação da LGPD.
Trade-offs: desempenho vs. compliance
Implementar políticas rigorosas de retenção e anonimização traz impactos que precisam ser avaliados:
| Aspecto | Ganho | Custo |
|---|---|---|
| EXECUTIONS_DATA_SAVE_ON_SUCCESS=none | Banco 70% menor, backup mais rápido | Debug de workflows bem-sucedidos fica cego (sem payload) |
| EXECUTIONS_DATA_MAX_AGE=168h | Compliance automático, espaço controlado | Histórico curto pode dificultar análise de tendências |
| Anonimização via hash | Dados não identificáveis em logs | Hash é irreversível — impossível recuperar CPF original se necessário |
| Workflow de exclusão automatizada | Conformidade com Art. 16 (direito à exclusão) | Requer manutenção e testes; exclusão acidental é risco |
Recomendação prática: em VPS com 8 GB RAM e 100 GB NVMe (como o VPS Lite 10 da Rollin Host), manter EXECUTIONS_DATA_MAX_AGE=336h (14 dias) + salvamento apenas em erro oferece equilíbrio entre rastreabilidade e compliance sem pressionar disco.
Infraestrutura: por que VPS brasileira facilita compliance LGPD
Embora a LGPD permita transferência internacional de dados sob condições específicas (Art. 33), hospedar o n8n em empresa brasileira com emissão de NF-e e suporte nacional simplifica auditoria e reduz riscos legais.
Vantagens técnicas e jurídicas
- Jurisdição nacional: em caso de fiscalização da ANPD, a empresa controladora dos dados (você) e a operadora (Rollin Host) estão sob mesma legislação, facilitando termo de processamento de dados.
- Latência para APIs brasileiras: workflows que consultam Serasa, Receita Federal ou CRMs nacionais têm latência 40-80% menor quando o n8n roda em VPS com borda Cloudflare no Brasil.
- Backup local: políticas de backup em Frankfurt (Alemanha) da Rollin Host respeitam adequação GDPR, compatível com LGPD, mas manter réplica em território nacional agiliza recuperação.
A infraestrutura da Rollin Host combina VPS em Frankfurt (AMD EPYC + NVMe) com Cloudflare CDN e proxy com borda no Brasil, oferecendo baixa latência sem abrir mão da redundância europeia.
Passo a passo completo: VPS + n8n + LGPD
1. Provisionar VPS
Escolha um plano com ao menos 8 GB RAM (n8n com PostgreSQL consome ~1,5 GB em idle + overhead de workflows).
Exemplo: VPS Lite 10 (4 vCPU, 8 GB, 75 GB NVMe) a R$ 52,90/mês — suficiente para até 500 execuções/dia com retenção de 14 dias.
2. Instalar n8n via Docker Compose
version: '3.8'
services:
postgres:
image: postgres:15
environment:
POSTGRES_DB: n8n
POSTGRES_USER: n8n
POSTGRES_PASSWORD: SenhaSegura123
volumes:
- postgres_data:/var/lib/postgresql/data
n8n:
image: n8nio/n8n:latest
ports:
- "5678:5678"
environment:
DB_TYPE: postgresdb
DB_POSTGRESDB_HOST: postgres
DB_POSTGRESDB_DATABASE: n8n
DB_POSTGRESDB_USER: n8n
DB_POSTGRESDB_PASSWORD: SenhaSegura123
EXECUTIONS_DATA_MAX_AGE: 336
EXECUTIONS_DATA_PRUNE: true
EXECUTIONS_DATA_SAVE_ON_SUCCESS: none
EXECUTIONS_DATA_SAVE_ON_ERROR: all
N8N_LOG_OUTPUT: json
volumes:
- n8n_data:/home/node/.n8n
depends_on:
- postgres
volumes:
postgres_data:
n8n_data:
3. Configurar SSL com Nginx + Certbot
Proxy reverso com SSL é obrigatório para webhooks HTTPS (exigência de integrações como WhatsApp Cloud API e CRMs SaaS).
apt install nginx certbot python3-certbot-nginx
certbot --nginx -d n8n.seudominio.com.br
4. Criar workflow de limpeza mensal
- Cron Trigger: 1º dia do mês, 3h da manhã.
- PostgreSQL Node:
DELETE FROM execution_entity WHERE finished_at < NOW() - INTERVAL '90 days'(limpeza adicional além do prune automático). - Function Node: registra
{data, registros_excluidos}em tabelacompliance_log.
5. Documentar política de retenção
Crie documento Política de Retenção de Dados (exigido pela LGPD, Art. 37) especificando:
- Dados operacionais (execuções n8n): 14 dias.
- Logs de auditoria: 5 anos.
- Dados de clientes em CRM: até cancelamento de consentimento + 30 dias.
Disponibilize via endpoint /politica-retencao no domínio da aplicação.
Monitoramento e alertas de compliance
Configure alertas para garantir que as políticas de retenção estão ativas:
Alerta de falha no prune
-- Executar diariamente via cron + script
SELECT COUNT(*) FROM execution_entity
WHERE finished_at < NOW() - INTERVAL '15 days';
Se a contagem for > 0 após configurar EXECUTIONS_DATA_MAX_AGE=336h, o prune falhou. Configure alerta via webhook para Slack ou e-mail.
Alerta de disco cheio
df -h /var/lib/docker/volumes | awk '$5 > 80 {print "Disco n8n acima de 80%"}'
Disco cheio bloqueia inserções no PostgreSQL e pode travar workflows. A retenção adequada mantém uso de disco previsível.
Principais aprendizados
- O n8n self-hosted não aplica retenção automática por padrão — é necessário configurar
EXECUTIONS_DATA_MAX_AGEeEXECUTIONS_DATA_PRUNE=true. - Anonimizar campos sensíveis em nós Function (via hash SHA-256) reduz risco de exposição em logs, mesmo dentro da janela de retenção.
- Workflows de exclusão programada são essenciais para compliance com Art. 16 da LGPD (direito à exclusão) em sistemas externos.
- VPS com empresa brasileira (emissão de NF-e, suporte nacional) simplifica auditoria e termo de processamento de dados.
- Auditoria via tabela dedicada no PostgreSQL ou log estruturado JSON + Loki garante rastreabilidade de operações com dados pessoais.
Perguntas frequentes
Qual a penalidade por não excluir dados pessoais no prazo exigido pela LGPD?
A ANPD pode aplicar multa de até 2% do faturamento da empresa (limite de R$ 50 milhões por infração), além de advertência, bloqueio de dados e publicização da infração. Em 2025, e-commerces e SaaS foram os setores mais multados por retenção indefinida de logs.
O n8n salva dados de cartão de crédito nas execuções?
Se um workflow processar payloads com dados de cartão (via webhook de gateway de pagamento), esses dados são salvos em texto plano no banco PostgreSQL por padrão. É obrigatório configurar EXECUTIONS_DATA_SAVE_ON_SUCCESS=none e nunca logar campos PCI-DSS (número de cartão, CVV) — use variáveis de ambiente ou credenciais criptografadas do n8n.
Posso hospedar n8n em servidor fora do Brasil e ainda estar em compliance com LGPD?
Sim, desde que a transferência internacional atenda aos requisitos do Art. 33 da LGPD (país com nível adequado de proteção, cláusulas contratuais padrão ou consentimento específico do titular). Usar VPS em Frankfurt (Alemanha) da Rollin Host é seguro porque a UE possui GDPR, considerado adequado pela ANPD, e a empresa é brasileira (facilitando termo de processamento).
Como garantir que workflows antigos não estão salvando dados além do permitido?
Execute auditoria manual trimestral: liste todos os workflows via API do n8n (GET /workflows) e verifique configuração Workflow Settings > Save Executions. Workflows críticos (pagamento, saúde) devem ter salvamento desabilitado. Use script Python ou Node.js para automatizar e gerar relatório.