O N8N é uma ferramenta poderosa de automação de fluxos de trabalho que pode ser auto-hospedada, permitindo controle total sobre seus dados e integrações. Recentemente, precisei configurar o N8N em um ambiente self-hosting usando o NPM e decidi automatizar todo o processo com o Ansible. Neste artigo, vou compartilhar alguns pontos de como criei essa automação, explicando os detalhes técnicos e as configurações utilizadas.


Pré-requisitos

Antes de começar, é importante mencionar que o servidor já possuía o Nginx e o Node.js instalados. Esses dois softwares são pré-requisitos para a execução do N8N e para servir a aplicação na web. Caso você precise, também é possível automatizar a instalação desses softwares com o Ansible, mas isso não foi necessário no meu caso.


Variáveis de Ambiente

As variáveis de ambiente utilizadas na configuração foram obtidas de um arquivo .env localizado na raiz do projeto. Esse arquivo contém informações sensíveis e específicas do ambiente, como:

  • Credenciais do banco de dados PostgreSQL.
  • Configurações de domínio para o Nginx.
  • Outras variáveis necessárias para o funcionamento do N8N.

O Ansible utiliza o módulo include_vars para carregar essas variáveis no início da execução. Aqui está um exemplo de como isso foi feito:

- name: Carrega o arquivo de .env
  ansible.builtin.include_vars:
    file: .env
    name: env_vars
  tags: setup

Configuração do Banco de Dados PostgreSQL

O N8N utiliza o PostgreSQL como banco de dados. Para que o Ansible pudesse interagir com o PostgreSQL e criar o banco de dados, o usuário e as permissões necessárias, foi necessário instalar o pacote psycopg2. Esse pacote é uma biblioteca Python que permite a comunicação com o PostgreSQL para uso do módulo postgresql.postgresql_db.

A instalação do psycopg2 foi feita dentro de um ambiente virtual Python, garantindo que as dependências fossem isoladas. Aqui está um trecho da configuração:

- name: Cria um ambiente virtual Python
  ansible.builtin.command:
    cmd: python3 -m venv /opt/venv
  tags: setup

- name: Instala psycopg2 no ambiente virtual
  ansible.builtin.pip:
    virtualenv: /opt/venv
    name: psycopg2
  tags: setup

Com o psycopg2 instalado, o Ansible pôde criar o banco de dados e o usuário necessários para o N8N:

- name: Cria banco de dados do N8N
  community.postgresql.postgresql_db:
    name: "{{ env_vars.DB_POSTGRESDB_DATABASE }}"
    state: present
  become: true
  become_user: postgres
  tags: setup

- name: Cria usuário N8N no banco de dados
  community.postgresql.postgresql_user:
    name: "{{ env_vars.DB_POSTGRESDB_USER }}"
    password: "{{ env_vars.DB_POSTGRESDB_PASSWORD }}"
    db: "{{ env_vars.DB_POSTGRESDB_DATABASE }}"
    role_attr_flags: "LOGIN"
    state: present
  become: true
  become_user: postgres
  tags: setup

Configuração do Nginx

O servidor web utilizado para servir a aplicação foi o Nginx. Um template Jinja2 foi criado para gerar automaticamente o arquivo de configuração do Nginx com base nas variáveis de ambiente. Aqui está um exemplo do template utilizado (n8n.conf.j2):

server {
    listen [::]:443 ssl;
    http2 on;

    server_name {{ env_vars.N8N_DOMAIN_URL }};

    location = /robots.txt {
        add_header Content-Type text/plain;
        return 200 "User-agent: *\nDisallow: /\n";
    }

    location / {
        proxy_pass http://127.0.0.1:5678;
        proxy_buffering off;
        proxy_http_version 1.1;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
    }

    # SSL settings
    ssl_verify_client on;
    include global/seu-certificado.conf;

    # Log settings
    error_log /var/log/nginx/n8n-error.log;
    access_log /var/log/nginx/n8n-access.log;
}

Esse template configura o Nginx como um proxy reverso para o N8N, que está rodando na porta 5678. Ele também inclui configurações de SSL e logs. Lembrando que você pode personalizar seu arquivo de Nginx conforme deseja, acima é um exemplo básico para a disponibilização do app.

Após gerar o arquivo de configuração, o Nginx foi recarregado para aplicar as mudanças:

- name: Recarrega o daemon do systemd
  ansible.builtin.systemd:
    daemon_reload: yes
  tags: setup

Configuração do Serviço N8N

O N8N foi instalado globalmente usando o NPM e configurado como um serviço no Linux utilizando o systemd. Um template Jinja2 foi criado para gerar o arquivo de serviço (n8n.service.j2):

[Unit]
Description=n8n Workflow Automation
After=network.target

[Service]
User=[seu usuário]
EnvironmentFile=/home/[seu usuário]/.n8n/.env
ExecStart=/usr/bin/env /usr/local/bin/n8n start
Restart=always
RestartSec=10s
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=n8n

[Install]
WantedBy=multi-user.target

Esse arquivo define o N8N como um serviço que será iniciado automaticamente no boot e reiniciado em caso de falha. Após criar o arquivo de serviço, o daemon do systemd foi recarregado e o serviço foi iniciado:

- name: Cria serviço systemd para n8n
  ansible.builtin.template:
    src: n8n.service.j2
    dest: /etc/systemd/system/n8n.service
  notify: Restart n8n
  become: true
  tags: setup

Conclusão

Com essa automação, consegui configurar o N8N self-hosting de forma rápida e consistente. O Ansible garantiu que todas as dependências fossem instaladas, o banco de dados fosse configurado corretamente e o N8N estivesse pronto para uso com apenas um comando.

Se você está pensando em hospedar o N8N fora do Docker, como comumente utilizado, recomendo usar o Ansible para gerenciar a configuração devido à facilidade e flexibilidade em relação a ações manuais. Além disso, caso seu servidor não tenha o Nginx ou o Node.js instalados, você pode facilmente adicionar essas etapas ao playbook para automatizar ainda mais o processo.

Espero que este artigo tenha sido útil! Se você tiver dúvidas ou sugestões, deixe um comentário. 🚀