YouTube – (Bonus) Adicionar o EvolutionAPI via Docker para funcionar nas automações N8N

Fala pessoal, este post tem como objetivo ensinar a configurar uma API não oficial do WhatsApp, chamada Evolution API, utilizando o Docker e realizar a integração dentro do N8N, também configurado como Self Hosted na nossa VPS da Oracle.

O vídeo que configuramos o N8N no modo fila, subindo a parte do Editor + Webhooks + Workers está abaixo:

Passo 1

O primeiro passo, é definir em qual subdomínio iremos subir a aplicação da Evolution API e em seguida, cadastrá-lo no nosso servidor de DNS, apontando para nossa VPS da Oracle.

O apontamento será um registro do Tipo A, com o subdomínio evolutionapi-staging apontando para o IP do servidor.

No meu caso, utilizo o Registro.br nessa configuração

Passo 2

Em seguida, a sequência de configurações já será dentro do nosso servidor VSP em questão. Então, basta logar com SSH para ter acesso ao console do seu servidor.

ssh ubuntu@SEUIP -i /path/to/private-key

No comando acima, substitua os valores para o seu caso.

Passo 3

Crie a pasta em que o Evolution API será instalado com seu próprio docker-compose.yml.

mkdir apps/evolutionapi-staging.progtech.com.br
cd apps/evolutionapi-staging.progtech.com.br

Passo 4

Copiar o conteúdo que foi criado na pasta do Evolution API para o vídeo em questão em nosso repositório público do Github.

Esse é o link: https://github.com/prog-tech/youtube/tree/main/videos/video-update-and-enhance-n8n-and-install-evolution-api/evolutionapi

Primeiro, copiaremos o arquivo .env.example para dentro da pasta somente como .env. E modificaremos o conteúdo para o que precisamos:

# EVOLUTION API
SERVER_PORT=8080
SERVER_URL="https://evolutionapi.seudominio.com.br"
DATABASE_CONNECTION_URI="postgres://user:passwprd@host:5432/evolutionapi?sslmode=disable"
CONFIG_SESSION_PHONE_VERSION="2.3000.1025359745"
QRCODE_COLOR="#175197"
CHATWOOT_IMPORT_DATABASE_CONNECTION_URI="postgresql://user:passwprd@host:5432/chatwoot?sslmode=disable"
CACHE_REDIS_ENABLED=true
CACHE_REDIS_URI="redis://default:default@evolution_redis:6379"
CACHE_REDIS_TTL=604800
CACHE_REDIS_PREFIX_KEY="evolution"
CACHE_REDIS_SAVE_INSTANCES=false
CACHE_LOCAL_ENABLED=false
S3_ENABLED=false
S3_ACCESS_KEY="s3-access-key"
S3_SECRET_KEY="s3-secret-key"
S3_BUCKET="evolution"
S3_PORT=443
S3_ENDPOINT="s3.domain.com"
S3_REGION="eu-west-3"
S3_USE_SSL="true"
AUTHENTICATION_API_KEY="generate-a-random-string"
AUTHENTICATION_EXPOSE_IN_FETCH_INSTANCES=true

# Redis
REDIS_USERNAME="default"
REDIS_PASSWORD="default"

Os valores principais para alterarmos são:

SERVER_URL
CONFIG_SESSION_PHONE_VERSION
DATABASE_CONNECTION_URI
AUTHENTICATION_API_KEY

O SERVER_URL, basta trocar para o seu domínio. Exemplo do meu caso:

SERVER_URL="https://evolutionapi-staging.progtech.com.br

É importante alterar também o valor da versão do WhatsApp mais atual, que está configurada na variável CONFIG_SESSION_PHONE_VERSION. Para pegar essa informação, basta acessar as Configurações -> Ajuda na interface do WhatsApp Web.

O Redis, usaremos uma nova instância, que irá subir juntamente com o Evolution API, então a variável CACHE_REDIS_URI já está configurada corretamente.

E como queremos utilizar o mesmo Postgres que o N8N já utilizado, basta entrar dentro do Pgadmin e criar a database chamada evolutionapi e vincular ao usuário do N8N, ou se preferir, pode criar um usuário/senha específico para essa database. Após esse processo de criação no Postgres, basta alterar o DATABASE_CONNECTION_URI substituindo os valores. O host, pode colocar como postgres, pois é o nome do serviço do postgres dentro do docker-compose.yml do N8N e como ambos estão na mesma rede compartilhada, o Evolution API não terá problemas em acessá-lo.

A variável de AUTHENTICATIONA_API_KEY, será necessário gerar um token aleatório, que será a senha para acessar a aplicação da Evolution API. A geração deste token pode ser feito nesse site.

Em seguida, basta copiar o conteúdo do arquivo docker-compose.yml na pasta do evolutionapi especificada acima para docker-compose.yml dentro da pasta do servidor.

Ficando assim: “~/apps/evolutionapi-staging.progtech.com.br/docker-compose.yml”.

E o conteúdo será:

services:
  evolution_api:
    image: atendai/evolution-api:latest
    environment:
      SERVER_TYPE: http
      SERVER_PORT: ${SERVER_PORT:-8080}
      SERVER_URL: ${SERVER_URL}
      SENTRY_DSN:
      CORS_ORIGIN: '*'
      CORS_METHODS: GET,POST,PUT,DELETE
      CORS_CREDENTIALS: true
      LOG_LEVEL: ERROR,WARN,DEBUG,INFO,LOG,VERBOSE,DARK,WEBHOOKS,WEBSOCKET
      LOG_COLOR: true
      LOG_BAILEYS: error
      EVENT_EMITTER_MAX_LISTENERS: 50
      DEL_INSTANCE: false
      DATABASE_PROVIDER: postgresql
      DATABASE_CONNECTION_URI: ${DATABASE_CONNECTION_URI}
      DATABASE_CONNECTION_CLIENT_NAME: evolution_exchange
      DATABASE_SAVE_DATA_INSTANCE: true
      DATABASE_SAVE_DATA_NEW_MESSAGE: true
      DATABASE_SAVE_MESSAGE_UPDATE: true
      DATABASE_SAVE_DATA_CONTACTS: true
      DATABASE_SAVE_DATA_CHATS: true
      DATABASE_SAVE_DATA_LABELS: true
      DATABASE_SAVE_DATA_HISTORIC: true
      DATABASE_SAVE_IS_ON_WHATSAPP: true
      DATABASE_SAVE_IS_ON_WHATSAPP_DAYS: 7
      DATABASE_DELETE_MESSAGE: true
      RABBITMQ_ENABLED: false
      RABBITMQ_URI: amqp://localhost
      RABBITMQ_EXCHANGE_NAME: evolution
      RABBITMQ_GLOBAL_ENABLED: false
      RABBITMQ_EVENTS_APPLICATION_STARTUP: false
      RABBITMQ_EVENTS_INSTANCE_CREATE: false
      RABBITMQ_EVENTS_INSTANCE_DELETE: false
      RABBITMQ_EVENTS_QRCODE_UPDATED: false
      RABBITMQ_EVENTS_MESSAGES_SET: false
      RABBITMQ_EVENTS_MESSAGES_UPSERT: false
      RABBITMQ_EVENTS_MESSAGES_EDITED: false
      RABBITMQ_EVENTS_MESSAGES_UPDATE: false
      RABBITMQ_EVENTS_MESSAGES_DELETE: false
      RABBITMQ_EVENTS_SEND_MESSAGE: false
      RABBITMQ_EVENTS_CONTACTS_SET: false
      RABBITMQ_EVENTS_CONTACTS_UPSERT: false
      RABBITMQ_EVENTS_CONTACTS_UPDATE: false
      RABBITMQ_EVENTS_PRESENCE_UPDATE: false
      RABBITMQ_EVENTS_CHATS_SET: false
      RABBITMQ_EVENTS_CHATS_UPSERT: false
      RABBITMQ_EVENTS_CHATS_UPDATE: false
      RABBITMQ_EVENTS_CHATS_DELETE: false
      RABBITMQ_EVENTS_GROUPS_UPSERT: false
      RABBITMQ_EVENTS_GROUP_UPDATE: false
      RABBITMQ_EVENTS_GROUP_PARTICIPANTS_UPDATE: false
      RABBITMQ_EVENTS_CONNECTION_UPDATE: false
      RABBITMQ_EVENTS_REMOVE_INSTANCE: false
      RABBITMQ_EVENTS_LOGOUT_INSTANCE: false
      RABBITMQ_EVENTS_CALL: false
      RABBITMQ_EVENTS_TYPEBOT_START: false
      RABBITMQ_EVENTS_TYPEBOT_CHANGE_STATUS: false
      SQS_ENABLED: false
      SQS_ACCESS_KEY_ID:
      SQS_SECRET_ACCESS_KEY:
      SQS_ACCOUNT_ID:
      SQS_REGION:
      WEBSOCKET_ENABLED: false
      WEBSOCKET_GLOBAL_EVENTS: false
      PUSHER_ENABLED: false
      PUSHER_GLOBAL_ENABLED: false
      PUSHER_GLOBAL_APP_ID:
      PUSHER_GLOBAL_KEY:
      PUSHER_GLOBAL_SECRET:
      PUSHER_GLOBAL_CLUSTER:
      PUSHER_GLOBAL_USE_TLS: true
      PUSHER_EVENTS_APPLICATION_STARTUP: true
      PUSHER_EVENTS_QRCODE_UPDATED: true
      PUSHER_EVENTS_MESSAGES_SET: true
      PUSHER_EVENTS_MESSAGES_UPSERT: true
      PUSHER_EVENTS_MESSAGES_EDITED: true
      PUSHER_EVENTS_MESSAGES_UPDATE: true
      PUSHER_EVENTS_MESSAGES_DELETE: true
      PUSHER_EVENTS_SEND_MESSAGE: true
      PUSHER_EVENTS_CONTACTS_SET: true
      PUSHER_EVENTS_CONTACTS_UPSERT: true
      PUSHER_EVENTS_CONTACTS_UPDATE: true
      PUSHER_EVENTS_PRESENCE_UPDATE: true
      PUSHER_EVENTS_CHATS_SET: true
      PUSHER_EVENTS_CHATS_UPSERT: true
      PUSHER_EVENTS_CHATS_UPDATE: true
      PUSHER_EVENTS_CHATS_DELETE: true
      PUSHER_EVENTS_GROUPS_UPSERT: true
      PUSHER_EVENTS_GROUPS_UPDATE: true
      PUSHER_EVENTS_GROUP_PARTICIPANTS_UPDATE: true
      PUSHER_EVENTS_CONNECTION_UPDATE: true
      PUSHER_EVENTS_LABELS_EDIT: true
      PUSHER_EVENTS_LABELS_ASSOCIATION: true
      PUSHER_EVENTS_CALL: true
      PUSHER_EVENTS_TYPEBOT_START: false
      PUSHER_EVENTS_TYPEBOT_CHANGE_STATUS: false
      WA_BUSINESS_TOKEN_WEBHOOK: evolution
      WA_BUSINESS_URL: https://graph.facebook.com
      WA_BUSINESS_VERSION: v20.0
      WA_BUSINESS_LANGUAGE: en_US
      WEBHOOK_GLOBAL_ENABLED: false
      WEBHOOK_GLOBAL_URL:
      WEBHOOK_GLOBAL_WEBHOOK_BY_EVENTS: false
      WEBHOOK_EVENTS_APPLICATION_STARTUP: false
      WEBHOOK_EVENTS_QRCODE_UPDATED: true
      WEBHOOK_EVENTS_MESSAGES_SET: true
      WEBHOOK_EVENTS_MESSAGES_UPSERT: true
      WEBHOOK_EVENTS_MESSAGES_EDITED: true
      WEBHOOK_EVENTS_MESSAGES_UPDATE: true
      WEBHOOK_EVENTS_MESSAGES_DELETE: true
      WEBHOOK_EVENTS_SEND_MESSAGE: true
      WEBHOOK_EVENTS_CONTACTS_SET: true
      WEBHOOK_EVENTS_CONTACTS_UPSERT: true
      WEBHOOK_EVENTS_CONTACTS_UPDATE: true
      WEBHOOK_EVENTS_PRESENCE_UPDATE: true
      WEBHOOK_EVENTS_CHATS_SET: true
      WEBHOOK_EVENTS_CHATS_UPSERT: true
      WEBHOOK_EVENTS_CHATS_UPDATE: true
      WEBHOOK_EVENTS_CHATS_DELETE: true
      WEBHOOK_EVENTS_GROUPS_UPSERT: true
      WEBHOOK_EVENTS_GROUPS_UPDATE: true
      WEBHOOK_EVENTS_GROUP_PARTICIPANTS_UPDATE: true
      WEBHOOK_EVENTS_CONNECTION_UPDATE: true
      WEBHOOK_EVENTS_REMOVE_INSTANCE: false
      WEBHOOK_EVENTS_LOGOUT_INSTANCE: false
      WEBHOOK_EVENTS_LABELS_EDIT: true
      WEBHOOK_EVENTS_LABELS_ASSOCIATION: true
      WEBHOOK_EVENTS_CALL: true
      WEBHOOK_EVENTS_TYPEBOT_START: false
      WEBHOOK_EVENTS_TYPEBOT_CHANGE_STATUS: false
      WEBHOOK_EVENTS_ERRORS: false
      WEBHOOK_EVENTS_ERRORS_WEBHOOK:
      CONFIG_SESSION_PHONE_CLIENT: Evolution API
      CONFIG_SESSION_PHONE_NAME: Chrome
      CONFIG_SESSION_PHONE_VERSION: ${CONFIG_SESSION_PHONE_VERSION}
      QRCODE_LIMIT: 30
      QRCODE_COLOR: ${QRCODE_COLOR}
      TYPEBOT_ENABLED: false
      TYPEBOT_API_VERSION: latest
      CHATWOOT_ENABLED: false
      CHATWOOT_MESSAGE_READ: true
      CHATWOOT_MESSAGE_DELETE: true
      CHATWOOT_BOT_CONTACT: true
      CHATWOOT_IMPORT_DATABASE_CONNECTION_URI: ${CHATWOOT_IMPORT_DATABASE_CONNECTION_URI}
      CHATWOOT_IMPORT_PLACEHOLDER_MEDIA_MESSAGE: true
      OPENAI_ENABLED: false
      DIFY_ENABLED: false
      CACHE_REDIS_ENABLED: ${CACHE_REDIS_ENABLED:-true}
      CACHE_REDIS_URI: ${CACHE_REDIS_URI}
      CACHE_REDIS_TTL: ${CACHE_REDIS_TTL:-604800}
      CACHE_REDIS_PREFIX_KEY: ${CACHE_REDIS_PREFIX_KEY:-evolution}
      CACHE_REDIS_SAVE_INSTANCES: ${CACHE_REDIS_SAVE_INSTANCES:-false}
      CACHE_LOCAL_ENABLED: ${CACHE_LOCAL_ENABLED:-false}
      S3_ENABLED: ${S3_ENABLED:-false}
      S3_ACCESS_KEY: ${S3_ACCESS_KEY}
      S3_SECRET_KEY: ${S3_SECRET_KEY}
      S3_BUCKET: ${S3_BUCKET:-evolution}
      S3_PORT: ${S3_PORT:-443}
      S3_ENDPOINT: ${S3_ENDPOINT}
      S3_REGION: ${S3_REGION:-us-east-1}
      S3_USE_SSL: true
      AUTHENTICATION_API_KEY: ${AUTHENTICATION_API_KEY}
      AUTHENTICATION_EXPOSE_IN_FETCH_INSTANCES: true
      LANGUAGE: en
      PROXY_HOST:
      PROXY_PORT: 80
      PROXY_PROTOCOL: http
      PROXY_USERNAME:
      PROXY_PASSWORD:
    depends_on:
      evolution_redis:
        condition: service_started
    restart: unless-stopped
    ports:
      - "${SERVER_PORT:-8080}:8080"
    volumes:
      - evolution_instances:/evolution/instances
    networks:
      - evolution-network
      - n8n-shared-network
  evolution_redis:
    image: redis:latest
    command: redis-server --requirepass ${REDIS_PASSWORD:-default}
    environment:
      REDIS_USER: default
      REDIS_PASSWORD: ${REDIS_PASSWORD:-default}
    restart: unless-stopped
    networks:
      - evolution-network

volumes:
  evolution_instances:

networks:
  evolution-network: {}
  n8n-shared-network:
    external: true

Passo 5

Com todas as configurações acima feitas, basta rodar o comando para subir o Docker do EvolutionAPI + Redis Evolution

docker compose up -d

Passo 6

A última configuração necessária, é disponibilizar o serviço do Evolution API que acabamos de subir no NGINX do nosso servidor VPS.
Para isso, entre como root com o comando:

sudo -s

Em seguida crie o arquivo dentro do nginx:

vim /etc/nginx/sites-available/evolutionapi-staging.progtech.com.br

Agora cole o conteúdo que está nesse arquivo:

server {
  listen 80;
  server_name subdominio.host.com.br;

  location / {
    proxy_pass http://localhost:8080;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade; # websocket support
    proxy_set_header Connection "Upgrade";  # websocket support
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    chunked_transfer_encoding off;
    proxy_buffering off;
    proxy_cache off;
  }
}

Substitua o valor de subdominio.host.com.br para o que criou no DNS. No meu caso, será evolutionapi-staging.progtech.com.br.

Com essa configuração realizada, execute os comandos abaixo (ainda como root) para criar um link simbólico desse arquivo na pasta sites-enabled do Nginx.

cd /etc/nginx/sites-enabled
ln -s /etc/nginx/sites-available/evolutionapi-staging.progtech.com.br
/etc/init.d/nginx restart

Com os comandos acima, além de criar o link simbólico, já reiniciamos o nginx para que o novo subdominio já seja acessível via browser (navegador).

Por fim, precisaremos também criar um certificado SSL para que o subdominio seja acessado através de HTTPS. Execute o comando:

sudo certbot --nginx -d evolutionapi-staging.progtech.com.br

Além de gerar o certificado, o certbot já irá alterar o arquivo de configuração do Nginx corretamente. Para que isso funcione corretamente, basta reiniciar o Nginx novamente:

/etc/init.d/nginx restart

Pronto. Agora, sua aplicação já estará rodando no subdomínio configurado.
Basta acessar pelo navegador o endereço: https://evolutionapi-staging.progtech.com.br/manager

Na tela de login, no API Token, basta colocar o token configurado na variável AUTHENTICATIONA_API_KEY e você conseguirá utilizar o Evolution API instalado na sua VPS.

Se surgir alguma dúvida, podem deixar nos comentários aqui ou dos vídeos lá no canal.

Até a próxima.

Previous Article

Como Hackeamos o CodeRabbit: de um Pull Request Simples até RCE e Acesso de Escrita em 1 Milhão de Repositórios

Next Article

Como Proteger seus Webhooks no N8N com Métodos de Autenticação

Write a Comment

Leave a Comment

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Receba Nossa Newsletter

Assine nossa newsletter por e-mail para receber as postagens mais recentes diretamente na sua caixa de entrada.
Inspiração pura, zero spam ✨