47 versãoões no total.

  1. 2.27.0

    Adicionado

    • Cloudflare - modo global (Flexible sempre ativo): toggle na pagina
      Cloudflare que trata qualquer dominio como atras da CF quando a conexao vem de
      um IP real do Cloudflare
      (cf_src) — pega o IP real do visitante e atende o
      SSL Flexible na :80 sem loop, sem precisar marcar dominio por dominio.
      Seguro contra spoof (so confia se a origem estiver nas faixas da CF). O
      "recusar acesso direto" (lockdown) continua por-dominio.

    Alterado / desempenho

    • Interface mais leve com o tempo aberta. Dashboard: polling pausa quando a
      aba esta em segundo plano (document.hidden) e retoma ao voltar
      (visibilitychange); graficos atualizam sem animacao (update('none'));
      historico passa de 2s para 10s.
    • Coleta de stats de 2s para 5s (menos escrita e ~2,5x menos linhas por
      consulta; o stats.db encolhe conforme os dados antigos saem pela retencao de
      3 dias) e SQLite em modo WAL (leitor/escritor nao se bloqueiam — menos
      travadas na interface sob concorrencia).
  2. 2.26.2

    Corrigido

    • Editar lista (dominio/UA) ainda quebrava ao abrir pelo menu (URL com hash).
      O bootstrap.bundle carrega depois do script da pagina; ao entrar via
      #dom-lists/#ua-lists, o showTabFromHash() chamava new bootstrap.Tab()
      no load, antes do bootstrap existir — a excecao interrompia o script e os mapas
      UA_LISTS/DOM_LISTS nunca eram atribuidos. Agora showTabFromHash ignora o
      bootstrap ausente e a ativacao da aba e adiada para o DOMContentLoaded.
  3. 2.26.1

    Corrigido

    • Botao "editar" de listas (dominio e UA) quebrado com Uncaught SyntaxError: Unexpected end of input. O onclick embutia {{ ...|tojson }}, cujas aspas
      duplas do JSON fechavam o atributo onclick="..." e cortavam o script. Agora
      os dados vao em mapas DOM_LISTS/UA_LISTS num <script> (contexto seguro) e
      o onclick passa apenas o nome da lista.
  4. 2.26.0

    Corrigido (outage de SSL)

    • Renovacao parcial nao publica mais nada = corrigido. Uma unica lineage com
      DNS morto fazia certbot renew sair != 0; renew_certs() e api_renew_certs()
      entao davam return ANTES de recombinar os pem, e nenhum dos certs renovados
      com sucesso era publicado no HAProxy (10 de 13 dominios serviram cert expirado
      por ate 4 dias). Agora a publicacao roda SEMPRE, por lineage, e falha parcial
      vira resultado parcial + aviso — nunca abort total.
    • Escrita atomica do pem: o open(pem,"w") truncava no lugar e so fazia
      chmod depois (janela com a chave privada 0644 e pem truncado visivel a um
      reload concorrente). Novo helper publish_cert_to_haproxy() escreve em tmp
      0600 no mesmo dir e faz os.replace atomico; pula se o conteudo nao mudou.

    Adicionado

    • Hooks de renovacao do certbot (causa raiz): deploy hook publica cada
      lineage renovada no HAProxy (atomico, idempotente, ignora certs de staging do
      --dry-run) e sinaliza; post hook valida haproxy -c e recarrega uma unica
      vez
      . Instalados pelo setup.sh e tambem auto-instalados no boot do painel
      (para servidores atualizados via rsync sem rerodar o setup), removendo o hook
      legado que recarregava a cada lineage. certbot.timer habilitado.
    • Painel de Certificados: dias restantes com destaque (vermelho expirado /
      amarelo < 15 dias), deteccao de drift (o HAProxy serve um cert mais velho
      que o certbot ja renovou em /etc/letsencrypt/live) com botao Republicar,
      e um botao geral Republicar do Let's Encrypt (recombina tudo sem chamar o
      certbot).
    • Deteccao de lineage orfa: dominios em /etc/letsencrypt/renewal que nao
      resolvem no DNS e/ou nao estao no HAProxy sao listados com acao de remover
      (certbot delete + apaga o pem) — e o gatilho que dispara o outage.

    Alterado

    • O bloco fullchain+privkey -> pem estava duplicado em 5 lugares (add_domain,
      generate_cert, renew_certs, api_generate_cert, api_renew_certs, provision);
      todos passam a usar o helper unico publish_cert_to_haproxy().
  5. 2.25.0

    Adicionado

    • Tela de Dominios: servidores do backend inline + busca. Cada dominio agora
      mostra os servidores do seu backend (nome, IP:porta, status, backup, maxconn)
      e permite adicionar / remover / habilitar-desabilitar servidores ali mesmo
      (reusa as APIs /api/backends/*), com aviso de que a edicao afeta todos os
      dominios que compartilham o backend. Novo campo de busca filtra os cards
      por hostname, backend ou IP.

    Corrigido / robustez

    • Atualizacao mais confiavel: apos o rsync, o reinicio do servico agora tem
      fallback (systemd-run e, se falhar, processo destacado) e loga se nao conseguir.
      A tela de Atualizacao passa a comparar a versao rodando vs. a versao em disco
      e, quando divergem (arquivos ja atualizados mas servico ainda na versao antiga),
      mostra um aviso "reinicie para concluir" com botao de Reiniciar agora — evita
      o caso em que o update aplica os arquivos mas o processo antigo continua servindo
      templates/codigo em cache.
  6. 2.24.0

    Adicionado

    • Gateway de saida (NAT) na pagina Configs: card para usar este servidor como
      gateway de internet das VMs da rede interna. Liga ip_forward + masquerade
      (nftables, table propria mp_gateway) da(s) rede(s) interna(s) escolhida(s)
      saindo pela interface publica, com opcao de firewall de encaminhamento
      (restrito/liberado). Persistente no boot (sysctl.d + unit systemd), validado
      com nft -c antes de aplicar, e reversivel (desativar remove tudo).
    • Menu Tuning renomeado para Configs.

    Corrigido

    • Loop de redirect (302) para IPs da whitelist: o http-request allow if trusted_src encerrava o processamento das regras antes dos set-header X-Forwarded-Proto https, entao o backend (ex.: Magento) achava que a
      requisicao era HTTP e redirecionava pra HTTPS em loop. Os cabecalhos
      X-Forwarded-Proto/Port/For + X-Real-IP agora sao setados dentro do bloco
      da whitelist, antes do allow — corrige o loop e tambem o IP real do cliente
      nos logs do backend para IPs confiaveis.
  7. 2.23.0

    Alterado

    • "Lista de confianca" virou "Whitelist" — e agora libera de tudo: IPs/faixas
      na whitelist passam sem qualquer bloqueio, limite ou inspecao (blocklist global,
      bloqueio temporario de IP, rate-limit, regras condicionais e WAF). Implementado
      como http-request allow if trusted_src no topo do ft_https (logo apos o bloco
      Cloudflare, com o IP real ja resolvido, e antes de todas as defesas). Antes so
      isentava rate-limit, bloqueio manual de IP e WAF. O escape para liberar
      Googlebot, webhooks de pagamento, monitoramento ou o proprio IP sem quebrar nada.
  8. 2.22.1

    Alterado

    • Trafego enxuto, Regras centraliza a seguranca: "Lista de confianca"
      (allowlist), "Blocklist global (IP/UA)" e "Limite de requisicoes por dominio"
      sairam da pagina Trafego e viraram abas/sub-itens da pagina Regras. A
      pagina Trafego fica so com o monitoramento ao vivo de requisicoes por IP e o
      bloqueio temporario de IP por dominio. O menu "Regras" passa a ter: Condicoes,
      Listas de UA, Listas de dominio, Lista de confianca, Blocklist global e Limite
      por dominio.
  9. 2.22.0

    Adicionado

    • Regras condicionais por dominio (estilo firewall da Cloudflare): pagina
      "Regras" com construtor de regra combinando condicoes por E (todas
      precisam bater) com opcao de negacao ("nao e"), e acao Bloquear (403),
      Permitir (excecao) ou Limitar (429). Tipos de condicao: pais
      (geoip), path/URL (comeca com / contem), User-Agent (substring),
      lista de UA e IP/CIDR. Varias regras por dominio sao avaliadas de cima
      pra baixo — a primeira que casar vence (Permitir acima de um bloqueio funciona
      como excecao). Cada regra tem contador de matches ao vivo e log por
      regra
      (via marcador no log-format do HAProxy), com modal listando IP, hora,
      status, metodo e path.
    • Listas de User-Agent reutilizaveis: listas nomeadas de UAs usadas nas
      regras pela condicao "Lista de UA" (casa se o UA contiver qualquer item).
    • Listas de dominio: agrupam varios dominios (apenas dominios ja
      configurados no HAProxy
      , via checkboxes) para servir de alvo de uma
      regra — a regra vale pra todos os dominios da lista de uma vez.
    • Pagina de fallback "Dominio nao disponivel" (host guard): acesso pelo IP
      do servidor, com Host ausente, ou por dominio apontado por DNS mas nao
      criado
      no HAProxy agora recebe uma pagina de erro branded do miniProxy (404)
      em vez de cair no default_backend e servir o vhost padrao do backend. A lista
      de dominios validos (valid_hosts.lst) e mantida em sincronia automaticamente;
      o desafio ACME continua liberado para emitir SSL de dominios novos.
    • Bypass ACME (/.well-known/acme-challenge/): allow no topo dos frontends
      para a emissao/renovacao de SSL nunca ser barrada por restricoes do dominio
      (blocklist, geoblock, rate-limit, WAF, regras).
    • Menu lateral reorganizado: secoes Infraestrutura / Seguranca / Sistema;
      "Regras" colapsavel com sub-itens (Condicoes, Listas de UA, Listas de dominio)
      e secao "Sistema" colapsavel para ocupar menos espaco; "Sair" fixo no rodape.
      Card "Regras" na Dashboard com o numero de regras ativas.

    Alterado

    • /traffic simplificado: "Geoblock por dominio", "Bloqueio de User-Agent por
      dominio" e "Limite de requisicoes por User-Agent por dominio" sairam da pagina
      Trafego e passaram a ser feitos pela pagina Regras (condicoes pais / UA /
      lista de UA + acoes Bloquear/Limitar), evitando duplicidade.
  10. 2.21.0

    Adicionado

    • Contadores de bloqueio na Dashboard: card "Bloqueios" com o total ativo e
      detalhamento (IP + User-Agent global/por dominio + bloqueios temporarios),
      linkando para a pagina Bloqueios; e card "Rate-limit UA" com o numero de regras
      de throttle por User-Agent, linkando para Trafego. Calculo leve (le os arquivos
      de estado, sem varrer log).
  11. 2.20.0

    Adicionado

    • Pagina "Bloqueios" (log dos bloqueios), com duas visoes:
    • Historico de acoes (auditoria): registra cada bloqueio/desbloqueio feito
      pelo painel ou pela API — quando, acao, alvo, detalhe e por quem. Cobre IP,
      User-Agent (global e por dominio), import de lista e bloqueio temporario de
      IP. Inclui itens ja removidos. Guardado em /etc/haproxy/blocklist-audit.jsonl
      (auto-poda nas ultimas 5000 linhas), com filtro de busca.
    • Eventos 403: requisicoes que foram barradas de verdade (status 403),
      lidas do log de acesso do HAProxy (IP, dominio, metodo, path), com busca e
      modo ao vivo. (O log-format nao inclui User-Agent — avisado na tela.)
    • Limite de requisicoes por User-Agent (por dominio): throttle (429) de um
      User-Agent num dominio, com contador agregado por UA (todos os IPs somam),
      casando por substring em minusculas. Stick-table string por dominio (sc2),
      separado do rate-limit por IP (sc1) — dá pra ter os dois no mesmo dominio.
      IPs da lista de confianca sao isentos.
  12. 2.19.0

    Adicionado

    • Tema claro com alternancia: botao no rodape da barra lateral troca entre
      claro/escuro; preferencia salva no navegador (localStorage) e aplicada antes
      de pintar a tela (sem flash). O logo troca junto com o tema. Paleta clara via
      variaveis CSS (data-bs-theme="light"); caixas de terminal/log seguem escuras
      nos dois temas de proposito.
    • Bloqueio de User-Agent por dominio (importar lista): na pagina "Trafego",
      cola-se uma lista de User-Agents (1 por linha, ex.: do .htaccess) e escolhe-se
      os alvos — "Todos os dominios" (blocklist global) e/ou dominios especificos.
      Casa por substring em minusculas (ahrefsbot pega AhrefsBot/7.0). Cada
      dominio tem seu proprio mapa (/etc/haproxy/ua-block/<dominio>.map) e uma regra
      de deny que casa host + UA; a lista bloqueada aparece por dominio, com remocao
      individual. Remover o ultimo UA de um dominio apaga o mapa e a regra some.
  13. 2.18.0

    Adicionado

    • Blocklist global de IP e User-Agent (aplicada em ft_http e ft_https):
    • API REST sob /haproxy-admin/api/blocklist/ip e /blocklist/ua
      (GET lista, POST bloqueia, DELETE desbloqueia; resposta {"ok":...}).
      Autenticada (sessao do painel ou HTTP Basic para automacao).
    • Efeito imediato sem reload via Runtime API (add/del map no socket
      admin) + persistencia nos arquivos .map; metadados (motivo/timestamp)
      num sidecar /etc/haproxy/blocklist-meta.json.
    • IP casa endereco/CIDR (map_ip); User-Agent casa substring em minusculas
      (map_sub, ex.: ahrefsbot pega AhrefsBot/7.0).
    • Bloco de deny inserido nos frontends apos o Cloudflare (src ja e o IP real
      por tras da CF) e antes dos use_backend; instalado sob demanda no primeiro
      bloqueio (um reload) e depois so runtime. Maps criados no boot.
    • Validacao: IP via ipaddress.ip_network; UA normalizado (minusculas,
      strip, <=200 chars, sem espacos/quebras); entrada sanitizada antes do socket.
    • Tela na pagina "Trafego" (secao "Blocklist global"): listas de IP e
      User-Agent com motivo, adicao e remocao, reusando o mesmo backend da API.
  14. 2.17.0

    Adicionado

    • Nova pagina "Logs" — central unica de todos os logs gerados no servidor:
    • Visualizador ao vivo com dropdown de fontes: acesso HTTP do HAProxy,
      WAF Coraza (matches + auditoria), servico do painel e do HAProxy (journald),
      e um item por proxy TCP quando a separacao esta ligada. Filtro de texto,
      nº de linhas e modo "ao vivo". Cai para o journald quando o arquivo nao
      existe (servidores journald-only).
    • Retencao por fonte: edita os arquivos reais do logrotate
      (/etc/logrotate.d/*) — dias a guardar + compressao on/off — validando com
      logrotate -d antes de gravar. Lista os arquivos de cada fonte (inclui os
      rotacionados .gz) com tamanho e download (restrito aos diretorios de
      log, com protecao contra path traversal), e botao "Rotacionar agora".
    • Separacao de logs TCP por porta: cada listen tcp_<nome> recebe
      log-tag haproxytcp-<nome> e uma regra rsyslog roteia por programname
      para /var/log/haproxy-tcp/<nome>.log (antes ficavam misturados no
      haproxy.log). Ativacao/desativacao reversivel pela interface, com
      validacao (haproxy -c) e reload.

    Corrigido / robustez

    • Detecta servidores journald-only (sem rsyslog instalado): a separacao de
      logs TCP se recusa a ativar com mensagem clara em vez de reportar sucesso
      falso, e a pagina orienta a usar o journald do servico haproxy.
  15. 2.16.0

    Adicionado

    • Nova pagina "Trafego" — modulo de observabilidade e defesa por dominio:
    • Requisicoes por IP: lista os IPs que mais acessaram cada dominio nos
      ultimos 30s/60s/120s/5min (lido do log de acesso do HAProxy, independente
      do audit.log do WAF), com taxa normalizada em req/10s e atualizacao viva.
    • Bloqueio temporario de IP por dominio: bloqueia um ou varios IPs/CIDRs
      num dominio por 10min/1h/6h/24h/7 dias. Expira sozinho via ACL date() do
      HAProxy (sem job de desbloqueio). Lista de bloqueios ativos com contagem
      regressiva + desbloqueio manual, e historico das ultimas 24h.
    • Limite de requisicoes por dominio (rate-limit): define req/10s por IP
      por dominio (stick-table dedicado por dominio, isolado dos demais); quem
      passa do limiar recebe 429 automaticamente.
    • Geoblock por dominio (permitir-so): aceita so visitantes dos paises
      escolhidos; o resto recebe 403. Seletor de paises com busca e checkboxes
      (231 paises). Faixas de IP (IPv4+IPv6) baixadas do ipdeny.com e cacheadas
      em /etc/haproxy/geoip/, com botao de atualizar.
    • Lista de confianca (allowlist): IPs/prefixos isentos de rate-limit,
      bloqueio de IP e geoblock — o escape para liberar Googlebot, webhooks de
      pagamento, pixel do Facebook etc. sem quebrar SEO/checkout.
    • WAF - exclusoes por path: exclusoes globais por prefixo de URI
      (global_path_exclusions, sem checar dominio) e exibicao/remocao das
      exclusoes por dominio+path na interface, alem de contador de eventos
      bloqueados recentes.

    Alterado

    • Estado dos novos recursos em arquivos proprios: /etc/haproxy/ip-blocks.json,
      rate-limits.json, geoblock.json, traffic-allowlist.lst. Todos os blocos
      na haproxy.cfg sao gerenciados entre marcadores, validados com haproxy -c
      e aplicados com backup + reload gracioso.
    • Genericizacao de plataforma: removidas as mencoes de "CWP" e "Magento" da
      interface e do codigo (rotulos, comentarios e exemplos passam a ser
      neutros), para o painel servir a qualquer plataforma. Os nomes de
      backend/servidor da haproxy.cfg do usuario nao sao tocados.
  16. 2.15.0
    • Auto-atualizacao via minirepo: aba Atualizacao com check de versao e
      update remoto (baixa pacote, aplica com rsync preservando dados, reinicia).
  17. 2.14.0
    • Rebrand para miniProxy (logos, favicon e nome em toda a interface).