mirror of
https://github.com/melgarafael/DeskcommCRM.git
synced 2026-10-02 01:28:34 +08:00
O Caddy reordena as diretivas pela ordem padrao dele, e nessa ordem `respond`
vem DEPOIS de `reverse_proxy`: o catch-all atendia primeiro e o 403 nunca era
alcancado. Medido apos o deploy — o POST sem assinatura continuava respondendo
200 {"accepted":true}.
Dentro de um bloco `route`, vale a ordem escrita.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014eDYqCWr7Zrs99vLjqGj8r
46 lines
1.7 KiB
Caddyfile
46 lines
1.7 KiB
Caddyfile
# Caddy — reverse proxy + HTTPS automático (Let's Encrypt) para o DeskcommCRM.
|
|
# HTTP→HTTPS e emissão/renovação de certificado são automáticos.
|
|
{
|
|
email {$ACME_EMAIL}
|
|
}
|
|
|
|
{$DOMAIN} {
|
|
encode gzip
|
|
|
|
# `route` é obrigatório aqui: fora dele o Caddy reordena as diretivas pela
|
|
# ordem padrão dele, na qual `respond` vem DEPOIS de `reverse_proxy` — o
|
|
# catch-all atendia primeiro e o 403 abaixo nunca era alcançado (medido: o
|
|
# POST sem assinatura ainda respondia 200). Dentro de `route`, vale a ordem
|
|
# escrita.
|
|
route {
|
|
# O webhook GLOBAL do WAHA (sem token na URL) não é publicado na internet.
|
|
#
|
|
# Nesta stack o WAHA fala com o app pela rede interna do Docker
|
|
# (http://app:3000/api/v1/webhooks/waha), então essa rota nunca precisou ser
|
|
# alcançável de fora — e estando aberta, qualquer pessoa que soubesse o
|
|
# endereço injetava mensagem falsa no CRM, escolhia o remetente e fazia o
|
|
# WhatsApp do dono responder para um número arbitrário (queimando o
|
|
# orçamento de IA e arriscando banimento do número).
|
|
#
|
|
# Quem roda o WAHA em OUTRO servidor deve usar a rota por tenant,
|
|
# /api/v1/webhooks/waha/<token>, que carrega um token imprevisível na URL e
|
|
# continua pública — é a variante canônica para essa topologia.
|
|
@waha_global path /api/v1/webhooks/waha
|
|
respond @waha_global 403
|
|
|
|
# O runner de agente de IA (ToolLoop) pode levar até ~5min por requisição.
|
|
# Timeout estendido só nessa rota pra o proxy não cortar a resposta longa.
|
|
@agentrun path /api/internal/agents/run*
|
|
reverse_proxy @agentrun app:3000 {
|
|
transport http {
|
|
read_timeout 320s
|
|
write_timeout 320s
|
|
}
|
|
}
|
|
|
|
# Todo o resto do app.
|
|
reverse_proxy app:3000
|
|
}
|
|
}
|