Guias/Instalação e ambiente
Documentação

Instalação e ambiente

Variáveis de ambiente e configuração do servidor.

Este documento descreve as variaveis de ambiente usadas pela API no estado atual do codigo.

Quando DOCKER_ENV esta ausente ou definido como false, a aplicacao carrega o arquivo .env do diretorio de execucao e depois le os valores do ambiente do processo. Variaveis ja definidas no processo tem prioridade sobre os valores do arquivo .env.

Quando DOCKER_ENV=true, .env e .env.dev nao sao carregados; todas as variaveis precisam ser fornecidas diretamente ao container.

.env.dev e .env.docker.example sao arquivos de referencia. A aplicacao nao carrega esses arquivos automaticamente.

Variaveis obrigatorias

VariavelExemploDescricao
DATABASE_URLpostgres://postgres:postgres@localhost:5432/whatsapp?sslmode=disableString de conexao do PostgreSQL principal da API.
AUTHENTICATION_JWT_EXPIRES_IN3600Expiracao do JWT em segundos. Use 0 para gerar tokens sem claim exp. Valores negativos sao invalidos.
AUTHENTICATION_JWT_SECRETchange-meChave secreta usada para assinar JWTs HS256. Nao pode ser vazia.
AUTHENTICATION_GLOBAL_AUTH_TOKENchange-me-global-tokenToken global usado para criar/listar instancias e rotas administrativas que aceitam chave global. Nao pode ser vazio.
QRCODE_LIMIT5Numero maximo de QR codes servidos durante uma tentativa de pareamento. Deve ser inteiro positivo.
QRCODE_EXPIRATION_TIME30Tempo de vida de cada QR code, em segundos. Deve ser inteiro positivo.
QRCODE_LIGHT_COLOR#ffffffCor clara do QR PNG. Deve estar no formato #RRGGBB.
QRCODE_DARK_COLOR#198754Cor escura do QR PNG. Deve estar no formato #RRGGBB.
WHATSAPP_AUTO_RECONNECTtrueHabilita restauracao automatica das sessoes que deveriam estar online. Valor aceito: true ou false.
WHATSAPP_STARTUP_RECONNECT_CONCURRENCY5Numero maximo de sessoes WhatsApp restauradas em paralelo. Deve ser inteiro positivo.
WHATSAPP_CONNECT_TIMEOUT30Timeout inicial da conexao WhatsApp, em segundos. Deve ser inteiro positivo.
WHATSAPP_RECONNECT_INITIAL_DELAY2Backoff inicial de reconexao, em segundos. Deve ser inteiro positivo.
WHATSAPP_RECONNECT_MAX_DELAY60Backoff maximo de reconexao, em segundos. Deve ser maior ou igual a WHATSAPP_RECONNECT_INITIAL_DELAY.
WHATSAPP_PROFILE_PICTURE_TIMEOUT15Timeout para buscar foto de perfil, em segundos. Deve ser inteiro positivo.

Servidor e execucao

VariavelObrigatoriaDefaultExemploDescricao
DOCKER_ENVNaofalsetrueQuando true, impede o carregamento automatico de .env. Valores aceitos: vazio, false, true.
SERVER_PORTNao80848084Porta do listener HTTP. Informe apenas o numero, sem :.
LOG_LEVELNaoinfotraceNivel do Zerolog. Valores aceitos pelo Zerolog: trace, debug, info, warn, error, fatal, panic, disabled.
TZNaocontrolado pelo SO/containerAmerica/Sao_PauloNao e lida diretamente por internal/config; e usada pelo ambiente/container para timezone do processo.
TMPDIRNaocontrolado pelo SO/container/app/tmpNao e lida diretamente por internal/config; pode ser usada pelo SO e bibliotecas para arquivos temporarios.

Banco de dados

VariavelObrigatoriaDefaultExemploDescricao
DATABASE_URLSimnenhumpostgres://...Banco principal da API. Repositorios e migrations usam sempre este banco.
DATABASE_SAVE_DATA_NEW_MESSAGENaotruetruePersiste mensagens recebidas em Message.
DATABASE_SAVE_MESSAGE_UPDATENaofalsefalsePersiste recibos/eventos de atualizacao em MessageUpdate.
DATABASE_SAVE_DATA_CONTACTSNaofalsefalsePersiste sincronizacao e eventos de contatos em Contact.

Sessoes do Whatsmeow

VariavelObrigatoriaDefaultExemploDescricao
WHATSAPP_SESSION_STORENaopostgressqliteBackend usado pelo whatsmeow para sessoes/dispositivos. Valores aceitos: sqlite, postgres.
WHATSAPP_SESSION_SQLITE_DSNNaofile:./data/whatsmeow.db?_foreign_keys=onfile:./data/whatsmeow.db?_foreign_keys=onDSN do SQLite quando WHATSAPP_SESSION_STORE=sqlite.
WHATSAPP_SESSION_POSTGRES_URLNaovaziopostgres://sessions:...URL PostgreSQL dedicada para sessoes do whatsmeow. Quando vazia e o store e postgres, usa DATABASE_URL.

DATABASE_URL continua sendo o banco principal da API. Se WHATSAPP_SESSION_POSTGRES_URL estiver preenchida, as sessoes do whatsmeow sao inicializadas e migradas somente no banco dedicado.

Alterar WHATSAPP_SESSION_STORE nao migra sessoes automaticamente. Migre os dados antes ou pareie as instancias novamente.

Autenticacao

VariavelObrigatoriaDefaultExemploDescricao
AUTHENTICATION_JWT_EXPIRES_INSimnenhum3600Expiracao do JWT em segundos. 0 remove a claim exp.
AUTHENTICATION_JWT_SECRETSimnenhumstrong-secretSegredo para assinar JWTs HS256.
AUTHENTICATION_GLOBAL_AUTH_TOKENSimnenhumadmin-tokenToken global administrativo.

Nao use segredos de desenvolvimento em producao. JWTs, chaves de API, tokens globais, URLs de banco e segredos nao devem ser escritos em logs.

WhatsApp e pareamento

VariavelObrigatoriaDefaultExemploDescricao
QRCODE_LIMITSimnenhum5Maximo de QR codes por tentativa de pareamento.
QRCODE_EXPIRATION_TIMESimnenhum30Validade de cada QR code, em segundos.
QRCODE_LIGHT_COLORSimnenhum#ffffffCor clara do QR PNG.
QRCODE_DARK_COLORSimnenhum#198754Cor escura do QR PNG.
CONFIG_SESSION_PHONE_CLIENTNaoDESKTOPCHROMETipo de plataforma exibido nos dispositivos vinculados do WhatsApp.
CONFIG_SESSION_PHONE_NAMENaoCodeChatCodeChatNome exibido nos dispositivos vinculados do WhatsApp.
WHATSAPP_PAIRING_TIMEOUTNao3m3mTimeout total do contexto de pareamento. Usa formato de duracao Go, como 30s, 3m, 1h.
WHATSAPP_AUTO_RECONNECTSimnenhumtrueHabilita restauracao automatica no startup.
WHATSAPP_STARTUP_RECONNECT_CONCURRENCYSimnenhum5Quantidade maxima de restauracoes paralelas.
WHATSAPP_CONNECT_TIMEOUTSimnenhum30Timeout inicial de conexao, em segundos.
WHATSAPP_RECONNECT_INITIAL_DELAYSimnenhum2Delay inicial de reconexao, em segundos.
WHATSAPP_RECONNECT_MAX_DELAYSimnenhum60Delay maximo de reconexao, em segundos.
WHATSAPP_PROFILE_PICTURE_TIMEOUTSimnenhum15Timeout para buscar foto de perfil, em segundos.
WHATSAPP_ADDRESS_CACHE_TTLNao168h168hTTL do cache de mapeamento entre endereco WhatsApp e JID canonico. Usa formato de duracao Go.

CONFIG_SESSION_PHONE_CLIENT e CONFIG_SESSION_PHONE_NAME sao aplicados uma vez durante a inicializacao, antes da criacao do SQL Store e dos clientes do Whatsmeow. Eles afetam novos vinculos; dispositivos ja vinculados nao sao reescritos automaticamente.

Webhooks

VariavelObrigatoriaDefaultExemploDescricao
WEBHOOK_GLOBAL_URLCondicionalvaziohttps://example.com/webhookURL global de webhook. Deve ser HTTP(S) absoluta. Obrigatoria quando WEBHOOK_GLOBAL_ENABLED=true.
WEBHOOK_GLOBAL_ENABLEDNaofalsefalseEnvia eventos reconhecidos de todas as instancias para WEBHOOK_GLOBAL_URL.

WebSocket

VariavelObrigatoriaDefaultExemploDescricao
WEBSOCKET_ENABLEDNaotruetrueHabilita rotas WebSocket de eventos e midia de chamadas.
WEBSOCKET_ALLOWED_ORIGINSNaovaziohttp://localhost:3000,http://localhost:5173Lista separada por virgulas de origens aceitas para browsers.
WEBSOCKET_ALLOW_EMPTY_ORIGINNaotruetruePermite clientes backend sem header Origin.
WEBSOCKET_PING_INTERVALNao25s25sIntervalo de ping. Usa formato de duracao Go.
WEBSOCKET_PONG_TIMEOUTNao60s60sPrazo maximo para receber pong. Usa formato de duracao Go.
WEBSOCKET_WRITE_TIMEOUTNao10s10sTimeout de escrita de frames. Usa formato de duracao Go.
WEBSOCKET_SEND_BUFFERNao256256Tamanho do buffer por cliente WebSocket. Em midia de chamadas, cliente lento pode ser desconectado quando esse buffer lota. Deve ser inteiro positivo.

Processamento de mensagens

VariavelObrigatoriaDefaultExemploDescricao
MESSAGE_PROCESSING_WORKERSNao44Maximo de jobs assincronos processados em paralelo.
MESSAGE_PROCESSING_QUEUE_SIZENao100100Tamanho maximo da fila em memoria.
MESSAGE_PROCESSING_TIMEOUTNao60s60sTimeout total de um job. Usa formato de duracao Go.
MESSAGE_GROUP_INFO_TIMEOUTNao30s30sTimeout para carregar informacoes de grupo durante mentionAll.
MESSAGE_SEND_TIMEOUTNao30s30sTimeout para presenca/delay/envio final pelo WhatsApp.

Message Batch

VariavelObrigatoriaDefaultExemploDescricao
MESSAGE_BATCH_WORKER_ENABLEDNaotruetrueHabilita o worker persistente de envio em lote.
MESSAGE_BATCH_WORKER_POLL_INTERVAL_MSNao10001000Intervalo de polling do worker/outbox, em milissegundos.
MESSAGE_BATCH_INSTANCE_RECHECK_INTERVAL_MSNao50005000Intervalo para reavaliar instancias em WAITING_FOR_INSTANCE.
MESSAGE_BATCH_MAX_DELAY_MSNao8640000086400000Maior options.delay.maxMs aceito em lotes. Default: 24 horas.
MESSAGE_BATCH_MAX_RECIPIENTSNao1000010000Limite de entradas em recipients antes de remover duplicidades.
MESSAGE_BATCH_SHUTDOWN_TIMEOUT_MSNao1500015000Tempo maximo para envios iniciados terminarem durante shutdown.
MESSAGE_BATCH_TIMEZONENaoUTCAmerica/Sao_PauloTimezone IANA default para agendas sem schedule.timezone.

Media pre-upload

VariavelObrigatoriaDefaultExemploDescricao
MEDIA_PRE_UPLOAD_MAX_FILE_SIZENao100MB100MBTamanho maximo aceito em POST /instance/:instance/media/uploads. Aceita inteiros com sufixos B, KB, MB, GB; sem sufixo, bytes.

Calls

Chamadas sao desligadas por padrao e tambem dependem da configuracao por instancia em GET/PUT /call/{instanceName}/config.

CALLS_ENABLED=true apenas libera o subsistema globalmente. Uma instancia sem configuracao de chamadas, ou com callsEnabled=false, fica em modo passivo: a API nao registra o provider de chamadas para a instancia, nao persiste historico, nao emite eventos e nao envia Answer, Reject ou Hangup. Nessa condicao, chamadas de voz/video continuam tocando e sendo atendidas normalmente no smartphone vinculado.

VariavelObrigatoriaDefaultExemploDescricao
CALLS_ENABLEDNaofalsefalseBloqueio mestre do subsistema de chamadas. Precisa estar true junto com callsEnabled=true na instancia para a API gerenciar chamadas.
CALLS_AUDIO_ENABLEDNaotruetrueBloqueio global para recursos de audio de chamadas.
CALLS_VIDEO_ENABLEDNaofalsefalseBloqueio global para recursos de video de chamadas.
CALLS_REACTIONS_ENABLEDNaotruetrueBloqueio global para reacoes em chamadas.
CALLS_DIAGNOSTICS_ENABLEDNaofalsefalseHabilita diagnosticos do provider quando a instancia tambem permite.
CALLS_MAX_CONCURRENT_GLOBALNao2020Limite global de chamadas ativas.
CALLS_MAX_CONCURRENT_PER_INSTANCENao11Limite de chamadas ativas por instancia.
CALLS_MAX_DURATION_SECONDSNao36003600Duracao maxima de chamada, em segundos.
CALLS_MEDIA_MAX_SIZE_MBNao100100Tamanho maximo de midia baixada para playback, em MB.
CALLS_MEDIA_DOWNLOAD_TIMEOUT_SECONDSNao6060Timeout de download de midia de chamada, em segundos.
CALLS_DIAGNOSTICS_DIRECTORYNao./data/call-diagnostics./data/call-diagnosticsDiretorio base dos diagnosticos do provider.
CALLS_ALLOW_PRIVATE_MEDIA_DOWNLOADSNaofalsefalsePermite downloads de midia a partir de hosts privados/loopback/link-local. Deixe false em producao.
CALLS_HANGUP_SEND_TIMEOUT_SECONDSNao55Tempo maximo para transmitir o <terminate> com contexto de sinalizacao independente.
CALLS_HANGUP_ACK_TIMEOUT_SECONDSNao55Tempo maximo aguardando o <ack class="call"> correlacionado pelo stanza ID do <terminate>.
CALLS_HANGUP_REMOTE_EVENT_TIMEOUT_SECONDSNao22Janela de observacao independente para o evento remoto de encerramento.
CALLS_HANGUP_CONFIRM_TIMEOUT_SECONDSNao--Alias legado, usado somente se CALLS_HANGUP_ACK_TIMEOUT_SECONDS nao estiver definido.
CALLS_HANGUP_RETRY_ENABLEDNaotruetrueHabilita retry limitado quando o envio do terminate falha antes de confirmacao.
CALLS_HANGUP_MAX_ATTEMPTSNao22Maximo de tentativas de envio do terminate.

Calls recording

Gravacao local e desligada por padrao. Mesmo com CALLS_RECORDING_ENABLED=true, cada instancia ainda precisa habilitar settings.recording.enabled=true.

VariavelObrigatoriaDefaultExemploDescricao
CALLS_RECORDING_ENABLEDNaofalsefalseBloqueio mestre global para gravacao de chamadas.
CALLS_RECORDING_DIRECTORYNao./data/calls./data/callsDiretorio base para arquivos de gravacao. A aplicacao cria, rejeita symlink e testa escrita no startup.
CALLS_RECORDING_DEFAULT_RETENTION_DAYSNao3030Retencao default aplicada quando a instancia nao define recording.retentionDays.
CALLS_RECORDING_MAX_RETENTION_DAYSNao365365Valor maximo aceito para recording.retentionDays por instancia.
CALLS_RECORDING_MAX_DISK_MBNao5120051200Limite global de uso do diretorio de gravacao, em MB.
CALLS_RECORDING_MIN_FREE_DISK_MBNao20482048Reserva minima de disco configurada para o subsistema de gravacao, em MB.
CALLS_RECORDING_MAX_FILE_MBNao20482048Tamanho maximo de cada arquivo de gravacao, em MB.
CALLS_RECORDING_WORKER_BUFFER_FRAMESNao256256Tamanho do buffer interno por gravador de trilha.
CALLS_RECORDING_CLOSE_TIMEOUT_SECONDSNao1515Timeout alvo para fechamento/finalizacao controlada, em segundos.
CALLS_RECORDING_PROCESSING_TIMEOUT_SECONDSNao300300Timeout alvo para processamento/finalizacao, em segundos.
CALLS_RECORDING_GENERATE_SHA256NaotruetrueGera checksum SHA-256 dos arquivos finalizados.
CALLS_RECORDING_GENERATE_FINAL_FILESNaotruetrueHabilita geracao de arquivos finais quando o pipeline suportar.
CALLS_RECORDING_KEEP_RAW_FILESNaotruetruePreserva arquivos brutos quando arquivos finais forem gerados.
CALLS_RECORDING_FFMPEG_ENABLEDNaotruetrueHabilita uso de FFmpeg para processamento final quando aplicavel.
CALLS_RECORDING_FFMPEG_PATHNaoffmpeg/usr/bin/ffmpegExecutavel FFmpeg. Validado com LookPath somente quando gravacao, arquivos finais e FFmpeg estao habilitados.
CALLS_RECORDING_FFPROBE_PATHNaoffprobe/usr/bin/ffprobeExecutavel FFprobe. Validado nas mesmas condicoes do FFmpeg.
CALLS_RECORDING_FFMPEG_MAX_CONCURRENTNao22Maximo de processamentos FFmpeg concorrentes.
CALLS_RECORDING_RETENTION_DAYSNao77Variavel legada ainda lida pelo codigo para compatibilidade. Para novas configuracoes, use CALLS_RECORDING_DEFAULT_RETENTION_DAYS e CALLS_RECORDING_MAX_RETENTION_DAYS.

Observacoes:

  • A gravacao cria arquivos apenas quando a API participa da midia da chamada.
  • Chamadas atendidas no smartphone ou em outro dispositivo vinculado ficam com recordingStatus=UNAVAILABLE e motivo media_owned_by_another_device.
  • Audio local e gravado como WAV PCM 16 kHz.
  • Video local e gravado como H.264 Annex-B bruto.

Variaveis auxiliares do Docker/Compose

As variaveis abaixo aparecem em .env.docker.example para build, imagem, Traefik ou ferramentas externas. Elas nao sao lidas por internal/config como configuracao da API:

VariavelExemploUso
GO_VERSION1.26Build/container.
APP_NAMEwhatsapp-go-apiMetadados da imagem/documentacao.
APP_VERSIONdevMetadados da imagem/documentacao.
APP_DESCRIPTIONAPI HTTP em Go...Metadados da imagem/documentacao.
APP_DEVELOPERCodeChatMetadados da imagem/documentacao.
APP_REPOSITORYvazioMetadados da imagem/documentacao.
BUILD_DATEvazioMetadados de build.
VCS_REFvazioMetadados de build.
VCS_URLvazioMetadados de build.
DOCKER_IMAGEcodechatbr/whatsapp-go-apiNome da imagem no Compose/build.
IMAGE_TAGlatestTag da imagem no Compose/build.
FFMPEG_PATH/usr/bin/ffmpegVariavel auxiliar legada de ambiente/container. O subsistema de chamadas usa CALLS_RECORDING_FFMPEG_PATH.
FFPROBE_PATH/usr/bin/ffprobeVariavel auxiliar legada de ambiente/container. O subsistema de chamadas usa CALLS_RECORDING_FFPROBE_PATH.
API_HOSTapi.codechat.localHost usado por configuracoes Traefik/Compose.
TRAEFIK_NETWORKtraefik_publicRede Traefik.
TRAEFIK_ENTRYPOINTwebsecureEntrypoint Traefik.
TRAEFIK_TLStrueTLS no Traefik.
TRAEFIK_CERT_RESOLVERletsencryptResolver de certificados do Traefik.
TRAEFIK_MIDDLEWARESvazioMiddlewares Traefik.
TRAEFIK_SERVER_TRANSPORTvazioServer transport Traefik.

Execucao local

cp .env.dev .env
go run ./cmd/api

Docker

Exemplo minimo de ambiente no Compose:

environment:
  DOCKER_ENV: "true"
  SERVER_PORT: "${SERVER_PORT:-8084}"
  LOG_LEVEL: "${LOG_LEVEL:-info}"
  DATABASE_URL: "${DATABASE_URL}"
  AUTHENTICATION_JWT_EXPIRES_IN: "${AUTHENTICATION_JWT_EXPIRES_IN:-3600}"
  AUTHENTICATION_JWT_SECRET: "${AUTHENTICATION_JWT_SECRET}"
  AUTHENTICATION_GLOBAL_AUTH_TOKEN: "${AUTHENTICATION_GLOBAL_AUTH_TOKEN}"
  QRCODE_LIMIT: "${QRCODE_LIMIT:-5}"
  QRCODE_EXPIRATION_TIME: "${QRCODE_EXPIRATION_TIME:-30}"
  QRCODE_LIGHT_COLOR: "${QRCODE_LIGHT_COLOR:-#ffffff}"
  QRCODE_DARK_COLOR: "${QRCODE_DARK_COLOR:-#198754}"
  WHATSAPP_AUTO_RECONNECT: "${WHATSAPP_AUTO_RECONNECT:-true}"
  WHATSAPP_STARTUP_RECONNECT_CONCURRENCY: "${WHATSAPP_STARTUP_RECONNECT_CONCURRENCY:-5}"
  WHATSAPP_CONNECT_TIMEOUT: "${WHATSAPP_CONNECT_TIMEOUT:-30}"
  WHATSAPP_RECONNECT_INITIAL_DELAY: "${WHATSAPP_RECONNECT_INITIAL_DELAY:-2}"
  WHATSAPP_RECONNECT_MAX_DELAY: "${WHATSAPP_RECONNECT_MAX_DELAY:-60}"
  WHATSAPP_PROFILE_PICTURE_TIMEOUT: "${WHATSAPP_PROFILE_PICTURE_TIMEOUT:-15}"

Se WHATSAPP_SESSION_STORE=sqlite, monte volume persistente para o diretorio do SQLite. Para o DSN default, persista /app/data ou o caminho equivalente data do diretorio de trabalho usado pela imagem.

Notas de seguranca

  • Nao publique .env real.
  • Nao use secrets de desenvolvimento em producao.
  • Mantenha CALLS_ALLOW_PRIVATE_MEDIA_DOWNLOADS=false em producao, exceto quando houver uma razao operacional clara.
  • Trate CALLS_DIAGNOSTICS_DIRECTORY e CALLS_RECORDING_DIRECTORY como diretorios sensiveis.
  • Restrinja acesso a backups que contenham DATABASE_URL, tokens, metadados de chamadas ou arquivos de gravacao.