diff --git a/.dockerignore b/.dockerignore deleted file mode 100644 index d826db4..0000000 --- a/.dockerignore +++ /dev/null @@ -1,48 +0,0 @@ -# Documentation and config folders -.gemini/ -.git/ -.github/ -.vscode/ -.idea/ - -# Legacy files (not needed in container) -legacy/ - -# Logs and debug files -*.log -debug_logs*.txt -nginx_test*.log - -# Environment files -.env -.env.local - -# Git files -.gitignore -.gitattributes - -# Documentation -README.md -*.md -!nginx.conf - -# Docker files (avoid recursive includes) -docker-compose*.yml -Dockerfile* - -# Temporary and backup files -*.tmp -*.bak -*.swp -*.swo -*~ - -# OS files -.DS_Store -Thumbs.db - -# SSL private keys (should be mounted as volume, not baked in) -ssl/*.key - -# Disabled configs -*.disabled diff --git a/.gemini/GEMINI.md b/.gemini/GEMINI.md deleted file mode 100644 index 9400795..0000000 --- a/.gemini/GEMINI.md +++ /dev/null @@ -1,135 +0,0 @@ -# NGINX Pathfinder Proxy - Documentação Técnica - -## Visão Geral - -Projeto de infraestrutura para Proxy Reverso de Alta Disponibilidade, utilizando Containers Docker para modularidade e fácil manutenção. - -## Arquitetura de Containers - -O projeto roda sobre 3 serviços orquestrados via `docker-compose.yml`: - -| Serviço | Imagem | Porta Exposta | Função | -|---------|--------|---------------|--------| -| **modsecurity** | `owasp/modsecurity-crs:nginx-alpine` | `80`, `443` | **Frontend (WAF)**. Recebe todo o tráfego da internet, filtra ataques (SQLi, XSS) e encaminha requisições limpas para o Proxy. | -| **nginx-proxy** | `alpine` (Custom Build) | `8080` (Interna) | **Backend Proxy**. Gerencia vhosts, terminação SSL, cache, compressão Brotli e roteamento para as aplicações finais. | -| **fail2ban** | `crazymax/fail2ban` | - | **Watchdog**. Lê logs compartilhados dos dois containers acima e bane IPs maliciosos diretamente no host (via iptables). | - ---- - -## Automação SSL - -O sistema possui um mecanismo de **auto-cura** para certificados SSL. - -### Componentes -1. **Certbot**: Instalado dentro do container `nginx-proxy`. -2. **Volumes**: - - `ssl/`: Onde ficam os arquivos `.crt` e `.key` usados pelo NGINX. - - `certbot/`: Onde o Certbot guarda os arquivos originais do Let's Encrypt. -3. **Scripts**: - - `scripts/inject_acme.sh`: Varre todos os arquivos em `conf.d/` e injeta o snippet de validação ACME (`.well-known`) se não existir. - - `scripts/renew_ssl.sh`: - 1. Verifica a data de expiração de cada certificado ativo. - 2. Se faltar **3 dias ou menos**, dispara `certbot renew`. - 3. Copia os novos arquivos gerados para a pasta `ssl/`. - 4. Recarrega o NGINX. - -### Agendamento -- **Cron**: Configurado no `pre-flight.sh` para rodar todos os dias às **01:00 AM**. -- **Startup**: A verificação também roda a cada reinício do container. - ---- - -## Estrutura de Arquivos - -``` -. -├── conf.d/ # Configurações de sites (VHosts) -├── snippets/ # Trechos reutilizáveis -│ ├── acme_challenge.conf # Snippet para validação Let's Encrypt -│ ├── internal_networks.conf # IPs permitidos (VPN/Local) -│ └── ... -├── scripts/ # Scripts de automação -│ ├── pre-flight.sh # Entrypoint (DNS Check + Cron Setup) -│ ├── inject_acme.sh # Injetor de config ACME -│ └── renew_ssl.sh # Lógica de renovação -├── ssl/ # Certificados em uso -├── fail2ban/ # Configs do Fail2ban -│ ├── jail.d/ # Definição das prisões -│ └── filter.d/ # Regex de detecção -├── .gemini/ # Documentação do projeto -└── docker-compose.yml # Orquestração -``` - ---- - -## Módulos Especiais - -### 1. Brotli & Headers More -O container `nginx-proxy` é construído manualmente (`Dockerfile`) para incluir módulos que não vêm por padrão no Alpine: -- `nginx-mod-http-brotli` -- `nginx-mod-http-headers-more` - -### 2. ModSecurity (WAF) -Rodar o WAF em container separado (`modsecurity`) evita a necessidade de compilar o ModSecurity no NGINX principal. - -**Arquitetura Customizada:** -- **Injeção de Template**: Um arquivo `modsec.conf.template` local é montado durante o boot para contornar limitações de permissão do container oficial. Ele instrui o NGINX a carregar regras customizadas. -- **Regras Modulares**: Localizadas em `modsec_rules/`, divididas por aplicação (`gitea-rule-exceptions.conf`, `nextcloud...`). -- **Global**: `global-exceptions.conf` define apenas a whitelist de rede. -- **Bypass de Emergência**: Se o WAF falhar, altere as portas no `docker-compose.yml` para expor o `nginx-proxy` diretamente. - ---- - -## Fluxo de Deploy Atualizado - -```mermaid -graph TD - Start[Deploy] --> DetectIP[Detectar IP Público] - DetectIP --> Build[Docker Build (NGINX + Certbot)] - Build --> Up[Docker Compose Up] - Up --> PreFlight[Pre-Flight Script] - - PreFlight --> DNSCheck[Validar DNS dos Domínios] - DNSCheck --> CronSetup[Configurar Cron Job] - CronSetup --> SSLCheck[Verificar Validade SSL] - - SSLCheck -- Vence > 3 dias --> StartNginx[Iniciar NGINX] - SSLCheck -- Vence <= 3 dias --> Renew[Rodar renew_ssl.sh] - Renew --> StartNginx -``` - ---- - -## Comandos Operacionais - -**Verificar status dos serviços:** -```bash -docker compose ps -``` - -**Verificar validade dos SSL (Log):** -```bash -docker compose logs nginx-proxy | grep "SSL" -``` - -**Forçar renovação SSL manualmente:** -```bash -docker compose exec nginx-proxy /scripts/renew_ssl.sh -``` - -**Reload Zero-Downtime (Blue-Green Logic):** -Este comando valida a configuração e executa um reload gracioso (`nginx -s reload`), onde novos workers assumem as novas configurações enquanto os antigos terminam as requisições correntes. -```bash -./scripts/reload.sh # Linux -./scripts/reload.ps1 # Windows PowerShell -``` - -**Banir um IP manualmente:** -```bash -docker compose exec fail2ban fail2ban-client set nginx-badbots banip 1.2.3.4 -``` - -**Adicionar novo site:** -1. Criar `conf.d/novo-site.conf` -2. `docker compose restart nginx-proxy` -3. O script de startup irá validar o DNS e injetar o suporte ACME automaticamente. diff --git a/.gemini/TODO.md b/.gemini/TODO.md deleted file mode 100644 index a54a09b..0000000 --- a/.gemini/TODO.md +++ /dev/null @@ -1,40 +0,0 @@ -# Tarefas Pendentes e Melhorias Futuras - -## 1. Gestão Dinâmica de DNS -**Origem:** Migração de `legacy/hosts` -- **Problema:** O método atual usa `extra_hosts` no `docker-compose.yml`, que é estático e exige recriação do container para alterações. -- **Objetivo:** Mudar o modo de registro e atualização de DNS para ser mais dinâmico ou simples. -- **Ideias:** DNS containerizado (Bind/CoreDNS) ou Service Discovery. - -## 2. Revisão de Regras ModSecurity -**Origem:** Migração de `legacy/nginx/modsecurity/*.conf` (Regras Antigas) -- **Status:** ✅ Concluído. -- **Resolução:** Regras refatoradas para estrutura modular (`modsec_rules/`). WAF ativo e configurado via template injection para Gitea, Nextcloud, Exchange, Zabbix e outros. -- **Ação:** Monitorar logs (`modsec_audit.log`) para ajustes finos futuros. - -## 3. Atualizações Zero-Downtime (Sem Queda) -**Objetivo:** Criar um método para atualizar configurações de sites sem que clientes externos percam a conexão. -- **Status:** ✅ Concluído. -- **Solução Implementada:** Script `./scripts/reload.sh` que executa `nginx -t` e `nginx -s reload` (Reload Suave/Process-Level Blue-Green). -- **Como usar:** Execute `./scripts/reload.sh` após alterar qualquer `.conf`. - -## 4. Conexão Direta na Interface do Host -**Objetivo:** Configurar o proxy para rotear tráfego tanto internamente (entre containers Docker) quanto externamente (para serviços fora do Docker). -- **Status:** 🧪 Implementado - Aguardando Teste no Host -- **Solução Implementada:** - - Adicionado `host.docker.internal:host-gateway` no `docker-compose.yml` para ambos containers - - Criado `snippets/docker_resolver.conf` para resolução DNS dinâmica de containers - - Criado `conf.d/test-connectivity.conf` (temporário) com endpoints de teste - - Atualizado diagrama de arquitetura no `README.md` -- **Testes Necessários (no host de deploy):** - ```bash - # Rebuild e restart - docker compose build --no-cache nginx-proxy - docker compose down && docker compose up -d - - # Testar conectividade - docker compose exec nginx-proxy ping -c 2 10.10.253.254 - docker compose exec nginx-proxy ping -c 2 10.10.253.128 - ``` -- **Após Validação:** Deletar `conf.d/test-connectivity.conf` e marcar como ✅ Concluído. - diff --git a/.gitignore b/.gitignore deleted file mode 100644 index ad6ca01..0000000 --- a/.gitignore +++ /dev/null @@ -1,34 +0,0 @@ -# Logs and debug files -*.log -debug_logs*.txt -nginx_test*.log - -# Environment files -.env -.env.local - -# Docker -docker-compose.override.yml - -# SSL certificates (sensitive - should be managed separately) -ssl/*.key -ssl/*.crt -ssl/*.pem - -# Editor files -.vscode/ -.idea/ -*.swp -*.swo -*~ - -# OS files -.DS_Store -Thumbs.db - -# Temporary files -*.tmp -*.bak - -# Disabled configs -*.disabled diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 36c1434..0000000 --- a/Dockerfile +++ /dev/null @@ -1,21 +0,0 @@ -FROM alpine:latest - -# Install NGINX and tools -RUN apk add --no-cache nginx nginx-mod-http-brotli nginx-mod-http-headers-more bind-tools openssl curl bash certbot git nano - -# Setup Nginx directories -RUN mkdir -p /run/nginx /var/cache/nginx - -# Forward logs to Docker log collector -RUN ln -sf /dev/stdout /var/log/nginx/access.log \ - && ln -sf /dev/stderr /var/log/nginx/error.log - -# Copy custom config (defaults, will be overriden by volumes) -COPY nginx.conf /etc/nginx/nginx.conf -COPY snippets/ /etc/nginx/snippets/ - -# Expose ports -EXPOSE 80 443 - -# Start Nginx -CMD ["nginx", "-g", "daemon off;"] diff --git a/README.md b/README.md deleted file mode 100644 index bad9395..0000000 --- a/README.md +++ /dev/null @@ -1,67 +0,0 @@ -# Nginx Pathfinder Proxy - -## Visão Geral -Proxy Reverso NGINX simplificado rodando em um **único container Docker**. -Este projeto foi refatorado para remover automações complexas, WAF (ModSecurity) e Fail2ban, focando em simplicidade e gerenciamento manual. - -## Arquitetura -- **Serviço**: `nginx-proxy` (Imagem Alpine Customizada) -- **Portas**: `80`, `443` (Modo Bridge) -- **Gerenciamento**: Manual via edição de arquivos no host. - -## Estrutura de Arquivos -``` -. -├── conf.d/ # Configurações de sites (VHosts) - EDITE AQUI -├── snippets/ # Trechos reutilizáveis (Rate Limit, Cache, Maps) -├── ssl/ # Certificados SSL (.crt, .key) -├── nginx.conf # Configuração global -├── docker-compose.yml # Definição do serviço -└── Dockerfile # Definição da imagem -``` - -## Como Usar - -### 1. Iniciar -```bash -docker compose up -d --build -``` - -### 2. Adicionar Novo Site -Crie um arquivo `.conf` na pasta `conf.d/`. -**Exemplo:** -```nginx -server { - listen 80; - server_name exemplo.com.br; - - location / { - proxy_pass http://192.168.1.50:8080; - include /etc/nginx/snippets/proxy_params.conf; # Se houver params comuns - } -} -``` - -### 3. Aplicar Mudanças -Após editar qualquer arquivo (`nginx.conf` ou `conf.d/*`), recarregue o Nginx: -```bash -docker exec nginx-proxy nginx -s reload -``` - -### 4. SSL -Coloque seus certificados manualment na pasta `ssl/` e aponte no seu config: -```nginx -ssl_certificate /etc/nginx/ssl/meu-site.crt; -ssl_certificate_key /etc/nginx/ssl/meu-site.key; -``` - -## Cache -O sistema utiliza uma zona de cache dinâmica única. -Para ativar cache em um location: -```nginx -location / { - proxy_cache dynamic_cache; - proxy_cache_valid 200 1h; - proxy_pass http://backend; -} -``` \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index 0666e16..0000000 --- a/docker-compose.yml +++ /dev/null @@ -1,21 +0,0 @@ -services: - nginx: - build: . - container_name: nginx-proxy - restart: always - network_mode: bridge - ports: - - "80:80" - - "443:443" - volumes: - #- ./nginx.conf:/etc/nginx/nginx.conf # Removed to avoid file-mount errors in Portainer - - ./conf.d:/etc/nginx/conf.d - #- ./snippets:/etc/nginx/snippets # Removed to avoid empty-mount errors - - ./ssl:/etc/nginx/ssl - - nginx_logs:/var/log/nginx - - nginx_cache:/var/cache/nginx - - ./certbot:/etc/letsencrypt - -volumes: - nginx_logs: - nginx_cache: