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
| Variavel | Exemplo | Descricao |
|---|---|---|
DATABASE_URL | postgres://postgres:postgres@localhost:5432/whatsapp?sslmode=disable | String de conexao do PostgreSQL principal da API. |
AUTHENTICATION_JWT_EXPIRES_IN | 3600 | Expiracao do JWT em segundos. Use 0 para gerar tokens sem claim exp. Valores negativos sao invalidos. |
AUTHENTICATION_JWT_SECRET | change-me | Chave secreta usada para assinar JWTs HS256. Nao pode ser vazia. |
AUTHENTICATION_GLOBAL_AUTH_TOKEN | change-me-global-token | Token global usado para criar/listar instancias e rotas administrativas que aceitam chave global. Nao pode ser vazio. |
QRCODE_LIMIT | 5 | Numero maximo de QR codes servidos durante uma tentativa de pareamento. Deve ser inteiro positivo. |
QRCODE_EXPIRATION_TIME | 30 | Tempo de vida de cada QR code, em segundos. Deve ser inteiro positivo. |
QRCODE_LIGHT_COLOR | #ffffff | Cor clara do QR PNG. Deve estar no formato #RRGGBB. |
QRCODE_DARK_COLOR | #198754 | Cor escura do QR PNG. Deve estar no formato #RRGGBB. |
WHATSAPP_AUTO_RECONNECT | true | Habilita restauracao automatica das sessoes que deveriam estar online. Valor aceito: true ou false. |
WHATSAPP_STARTUP_RECONNECT_CONCURRENCY | 5 | Numero maximo de sessoes WhatsApp restauradas em paralelo. Deve ser inteiro positivo. |
WHATSAPP_CONNECT_TIMEOUT | 30 | Timeout inicial da conexao WhatsApp, em segundos. Deve ser inteiro positivo. |
WHATSAPP_RECONNECT_INITIAL_DELAY | 2 | Backoff inicial de reconexao, em segundos. Deve ser inteiro positivo. |
WHATSAPP_RECONNECT_MAX_DELAY | 60 | Backoff maximo de reconexao, em segundos. Deve ser maior ou igual a WHATSAPP_RECONNECT_INITIAL_DELAY. |
WHATSAPP_PROFILE_PICTURE_TIMEOUT | 15 | Timeout para buscar foto de perfil, em segundos. Deve ser inteiro positivo. |
Servidor e execucao
| Variavel | Obrigatoria | Default | Exemplo | Descricao |
|---|---|---|---|---|
DOCKER_ENV | Nao | false | true | Quando true, impede o carregamento automatico de .env. Valores aceitos: vazio, false, true. |
SERVER_PORT | Nao | 8084 | 8084 | Porta do listener HTTP. Informe apenas o numero, sem :. |
LOG_LEVEL | Nao | info | trace | Nivel do Zerolog. Valores aceitos pelo Zerolog: trace, debug, info, warn, error, fatal, panic, disabled. |
TZ | Nao | controlado pelo SO/container | America/Sao_Paulo | Nao e lida diretamente por internal/config; e usada pelo ambiente/container para timezone do processo. |
TMPDIR | Nao | controlado pelo SO/container | /app/tmp | Nao e lida diretamente por internal/config; pode ser usada pelo SO e bibliotecas para arquivos temporarios. |
Banco de dados
| Variavel | Obrigatoria | Default | Exemplo | Descricao |
|---|---|---|---|---|
DATABASE_URL | Sim | nenhum | postgres://... | Banco principal da API. Repositorios e migrations usam sempre este banco. |
DATABASE_SAVE_DATA_NEW_MESSAGE | Nao | true | true | Persiste mensagens recebidas em Message. |
DATABASE_SAVE_MESSAGE_UPDATE | Nao | false | false | Persiste recibos/eventos de atualizacao em MessageUpdate. |
DATABASE_SAVE_DATA_CONTACTS | Nao | false | false | Persiste sincronizacao e eventos de contatos em Contact. |
Sessoes do Whatsmeow
| Variavel | Obrigatoria | Default | Exemplo | Descricao |
|---|---|---|---|---|
WHATSAPP_SESSION_STORE | Nao | postgres | sqlite | Backend usado pelo whatsmeow para sessoes/dispositivos. Valores aceitos: sqlite, postgres. |
WHATSAPP_SESSION_SQLITE_DSN | Nao | file:./data/whatsmeow.db?_foreign_keys=on | file:./data/whatsmeow.db?_foreign_keys=on | DSN do SQLite quando WHATSAPP_SESSION_STORE=sqlite. |
WHATSAPP_SESSION_POSTGRES_URL | Nao | vazio | postgres://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
| Variavel | Obrigatoria | Default | Exemplo | Descricao |
|---|---|---|---|---|
AUTHENTICATION_JWT_EXPIRES_IN | Sim | nenhum | 3600 | Expiracao do JWT em segundos. 0 remove a claim exp. |
AUTHENTICATION_JWT_SECRET | Sim | nenhum | strong-secret | Segredo para assinar JWTs HS256. |
AUTHENTICATION_GLOBAL_AUTH_TOKEN | Sim | nenhum | admin-token | Token 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
| Variavel | Obrigatoria | Default | Exemplo | Descricao |
|---|---|---|---|---|
QRCODE_LIMIT | Sim | nenhum | 5 | Maximo de QR codes por tentativa de pareamento. |
QRCODE_EXPIRATION_TIME | Sim | nenhum | 30 | Validade de cada QR code, em segundos. |
QRCODE_LIGHT_COLOR | Sim | nenhum | #ffffff | Cor clara do QR PNG. |
QRCODE_DARK_COLOR | Sim | nenhum | #198754 | Cor escura do QR PNG. |
CONFIG_SESSION_PHONE_CLIENT | Nao | DESKTOP | CHROME | Tipo de plataforma exibido nos dispositivos vinculados do WhatsApp. |
CONFIG_SESSION_PHONE_NAME | Nao | CodeChat | CodeChat | Nome exibido nos dispositivos vinculados do WhatsApp. |
WHATSAPP_PAIRING_TIMEOUT | Nao | 3m | 3m | Timeout total do contexto de pareamento. Usa formato de duracao Go, como 30s, 3m, 1h. |
WHATSAPP_AUTO_RECONNECT | Sim | nenhum | true | Habilita restauracao automatica no startup. |
WHATSAPP_STARTUP_RECONNECT_CONCURRENCY | Sim | nenhum | 5 | Quantidade maxima de restauracoes paralelas. |
WHATSAPP_CONNECT_TIMEOUT | Sim | nenhum | 30 | Timeout inicial de conexao, em segundos. |
WHATSAPP_RECONNECT_INITIAL_DELAY | Sim | nenhum | 2 | Delay inicial de reconexao, em segundos. |
WHATSAPP_RECONNECT_MAX_DELAY | Sim | nenhum | 60 | Delay maximo de reconexao, em segundos. |
WHATSAPP_PROFILE_PICTURE_TIMEOUT | Sim | nenhum | 15 | Timeout para buscar foto de perfil, em segundos. |
WHATSAPP_ADDRESS_CACHE_TTL | Nao | 168h | 168h | TTL 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
| Variavel | Obrigatoria | Default | Exemplo | Descricao |
|---|---|---|---|---|
WEBHOOK_GLOBAL_URL | Condicional | vazio | https://example.com/webhook | URL global de webhook. Deve ser HTTP(S) absoluta. Obrigatoria quando WEBHOOK_GLOBAL_ENABLED=true. |
WEBHOOK_GLOBAL_ENABLED | Nao | false | false | Envia eventos reconhecidos de todas as instancias para WEBHOOK_GLOBAL_URL. |
WebSocket
| Variavel | Obrigatoria | Default | Exemplo | Descricao |
|---|---|---|---|---|
WEBSOCKET_ENABLED | Nao | true | true | Habilita rotas WebSocket de eventos e midia de chamadas. |
WEBSOCKET_ALLOWED_ORIGINS | Nao | vazio | http://localhost:3000,http://localhost:5173 | Lista separada por virgulas de origens aceitas para browsers. |
WEBSOCKET_ALLOW_EMPTY_ORIGIN | Nao | true | true | Permite clientes backend sem header Origin. |
WEBSOCKET_PING_INTERVAL | Nao | 25s | 25s | Intervalo de ping. Usa formato de duracao Go. |
WEBSOCKET_PONG_TIMEOUT | Nao | 60s | 60s | Prazo maximo para receber pong. Usa formato de duracao Go. |
WEBSOCKET_WRITE_TIMEOUT | Nao | 10s | 10s | Timeout de escrita de frames. Usa formato de duracao Go. |
WEBSOCKET_SEND_BUFFER | Nao | 256 | 256 | Tamanho 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
| Variavel | Obrigatoria | Default | Exemplo | Descricao |
|---|---|---|---|---|
MESSAGE_PROCESSING_WORKERS | Nao | 4 | 4 | Maximo de jobs assincronos processados em paralelo. |
MESSAGE_PROCESSING_QUEUE_SIZE | Nao | 100 | 100 | Tamanho maximo da fila em memoria. |
MESSAGE_PROCESSING_TIMEOUT | Nao | 60s | 60s | Timeout total de um job. Usa formato de duracao Go. |
MESSAGE_GROUP_INFO_TIMEOUT | Nao | 30s | 30s | Timeout para carregar informacoes de grupo durante mentionAll. |
MESSAGE_SEND_TIMEOUT | Nao | 30s | 30s | Timeout para presenca/delay/envio final pelo WhatsApp. |
Message Batch
| Variavel | Obrigatoria | Default | Exemplo | Descricao |
|---|---|---|---|---|
MESSAGE_BATCH_WORKER_ENABLED | Nao | true | true | Habilita o worker persistente de envio em lote. |
MESSAGE_BATCH_WORKER_POLL_INTERVAL_MS | Nao | 1000 | 1000 | Intervalo de polling do worker/outbox, em milissegundos. |
MESSAGE_BATCH_INSTANCE_RECHECK_INTERVAL_MS | Nao | 5000 | 5000 | Intervalo para reavaliar instancias em WAITING_FOR_INSTANCE. |
MESSAGE_BATCH_MAX_DELAY_MS | Nao | 86400000 | 86400000 | Maior options.delay.maxMs aceito em lotes. Default: 24 horas. |
MESSAGE_BATCH_MAX_RECIPIENTS | Nao | 10000 | 10000 | Limite de entradas em recipients antes de remover duplicidades. |
MESSAGE_BATCH_SHUTDOWN_TIMEOUT_MS | Nao | 15000 | 15000 | Tempo maximo para envios iniciados terminarem durante shutdown. |
MESSAGE_BATCH_TIMEZONE | Nao | UTC | America/Sao_Paulo | Timezone IANA default para agendas sem schedule.timezone. |
Media pre-upload
| Variavel | Obrigatoria | Default | Exemplo | Descricao |
|---|---|---|---|---|
MEDIA_PRE_UPLOAD_MAX_FILE_SIZE | Nao | 100MB | 100MB | Tamanho 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.
| Variavel | Obrigatoria | Default | Exemplo | Descricao |
|---|---|---|---|---|
CALLS_ENABLED | Nao | false | false | Bloqueio mestre do subsistema de chamadas. Precisa estar true junto com callsEnabled=true na instancia para a API gerenciar chamadas. |
CALLS_AUDIO_ENABLED | Nao | true | true | Bloqueio global para recursos de audio de chamadas. |
CALLS_VIDEO_ENABLED | Nao | false | false | Bloqueio global para recursos de video de chamadas. |
CALLS_REACTIONS_ENABLED | Nao | true | true | Bloqueio global para reacoes em chamadas. |
CALLS_DIAGNOSTICS_ENABLED | Nao | false | false | Habilita diagnosticos do provider quando a instancia tambem permite. |
CALLS_MAX_CONCURRENT_GLOBAL | Nao | 20 | 20 | Limite global de chamadas ativas. |
CALLS_MAX_CONCURRENT_PER_INSTANCE | Nao | 1 | 1 | Limite de chamadas ativas por instancia. |
CALLS_MAX_DURATION_SECONDS | Nao | 3600 | 3600 | Duracao maxima de chamada, em segundos. |
CALLS_MEDIA_MAX_SIZE_MB | Nao | 100 | 100 | Tamanho maximo de midia baixada para playback, em MB. |
CALLS_MEDIA_DOWNLOAD_TIMEOUT_SECONDS | Nao | 60 | 60 | Timeout de download de midia de chamada, em segundos. |
CALLS_DIAGNOSTICS_DIRECTORY | Nao | ./data/call-diagnostics | ./data/call-diagnostics | Diretorio base dos diagnosticos do provider. |
CALLS_ALLOW_PRIVATE_MEDIA_DOWNLOADS | Nao | false | false | Permite downloads de midia a partir de hosts privados/loopback/link-local. Deixe false em producao. |
CALLS_HANGUP_SEND_TIMEOUT_SECONDS | Nao | 5 | 5 | Tempo maximo para transmitir o <terminate> com contexto de sinalizacao independente. |
CALLS_HANGUP_ACK_TIMEOUT_SECONDS | Nao | 5 | 5 | Tempo maximo aguardando o <ack class="call"> correlacionado pelo stanza ID do <terminate>. |
CALLS_HANGUP_REMOTE_EVENT_TIMEOUT_SECONDS | Nao | 2 | 2 | Janela de observacao independente para o evento remoto de encerramento. |
CALLS_HANGUP_CONFIRM_TIMEOUT_SECONDS | Nao | - | - | Alias legado, usado somente se CALLS_HANGUP_ACK_TIMEOUT_SECONDS nao estiver definido. |
CALLS_HANGUP_RETRY_ENABLED | Nao | true | true | Habilita retry limitado quando o envio do terminate falha antes de confirmacao. |
CALLS_HANGUP_MAX_ATTEMPTS | Nao | 2 | 2 | Maximo 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.
| Variavel | Obrigatoria | Default | Exemplo | Descricao |
|---|---|---|---|---|
CALLS_RECORDING_ENABLED | Nao | false | false | Bloqueio mestre global para gravacao de chamadas. |
CALLS_RECORDING_DIRECTORY | Nao | ./data/calls | ./data/calls | Diretorio base para arquivos de gravacao. A aplicacao cria, rejeita symlink e testa escrita no startup. |
CALLS_RECORDING_DEFAULT_RETENTION_DAYS | Nao | 30 | 30 | Retencao default aplicada quando a instancia nao define recording.retentionDays. |
CALLS_RECORDING_MAX_RETENTION_DAYS | Nao | 365 | 365 | Valor maximo aceito para recording.retentionDays por instancia. |
CALLS_RECORDING_MAX_DISK_MB | Nao | 51200 | 51200 | Limite global de uso do diretorio de gravacao, em MB. |
CALLS_RECORDING_MIN_FREE_DISK_MB | Nao | 2048 | 2048 | Reserva minima de disco configurada para o subsistema de gravacao, em MB. |
CALLS_RECORDING_MAX_FILE_MB | Nao | 2048 | 2048 | Tamanho maximo de cada arquivo de gravacao, em MB. |
CALLS_RECORDING_WORKER_BUFFER_FRAMES | Nao | 256 | 256 | Tamanho do buffer interno por gravador de trilha. |
CALLS_RECORDING_CLOSE_TIMEOUT_SECONDS | Nao | 15 | 15 | Timeout alvo para fechamento/finalizacao controlada, em segundos. |
CALLS_RECORDING_PROCESSING_TIMEOUT_SECONDS | Nao | 300 | 300 | Timeout alvo para processamento/finalizacao, em segundos. |
CALLS_RECORDING_GENERATE_SHA256 | Nao | true | true | Gera checksum SHA-256 dos arquivos finalizados. |
CALLS_RECORDING_GENERATE_FINAL_FILES | Nao | true | true | Habilita geracao de arquivos finais quando o pipeline suportar. |
CALLS_RECORDING_KEEP_RAW_FILES | Nao | true | true | Preserva arquivos brutos quando arquivos finais forem gerados. |
CALLS_RECORDING_FFMPEG_ENABLED | Nao | true | true | Habilita uso de FFmpeg para processamento final quando aplicavel. |
CALLS_RECORDING_FFMPEG_PATH | Nao | ffmpeg | /usr/bin/ffmpeg | Executavel FFmpeg. Validado com LookPath somente quando gravacao, arquivos finais e FFmpeg estao habilitados. |
CALLS_RECORDING_FFPROBE_PATH | Nao | ffprobe | /usr/bin/ffprobe | Executavel FFprobe. Validado nas mesmas condicoes do FFmpeg. |
CALLS_RECORDING_FFMPEG_MAX_CONCURRENT | Nao | 2 | 2 | Maximo de processamentos FFmpeg concorrentes. |
CALLS_RECORDING_RETENTION_DAYS | Nao | 7 | 7 | Variavel 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=UNAVAILABLEe motivomedia_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:
| Variavel | Exemplo | Uso |
|---|---|---|
GO_VERSION | 1.26 | Build/container. |
APP_NAME | whatsapp-go-api | Metadados da imagem/documentacao. |
APP_VERSION | dev | Metadados da imagem/documentacao. |
APP_DESCRIPTION | API HTTP em Go... | Metadados da imagem/documentacao. |
APP_DEVELOPER | CodeChat | Metadados da imagem/documentacao. |
APP_REPOSITORY | vazio | Metadados da imagem/documentacao. |
BUILD_DATE | vazio | Metadados de build. |
VCS_REF | vazio | Metadados de build. |
VCS_URL | vazio | Metadados de build. |
DOCKER_IMAGE | codechatbr/whatsapp-go-api | Nome da imagem no Compose/build. |
IMAGE_TAG | latest | Tag da imagem no Compose/build. |
FFMPEG_PATH | /usr/bin/ffmpeg | Variavel auxiliar legada de ambiente/container. O subsistema de chamadas usa CALLS_RECORDING_FFMPEG_PATH. |
FFPROBE_PATH | /usr/bin/ffprobe | Variavel auxiliar legada de ambiente/container. O subsistema de chamadas usa CALLS_RECORDING_FFPROBE_PATH. |
API_HOST | api.codechat.local | Host usado por configuracoes Traefik/Compose. |
TRAEFIK_NETWORK | traefik_public | Rede Traefik. |
TRAEFIK_ENTRYPOINT | websecure | Entrypoint Traefik. |
TRAEFIK_TLS | true | TLS no Traefik. |
TRAEFIK_CERT_RESOLVER | letsencrypt | Resolver de certificados do Traefik. |
TRAEFIK_MIDDLEWARES | vazio | Middlewares Traefik. |
TRAEFIK_SERVER_TRANSPORT | vazio | Server transport Traefik. |
Execucao local
cp .env.dev .env
go run ./cmd/apiDocker
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
.envreal. - Nao use secrets de desenvolvimento em producao.
- Mantenha
CALLS_ALLOW_PRIVATE_MEDIA_DOWNLOADS=falseem producao, exceto quando houver uma razao operacional clara. - Trate
CALLS_DIAGNOSTICS_DIRECTORYeCALLS_RECORDING_DIRECTORYcomo diretorios sensiveis. - Restrinja acesso a backups que contenham
DATABASE_URL, tokens, metadados de chamadas ou arquivos de gravacao.
