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.
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.