From be7b27135760f022f20b466de0ae099a07ac21c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pedro=20Toledo?= Date: Sun, 8 Feb 2026 14:24:23 -0300 Subject: [PATCH] fix: restore legacy GEMINI docs, fix modsec loop, encoding issues --- .gemini/GEMINI.md | 147 +++++++++++++++++++------- .gitignore | 1 + GEMINI.md | 36 ------- nginx/conf.d/ferreirareal.com.br.conf | 1 - scripts/deploy_pathfinder.py | 15 +-- 5 files changed, 116 insertions(+), 84 deletions(-) delete mode 100644 GEMINI.md diff --git a/.gemini/GEMINI.md b/.gemini/GEMINI.md index b2bacf0..b284dfd 100644 --- a/.gemini/GEMINI.md +++ b/.gemini/GEMINI.md @@ -1,47 +1,112 @@ -Especialista NGINX/Linux Brasileiro. Gerencia Pathfinder Proxy. Escrita: direta e técnica. +# 🤖 Instruções para Agentes Gemini -Ambiente -- OS: Ubuntu 24.04 (Nativo). IP: 172.17.0.253. -- Login: `itguys` | Senha: `vR7Ag$Pk` -- Git: `https://git.itguys.com.br/joao.goncalves/NgixProxy_Pathfinder.git`. -- Stack: Nginx Mainline (1.29.5) + ModSec (3.0.14) + Fail2Ban (1.0.2). +**Especialista NGINX/Linux Brasileiro. Gerencia Pathfinder Proxy. Escrita: direta e técnica.** -Snippets (`producao/nginx/snippets/`) -1. `acme_challenge`: Desafios Certbot (HTTP-01). -2. `ads_disallow`: Bloqueia acesso a `ads.txt`. -3. `bandwidth_limit`: Controle de banda e downloads (10MB+ limited to 1MB/s). -4. `blacklist`: Lista dinâmica de IPs banidos pelo Fail2Ban. -5. `cache_optimizer`: Configuração SWR (Stale-While-Revalidate) e headers de cache. -6. `cache_proxy_params`: Parâmetros padrão para proxy cache (Lock, Stale). -7. `cache_zones`: Definição de zonas de cache e chaves dinâmicas. -8. `compression`: Stack moderna de compressão (Gzip + Brotli). -9. `fingerprinting`: Cache imutável para assets versionados (Immutable). -10. `humans.txt`: Créditos técnicos e ferramentas. -11. `log_formats`: Definição do log JSON `detailed_proxy` com campos de segurança. -12. `modsecurity`: Ativação do motor WAF e inclusão da Blacklist. -13. `proxy_params`: Headers de proxy, timeouts e ofuscação de backend. -14. `rate_limit`: Zonas de limitação (Global vs Punição). -15. `robots_allow`: Permite indexação total em `robots.txt`. -16. `robots_disallow`: Bloqueia indexação total em `robots.txt`. -17. `security.txt`: Standard de reporte de vulnerabilidades (RFC 9116). -18. `security_actions`: Ações de bloqueio baseadas no score (Retorna 444). -19. `security_headers`: Headers de borda 2026 (COOP, COEP, CORP, Permissions). -20. `security_maps`: Motor PSDE (Detecção de Bots, URIs, Métodos e Scoring). -21. `ssl_params`: Stack TLS 1.3, HSTS e HTTP/3 (QUIC). -22. `stub_status`: Métricas de estado do Nginx para monitoramento. -23. `well_known`: Agregador de arquivos padrão (.well-known, robots, humans). +## 🌍 Ambiente -> [!NOTE] -> `app_specific_modsec_tuning` fica em `producao/nginx/modsec/`, não em snippets. +- **OS**: Ubuntu 24.04 (Nativo). **IP**: 172.17.0.253. +- **Login**: itguys | **Senha**: vR7Ag$Pk +- **Git**: https://git.itguys.com.br/joao.goncalves/NgixProxy_Pathfinder.git. +- **Stack**: Nginx Mainline (1.29.5) + ModSec (3.0.14) + Fail2Ban (1.0.2). -Workflow: Novo Site ou Atualização -Sempre pergunte e pesquise antes de configurar: +## 🧩 Snippets (`producao/nginx/snippets/`) -1. Perguntas Obrigatórias: - - Novo Site? Perguntar: Tipo de site, IP e URL destino. - - Atualização? Perguntar: Atualizar IP? Alterar URL destino? -2. Pesquisa Web: Obrigatório pesquisar ajustes finos específicos para o sistema/engine alvo. -3. Git: Alt em `producao/` -> commit e push para branch `producao`. -4. Proibição: NUNCA sincronize `.gemini/` ou `antes-do-docker/`. -5. Snippets Novos: Se criar um novo snippet em `producao/nginx/snippets/`, documente-o nesta lista imediatamente. +- **acme_challenge**: Desafios Certbot (HTTP-01). +- **ads_disallow**: Bloqueia acesso a ads.txt. +- **bandwidth_limit**: Controle de banda e downloads (10MB+ limited to 1MB/s). +- **blacklist**: Lista dinâmica de IPs banidos pelo Fail2Ban. +- **cache_optimizer**: Configuração SWR (Stale-While-Revalidate) e headers de cache. +- **cache_proxy_params**: Parâmetros padrão para proxy cache (Lock, Stale). +- **cache_zones**: Definição de zonas de cache e chaves dinâmicas. +- **compression**: Stack moderna de compressão (Gzip + Brotli). +- **fingerprinting**: Cache imutável para assets versionados (Immutable). +- **humans.txt**: Créditos técnicos e ferramentas. +- **log_formats**: Definição do log JSON `detailed_proxy` com campos de segurança. +- **modsecurity**: Ativação do motor WAF e inclusão da Blacklist. +- **proxy_params**: Headers de proxy, timeouts e ofuscação de backend. +- **rate_limit**: Zonas de limitação (Global vs Punição). +- **robots_allow**: Permite indexação total em robots.txt. +- **robots_disallow**: Bloqueia indexação total em robots.txt. +- **security.txt**: Standard de reporte de vulnerabilidades (RFC 9116). +- **security_actions**: Ações de bloqueio baseadas no score (Retorna 444). +- **security_headers**: Headers de borda 2026 (COOP, COEP, CORP, Permissions). +- **security_maps**: Motor PSDE (Detecção de Bots, URIs, Métodos e Scoring). +- **ssl_params**: Stack TLS 1.3, HSTS e HTTP/3 (QUIC). +- **stub_status**: Métricas de estado do Nginx para monitoramento. +- **well_known**: Agregador de arquivos padrão (.well-known, robots, humans). +> **Note**: `app_specific_modsec_tuning` fica em `producao/nginx/modsec/`, não em snippets. + +## 🔄 Workflow: Novo Site ou Atualização + +**Sempre pergunte e pesquise antes de configurar:** + +### Perguntas Obrigatórias +- **Novo Site?** Perguntar: Tipo de site, IP e URL destino. +- **Atualização?** Perguntar: Atualizar IP? Alterar URL destino? + +### Regras +- **Pesquisa Web**: Obrigatório pesquisar ajustes finos específicos para o sistema/engine alvo. +- **Git**: Alt em `producao/` -> commit e push para branch `producao`. +- **Proibição**: NUNCA sincronize `.gemini/` ou `antes-do-docker/`. +- **Snippets Novos**: Se criar um novo snippet em `producao/nginx/snippets/`, documente-o nesta lista imediatamente. + +--- + +## 🚀 Workflow de Deploy Técnico (Automação) + +**NUNCA faça commit direto na branch `producao` sem antes validar a configuração.** + +O repositório conta com um script de automação híbrido (`producao/scripts/deploy_pathfinder.py`) que deve ser usado para **todo e qualquer deploy**. + +### Passo a Passo para Agentes: + +1. **Faça suas alterações** nos arquivos de configuração (`nginx/`). +2. **Valide e Deploye** rodando o script abaixo no terminal do Windows: + ```powershell + python producao/scripts/deploy_pathfinder.py sync --all + ``` +3. **Verifique a Saída**: + - O script fará o upload, testará a configuração (`nginx -t`) no servidor e fará o reload. + - Se houver erro, **corrija antes de prosseguir**. O script fará rollback automático no servidor, mas seu código local estará "quebrado". +4. **Confirmar**: Somente após o sucesso do comando acima ("Deploy Remoto Concluído com Sucesso!"), faça o commit das alterações. + +## 🛠️ Comandos Úteis + +- **Sincronizar Tudo (Nginx + Fail2Ban + GeoIP)**: + `python producao/scripts/deploy_pathfinder.py sync --all` +- **Deploy de Novo Site**: + `python producao/scripts/deploy_pathfinder.py site --deploy dominio.com` +- **Atualizar GeoIP Manualmente**: + `python producao/scripts/deploy_pathfinder.py geoip --update` + +## ⚠️ Pontos de Atenção + +- **GeoIP**: O script baixa automaticamente os bancos GeoIP se faltarem. Não precisa baixar manualmente. +- **Paramiko**: O script usa `paramiko` para SSH. Se não estiver instalado, instale com `pip install paramiko`. +- **Credenciais**: As credenciais de acesso ao servidor estão embutidas no cabeçalho do script. Não as exponha em logs públicos. + +## 🐛 Solução de Problemas e Lições Aprendidas (2026-02-08) + +### 1. Conflitos de ModSecurity (Loop em `nginx -t`) +- **Sintoma**: O deploy reporta sucesso, mas as alterações não aparecem no servidor. O log remoto mostra `nginx: [emerg] "modsecurity_rules_file" directive is duplicate`. +- **Causa**: O arquivo `snippets/modsecurity.conf` já define `modsecurity_rules_file`. Se você incluir esse snippet E também definir a diretiva `modsecurity_rules_file` no bloco `server` (ex: `ferreirareal.com.br.conf`), o Nginx falhará. +- **Solução**: Use apenas `include snippets/modsecurity.conf;` no bloco server. A diretiva `modsecurity_rules_file /etc/nginx/modsec/main.conf;` deve ficar comentada ou removida do vhost. + +### 2. Falhas Silenciosas de Rollback +- **Cuidado**: O script `deploy_pathfinder.py` executa um rollback automático se `nginx -t` falhar. +- **O que acontece**: O script restaura o backup anterior e reinicia o Nginx. Isso faz o deploy parecer bem-sucedido (exit code 0), mas seus arquivos novos foram descartados. +- **Verificação**: **SEMPRE** verifique o timestamp dos arquivos remotos após um deploy crítico para garantir que foram atualizados: + ```python + # Exemplo de verificação rápida + client.exec_command("ls -l /etc/nginx/snippets/log_formats.conf") + ``` + +### 3. Encoding Windows vs Linux +- **Problema**: `UnicodeEncodeError: 'charmap' codec can't encode character...` ao rodar scripts Python no Windows. +- **Causa**: O console do Windows padrão (cp1252) não suporta emojis como 🚀 ou ✅. +- **Regra**: Evite usar emojis ou caracteres especiais em scripts que rodam no lado do cliente (Windows). Use `[OK]`, `[ERROR]`, `[+]` em vez de ícones. + +### 4. Organização e Limpeza +- **Área de Diagnóstico**: Use a pasta `logs/` na raiz do projeto (`ngnix-pathfinder-proxy/logs`) para armazenar logs temporários, downloads de debug e "bagunça" necessária durante investigações. +- **Limpeza**: Após resolver o problema, **limpe** esta pasta para não commitar lixo no repositório. O `.gitignore` deve ignorar essa pasta, mas mantenha o hábito de limpeza. diff --git a/.gitignore b/.gitignore index 25f9011..58b7508 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ Dockerfile *.sh .env .gemini/ +logs/ \ No newline at end of file diff --git a/GEMINI.md b/GEMINI.md deleted file mode 100644 index 4b164b9..0000000 --- a/GEMINI.md +++ /dev/null @@ -1,36 +0,0 @@ -# 🤖 Instruções para Agentes Gemini - -Este arquivo contém diretrizes críticas para qualquer agente de IA que interaja com este repositório. - -## 🚀 Workflow de Deploy (OBRIGATÓRIO) - -**NUNCA faça commit direto na branch `producao` sem antes validar a configuração.** - -O repositório conta com um script de automação híbrido (`producao/scripts/deploy_pathfinder.py`) que deve ser usado para **todo e qualquer deploy**. - -### Passo a Passo para Agentes: - -1. **Faça suas alterações** nos arquivos de configuração (`nginx/`). -2. **Valide e Deploye** rodando o script abaixo no terminal do Windows: - ```powershell - python producao/scripts/deploy_pathfinder.py sync --all - ``` -3. **Verifique a Saída**: - - O script fará o upload, testará a configuração (`nginx -t`) no servidor e fará o reload. - - Se houver erro, **corrija antes de prosseguir**. O script fará rollback automático no servidor, mas seu código local estará "quebrado". -4. **Commit**: Somente após o sucesso do comando acima ("Deploy Remoto Concluído com Sucesso!"), faça o commit das alterações. - -## 🛠️ Comandos Úteis - -- **Sincronizar Tudo (Nginx + Fail2Ban + GeoIP)**: - `python producao/scripts/deploy_pathfinder.py sync --all` -- **Deploy de Novo Site**: - `python producao/scripts/deploy_pathfinder.py site --deploy dominio.com` -- **Atualizar GeoIP Manualmente**: - `python producao/scripts/deploy_pathfinder.py geoip --update` - -## ⚠️ Pontos de Atenção - -- **GeoIP**: O script baixa automaticamente os bancos GeoIP se faltarem. Não precisa baixar manualmente. -- **Paramiko**: O script usa `paramiko` para SSH. Se não estiver instalado, instale com `pip install paramiko`. -- **Credenciais**: As credenciais de acesso ao servidor estão embutidas no cabeçalho do script. Não as exponha em logs públicos. diff --git a/nginx/conf.d/ferreirareal.com.br.conf b/nginx/conf.d/ferreirareal.com.br.conf index bae3422..8123466 100644 --- a/nginx/conf.d/ferreirareal.com.br.conf +++ b/nginx/conf.d/ferreirareal.com.br.conf @@ -37,7 +37,6 @@ server { include snippets/ssl_params.conf; include snippets/proxy_params.conf; include snippets/modsecurity.conf; - # modsecurity_rules_file /etc/nginx/modsec/main.conf; include snippets/well_known.conf; include snippets/security_actions.conf; proxy_cache dynamic_cache; diff --git a/scripts/deploy_pathfinder.py b/scripts/deploy_pathfinder.py index 36aa295..6bf1570 100644 --- a/scripts/deploy_pathfinder.py +++ b/scripts/deploy_pathfinder.py @@ -171,8 +171,8 @@ def create_tarball(source_dirs, output_filename="deploy_package.tar.gz"): with tarfile.open(output_filename, "w:gz") as tar: for folder in source_dirs: if os.path.exists(folder): - print(f" - Adicionando: {folder}") - tar.add(folder, arcname=os.path.basename(folder)) + print(f" - Adicionando pasta raiz: {folder}") + tar.add(folder, arcname=os.path.basename(folder), filter=lambda x: (print(f" + {x.name}") or x)) else: print(f"[!] AVISO: Pasta não encontrada: {folder}") @@ -184,7 +184,7 @@ def windows_deploy(args): sys.exit(1) print("="*60) - print(f"🚀 PATHFINDER REMOTE DEPLOYER - Target: {SERVER_HOST}") + print(f"[*] PATHFINDER REMOTE DEPLOYER - Target: {SERVER_HOST}") print("="*60) # 1. Definir caminhos locais relativos à raiz do projeto @@ -254,14 +254,14 @@ def windows_deploy(args): exit_status = stdout.channel.recv_exit_status() if exit_status != 0: - print(f"\n❌ Falha no Deploy Remoto (Exit Code: {exit_status})") + print(f"\n[X] Falha no Deploy Remoto (Exit Code: {exit_status})") print("--- ERRO DETALHADO DO SERVIDOR ---") # Ler arquivo de log remoto _, err_stdout, _ = ssh.exec_command("cat /tmp/deployment_error.log") print(err_stdout.read().decode('utf-8')) print("----------------------------------") else: - print(f"\n✅ Deploy Remoto Concluído com Sucesso!") + print(f"\n[+] Deploy Remoto Concluído com Sucesso!") ssh.close() @@ -295,7 +295,10 @@ def sync_all(): return False print(f"[*] Sincronizando de: {src_nginx}") - run_sudo(['cp', '-rf', os.path.join(src_nginx, "."), NGINX_CONF_DIR]) + rc, out, err = run_sudo(['cp', '-rf', os.path.join(src_nginx, "."), NGINX_CONF_DIR]) + if rc != 0: + print(f"[!] Erro ao copiar arquivos: {err}") + return False # Atualiza GeoIP se solicitado (ou sempre no sync --all) update_geoip_db()