|
| 1 | +# 🚀 Evolution API - Multi-Device Fix |
| 2 | + |
| 3 | +## 📋 Resumo da Alteração |
| 4 | + |
| 5 | +**Problema:** A Evolution API estava caindo/desconectando quando o WhatsApp Android estava ativo, porque se identificava como "WebClient" (WhatsApp Web), ocupando o slot de sessão web. |
| 6 | + |
| 7 | +**Solução:** Remover a identificação de browser para usar o modo Multi-Device nativo do Baileys 7.x, que não conflita com outras sessões. |
| 8 | + |
| 9 | +--- |
| 10 | + |
| 11 | +## 🔧 Alteração no Código |
| 12 | + |
| 13 | +### Arquivo: `src/api/integrations/channel/whatsapp/whatsapp.baileys.service.ts` |
| 14 | + |
| 15 | +**ANTES (WebClient - CAI):** |
| 16 | +```typescript |
| 17 | +const session = this.configService.get<ConfigSessionPhone>('CONFIG_SESSION_PHONE'); |
| 18 | + |
| 19 | +let browserOptions = {}; |
| 20 | + |
| 21 | +if (number || this.phoneNumber) { |
| 22 | + this.phoneNumber = number; |
| 23 | + this.logger.info(`Phone number: ${number}`); |
| 24 | +} else { |
| 25 | + const browser: WABrowserDescription = [session.CLIENT, session.NAME, release()]; |
| 26 | + browserOptions = { browser }; |
| 27 | + this.logger.info(`Browser: ${browser}`); |
| 28 | +} |
| 29 | + |
| 30 | +// ... no socketConfig: |
| 31 | +...browserOptions, |
| 32 | +``` |
| 33 | + |
| 34 | +**DEPOIS (Multi-Device nativo - NÃO CAI):** |
| 35 | +```typescript |
| 36 | +if (number || this.phoneNumber) { |
| 37 | + this.phoneNumber = number; |
| 38 | + this.logger.info(`Phone number: ${number}`); |
| 39 | +} |
| 40 | + |
| 41 | +// Multi-Device mode: não definimos browser para evitar ser tratado como WebClient |
| 42 | +// Isso faz o Baileys usar o modo MD nativo, que não conflita com outras sessões |
| 43 | +this.logger.info('Using Multi-Device native mode (no browser identification)'); |
| 44 | + |
| 45 | +// ... no socketConfig: |
| 46 | +// Removido browserOptions para usar Multi-Device nativo (não WebClient) |
| 47 | +``` |
| 48 | + |
| 49 | +### Imports removidos: |
| 50 | +- `ConfigSessionPhone` do `@config/env.config` |
| 51 | +- `WABrowserDescription` do `baileys` |
| 52 | +- `release` do `os` |
| 53 | + |
| 54 | +--- |
| 55 | + |
| 56 | +## 📦 Repositório Fork |
| 57 | + |
| 58 | +**URL:** https://github.com/joinads/evolution-api |
| 59 | + |
| 60 | +**Commit:** `5dbf3e93` - "fix: usar Multi-Device nativo para evitar desconexões" |
| 61 | + |
| 62 | +--- |
| 63 | + |
| 64 | +## 🐳 Deploy na VPS com Docker Compose |
| 65 | + |
| 66 | +### Pré-requisitos |
| 67 | +- Docker e Docker Compose instalados |
| 68 | +- Acesso SSH à VPS |
| 69 | +- Volumes existentes com dados (PostgreSQL, Redis, Instances) |
| 70 | + |
| 71 | +### Volumes Utilizados (externos) |
| 72 | +``` |
| 73 | +evolution-clean_evolution_instances # Dados das instâncias WhatsApp |
| 74 | +evolution-clean_evolution_redis # Cache Redis |
| 75 | +evolution-clean_postgres_data # Banco de dados PostgreSQL |
| 76 | +``` |
| 77 | + |
| 78 | +--- |
| 79 | + |
| 80 | +## 📝 Comandos de Deploy |
| 81 | + |
| 82 | +### 1. Clone o repositório |
| 83 | +```bash |
| 84 | +cd ~ |
| 85 | +git clone https://github.com/joinads/evolution-api.git evolution-api-custom |
| 86 | +cd evolution-api-custom |
| 87 | +``` |
| 88 | + |
| 89 | +### 2. Copie o .env existente |
| 90 | +```bash |
| 91 | +cp ~/evolution-clean/.env . |
| 92 | +``` |
| 93 | + |
| 94 | +### 3. Crie o docker-compose.prod.yaml |
| 95 | +```bash |
| 96 | +cat > docker-compose.prod.yaml << 'EOF' |
| 97 | +services: |
| 98 | + api: |
| 99 | + container_name: evolution_api |
| 100 | + build: |
| 101 | + context: . |
| 102 | + dockerfile: Dockerfile |
| 103 | + image: evolution-api:v2.3.4-multidevice |
| 104 | + restart: always |
| 105 | + depends_on: |
| 106 | + - redis |
| 107 | + - postgres |
| 108 | + ports: |
| 109 | + - 8080:8080 |
| 110 | + volumes: |
| 111 | + - evolution-clean_evolution_instances:/evolution/instances |
| 112 | + networks: |
| 113 | + - evolution-net |
| 114 | + env_file: |
| 115 | + - .env |
| 116 | + expose: |
| 117 | + - 8080 |
| 118 | +
|
| 119 | + redis: |
| 120 | + image: redis:latest |
| 121 | + networks: |
| 122 | + - evolution-net |
| 123 | + container_name: redis |
| 124 | + command: > |
| 125 | + redis-server --port 6379 --appendonly yes |
| 126 | + volumes: |
| 127 | + - evolution-clean_evolution_redis:/data |
| 128 | + ports: |
| 129 | + - 6379:6379 |
| 130 | +
|
| 131 | + postgres: |
| 132 | + container_name: postgres |
| 133 | + image: postgres:15 |
| 134 | + networks: |
| 135 | + - evolution-net |
| 136 | + command: ["postgres", "-c", "max_connections=1000", "-c", "listen_addresses=*"] |
| 137 | + restart: always |
| 138 | + ports: |
| 139 | + - 5432:5432 |
| 140 | + environment: |
| 141 | + - POSTGRES_USER=caio |
| 142 | + - POSTGRES_PASSWORD=caio123 |
| 143 | + - POSTGRES_DB=evolution |
| 144 | + - POSTGRES_HOST_AUTH_METHOD=trust |
| 145 | + volumes: |
| 146 | + - evolution-clean_postgres_data:/var/lib/postgresql/data |
| 147 | + expose: |
| 148 | + - 5432 |
| 149 | +
|
| 150 | +volumes: |
| 151 | + evolution-clean_evolution_instances: |
| 152 | + external: true |
| 153 | + evolution-clean_evolution_redis: |
| 154 | + external: true |
| 155 | + evolution-clean_postgres_data: |
| 156 | + external: true |
| 157 | +
|
| 158 | +networks: |
| 159 | + evolution-net: |
| 160 | + name: evolution-net |
| 161 | + driver: bridge |
| 162 | +EOF |
| 163 | +``` |
| 164 | + |
| 165 | +### 4. Pare a Evolution antiga (se estiver rodando) |
| 166 | +```bash |
| 167 | +cd ~/evolution-clean |
| 168 | +docker-compose down |
| 169 | +``` |
| 170 | + |
| 171 | +### 5. Build da nova imagem |
| 172 | +```bash |
| 173 | +cd ~/evolution-api-custom |
| 174 | +docker-compose -f docker-compose.prod.yaml build --no-cache |
| 175 | +``` |
| 176 | + |
| 177 | +### 6. Suba os containers |
| 178 | +```bash |
| 179 | +docker-compose -f docker-compose.prod.yaml up -d |
| 180 | +``` |
| 181 | + |
| 182 | +### 7. Verifique os logs |
| 183 | +```bash |
| 184 | +docker-compose -f docker-compose.prod.yaml logs -f api |
| 185 | +``` |
| 186 | + |
| 187 | +--- |
| 188 | + |
| 189 | +## 🔄 Comandos Úteis |
| 190 | + |
| 191 | +### Ver status dos containers |
| 192 | +```bash |
| 193 | +docker-compose -f docker-compose.prod.yaml ps |
| 194 | +``` |
| 195 | + |
| 196 | +### Reiniciar a API |
| 197 | +```bash |
| 198 | +docker-compose -f docker-compose.prod.yaml restart api |
| 199 | +``` |
| 200 | + |
| 201 | +### Ver logs em tempo real |
| 202 | +```bash |
| 203 | +docker-compose -f docker-compose.prod.yaml logs -f api |
| 204 | +``` |
| 205 | + |
| 206 | +### Parar todos os containers |
| 207 | +```bash |
| 208 | +docker-compose -f docker-compose.prod.yaml down |
| 209 | +``` |
| 210 | + |
| 211 | +### Rebuild após alterações no código |
| 212 | +```bash |
| 213 | +git pull origin main |
| 214 | +docker-compose -f docker-compose.prod.yaml build --no-cache |
| 215 | +docker-compose -f docker-compose.prod.yaml up -d |
| 216 | +``` |
| 217 | + |
| 218 | +--- |
| 219 | + |
| 220 | +## 🔍 Verificar se o Fix está Funcionando |
| 221 | + |
| 222 | +Nos logs da API, você deve ver: |
| 223 | +``` |
| 224 | +Using Multi-Device native mode (no browser identification) |
| 225 | +``` |
| 226 | + |
| 227 | +**NÃO deve mais aparecer:** |
| 228 | +``` |
| 229 | +Browser: ['Evolution API', 'Chrome', ...] |
| 230 | +``` |
| 231 | + |
| 232 | +--- |
| 233 | + |
| 234 | +## ⚠️ Notas Importantes |
| 235 | + |
| 236 | +1. **Instâncias existentes:** Continuam funcionando normalmente. As credenciais salvas não dependem do parâmetro `browser`. |
| 237 | + |
| 238 | +2. **Novas conexões:** Usarão o modo Multi-Device nativo automaticamente. |
| 239 | + |
| 240 | +3. **Se uma sessão expirar:** Ao reconectar via QR Code, já usará o novo modo. |
| 241 | + |
| 242 | +4. **Volumes externos:** O docker-compose usa `external: true` para apontar para os volumes existentes, preservando todos os dados. |
| 243 | + |
| 244 | +--- |
| 245 | + |
| 246 | +## 📊 Comparação: Antes vs Depois |
| 247 | + |
| 248 | +| Aspecto | Antes (v2.3.4 oficial) | Depois (com fix) | |
| 249 | +|---------|------------------------|------------------| |
| 250 | +| Identificação | `['Evolution API', 'Chrome', OS]` | Nenhuma (MD nativo) | |
| 251 | +| Tipo de sessão | WebClient | Multi-Device | |
| 252 | +| Aparece como | "WhatsApp Web" | Dispositivo vinculado | |
| 253 | +| Conflita com Android | ✅ SIM | ❌ NÃO | |
| 254 | +| Cai quando Android ativo | ✅ SIM | ❌ NÃO | |
| 255 | + |
| 256 | +--- |
| 257 | + |
| 258 | +## 🆘 Rollback (Voltar para versão oficial) |
| 259 | + |
| 260 | +Se precisar voltar para a versão oficial: |
| 261 | + |
| 262 | +```bash |
| 263 | +cd ~/evolution-api-custom |
| 264 | +docker-compose -f docker-compose.prod.yaml down |
| 265 | + |
| 266 | +cd ~/evolution-clean |
| 267 | +docker-compose up -d |
| 268 | +``` |
| 269 | + |
| 270 | +--- |
| 271 | + |
| 272 | +## 📅 Data da Alteração |
| 273 | +**04 de Dezembro de 2025** |
| 274 | + |
| 275 | +## 👤 Autor |
| 276 | +Alteração realizada com auxílio de IA (Claude/Cursor) |
| 277 | + |
| 278 | +## 🔗 Links |
| 279 | +- Fork: https://github.com/joinads/evolution-api |
| 280 | +- Original: https://github.com/EvolutionAPI/evolution-api |
| 281 | +- Baileys: https://github.com/WhiskeySockets/Baileys |
| 282 | + |
0 commit comments