BR

O N8N vem ganhando espaço na internet recentemente por ser open-source, e por dar liberdade de fazer automações que antes eram mais difícil com outras ferramentas do mesmo segmento, ou que só podia ser feito por código. O N8N trás conexões com +500 serviços, o que lhe dá uma grande versatilidade de ferramentas, para os mais variados tipos de propósitos.

Para demonstrar tal coisa, nós da Data Trends, decidios fazer um projeto ELT que será dividido em duas partes devido o tamanho do mesmo, e para ficar de fácil entendiemento.

Essa primeira parte, irá comtemplar a parte da automação responsável por fazer a cópia do dado, isto é, extrair o dado da fonte, nesse caso, do banco Postgres, e copiá-lo para o destino em formato JSON. Nosso destino aqui será o MinIo.

Antes de tudo, iremos falar sobre a configuração do seu ambiente para podermos colocar esse incrível projeto no ar. Então garanta que você tenha o Docker instalado na sua máquina e funcionando, pois ele será nossa base para tudo.

Configurando projeto…

Escolha uma pasta para trabalhar, com seu o seu terminal aberto nessa respectiva pasta, rode o comando:

git clone https://github.com/marllonDev/n8n-automation.git

Esse código, irá baixar o nosso projeto do GitHub. Agora que você baixou o projeto, ainda temos que fazer umas coisas para você conseguir rodar esse projeto.

Primeiro de tudo, crie um arquivo .env no caminho n8n-compose/. Esse arquivo não é feito o upload para o GitHub por questões de boas práticas e segurança. Então você deve criar você mesmo o seu com suas chaves.

n8n compose folder

O seu arquivo .env, após criado, deve ficar na mesma estrutura de pasta ao lado. Isto é, n8n-compose/.env.

Nesse arquivo, crie as seguintes variaveis:

  • N8N_ENCRYPTION_KEY=sua_chave_aqui
    • Para a chave acima, no seu terminal, rode o comando: docker exec -it n8n openssl rand -hex 32 para gerar sua chave. Após gerada, cole ela no local solicitado acima. OBS: Rode esse comando após subir os serviços, que irá acontecer um pouco mais abaixo.
  • GENERIC_TIMEZONE=America/Sao_Paulo
  • POSTGRES_USER=coloque_um_nome_de_sua_escolha_aqui
  • POSTGRES_PASSWORD=coloque_uma_senha_de_sua_escolha_aqui
  • MINIO_ROOT_USER=coloque_um_nome_de_sua_escolha_aqui
  • MINIO_ROOT_PASSWORD=coloque_uma_senha_de_sua_escolha_aqui
  • SSL_EMAIL=pode_colocar_seu_email

Isso deve ser configurado por cada pessoa, pois são informações pessoais, então é uma boa prática nunca subir isso para o GitHub. Essas variaveis de ambiente devem ser configuradas pois o arquivo docker-compose.yml irá precisar na hora de rodar o projeto.

Com o projeto baixado e configurado, navegue para dentro da pasta n8n-compose usando o código cd n8n-compose/. E então rode o comando abaixo:

docker compose up -d

Esse código irá subir todos os serviços do arquivo docker-compose.yml da pasta n8n-compose. Você pode vê-los pelo terminal através do código abaixo:

docker ps

Ou, através da interface gráfica do próprio Docker Desktop na aba de Contâiners.

Agora você pode rodar o comando para pegar a KEY do campo N8N_ENCRYPTION_KEY descrito um pouco acima.

Acessando o N8N

Para poder de fato usar o N8N, abra o link [http://localhost:5678/], e coloque as credenciais que você configurou nos passos anteriores. Irá abrir a interface gráfica do N8N. Agora, vamos importar os dois workflows criados para essa automação.

  1. Na página inicial, no canto superior direito, você verá um botão Create Workflow, clique nele, e crie um workflow em branco.
    • No canto superior direito novamente, você verá um botão com “3 pontinhos”( ). Clique nele e vá em Import from File. Agora basta importar os dois arquivos .json contidos no caminho /backup.
  2. Com os dois workflows importados, só falta as credenciais que iremos precisar.
    • Para a credencial do Postgres, faça como o print abaixo:
PostgresCredential p1
PostgresCredential p1
PostgresCredential p2
PostgresCredential p2
    • Para a credencial do MinIo, faça como o print abaixo:
MinIoCredential
MinIoCredential

Se estiver com dúvidas onde achar as senhas de acesso, elas estão no seu arquivo .env que você configurou nos passos anteriores.

Acessando o MinIo

Agora para vamos configurar o MinIo. Aqui é bem fácil e rápido, então vamos lá!!

Acesse o link [http://localhost:9001] para abrir a versão Web do MinIo. Nele você irá se deparar com uma tela de login, coloque as mesmas credenciais do arquivo .env que você já tem configurado.

Na página incial, você verá que é bem simples e clean, então basta clicar no canto superior esquerdo no botão Create Bucket, coloque o nome processed-parquet, e depois crie outro bucket, mas agora com o nome raw-files-json. Pronto!!

Com esses dois buckets criado, nossa configuração está completamente pronto.

O Projeto

Como disse no início deste poste, essa será a primeira parte onde iremos contemplar a primeiro workflow dessa automação, o Automation for Copy Data.

automação p1
automação p1

Nosso pontapé inicial, será o click do mouse, como mostra o primeiro Nó da esquerda para direita, isso dará início ao fluxo. No InitLoop, definimos um código em Java Script que defini um parâmetro chamado offset com o valor 0(zero), que na frente iremos usar. O código é o seguinte:

InitLoop
InitLopp
LoopState

O terceiro Nó é o Loop State ao lado, ele defini um novo campo chamado batchSize cujo o valor é 10 mil e, um campo chamado offset, onde seu valor incial é 0(zero), respectivamente.

O Nó do Postgres, nós usamos o código abaixo:

Postgres Query
Postgres Query

Essa query dinâmica irá buscar no banco de dados os primeiros 10 mil registros, sem pular nenhum, pois o parâmetro offset está definido como 0(zero) nesse momento.

UploadFile, Bucket S3

Nosso Nó do bucket S3 ou MinIo está configurado dessa forma. Perceba que ele recebe os parâmetros do Loop State no campo File Name. Foi feito dessa maneira para que cada vez que ele rodar e extrair 10 mil registros do banco, ele adicione o nome tendo coêrencia à contagem, nesse caso, de 10 mil em 10 mil. Em resumo, o nome do arquivo no bucket ficaria assim: lote-offset-10000.json. Na outra rodada seria lote-offset-20000.json, e assim sucessivamente.

Nosso penúltimo Nó, é um IF que tem a cláusula(de forma traduzida): Se o tamanho dos itens do Nó SQL Query for IGUAL ao campo BatchSize do Nó Loop State. Então, o IF é TRUE, e irá para o próximo Nó que descreveremos nos próximos parágrafos. Agora, fique com a imagem de como está nosso Nó:

Nó IF
Nó IF

Se o Nó IF for FALSE, então ele irá para um Nó chamado Wait, que esperará 2 segundos e a automção irá parar. Veja abaixo:

Nó Wait
Nó Wait

Agora, como disse anteriormente, se for TRUE, então irá para o Nó chamado UpdateOffset, onde tem um código Java Script que em resumo, diz para pegar o valor do campo offset do Nó Loop State e somar com o campo BatchSize do própro Nó Loop State novamente. Fazendo assim, a cada loop que for TRUE, o valor do campo offset ser incrementado de 10 mil em 10 mil. Você pode ver abaixo como o código foi feito:

Nó UpdateOffset
Nó UpdateOffset

Após cada Nó ser explicado nesse guia, vou mostrar novamente uma visão Macro de toda a automação.

automação p1
automação p1

Conclusão

Com isso feito, eu passei por todos os Nós dessa primeira parte da automação ELT. Sei que para quem nunca viu esse tipo de coisa pode ser confuso, mas depois de fazer no seu próprio PC, e ver rodando algumas vezes, tenho certeza que ir acompanhando os Loops, irá deixar você mais a “Par”, de como está acontecendo nas entre linhas.

A segunda parte da Automação, que será a parte da tranformar o dado Raw(Cru) no formato Json para o formato Parquet, sairá em breve e irei estar deixando o link aqui nesse post.

Nos comentários abaixo, por favor, compartilhe se a automação foi bem-sucedida. Caso contrário, deixe seu comentário que estarei disponível para ajudar a resolver qualquer problema. E, se a automação foi um sucesso, fique à vontade para compartilhar seus resultados para que eu possa conhecer sua experiência com o projeto.

Compartilhe:

Apaixonado por dados e tecnologias transformadoras, com 4+ anos de experiência na interseção entre engenharia de dados e inovação. Atualmente, como Engenheiro de Dados Sênior, me dedico à criação de ecossistemas de dados escaláveis, aplicando sua expertise no dinâmico setor de crédito. Ao longo da sua trajetória, projetou inúmeros pipelines de dados robustos para plataformas que atendiam milhares de usuários, bem como sistemas legados, integrando-os às soluções nativas da nuvem (AWS/Azure) por meio de frameworks ETL/ELT escaláveis.