Skip to content

Commit 5dbf3e9

Browse files
committed
fix: usar Multi-Device nativo para evitar desconexões
1 parent df20c5f commit 5dbf3e9

File tree

4 files changed

+255
-13
lines changed

4 files changed

+255
-13
lines changed

deploy-vps.sh

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
#!/bin/bash
2+
3+
# ===========================================
4+
# SCRIPT DE DEPLOY - Evolution API Multi-Device
5+
# ===========================================
6+
7+
set -e
8+
9+
echo "🚀 Iniciando deploy da Evolution API com Multi-Device fix..."
10+
11+
# Cores para output
12+
RED='\033[0;31m'
13+
GREEN='\033[0;32m'
14+
YELLOW='\033[1;33m'
15+
NC='\033[0m' # No Color
16+
17+
# Verificar se está no diretório correto
18+
if [ ! -f "docker-compose.prod.yaml" ]; then
19+
echo -e "${RED}❌ Erro: Execute este script no diretório da Evolution API${NC}"
20+
exit 1
21+
fi
22+
23+
# Backup do docker-compose atual (se existir)
24+
if [ -f "docker-compose.yaml" ]; then
25+
echo -e "${YELLOW}📦 Fazendo backup do docker-compose.yaml atual...${NC}"
26+
cp docker-compose.yaml docker-compose.yaml.backup.$(date +%Y%m%d_%H%M%S)
27+
fi
28+
29+
# Parar containers existentes (mantém volumes)
30+
echo -e "${YELLOW}⏹️ Parando containers existentes...${NC}"
31+
docker compose -f docker-compose.prod.yaml down 2>/dev/null || docker-compose -f docker-compose.prod.yaml down 2>/dev/null || true
32+
33+
# Build da nova imagem
34+
echo -e "${YELLOW}🔨 Buildando imagem com Multi-Device fix...${NC}"
35+
docker compose -f docker-compose.prod.yaml build --no-cache api
36+
37+
# Subir containers
38+
echo -e "${YELLOW}🚀 Iniciando containers...${NC}"
39+
docker compose -f docker-compose.prod.yaml up -d
40+
41+
# Aguardar API iniciar
42+
echo -e "${YELLOW}⏳ Aguardando API iniciar...${NC}"
43+
sleep 10
44+
45+
# Verificar status
46+
echo -e "${GREEN}✅ Deploy concluído!${NC}"
47+
echo ""
48+
echo "📊 Status dos containers:"
49+
docker compose -f docker-compose.prod.yaml ps
50+
51+
echo ""
52+
echo "📋 Últimos logs da API:"
53+
docker compose -f docker-compose.prod.yaml logs api --tail 20
54+
55+
echo ""
56+
echo -e "${GREEN}========================================${NC}"
57+
echo -e "${GREEN}🎉 Evolution API Multi-Device está rodando!${NC}"
58+
echo -e "${GREEN}========================================${NC}"
59+
echo ""
60+
echo "🔗 Acesse: http://SEU_IP:8080"
61+
echo "📚 Docs: http://SEU_IP:8080/docs"
62+
echo "🖥️ Manager: http://SEU_IP:8080/manager"
63+
echo ""
64+
echo "💡 Para ver logs em tempo real:"
65+
echo " docker compose -f docker-compose.prod.yaml logs -f api"
66+

docker-compose.local.yaml

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
version: "3.8"
2+
3+
services:
4+
api:
5+
container_name: evolution_api_local
6+
build:
7+
context: .
8+
dockerfile: Dockerfile
9+
restart: unless-stopped
10+
depends_on:
11+
postgres:
12+
condition: service_healthy
13+
redis:
14+
condition: service_started
15+
ports:
16+
- "8080:8080"
17+
volumes:
18+
- evolution_instances:/evolution/instances
19+
networks:
20+
- evolution-local
21+
environment:
22+
# Servidor
23+
- SERVER_NAME=evolution
24+
- SERVER_TYPE=http
25+
- SERVER_PORT=8080
26+
- SERVER_URL=http://localhost:8080
27+
- SERVER_DISABLE_DOCS=false
28+
- SERVER_DISABLE_MANAGER=false
29+
30+
# Banco de dados
31+
- DATABASE_PROVIDER=postgresql
32+
- DATABASE_CONNECTION_URI=postgresql://evolution:evolution123@postgres:5432/evolution
33+
- DATABASE_CONNECTION_CLIENT_NAME=evolution
34+
- DATABASE_SAVE_DATA_INSTANCE=true
35+
- DATABASE_SAVE_DATA_NEW_MESSAGE=true
36+
- DATABASE_SAVE_MESSAGE_UPDATE=true
37+
- DATABASE_SAVE_DATA_CONTACTS=true
38+
- DATABASE_SAVE_DATA_CHATS=true
39+
- DATABASE_SAVE_DATA_HISTORIC=true
40+
- DATABASE_SAVE_DATA_LABELS=true
41+
- DATABASE_SAVE_IS_ON_WHATSAPP=true
42+
- DATABASE_SAVE_IS_ON_WHATSAPP_DAYS=7
43+
44+
# Redis
45+
- CACHE_REDIS_ENABLED=true
46+
- CACHE_REDIS_URI=redis://redis:6379
47+
- CACHE_REDIS_PREFIX_KEY=evolution-cache
48+
- CACHE_REDIS_TTL=604800
49+
- CACHE_REDIS_SAVE_INSTANCES=true
50+
- CACHE_LOCAL_ENABLED=true
51+
52+
# Autenticação
53+
- AUTHENTICATION_API_KEY=sua-api-key-aqui
54+
- AUTHENTICATION_EXPOSE_IN_FETCH_INSTANCES=false
55+
56+
# Logs
57+
- LOG_LEVEL=ERROR,WARN,DEBUG,INFO,LOG,VERBOSE,WEBHOOKS,WEBSOCKET
58+
- LOG_COLOR=true
59+
- LOG_BAILEYS=error
60+
61+
# Instâncias
62+
- DEL_INSTANCE=false
63+
- DEL_TEMP_INSTANCES=true
64+
65+
# Idioma
66+
- LANGUAGE=pt-BR
67+
68+
# WebSocket
69+
- WEBSOCKET_ENABLED=true
70+
- WEBSOCKET_GLOBAL_EVENTS=true
71+
72+
# QR Code
73+
- QRCODE_LIMIT=30
74+
- QRCODE_COLOR=#198754
75+
76+
# Telemetria
77+
- TELEMETRY_ENABLED=false
78+
79+
postgres:
80+
container_name: evolution_postgres_local
81+
image: postgres:15-alpine
82+
restart: unless-stopped
83+
environment:
84+
- POSTGRES_DB=evolution
85+
- POSTGRES_USER=evolution
86+
- POSTGRES_PASSWORD=evolution123
87+
volumes:
88+
- postgres_data:/var/lib/postgresql/data
89+
networks:
90+
- evolution-local
91+
ports:
92+
- "5432:5432"
93+
healthcheck:
94+
test: ["CMD-SHELL", "pg_isready -U evolution -d evolution"]
95+
interval: 5s
96+
timeout: 5s
97+
retries: 5
98+
99+
redis:
100+
container_name: evolution_redis_local
101+
image: redis:7-alpine
102+
restart: unless-stopped
103+
command: redis-server --appendonly yes
104+
volumes:
105+
- redis_data:/data
106+
networks:
107+
- evolution-local
108+
ports:
109+
- "6379:6379"
110+
111+
volumes:
112+
evolution_instances:
113+
postgres_data:
114+
redis_data:
115+
116+
networks:
117+
evolution-local:
118+
name: evolution-local
119+
driver: bridge
120+

docker-compose.prod.yaml

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
services:
2+
api:
3+
container_name: evolution_api
4+
# Build local com as alterações do Multi-Device
5+
build:
6+
context: .
7+
dockerfile: Dockerfile
8+
image: evolution-api:v2.3.4-multidevice
9+
restart: always
10+
depends_on:
11+
- redis
12+
- postgres
13+
ports:
14+
- 8080:8080
15+
volumes:
16+
- evolution_instances:/evolution/instances
17+
networks:
18+
- evolution-net
19+
env_file:
20+
- .env
21+
expose:
22+
- 8080
23+
24+
redis:
25+
image: redis:latest
26+
networks:
27+
- evolution-net
28+
container_name: redis
29+
command: >
30+
redis-server --port 6379 --appendonly yes
31+
volumes:
32+
- evolution_redis:/data
33+
ports:
34+
- 6379:6379
35+
36+
postgres:
37+
container_name: postgres
38+
image: postgres:15
39+
networks:
40+
- evolution-net
41+
command: ["postgres", "-c", "max_connections=1000", "-c", "listen_addresses=*"]
42+
restart: always
43+
ports:
44+
- 5432:5432
45+
environment:
46+
- POSTGRES_USER=caio
47+
- POSTGRES_PASSWORD=caio123
48+
- POSTGRES_DB=evolution
49+
- POSTGRES_HOST_AUTH_METHOD=trust
50+
volumes:
51+
- postgres_data:/var/lib/postgresql/data
52+
expose:
53+
- 5432
54+
55+
volumes:
56+
evolution_instances:
57+
evolution_redis:
58+
postgres_data:
59+
60+
networks:
61+
evolution-net:
62+
name: evolution-net
63+
driver: bridge
64+

src/api/integrations/channel/whatsapp/whatsapp.baileys.service.ts

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,6 @@ import {
6767
Chatwoot,
6868
ConfigService,
6969
configService,
70-
ConfigSessionPhone,
7170
Database,
7271
Log,
7372
Openai,
@@ -122,7 +121,6 @@ import makeWASocket, {
122121
Product,
123122
proto,
124123
UserFacingSocketConfig,
125-
WABrowserDescription,
126124
WAMediaUpload,
127125
WAMessage,
128126
WAMessageKey,
@@ -140,7 +138,6 @@ import Long from 'long';
140138
import mimeTypes from 'mime-types';
141139
import NodeCache from 'node-cache';
142140
import cron from 'node-cron';
143-
import { release } from 'os';
144141
import { join } from 'path';
145142
import P from 'pino';
146143
import qrcode, { QRCodeToDataURLOptions } from 'qrcode';
@@ -550,21 +547,16 @@ export class BaileysStartupService extends ChannelStartupService {
550547
private async createClient(number?: string): Promise<WASocket> {
551548
this.instance.authState = await this.defineAuthState();
552549

553-
const session = this.configService.get<ConfigSessionPhone>('CONFIG_SESSION_PHONE');
554-
555-
let browserOptions = {};
556-
557550
if (number || this.phoneNumber) {
558551
this.phoneNumber = number;
559552

560553
this.logger.info(`Phone number: ${number}`);
561-
} else {
562-
const browser: WABrowserDescription = [session.CLIENT, session.NAME, release()];
563-
browserOptions = { browser };
564-
565-
this.logger.info(`Browser: ${browser}`);
566554
}
567555

556+
// Multi-Device mode: não definimos browser para evitar ser tratado como WebClient
557+
// Isso faz o Baileys usar o modo MD nativo, que não conflita com outras sessões
558+
this.logger.info('Using Multi-Device native mode (no browser identification)');
559+
568560
const baileysVersion = await fetchLatestWaWebVersion({});
569561
const version = baileysVersion.version;
570562
const log = `Baileys version: ${version.join('.')}`;
@@ -630,7 +622,7 @@ export class BaileysStartupService extends ChannelStartupService {
630622
msgRetryCounterCache: this.msgRetryCounterCache,
631623
generateHighQualityLinkPreview: true,
632624
getMessage: async (key) => (await this.getMessage(key)) as Promise<proto.IMessage>,
633-
...browserOptions,
625+
// Removido browserOptions para usar Multi-Device nativo (não WebClient)
634626
markOnlineOnConnect: this.localSettings.alwaysOnline,
635627
retryRequestDelayMs: 350,
636628
maxMsgRetryCount: 4,

0 commit comments

Comments
 (0)