🔓 Como intalar a API Evolution GO – Docker Swarm

Nesta aula vamos instalar a Evolution Go do zero na sua VPS, usando Portainer, Docker Swarm e Traefik, com persistência em PostgreSQL. Diferente de tutoriais genéricos, aqui cada passo existe para evitar que o serviço fique em crash loop por não conseguir criar os bancos de autenticação e usuários. Siga estritamente na ordem.

Pré-requisitos

Antes de começar, seu ambiente já precisa ter rodando:

  • Portainer (gerenciador do Docker Swarm).
  • Traefik (proxy reverso, com rede traefik_public e resolver de SSL le configurado).
  • PostgreSQL (acessível na rede digital_network pelo hostname postgres).
  • DNS configurado: aponte o subdomínio da API (ex: evolution-go.seudominio.com.br) para o IP do seu servidor.

Link das aulas pré-requisitas abaixo:

Passo a Passo

Passo 1: Autenticar no Docker Hub (evita erro toomanyrequests)

Faça login no Docker Hub direto no terminal do servidor:

docker login

Passo 2: Baixar a imagem manualmente antes do deploy

Baixe a imagem oficial da Evolution Go:

docker pull evoapicloud/evolution-go:latest

Passo 3: Criar os bancos de dados no PostgreSQL

A Evolution Go usa dois bancos separados: um para autenticação e outro para usuários. Acesse o container do seu Postgres:

PG=$(docker ps -qf name=postgres)
docker exec -i $PG psql -U postgres -c "CREATE DATABASE evogo_auth;"
docker exec -i $PG psql -U postgres -c "CREATE DATABASE evogo_users;"
Por que esse passo existe: sem os dois bancos criados previamente, o serviço entra em crash loop tentando conectar em um banco inexistente.

Passo 4: Criar os volumes externos

A Evolution Go guarda dados de autenticação e logs em volumes próprios:

docker volume create evolution_go_data
docker volume create evolution_go_logs
Por que esse passo existe: impede que o Swarm crie volumes efêmeros atrelados a um nó específico, garantindo que sessões e logs sobrevivam a um reinício do container.

Passo 5: Preparar as variáveis de ambiente

Gere uma chave forte para a API:

openssl rand -hex 32

Monte o bloco de Environment Variables com domínio, chave da API, senha do Postgres e os nomes dos dois bancos:

# ==========================================
# DOMÍNIO
# ==========================================
EVOLUTION_GO_DOMAIN=evolution-go.seudominio.com.br

# ==========================================
# SEGURANÇA
# ==========================================
GLOBAL_API_KEY=gere_uma_chave_segura_aqui

# ==========================================
# BANCO DE DADOS (POSTGRESQL)
# ==========================================
POSTGRES_PASSWORD=sua_senha_do_banco_aqui
POSTGRES_DATABASE_AUTH=evogo_auth
POSTGRES_DATABASE_USERS=evogo_users

Passo 6: Ajustar e colar a stack no Portainer

Vá em Stacks → Add stack, dê o nome de evolution-go e cole o código docker-compose.yml da stack. Abaixo do editor, ative Environment variables, clique em Advanced mode e cole o bloco do Passo 5. Clique em Deploy the stack.

⬇️ Ver e copiar a stack completa

Passo 7: Acompanhar o boot

Acompanhe os logs do serviço para confirmar que ele conectou nos dois bancos sem erro:

docker service logs evolution-go_evolution_go --tail 50 -f

Passo 8: Primeiro acesso

Quando o serviço estiver com status Running (em verde) no Portainer:

  • A API estará disponível em https://evolution-go.seudominio.com.br.
  • Use o header Authorization (ou o header exigido pela versão instalada) com o valor da GLOBAL_API_KEY definida no Passo 5 para autenticar suas primeiras requisições.

Resolução de Problemas Comuns na Evolution Go

SintomaCausaSolução
Serviço em crash loop reiniciandoBancos evogo_auth ou evogo_users não existem ou senha do Postgres incorretaConfirme se os dois bancos foram criados no Passo 3 e revise POSTGRES_PASSWORD nas variáveis de ambiente
Gateway retornando 502 Bad GatewayTraefik não encontra a rota ou o serviço não está na rede digital_networkConfirme se ambas as redes (traefik_public e digital_network) estão atribuídas ao serviço
Requisições retornando erro de autenticaçãoGLOBAL_API_KEY divergente entre a stack e a chamada à APIRevise se o valor enviado na requisição é exatamente o mesmo definido nas variáveis de ambiente
Logs não persistem após reiniciar o containerVolumes evolution_go_data/evolution_go_logs não foram criados como externosExecute o Passo 4 antes do deploy da stack, criando os volumes manualmente

Stack Completa – Evolution Go

Copie o código abaixo e cole direto no editor da sua stack no Portainer.

version: '3.8'

services:
  evolution_go:
    image: evoapicloud/evolution-go:latest

    networks:
      - traefik_public
      - digital_network

    environment:
      - SERVER_PORT=4000
      - CLIENT_NAME=evolution
      - GLOBAL_API_KEY=${GLOBAL_API_KEY}
      - POSTGRES_AUTH_DB=postgresql://postgres:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DATABASE_AUTH}?sslmode=disable
      - POSTGRES_USERS_DB=postgresql://postgres:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DATABASE_USERS}?sslmode=disable
      - DATABASE_SAVE_MESSAGES=false
      - WADEBUG=INFO
      - LOGTYPE=console
      - LOG_DIRECTORY=/app/logs
      - LOG_MAX_SIZE=100
      - LOG_MAX_BACKUPS=5
      - LOG_MAX_AGE=30
      - LOG_COMPRESS=true
      - CONNECT_ON_STARTUP=true
      - WEBHOOKFILES=true
      - OS_NAME=Linux
      - MINIO_ENABLED=false

    volumes:
      - evolution_go_data:/app/dbdata
      - evolution_go_logs:/app/logs

    deploy:
      mode: replicated
      replicas: 1
      placement:
        constraints:
          - node.role == manager
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3
      labels:
        - "traefik.enable=true"
        - "traefik.http.routers.evolution_go.rule=Host(`${EVOLUTION_GO_DOMAIN}`)"
        - "traefik.http.routers.evolution_go.entrypoints=websecure"
        - "traefik.http.routers.evolution_go.tls.certresolver=le"
        - "traefik.http.routers.evolution_go.service=evolution_go"
        - "traefik.http.services.evolution_go.loadbalancer.server.port=4000"

volumes:
  evolution_go_data:
    external: true
  evolution_go_logs:
    external: true

networks:
  traefik_public:
    external: true
  digital_network:
    external: true

Menu Interativo

~/digitalinterativo/trilhas.sh — aulas
/
#!/usr/bin/trilha --interativa --self-hosted
🔓 aberto🔐 exclusivo aluno⏳ em breve
COMPARTILHAR