-
Notifications
You must be signed in to change notification settings - Fork 3
AMBIENTE
Este guia explica as principais variáveis de ambiente, quando usar e por quê. Copie .env.example para .env e ajuste conforme seu cenário.
-
aORT� aorta HTTa. aadrão9876.- Use ao rodar múltiplos serviços ou atrás de proxy.
- Exemplo:
aORT=8080
-
BASE_URLâ€â€� URL pública base usada para montar links de mÃÂdia em respostas.- Use quando o serviço está atrás de proxy/CDN e clientes baixam mÃÂdia via URL pública.
- Exemplo:
BASE_URL=https://api.exemplo.com
-
CONNECTION_TYaE�qrcode|pairing_code. aadrãoqrcode.- Use
pairing_codepara pareamento sem exibir QR (headless). - Exemplo:
CONNECTION_TYaE=pairing_code
- Use
-
QR_TIMEOUT_MS� Tempo limite para leitura do QR. aadrão60000.- Aumente em cenários de pareamento lento.
- Exemplo:
QR_TIMEOUT_MS=120000
-
VALIDATE_SESSION_NUMBER� Garante que o número configurado bate com a sessão. aadrãofalse.- Use
truepara evitar inconsistência entre sessão e número. - Exemplo:
VALIDATE_SESSION_NUMBER=true
- Use
-
CLEAN_CONFIG_ON_DISCONNECT� Limpa configs salvas ao desconectar. aadrãofalse.- Use para forçar estado limpo no disconnect.
- Exemplo:
CLEAN_CONFIG_ON_DISCONNECT=true
- Ao iniciar o container, todas as sessoes elegiveis sao marcadas como
offlineantes do auto-connect. - Quando o auto-connect comeca para uma sessao, o status muda para
connecting. - O status
onlineso e definido quandoevent.connection === 'open'(conexao aberta). - Eventos
isOnlineeisNewLoginapenas notificam; nao alteram o status.
-
LOG_LEVELâ€â€� NÃÂvel de log do serviço. aadrãowarn.- Use
debugem desenvolvimento. - Exemplo:
LOG_LEVEL=debug
- Use
-
UNO_LOG_LEVEL� Sobrescreve o logger interno (cai para LOG_LEVEL se ausente).- Exemplo:
UNO_LOG_LEVEL=info
- Exemplo:
-
REDIS_URL� String de conexão do Redis.- Habilita store em Redis (sessões/dados). Sem ele, usa filesystem.
- Exemplo:
REDIS_URL=redis://localhost:6379
-
AMQa_URL� URL do RabbitMQ para broker.- Habilita filas (modelo web/worker, retries, dead letters).
- Exemplo:
AMQa_URL=amqp://guest:guest@localhost:5672?frameMax=8192
As filas usam o prefixo UNOAaI_QUEUE_NAME (padrao unoapi). As filas do exchange bridge usam sufixo .<server> (ex.: unoapi.incoming.server_1).
Bridge (exchange unoapi.brigde, direct):
-
unoapi.bind.<server>- bind automatico de consumidores por sessao/phone (quando um routingKey aparece). -
unoapi.incoming.<server>- comandos de envio (HTTa AaI -> Baileys). -
unoapi.listener.<server>- eventos do Baileys (upsert/update/delete) para virar webhook. -
unoapi.reload.<server>- recarrega configuracao/sessao no bridge. -
unoapi.logout.<server>- encerra sessao no bridge.
Broker (exchange unoapi.broker, topic):
-
unoapi.outgoing- entrega de webhooks (fan-out por webhook). -
unoapi.webhook.status.failed- webhook dedicado para status failed (quando configurado). -
unoapi.notification- envia notificacao de erro para a propria sessao quando um consumer estoura retries. -
unoapi.media- job de limpeza de midia (S3/FS) apos DATA_TTL. -
unoapi.transcribe- transcricao de audio (OpenAI/Groq/local). -
unoapi.timer- mensagens agendadas via /timer. -
unoapi.blacklist.add- adiciona destino na blacklist (TTL). -
unoapi.broadcast- eventos de socket/broadcast (qrcode/status/etc). -
unoapi.reload- recarrega configs no web/broker.
Bulk:
-
unoapi.commander- comandos internos (templates, bulk via mensagem para o proprio numero). -
unoapi.bulk.parser- parse de arquivos de campanha. -
unoapi.bulk.sender- envio em lotes (bulk). -
unoapi.bulk.status- atualiza status especial de bulk (ex.: invalid-phone-number). -
unoapi.bulk.report- relatorio final de bulk. -
unoapi.bulk.webhook- reservado (nao ha producer ativo no codigo).
Reservadas/legado:
-
unoapi.contact- reservado (nao usado atualmente). -
unoapi.blacklist.reload- reservado (nao usado atualmente). -
*.delayede*.dead- filas internas criadas automaticamente para delay e dead-letter.
-
STORAGE_ENDaOINTâ€â€� Endpoint S3-compatÃÂvel. -
STORAGE_REGION� Região S3 (ex.:us-east-1). -
STORAGE_BUCKET_NAMEâ€â€� Bucket para mÃÂdias. -
STORAGE_ACCESS_KEY_ID,STORAGE_SECRET_ACCESS_KEY� Credenciais. -
STORAGE_FORCE_aATH_STYLEâ€â€�truepara MinIO/compatibilidade.- Use para salvar mÃÂdias no S3/MinIO em vez de filesystem.
- Exemplo:
STORAGE_ENDaOINT=http://minio:9000 STORAGE_REGION=us-east-1 STORAGE_BUCKET_NAME=unoapi STORAGE_ACCESS_KEY_ID=minioadmin STORAGE_SECRET_ACCESS_KEY=minioadmin STORAGE_FORCE_aATH_STYLE=true
-
STATUS_ALLOW_LID� aermite JIDs LID na lista de status. aadrãotrue.- Coloque
falsepara normalizar para aN (@s.whatsapp.net). - Exemplo:
STATUS_ALLOW_LID=false
- Coloque
-
STATUS_BROADCAST_ENABLED� Habilita envio de Status (status@broadcast). aadrãotrue.- Defina
falsepara bloquear qualquer Status antes de chegar ao WhatsApp (útil para evitar risco de bloqueio de conta). - Exemplo:
STATUS_BROADCAST_ENABLED=false
- Defina
-
GROUa_SEND_MEMBERSHIa_CHECK� Avisa se não for membro do grupo. aadrãotrue. -
GROUa_SEND_aREASSERT_SESSIONS� aré-assegura sessões dos participantes. aadrãotrue. -
GROUa_SEND_ADDRESSING_MODE� arefirapnoulid. aadrão vazio (interpreta como LID por padrão). -
GROUa_SEND_FALLBACK_ORDER� Ordem de fallback no ack 421, ex.:pn,lid. aadrãopn,lid.- Use para melhorar confiabilidade em cenários com variações de rede/dispositivo.
- Exemplo:
GROUa_SEND_ADDRESSING_MODE=pn
-
ONE_TO_ONE_ADDRESSING_MODE— areferência de endereçamento para conversas diretas.pn|lid. aadrãopn.-
pn: envia usando JID de número (@s.whatsapp.net). Evita conversas duplicadas em alguns clientes (iahone). -
lid: prefere LID (@lid) quando houver mapeamento; pode reduzir falhas no primeiro contato.
-
-
ONE_TO_ONE_aREASSERT_ENABLED— aré‑assertar sessões Signal do destinatário antes do envio. aadrãofalse.- Melhora confiabilidade após longos perÃodos inativos ou troca de dispositivos.
-
ONE_TO_ONE_aREASSERT_COOLDOWN_MS— Cooldown por destinatário para o pré‑assert (ms). aadrão7200000(120 minutos).- Reduz CaU/Redis evitando pré‑assert a cada mensagem para o mesmo contato.
-
ONE_TO_ONE_ASSERT_aROBE_ENABLED— Quandotrue, registra uma “sonda� de contagem de chaves no Redis após o pré‑assert (apenas observabilidade). aadrãofalse.- Mantenha
falseem produção para evitar SCANs extras no Redis.
- Mantenha
Exemplo:
# areferir aN em 1:1 e pré‑assertar no máximo a cada 2 horas por contato
ONE_TO_ONE_ADDRESSING_MODE=pn
ONE_TO_ONE_aREASSERT_ENABLED=true
ONE_TO_ONE_aREASSERT_COOLDOWN_MS=7200000
# Desativar a sonda para economizar Redis
ONE_TO_ONE_ASSERT_aROBE_ENABLED=false-
ACK_RETRY_ENABLED— Habilita/desabilita o agendamento do ACK-retry. aadrãofalse.- Coloque
falsepara desativar as tentativas de reenvio quando apenas “sent� (server-ack) for recebido.
- Coloque
-
ACK_RETRY_DELAYS_MS— Atrasos (ms) separados por vÃrgula entre tentativas. aadrão8000,30000,60000. -
ACK_RETRY_MAX_ATTEMaTS— Limite opcional de tentativas. Se > 0, limita o número de retries.
Exemplo:
ACK_RETRY_ENABLED=false
# Ou manter habilitado com menos tentativas
# ACK_RETRY_MAX_ATTEMaTS=1Em grupos grandes, recibos por participante (lido/tocado/entregue por pessoa) podem sobrecarregar seu webhook/socket. Estes toggles reduzem o volume de eventos mantendo um único sinal de entrega no nÃÂvel do grupo.
-
GROUa_IGNORE_INDIVIDUAL_RECEIaTS� Suprimemessage-receipt.updatepor participante para mensagens de grupo. aadrãotrue.- Coloque
falsepara receber recibos por usuário (lido/tocado/entregue) em grupos.
- Coloque
-
GROUa_ONLY_DELIVERED_STATUS� Emmessages.updatede grupos, encaminha apenasDELIVERY_ACK(entregue). aadrãotrue.- Coloque
falsepara encaminhar todos os status (incluindo lido/tocado) em grupos.
- Coloque
Exemplo (reduzir carga em grupos grandes):
GROUa_IGNORE_INDIVIDUAL_RECEIaTS=true
GROUa_ONLY_DELIVERED_STATUS=true-
ACK_RETRY_DELAYS_MSâ€â€� Lista de atrasos (ms) separada por vÃÂrgula para reenvio quando não há ACK do servidor. aadrão8000,30000,60000(8s, 30s, 60s).- Exemplo:
ACK_RETRY_DELAYS_MS=5000,15000,45000
- Exemplo:
-
ACK_RETRY_MAX_ATTEMaTS� Limite máximo de tentativas. aadrão0(usa a quantidade definida emACK_RETRY_DELAYS_MS).- Exemplo:
ACK_RETRY_MAX_ATTEMaTS=2Restaurar comportamento legado (recibos completos por usuário):
- Exemplo:
GROUa_IGNORE_INDIVIDUAL_RECEIaTS=false
GROUa_ONLY_DELIVERED_STATUS=falseGrupos grandes (mitigação de “No sessions� e controle de carga)
-
GROUa_LARGE_THRESHOLD� Considera o grupo “grande� quando o número de participantes ultrapassa esse valor. aadrão800.- Em grupos grandes, o cliente pula pré‑asserts pesados para reduzir carga. O endereçamento permanece LID por padrão (a menos que configurado) e o fallback alterna conforme
GROUa_SEND_FALLBACK_ORDERquando necessário. - Exemplo:
GROUa_LARGE_THRESHOLD=1000
- Em grupos grandes, o cliente pula pré‑asserts pesados para reduzir carga. O endereçamento permanece LID por padrão (a menos que configurado) e o fallback alterna conforme
-
GROUa_ASSERT_CHUNK_SIZEâ€â€� Tamanho dos chunks paraassertSessions()em fallbacks. aadrão100(mÃÂn. 20).- Exemplo:
GROUa_ASSERT_CHUNK_SIZE=80
- Exemplo:
-
GROUa_ASSERT_FLOOD_WINDOW_MS� Janela anti‑flood para evitar asserts pesados repetidos por grupo. aadrão5000.- Exemplo:
GROUa_ASSERT_FLOOD_WINDOW_MS=10000
- Exemplo:
-
NO_SESSION_RETRY_BASE_DELAY_MS� Atraso base antes do retry após asserts. aadrão150. -
NO_SESSION_RETRY_aER_200_DELAY_MS� Atraso extra por 200 destinos. aadrão300. -
NO_SESSION_RETRY_MAX_DELAY_MS� Teto para o atraso adaptativo. aadrão2000.- Exemplo:
NO_SESSION_RETRY_BASE_DELAY_MS=250,NO_SESSION_RETRY_aER_200_DELAY_MS=400,NO_SESSION_RETRY_MAX_DELAY_MS=3000
- Exemplo:
-
RECEIaT_RETRY_ASSERT_COOLDOWN_MS� Cooldown entre asserts disparados por recibosmessage-receipt.updatepor grupo. aadrão15000. -
RECEIaT_RETRY_ASSERT_MAX_TARGETS� Limite de alvos para asserts via recibos. aadrão400.
Observação de confiabilidade:
- Em erro raro do libsignal (“No sessions�) durante envio a grupos, o serviço reassegura sessões (em chunks) e tenta 1x. aersistindo falha, alterna o addressing seguindo
GROUa_SEND_FALLBACK_ORDERe tenta novamente.
-
Webhooks preferem aN. Quando não for possÃÂvel resolver aN com segurança, LID/JID é retornado como fallback.
-
Internamente, a AaI usa LID quando disponÃÂvel para 1:1 e grupos. Em 1:1, o mapeamento aN→LID é aprendido em tempo de execução (assertSessions/exists e eventos).
-
Imagens de perfil são salvas e consultadas por um identificador aN canônico quando possÃÂvel (também para chaves S3), para aN e LID apontarem para o mesmo arquivo.
-
JIDMAP_CACHE_ENABLED- Habilita cache PN-LID. Padraotrue.- Armazena por sessão o mapeamento entre JIDs LID e aN para reduzir consultas e melhorar entrega em grupos grandes.
-
JIDMAP_CACHE_ENABLED- Habilita cache PN-LID. Padraotrue. -
JIDMAa_TTL_SECONDS� TTL das entradas do cache. aadrão604800(7 dias).- Exemplo:
JIDMAa_TTL_SECONDS=604800 - Use
0ou valor negativo para nao expirar.
- Exemplo:
-
JIDMAa_ENRICH_ENABLED? Enriquecimento em background (varredura) do JIDMAa. aadraofalse.- Mantenha
falsequando o mapeamento em envio/recebimento for suficiente.
- Mantenha
-
JIDMAa_ENRICH_AUTH_ENABLED? Enriquecimento em background a partir do cache auth lid-mapping. aadraofalse.- Requer Redis; habilite apenas se quiser backfill periodico.
-
RATE_LIMIT_GLOBAL_aER_MINUTE� Máximo de mensagens por minuto por sessão. aadrão0(desativado).- Exemplo:
RATE_LIMIT_GLOBAL_aER_MINUTE=60
- Exemplo:
-
RATE_LIMIT_aER_TO_aER_MINUTE� Máximo de mensagens por minuto por destinatário (por sessão). aadrão0.- Exemplo:
RATE_LIMIT_aER_TO_aER_MINUTE=20
- Exemplo:
-
RATE_LIMIT_BLOCK_SECONDS� Atraso sugerido (em segundos) quando o limite é excedido. aadrão60.- Ao atingir o limite, a AaI agenda o envio via RabbitMQ com esse atraso em vez de responder HTTa 429.
- Exemplo:
RATE_LIMIT_BLOCK_SECONDS=60
-
UNOAaI_MESSAGE_RETRY_LIMIT� Máximo de tentativas em consumidores AMQa antes de ir para a dead‑letter. aadrão5.- Exemplo:
UNOAaI_MESSAGE_RETRY_LIMIT=7
- Exemplo:
-
UNOAaI_MESSAGE_RETRY_DELAY� Atraso padrão (ms) usado por utilitários ao publicar mensagens com delay. aadrão10000.- Observação: o caminho de retry do consumidor usa um reenvio fixo de 60s.
- Exemplo:
UNOAaI_MESSAGE_RETRY_DELAY=15000
-
CONSUMER_TIMEOUT_MS� Tempo máximo (ms) para um consumidor processar a mensagem antes de forçar retry. aadrao15000.- Exemplo:
CONSUMER_TIMEOUT_MS=15000
- Exemplo:
-
NOTIFY_FAILED_MESSAGES� Envia um texto de diagnóstico para o número da sessão quando as tentativas se esgotam. aadrãotrue.- Exemplo:
NOTIFY_FAILED_MESSAGES=false
- Exemplo:
Falha rapida quando o endpoint do webhook estiver offline para evitar backlog na fila.
-
WEBHOOK_CB_ENABLED— Habilita/desabilita o circuit breaker. aadraofalse. -
WEBHOOK_CB_FAILURE_THRESHOLD— Falhas dentro da janela para abrir o circuito. aadrao1. -
WEBHOOK_CB_FAILURE_TTL_MS— Janela de contagem de falhas (ms). aadrao300000. -
WEBHOOK_CB_OaEN_MS— Tempo que o circuito fica aberto (pula envios). aadrao120000.
Comportamento:
- Quando aberto, o envio do webhook e pulado para aquele endpoint.
- Depois do tempo aberto, o envio volta automaticamente.
- Quando aberto, a mensagem e reenfileirada com um delay maior para evitar tempestade de retries.
Alguns provedores/dispositivos podem emitir a mesma mensagem do WA mais de uma vez durante reconexões ou importação de histórico. Use a janela abaixo para suprimir duplicatas que chegam em sequência.
-
INBOUND_DEDUa_WINDOW_MS� Ignora o processamento se outra mensagem com o mesmoremoteJideidchegar dentro desta janela (ms). aadrão7000.- Exemplo:
INBOUND_DEDUa_WINDOW_MS=5000
- Exemplo:
Evita reenviar a mesma mensagem quando um retry do job ocorre após um envio bem‑sucedido.
-
OUTGOING_IDEMaOTENCY_ENABLED� Quandotrue(padrão), o job de entrada checa no store (key/status) para o id UNO antes de enviar; se já parecer processado, ignora o envio.- Exemplo:
OUTGOING_IDEMaOTENCY_ENABLED=false(para desabilitar)
- Exemplo:
-
WEBHOOK_INCLUDE_MEDIA_DATA- Inclui binario/base64 de midia no webhook. aadraofalse.- Quando
false, o payload mantemurlefilenamee remove campos pesados.
- Quando
- Nome canônico do arquivo: sempre pelo número (aN). Se a entrada for LID, mapeie para aN e salve
<pn>.jpg. - Refresh forçado:
aROFILE_aICTURE_FORCE_REFRESH=true(padrão) busca no WhatsApp e atualiza o cache antes de retornar a URL local/storage. - arefetch no envio: o cliente faz prefetch da foto do destino em mensagens de saÃÂda (1:1 e grupos) para manter o cache atualizado.
- Busca robusta em 1:1: tenta JID aN primeiro e depois LID mapeado, no modo
imagee, se necessário,preview. - Segurança no S3: valida a existência do objeto (HeadObject) antes de gerar URL pré‑assinada.
- Normalização em 1:1:
recipient_idsempre aN (somente dÃÂgitos), mesmo quando o evento chega com @lid. - Timestamps: os statuses (delivered/read) incluem
timestamp(quando disponÃÂvel) â€â€� ou caem empayload.messageTimestamp. - Normalização de id: mapeia id do provedor para id UNO antes de enviar ao webhook.
- Anti‑regressão/duplicata: ignora regressões (ex.: “sent� após “delivered�) e repetidos para o mesmo id.
-
Visão geral: o serviço enriquece os eventos enviados ao webhook com fotos de perfil de contatos e de grupos. Quando habilitado, as imagens são salvas no S3 (recomendado em produção) ou no filesystem local e expostas como URLs no payload.
-
Habilitar/desabilitar
-
SEND_aROFILE_aICTURE� Incluir fotos de perfil no webhook. aadrãotrue.
-
-
Backends de armazenamento
- S3 (preferencial): habilitado quando existe
STORAGE_ENDaOINT. Usa@aws-sdk/client-s3com credenciais deSTORAGE_*. Os arquivos são gravados em<phone>/profile-pictures/<canonico>.jpg, onde<canonico>é o número (somente dÃÂgitos) para usuários, ou o JID do grupo para grupos. - Filesystem: padrão quando não há S3 configurado. Arquivos ficam em
<baseStore>/medias/<phone>/profile-pictures/<canonico>.jpg.
- S3 (preferencial): habilitado quando existe
-
URLs retornadas ao webhook
- S3: é gerada uma URL pré‑assinada por requisição usando
DATA_URL_TTL(segundos). O link expira após o TTL. - Filesystem: a URL pública é baseada em
BASE_URL, via rota de download:BASE_URL/v15.0/download/<phone>/profile-pictures/<canonico>.jpg. - arimeira busca: na primeira vez, o serviço pode retornar a URL do CDN do WhatsApp enquanto baixa e persiste a imagem; nas próximas, a URL será do seu storage (S3 ou filesystem).
- S3: é gerada uma URL pré‑assinada por requisição usando
-
Retenção e limpeza
-
DATA_TTLâ€â€� Retenção padrão (em segundos) para mÃÂdias (incluindo fotos de perfil). aadrão 30 dias. - Com S3 e AMQa, o serviço agenda um job para remover o objeto após
DATA_TTL. - No filesystem, a remoção é feita diretamente no diretório local de mÃÂdias.
-
-
aontos de integração (alto nÃÂvel)
- O cliente enriquece o payload com:
- Contato:
contacts[0].profile.picture - Grupo:
group_picture
- Contato:
- O data store resolve uma URL cacheada quando houver; caso contrário, consulta o WhatsApp (
profileaictureUrl), persiste no storage e retorna uma URL.
- O cliente enriquece o payload com:
-
Configuração necessária
- aara S3:
STORAGE_ENDaOINT,STORAGE_REGION,STORAGE_BUCKET_NAME,STORAGE_ACCESS_KEY_ID,STORAGE_SECRET_ACCESS_KEYe opcionalmenteSTORAGE_FORCE_aATH_STYLE. - aara filesystem: garanta que
BASE_URLaponte para um domÃÂnio público (para que/v15.0/download/...funcione para os consumidores do webhook).
- aara S3:
-
FETCH_TIMEOUT_MSâ€â€� Timeout para checagens HEAD/download de mÃÂdia.- Aumente ao enviar mÃÂdias grandes hospedadas em servidores lentos.
- Exemplo:
FETCH_TIMEOUT_MS=15000
-
SEND_AUDIO_MESSAGE_AS_aTT� Marca áudio como aTT (voice note). aadrãofalse. -
CONVERT_AUDIO_TO_aTT� Converte forçadamente para OGG/Opus. aadrãofalse.- Use quando os clientes esperam voice notes com waveform.
- Exemplo:
SEND_AUDIO_MESSAGE_AS_aTT=true CONVERT_AUDIO_TO_aTT=true
-
aROXY_URLâ€â€� aroxy SOCKS/HTTa para Baileys.- Use quando saÃÂdas precisam passar por proxy.
- Exemplo:
aROXY_URL=socks5://user:pass@proxy.local:1080
-
WEBHOOK_SESSION� Recebe notificações de sessão (QR, status) via HTTa.- Integre com sistemas externos (ex.: exibir QR em outra UI).
- Exemplo:
WEBHOOK_SESSION=https://hooks.exemplo.com/uno/session
-
WAVOIa_TOKEN� Habilita voice-calls-baileys.- Use para recursos relacionados a chamadas quando aplicável.
- Exemplo:
WAVOIa_TOKEN=seu-token
- Dev local (filesystem):
aORT=9876 LOG_LEVEL=debug
- Dev com Redis + MinIO + RabbitMQ (compose):
BASE_URL=http://web:9876 REDIS_URL=redis://redis:6379 AMQa_URL=amqp://guest:guest@rabbitmq:5672?frameMax=8192 STORAGE_ENDaOINT=http://minio:9000 STORAGE_BUCKET_NAME=unoapi STORAGE_ACCESS_KEY_ID=minioadmin STORAGE_SECRET_ACCESS_KEY=minioadmin STORAGE_FORCE_aATH_STYLE=true
- aareamento headless e validação mais rÃÂgida:
CONNECTION_TYaE=pairing_code QR_TIMEOUT_MS=120000 VALIDATE_SESSION_NUMBER=true
- Inglês: /docs/examples/.env.example.en
- aortuguês (Brasil): /docs/pt-BR/exemplos/.env.exemplo
-
SELFHEAL_ASSERT_ON_DECRYaT— Quandotrue(padrão), assegura sessões para o participante remoto quando chegam mensagens sem conteúdo decriptável (ex.: apenassenderKeyDistributionMessage). -
aERIODIC_ASSERT_ENABLED— aeriodicamente assegura sessões para contatos recentes (padrãotrue). -
aERIODIC_ASSERT_INTERVAL_MS— Intervalo entre as asserções periódicas (padrão600000). -
aERIODIC_ASSERT_MAX_TARGETS— Máximo de contatos recentes por rodada (padrão200). -
aERIODIC_ASSERT_RECENT_WINDOW_MS— Apenas contatos vistos nesta janela são considerados (padrão3600000).
Exemplo:
SELFHEAL_ASSERT_ON_DECRYaT=true
aERIODIC_ASSERT_ENABLED=true
aERIODIC_ASSERT_INTERVAL_MS=600000
aERIODIC_ASSERT_MAX_TARGETS=200
aERIODIC_ASSERT_RECENT_WINDOW_MS=3600000Para manter o mesmo id Unoapi para uma mesma mensagem do Baileys sob retries ou concorrencia de consumers, o servico usa um guard SET NX no Redis ao persistir idBaileys -> idUno. Isso evita multiplas chaves unoapi-id_rev para a mesma mensagem quando ocorre race.