WhatsApp – Instalando Evolution API com Docker e Traefik

A Evolution API é uma das melhores API open source disponível para você utilizar em suas aplicações. O que vou disponibilizar aqui é apenas uma configuração simples para subir a API com docker.

Qualquer dúvida sobre como funciona a API, recomendo que acesse o Github e documentação oficial da Evolution API.

Configuração com Traefik

Vou te disponibilizar uma configuração para rodar com Docker no Modo Swarm, copiando o arquivo abaixo você pode subir o mesmo dentro de uma pasta ou utilizar o Portainer para publicar a sua Stack de forma ainda mais fácil.

version: '3.8'

services:  
  whatsapp_api:
    image: atendai/evolution-api:latest
    networks:
      - traefik_public
    volumes:
      - evolution_instances:/evolution/instances
      - evolution_store:/evolution/store
    environment:
      CONFIG_SESSION_PHONE_CLIENT: AprendaNaWeb
      AUTHENTICATION_TYPE: apikey
      AUTHENTICATION_API_KEY: <API-CODIGO>
      SERVER_URL: https://api.seu-dominio.com.br
    deploy:
      mode: replicated
      replicas: 1
      resources:
          limits:
            cpus: '0.2'
            memory: 100M
      labels:
         - traefik.enable=true
         - traefik.http.routers.whatsapp_api.rule=Host(`api.seu-dominio.com`)
         - traefik.http.routers.whatsapp_api.entrypoints=websecure
         - traefik.http.routers.whatsapp_api.tls.certresolver=le
         - traefik.http.routers.whatsapp_api.service=whatsapp_api
         - traefik.http.services.whatsapp_api.loadbalancer.server.port=8080
    
networks:
  traefik_public:
    external: true

volumes:
  evolution_instances:
  evolution_store:

Configurações

No arquivo você precisa fazer alguma alterações para que funcione corretamente.

  • CONFIG_SESSION_PHONE_CLIENT (Altere para qualquer nome de sua preferência)
  • AUTHENTICATION_TYPE (O modo de autenticação é por apikey mas poderá utilizar jwt)
  • AUTHENTICATION_API_KEY (Você precisa gerar um código único com vários caracteres e números)

Evolution com MongoDB

A nova versão da API Evolution permite a integração com o MongoDB, um banco de dados NoSQL que oferece alta performance, escalabilidade e flexibilidade. Essa integração permite que você armazene os dados da sua aplicação de forma centralizada, o que torna sua aplicação mais robusta e facilita o acesso aos dados para futuras consultas.

Basta adicionar essas variáveis de ambiente para habilitar. Não esquecendo também de já ter um MongoDB pronto para receber a conexão da Evolution API.

environment:
  DATABASE_ENABLED: "true"
  DATABASE_CONNECTION_URI: mongodb://USER:PASSWORD@HOSTANME:27017/?authSource=admin&readPreference=primary&ssl=false&directConnection=true
  DATABASE_CONNECTION_DB_PREFIX_NAME: envdocker

Escolha o que quer Salvar no MongoDB

environment:
  DATABASE_SAVE_DATA_INSTANCE: "true"
  DATABASE_SAVE_DATA_NEW_MESSAGE: "true"
  DATABASE_SAVE_MESSAGE_UPDATE: "false"
  DATABASE_SAVE_DATA_CONTACTS: "false"
  DATABASE_SAVE_DATA_CHATS: "false"

No exemplo acima, estou optando salvar instâncias e mensagens no mongoDB, mas poderá habilitar outras opções para salvar no seu banco.

Mapeamento dos Volumes

Nessa API podemos ver que existe dois mapeamos de volumes para guardar os dados

  • evolution_instances: Guarda as instâncias criadas
  • evolution_store: Guarda todos os dados pertinentes

É importante ter esses dois volumes mapeados para garantir o funcionamento correto e storage dos dados.

Limites de Memória e CPU

Como estamos utilizando o modo Swarm, no arquivo tem definido como exemplo limite de CPU e memória que podem ser alterados de acordo com os recursos disponíveis da sua máquina. É importantíssimo definir limites e acompanhar para ter uma ideia de quanto você poderá alocar naqueles valores.

Networks

Como estou utilizando o Traefik como proxy reverso, tenho uma rede com esse nome e com isso consigo definir através dos labels o domínio e aplicar SSL para receber as requisições. Deixando mais seguro e sem portas abertas para acesso.

Se você tem uma rede com nome diferente ou ainda não criou uma, faça a criação antes e defina no arquivo o nome da mesma.

Labels para Traefik

Estou utilizando Traefik como proxy reverso para receber todas as requisições HTTP e HTTPS e mandar para o serviço da API.

Além do Traefik já conseguir receber todas as requisições, pois ele utiliza a porta 80 e 443. Já faz toda a parte de gerar certificado SSL, uma vez que você configurou e definiu nos labels daquele serviço.

Opções Adicionais do .ENV

Inicialmente temos apenas 3 configurações no nosso arquivo CONFIG_SESSION_PHONE_CLIENT, AUTHENTICATION_TYPE e AUTHENTICATION_API_KEY.

Mas existe outras configurações disponíveis abaixo caso você queira utilizar e acrescentar no arquivo que montamos os serviços para roda a API.

# Server URL - Set your application url

SERVER_URL=API-DOMAIN

# Cors - \* for all or set separate by commas - ex.: 'yourdomain1.com, yourdomain2.com'

CORS_ORIGIN=\*
CORS_METHODS=POST,GET,PUT,DELETE
CORS_CREDENTIALS=true

# Determine the logs to be displayed

LOG_LEVEL=ERROR,WARN,DEBUG,INFO,LOG,VERBOSE,DARK,WEBHOOKS
LOG_COLOR=true

# Log Baileys - "fatal" | "error" | "warn" | "info" | "debug" | "trace"

LOG_BAILEYS=error

# Determine how long the instance should be deleted from memory in case of no connection.

# Default time: 5 minutes

# If you don't even want an expiration, enter the value false

DEL_INSTANCE=false

# Temporary data storage

STORE_MESSAGES=true
STORE_MESSAGE_UP=true
STORE_CONTACTS=true
STORE_CHATS=true

# Set Store Interval in Seconds (7200 = 2h)

CLEAN_STORE_CLEANING_INTERVAL=7200
CLEAN_STORE_MESSAGES=true
CLEAN_STORE_MESSAGE_UP=true
CLEAN_STORE_CONTACTS=true
CLEAN_STORE_CHATS=true

# Permanent data storage

DATABASE_ENABLED=false
DATABASE_CONNECTION_URI=mongodb://root:root@mongodb:27017/?authSource=admin&readPreference=primary&ssl=false&directConnection=true
DATABASE_CONNECTION_DB_PREFIX_NAME=evdocker

# Choose the data you want to save in the application's database or store

DATABASE_SAVE_DATA_INSTANCE=false
DATABASE_SAVE_DATA_NEW_MESSAGE=false
DATABASE_SAVE_MESSAGE_UPDATE=false
DATABASE_SAVE_DATA_CONTACTS=false
DATABASE_SAVE_DATA_CHATS=false

REDIS_ENABLED=false
REDIS_URI=redis://redis:6379
REDIS_PREFIX_KEY=evdocker

RABBITMQ_ENABLED=false
RABBITMQ_URI=amqp://guest:guest@rabbitmq:5672

WEBSOCKET_ENABLED=false

# Global Webhook Settings

# Each instance's Webhook URL and events will be requested at the time it is created

## Define a global webhook that will listen for enabled events from all instances

WEBHOOK_GLOBAL_URL=<url>
WEBHOOK_GLOBAL_ENABLED=false

# With this option activated, you work with a url per webhook event, respecting the global url and the name of each event

WEBHOOK_GLOBAL_WEBHOOK_BY_EVENTS=false

## Set the events you want to hear

WEBHOOK_EVENTS_APPLICATION_STARTUP=false
WEBHOOK_EVENTS_QRCODE_UPDATED=true
WEBHOOK_EVENTS_MESSAGES_SET=true
WEBHOOK_EVENTS_MESSAGES_UPSERT=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_CALL=true

# This event fires every time a new token is requested via the refresh route

WEBHOOK_EVENTS_NEW_JWT_TOKEN=false

# Name that will be displayed on smartphone connection

CONFIG_SESSION_PHONE_CLIENT=Evolution API

# Browser Name = chrome | firefox | edge | opera | safari

CONFIG_SESSION_PHONE_NAME=chrome

# Set qrcode display limit

QRCODE_LIMIT=30
QRCODE_COLOR=#198754

# Defines an authentication type for the api

# We recommend using the apikey because it will allow you to use a custom token,

# if you use jwt, a random token will be generated and may be expired and you will have to generate a new token

# jwt or 'apikey'

AUTHENTICATION_TYPE=apikey

## Define a global apikey to access all instances.

### OBS: This key must be inserted in the request header to create an instance.

AUTHENTICATION_API_KEY=GLOBAL-API-KEY
AUTHENTICATION_EXPOSE_IN_FETCH_INSTANCES=true

## Set the secret key to encrypt and decrypt your token and its expiration time

# seconds - 3600s ===1h | zero (0) - never expires

AUTHENTICATION_JWT_EXPIRIN_IN=0
AUTHENTICATION_JWT_SECRET='L=0YWt]b2w[WF>#>:&E`'

Não tenho Traefik

Nesse caso, você poderá remover todo bloco labels e adicionar as portas para acessar diretamente com o IP da sua máquina e porta.

A porta do container é 8080, se você nao está utilizando o Traefik defina essa porta no arquivo ficando dessa forma abaixo:

ports:
  - 8080:8080

A primeira porta será acessada no navegador, a segunda porta é a do container. Caso você já esteja utilizando a porta 8080, terá que alterar para uma porta diferente.

Depois de Subir a Stack

Se você tem o Traefik utilize o seu domínio, caso contrário utilize seu SEU_IP:8080 no navegador. Depois você verá uma imagem como esta abaixo, mostrando a API funcionando e sua versão atualmente.

Post

Conclusão

Sem dúvidas essa API veio redondinha e funcionando muito bem apesar de ser nova. A tendência é cada vez mais crescer se popularizando ainda mais para chegar em um maior numero de pessoas com essa fermenta fantástica.

Quer aprender mais sobre Docker e Evolution?

Recomendo que acesse o Github e documentação da Evolution API e acompanhe os canais de divulgação para ter mais informações, e se possível colabore com algum valor para agradecer e incentivar o desenvolvedor dessa ferramenta que está totalmente gratuita.

Deixe um comentário

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

plugins premium WordPress