Como rodar múltiplas instâncias da Evolution API num servidor

A Evolution API suporta múltiplas instâncias por design, cada instância corresponde a um número de WhatsApp diferente. Você não precisa de múltiplos containers: um único servidor da Evolution API gerencia dezenas de instâncias simultâneas. O limite prático é RAM disponível (cada instância usa aproximadamente 80–150 MB em idle) e a estabilidade da conexão WebSocket.

Como a Evolution API gerencia instâncias

Cada instância é uma sessão WhatsApp independente. A Evolution API mantém a sessão em memória enquanto o container está rodando e, com PostgreSQL habilitado, persiste em banco para sobreviver a restarts. Instâncias são criadas, conectadas e desconectadas via API REST, sem reiniciar o container.

Criar e conectar múltiplas instâncias via API

O fluxo para cada número: criar a instância, gerar o QR code e escanear com o WhatsApp do número correspondente:

bash
# Criar a instância (repita para cada número)
curl -X POST "https://seu-servidor/instance/create" \
  -H "apikey: sua-chave-api" \
  -H "Content-Type: application/json" \
  -d '{"instanceName": "numero-cliente-01", "qrcode": true}'

# Gerar o QR code para conexão
curl -X GET "https://seu-servidor/instance/connect/numero-cliente-01" \
  -H "apikey: sua-chave-api"
# O QR code vem em base64 — renderize-o ou use o Evolution Manager

# Listar todas as instâncias e seus estados
curl -X GET "https://seu-servidor/instance/fetchInstances" \
  -H "apikey: sua-chave-api"

Recursos necessários por instância

O consumo de recursos varia conforme o volume de mensagens e número de grupos. Estimativas práticas:

PostgreSQL obrigatório para múltiplas instâncias em produção

Com múltiplas instâncias, o banco de dados é crítico para persistir todas as sessões. Sem PostgreSQL, um restart do container desconecta todas as instâncias simultaneamente, cada número precisaria escanear o QR code novamente.

yaml
# Configuração de banco no docker-compose.yml (com múltiplas instâncias)
services:
  evolution:
    image: atendai/evolution-api:latest
    restart: always
    environment:
      - DATABASE_ENABLED=true
      - DATABASE_CONNECTION_URI=postgresql://evolution:senha@postgres:5432/evolution
      - REDIS_ENABLED=true
      - REDIS_URI=redis://redis:6379
      # Autenticação global da API
      - AUTHENTICATION_TYPE=apikey
      - AUTHENTICATION_API_KEY=sua-chave-global
      # Permite que cada instância tenha seu próprio token
      - AUTHENTICATION_EXPOSE_IN_FETCH_INSTANCES=true

Monitorar o estado de todas as instâncias

Para checar quais instâncias estão conectadas e quais caíram:

bash
# Listar instâncias com estado de conexão
curl -X GET "https://seu-servidor/instance/fetchInstances" \
  -H "apikey: sua-chave-api" | \
  python3 -c "
import sys, json
data = json.load(sys.stdin)
for inst in data:
    name = inst.get('instance', {}).get('instanceName', '?')
    state = inst.get('instance', {}).get('connectionStatus', '?')
    print(f'{name}: {state}')
"

Não quer configurar manualmente?

Implante o Evolution API em menos de 5 minutos com a Runstack. Infraestrutura da OPEN Datacenter, com servidores em São Paulo.

Perguntas frequentes

Na Runstack Pro (2 vCPU, 4 GB RAM, R$ 144/mês), entre 10 e 15 instâncias em uso moderado. Na Business (3 vCPU, 8 GB RAM, R$ 215/mês), entre 25 e 40 instâncias. Acima disso, considere múltiplos servidores com um load balancer na frente.

Não. Um único container da Evolution API gerencia múltiplas instâncias. Cada número é uma instância dentro do mesmo servidor, você cria e gerencia via API REST sem precisar de containers adicionais.

Com PostgreSQL configurado, as sessões são persistidas e a reconexão é automática após o restart do container. Sem banco configurado, todas as instâncias precisam ser reconectadas manualmente com novo QR code.

Sim, com AUTHENTICATION_EXPOSE_IN_FETCH_INSTANCES=true e tokens individuais por instância. Cada cliente recebe seu próprio token e só acessa sua instância. Para isolamento total de dados, use um servidor separado por cliente.

Use DELETE /instance/delete/{instanceName} com sua chave de API. Isso desconecta a sessão e remove todos os dados da instância do banco. A operação é irreversível.