# docker/web/app.conf — include do vhost do Apache (WHM) — ÚNICO acoplamento (spec 16)
#
# Instalar em AMBOS os escopos, trocando <acct> e <domain>:
#   /etc/apache2/conf.d/userdata/std/2_4/<acct>/<domain>/app.conf
#   /etc/apache2/conf.d/userdata/ssl/2_4/<acct>/<domain>/app.conf
#
# O gêmeo SSL recebe TAMBÉM `app-ssl.conf` (X-Forwarded-Proto + HSTS): os dois arquivos
# NÃO são cópias um do outro.
#
# Regras de ouro:
#  - só os DOIS caminhos de validação de certificado ficam fora do proxy (AutoSSL/DCV);
#    o resto de `/.well-known` (inclui `security.txt`, RFC 9116) PRECISA chegar ao app
#  - porta do app só em 127.0.0.1
#  - UM dono por header: compressão/CSP/ETag/XFO no `web` (Caddy); HSTS/TLS no Apache
#    (`app-ssl.conf`). Nunca emitir HSTS nos dois.
#  - nunca editar httpd.conf (rebuildhttpdconf sobrescreve) — usar userdata

<IfModule mod_proxy.c>
    ProxyPreserveHost On
    # Desafios de validação de certificado (o cPanel usa um ou outro conforme o DCV).
    # AutoSSL / Let's Encrypt:
    ProxyPass        /.well-known/acme-challenge !
    # DCV de CA comercial:
    ProxyPass        /.well-known/pki-validation !
    # `timeout` = prazo do proxy (request inteiro: enviar o corpo + esperar a resposta).
    # 300 s: o maior upload legítimo é PDF 100 MiB a 500 B/s (≈231 s) + 30 s de CPU do
    # script = 261 s. Com 60 s, o upload era cortado com 504 (defeito medido; D0).
    # `connectiontimeout=5` (abrir a conexão) e `RequestReadTimeout ... MinRate=500`
    # (defesa por taxa: mata quem envia <500 B/s) **permanecem** — a janela maior não
    # afrouxa a defesa, ela só deixa o cliente legítimo concluir.
    ProxyPass        / http://127.0.0.1:8080/ connectiontimeout=5 timeout=300 retry=0
    ProxyPassReverse / http://127.0.0.1:8080/
</IfModule>

# --- Falha segura do proxy (ADR-005) -------------------------------------------
# Se o include do `ProxyPass` não carregar (módulo ausente, rebuild do httpd.conf,
# erro de sintaxe), o Apache NÃO pode servir a raiz do clone — `.env`, `vendor/`,
# `storage/` e `composer.json`. Nega por padrão e libera só os dois diretórios de DCV
# (o `ProxyPass` vence para o app: é avaliado antes do filesystem).
<Directory /home/<acct>/public_html>
    AllowOverride None
    Options -Indexes
    Require all denied
</Directory>

<Directory /home/<acct>/public_html/.well-known/acme-challenge>
    AllowOverride None
    Options -Indexes
    Require all granted
</Directory>

<Directory /home/<acct>/public_html/.well-known/pki-validation>
    AllowOverride None
    Options -Indexes
    Require all granted
</Directory>

# TRACE não tem uso e amplia a superfície (XST). Métodos: só os do app.
TraceEnable Off

<IfModule mod_remoteip.c>
    RemoteIPHeader X-Forwarded-For
    RemoteIPInternalProxy 127.0.0.1
</IfModule>

# --- Camada 1: borda (ADR-021) -------------------------------------------------
# Volumétrico/slowloris e limites de corpo/URL/cabeçalho. O maior upload legítimo é PDF 100 MiB.
# 110 MiB (maior hard: PDF 100 MiB + multipart)
LimitRequestBody   115343360
LimitRequestLine   8190
LimitRequestFields 100
LimitRequestFieldSize 8190

<IfModule mod_reqtimeout.c>
    RequestReadTimeout header=10-20,MinRate=500 body=20,MinRate=500
</IfModule>

# Se o host tiver mod_qos/mod_evasive (WHM), aperta conexões/requisições por IP.
<IfModule mod_qos.c>
    QS_SrvMaxConnPerIP 50
    QS_SrvMaxConnClose 100
</IfModule>

<IfModule mod_evasive20.c>
    DOSPageCount 20
    DOSPageInterval 1
    DOSSiteCount 100
    DOSSiteInterval 1
    DOSBlockingPeriod 10
</IfModule>

# --- Server-wide (WHM → Include Editor, NÃO neste include) --------------------
# `ServerTokens Prod` e `ServerSignature Off` têm contexto de servidor: colocá-los aqui
# derruba o `apachectl configtest`. Aplicar no include global do WHM
# (pre/post_virtualhost_global.conf) e provar no canário com `curl -I` (sem versão).
