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.


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.