diff --git a/.gemini/GEMINI.md b/.gemini/GEMINI.md index 9400795..b377914 100644 --- a/.gemini/GEMINI.md +++ b/.gemini/GEMINI.md @@ -1,41 +1,27 @@ -# NGINX Pathfinder Proxy - Documentação Técnica +# Pathfinder Proxy - Documentação Técnica (Traefik) ## Visão Geral -Projeto de infraestrutura para Proxy Reverso de Alta Disponibilidade, utilizando Containers Docker para modularidade e fácil manutenção. +Projeto de infraestrutura para Proxy Reverso de Alta Disponibilidade utilizando **Traefik Proxy**. O sistema automatiza a terminação SSL e o roteamento de tráfego para serviços internos (Docker) e externos (VMware/LXC). ## Arquitetura de Containers -O projeto roda sobre 3 serviços orquestrados via `docker-compose.yml`: +O projeto centraliza o tráfego no serviço `traefik`: | 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). | +| **traefik** | `traefik:v2.10` | `80`, `443`, `8080` | **Reverse Proxy & SSL**. Gerencia certificados Let's Encrypt, roteamento de vhosts e dashboard. | --- ## Automação SSL -O sistema possui um mecanismo de **auto-cura** para certificados SSL. +Utiliza o **ACME** nativo do Traefik. ### 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. +1. **Resolver**: `letsencrypt` configurado no `traefik.yml`. +2. **Storage**: Arquivo `acme.json` (deve ter permissão `600`). +3. **E-mail**: `suporte@itguys.com.br`. --- @@ -43,93 +29,40 @@ O sistema possui um mecanismo de **auto-cura** para certificados SSL. ``` . -├── 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 +├── docker-compose.yml # Orquestração do Traefik +├── traefik.yml # Configuração Estática (Global) +├── dynamic_conf.yml # Configuração Dinâmica (VHosts Externos) +├── acme.json # Armazenamento de Certificados SSL ├── .gemini/ # Documentação do projeto -└── docker-compose.yml # Orquestração +└── _backup/ # Legado do NGINX/ModSecurity ``` --- -## Módulos Especiais +## Logs e Monitoramento -### 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 -``` +- **Formato**: JSON (configurado em `traefik.yml`). +- **Nível**: INFO. +- **Acesso**: Dashboard disponível na porta `8080`. --- ## Comandos Operacionais -**Verificar status dos serviços:** +**Verificar status:** ```bash docker compose ps ``` -**Verificar validade dos SSL (Log):** +**Ver logs em tempo real:** ```bash -docker compose logs nginx-proxy | grep "SSL" +docker compose logs -f traefik ``` -**Forçar renovação SSL manualmente:** -```bash -docker compose exec nginx-proxy /scripts/renew_ssl.sh -``` +**Adicionar novo site externo:** +1. Editar `dynamic_conf.yml`. +2. O Traefik detecta a mudança automaticamente (watch: true). -**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. +*Mantido por IT Guys* diff --git a/README.md b/README.md index 7402367..2880e9f 100644 --- a/README.md +++ b/README.md @@ -1,143 +1,57 @@ -# NGINX Pathfinder Proxy +# NGINX Pathfinder Proxy (Migrated to Traefik) -Solução moderna de Proxy Reverso containerizado, construída com NGINX, ModSecurity WAF e automação de SSL. +Solução moderna de Proxy Reverso containerizado, agora utilizando **Traefik** para maior automação, suporte nativo a Docker e SSL gerenciado via Let's Encrypt. ## 🚀 Funcionalidades -### 🛡️ Segurança em Primeiro Lugar -- **ModSecurity WAF**: Conjunto de Regras OWASP (CRS) integrado rodando como proxy sidecar/frontend. -- **Fail2ban**: Serviço "cão de guarda" que bane IPs com comportamento suspeito (bots ruins, excesso de erros 4xx/5xx). -- **Mapas de Segurança**: Bloqueio automatizado de User-Agents maliciosos e restrições de rede interna. +### 🛡️ Traefik Proxy +- **SSL Automatizado**: Let's Encrypt nativo com renovação automática. +- **Auto-Discovery**: Detecta automaticamente novos containers Docker com labels específicos. +- **Dashboard**: Interface visual para monitoramento de rotas e serviços. +- **Logs em JSON**: Ideal para integração com stacks de monitoramento (ELK, Loki). -### ⚡ Performance -- **HTTP/3 (QUIC)**: Habilitado para conexões modernas de baixa latência. -- **Compressão Brotli**: Melhores taxas de compressão que o Gzip padrão. -- **Headers More**: Manipulação avançada de cabeçalhos para respostas limpas. - -### 🔒 SSL Automatizado -- **Renovação Zero-Touch**: O Certbot integrado verifica a validade diariamente. -- **Auto-Renovação**: Renova automaticamente certificados próximos do vencimento (<= 3 dias). -- **Injeção Inteligente**: Injeta automaticamente os snippets de desafio ACME nas configurações dos sites. +### ⚡ Performance & Flexibilidade +- **HTTP/2 & HTTP/3**: Suporte a protocolos modernos. +- **Roteamento Dinâmico**: Configuração de backends externos (VMs/LXC) via arquivo dinâmico. --- ## 🛠️ Como Trabalhar neste Repositório ### Pré-requisitos -- Docker & Docker Compose instalados -- Acesso à internet (para baixar imagens e validar SSL) +- Docker & Docker Compose instalados. +- Portas 80 e 443 liberadas. -### 1. Implantar o Servidor (Deploy) -Para iniciar toda a infraestrutura: -```bash -./deploy.sh -``` -*Este script detecta seu IP público, configura o ambiente e sobe os containers.* - -### 2. Adicionar um Novo Site -Todas as configurações de sites ficam na pasta `conf.d/`. - -1. **Crie o arquivo de configuração**: - Crie um arquivo `.conf` em `conf.d/` (ex: `meusite.com.br.conf`). Use um dos arquivos existentes como modelo. - - **Modelo Básico (com SSL):** - ```nginx - # Backend (para onde vai o tráfego) - upstream meu_backend { - server 192.168.1.10:8080; - } - - # Redirecionamento HTTP -> HTTPS - server { - listen 80; - server_name meusite.com.br; - include /etc/nginx/snippets/acme_challenge.conf; # Importante para SSL - return 301 https://$host$request_uri; - } - - # Bloco HTTPS - server { - listen 443 ssl; - http2 on; - server_name meusite.com.br; - - ssl_certificate /etc/nginx/ssl/meusite.com.br.crt; - ssl_certificate_key /etc/nginx/ssl/meusite.com.br.key; - - include /etc/nginx/snippets/ssl_params.conf; - - location / { - proxy_pass http://meu_backend; - include /etc/nginx/includes/proxy_backend.conf; - } - } - ``` - -2. **Aplique as alterações**: +### 1. Implantar o Proxy (Portainer/Docker Compose) +1. Certifique-se de que os arquivos `traefik.yml` e `dynamic_conf.yml` estão presentes. +2. Crie o arquivo de certificados: `touch acme.json && chmod 600 acme.json`. +3. Inicie os containers: ```bash - docker compose restart nginx-proxy + docker compose up -d ``` - *No reinício, o script de pre-flight validará o DNS e injetará configurações de SSL necessárias.* -### 3. Modificar Configurações Globais -As configurações globais são modularizadas na pasta `snippets/`. +### 2. Adicionar um Novo Site (Backend Externo) +Edite o arquivo `dynamic_conf.yml` para adicionar novas rotas para servidores fora do Docker. -- **Rate Limiting**: Edite `snippets/rate_limit.conf` para ajustar os limites de requisições por segundo. -- **Bloqueio de Bots**: Edite `snippets/security_maps.conf` para adicionar novos User-Agents à lista negra. -- **Cache**: Edite `snippets/cache_zones.conf` para definir novas zonas ou tempos de cache. +Exemplo de rota: +```yaml +http: + routers: + meu-site: + rule: "Host(`meu-site.com.br`)" + service: meu-servidor + entryPoints: [websecure] + tls: { certResolver: letsencrypt } + services: + meu-servidor: + loadBalancer: + servers: + - url: "http://IP_DO_SERVIDOR" +``` -### 3.1. Modificar Regras do WAF (ModSecurity) -O WAF agora utiliza uma estrutura modular de regras localizada na pasta `modsec_rules/`. -- **Arquivos Específicos**: Regras para Gitea, Nextcloud, Exchange, Zabbix, etc. ficam em seus respectivos arquivos `.conf`. -- **Global**: `global-exceptions.conf` contém apenas whitelists de rede interna. -- **Aplicação**: Após editar qualquer regra, reinicie o container do WAF para aplicar: - ```bash - docker compose restart modsecurity - ``` -> **Nota Técnica**: O arquivo `modsec.conf.template` na raiz é injetado no container durante o boot para contornar problemas de permissão e garantir o carregamento das regras customizadas. - -### 4. Gerenciar Certificados SSL -O sistema gerencia isso automaticamente, mas você pode intervir manualmente se necessário. - -- **Verificar Validade**: - Verifique os logs do startup para ver o status de todos os domínios: - ```bash - docker compose logs nginx-proxy | grep "SSL" - ``` - -- **Forçar Renovação**: - Se precisar renovar um certificado imediatamente: - ```bash - docker compose exec nginx-proxy /scripts/renew_ssl.sh - ``` - -- **Reload sem Downtime (Recomendado)**: - Para aplicar alterações de configuração (vhosts, SSL) sem derrubar conexões ativas: - ```bash - ./scripts/reload.sh - ``` - -### 5. Monitorar e Debugar - -- **Verificar Status dos Containers**: - ```bash - docker compose ps - ``` - -- **Ver Logs em Tempo Real**: - ```bash - docker compose logs -f - ``` - -- **Verificar se o WAF (ModSecurity) bloqueou algo**: - ```bash - docker compose logs modsecurity | grep "Access denied" - ``` - -- **Verificar Banimentos do Fail2ban**: - ```bash - docker compose exec fail2ban fail2ban-client status nginx-badbots - ``` +### 3. Dashboard do Traefik +Acesse o dashboard interno para verificar o status das rotas: +- **URL**: `http://localhost:8080/dashboard/` --- @@ -145,94 +59,25 @@ O sistema gerencia isso automaticamente, mas você pode intervir manualmente se ```mermaid graph TD - subgraph Internet - Client[Cliente Externo] - end - - subgraph Host["Host Docker (Portainer)"] - subgraph PathfinderStack["Stack: Pathfinder-Proxy
Rede: 172.112.0.0/16"] - WAF["ModSecurity WAF
172.112.0.3
:80, :443"] - NGINX["nginx-proxy
172.112.0.2
:8080 interno"] - F2B["fail2ban
network: host"] - end - - subgraph HostNetwork["Rede Física do Host"] - HostIP["host.docker.internal
(gateway)"] - end - - subgraph OtherStacks["Outras Stacks Docker"] - Container1["Container A
172.111.0.x"] - Container2["Container B
172.113.0.x"] - end - end - - subgraph ExternalServers["Servidores Externos"] - Server254["10.10.253.254"] - Server128["10.10.253.128
Gitea"] - end - - Client -->|":80/:443"| WAF - WAF -->|"proxy_pass :8080"| NGINX - F2B -.->|"lê logs"| WAF - F2B -.->|"lê logs"| NGINX + Client[Cliente Externo] -->|":80 / :443"| Traefik - NGINX -->|"extra_hosts
host-gateway"| HostIP - NGINX -.->|"bridge network"| Container1 - NGINX -.->|"bridge network"| Container2 - HostIP -->|"roteamento"| Server254 - HostIP -->|"roteamento"| Server128 - - style WAF fill:#e74c3c,stroke:#c0392b,color:#fff - style NGINX fill:#3498db,stroke:#2980b9,color:#fff - style F2B fill:#27ae60,stroke:#1e8449,color:#fff - style Server128 fill:#9b59b6,stroke:#8e44ad,color:#fff - style Server254 fill:#9b59b6,stroke:#8e44ad,color:#fff - style HostIP fill:#f39c12,stroke:#d68910,color:#fff - style Container1 fill:#1abc9c,stroke:#16a085,color:#fff - style Container2 fill:#1abc9c,stroke:#16a085,color:#fff + subgraph DockerHost["Docker Host"] + Traefik[Traefik Proxy] + App1[Container A] + App2[Container B] + end + + subgraph External["Rede Externa (LXC/VM)"] + Gitea[Gitea Server] + Zammad[Zammad Server] + end + + Traefik --> App1 + Traefik --> App2 + Traefik --> Gitea + Traefik --> Zammad ``` --- -## 📋 Sistemas e Servidores Configurados - -Lista de todos os sistemas roteados pelo proxy, organizados por tipo de infraestrutura. - -| Domínio | IP/Backend | Docker | VM | LXC | Descrição | -|---------|------------|:------:|:--:|:---:|-----------| -| `git.itguys.com.br` | 10.10.253.128 | ❌ | ❌ | ✅ | Gitea - Servidor Git | -| `zammad.itguys.com.br` | 172.16.254.59 | ❌ | ❌ | ✅ | Zammad - Helpdesk | -| `monitoramento.itguys.com.br` | 172.16.254.x | ❌ | ❌ | ✅ | Zabbix/Grafana | -| `mimir.itguys.com.br` | 172.16.x.x | ❌ | ❌ | ✅ | Mimir - Métricas | -| `windmill.grupopralog.com.br` | 172.16.253.103:8000 | ❌ | ❌ | ✅ | Windmill - Automação | -| `katalog.itguys.com.br` | 172.16.x.x | ❌ | ❌ | ✅ | Katalog | -| `verbocloud.itguys.com.br` | 172.16.253.13:11580 | ❌ | ❌ | ✅ | Nextcloud AIO | -| `cloud.grupopralog.com.br` | 172.16.253.12 | ❌ | ❌ | ✅ | Nextcloud Pralog | -| `srvoffice001.itguys.com.br` | 172.16.253.101 | ❌ | ✅ | ❌ | Exchange Server | -| `business.itguys.com.br` | 172.16.121.13 | ❌ | ✅ | ❌ | Exchange OWA | -| `vcenter.itguys.com.br` | 172.16.254.110:443 | ❌ | ✅ | ❌ | VMware vCenter | -| `unifi.itguys.com.br` | 172.16.254.123:8443 | ❌ | ✅ | ❌ | UniFi Controller | -| `workspace.itguys.com.br` | 172.16.121.2 | ❌ | ✅ | ❌ | Workspace Windows | -| `vscode.itguys.com.br` | 172.16.x.x | ❌ | ❌ | ✅ | VS Code Server | -| `telefonia.itguys.com.br` | 172.16.x.x | ❌ | ✅ | ❌ | Central Telefônica | -| `proxy.itguys.com.br` | localhost | ✅ | ❌ | ❌ | Este proxy | -| `itguys.com.br` | 172.16.x.x | ❌ | ✅ | ❌ | Site Principal | -| `pralog.com.br` | 172.16.x.x | ❌ | ✅ | ❌ | Site Pralog | -| `anatram.com.br` | 172.16.x.x | ❌ | ✅ | ❌ | Site Anatram | -| `ferreirareal.com.br` | 172.16.x.x | ✅ | ❌ | ❌ | Site Ferreira Real | -| `petytransportes.com.br` | 172.16.x.x | ❌ | ✅ | ❌ | Site Pety Transportes | -| `solucionei.itguys.com.br` | 172.16.x.x | ❌ | ✅ | ❌ | Solucionei | -| `rhema.itguys.com.br` | 172.16.x.x | ❌ | ✅ | ❌ | Rhema | -| `integra.grupopralog.com.br` | 172.16.x.x | ❌ | ❌ | ✅ | Integração Pralog | -| `ns1.itguys.com.br` | 172.16.x.x | ❌ | ❌ | ✅ | DNS Primário | -| `ns2.itguys.com.br` | 172.16.x.x | ❌ | ❌ | ✅ | DNS Secundário | -| `dns-primario.itguys.com.br` | 172.16.x.x | ❌ | ❌ | ✅ | DNS Admin | - -> [!NOTE] -> **Legenda:** Docker = Container Docker | VM = Máquina Virtual (VMware/Hyper-V) | LXC = Linux Container (Proxmox) -> -> IPs marcados como `172.16.x.x` precisam ser verificados nos arquivos de configuração individuais. - ---- - *Mantido por IT Guys* \ No newline at end of file diff --git a/TODO.md b/TODO.md deleted file mode 100644 index e5c562e..0000000 --- a/TODO.md +++ /dev/null @@ -1,49 +0,0 @@ -# Relatório de Diagnóstico e Pontos de Dor (Pain Points) - -Este documento sumariza os problemas arquiteturais e técnicos identificados durante a tentativa de estabilizar o stack `nginx-pathfinder-proxy`. O objetivo é fornecer um contexto claro para um futuro Agente de IA simplificar a solução. - -## 1. Arquitetura Excessivamente Complexa (Split Container) -Atualmente, temos dois containers NGINX separados: -1. **Frontend (`modsecurity`)**: Recebe a internet, faz WAF, termina SSL. -2. **Backend (`nginx-proxy`)**: Recebe do WAF, faz roteamento, gerencia certificados (Certbot), roda scripts. - -**Problemas Causados:** -- **Inferno de Permissões (Permission Hell):** O Backend (onde roda o Certbot) gera certificados no volume compartilhado como `root`. O Frontend tenta ler esses arquivos e falha com `Permission denied` porque roda com outro UID/GID. Tentar corrigir com `chmod` é frágil e inseguro. -- **Configuração Duplicada:** É preciso configurar o Nginx duas vezes. Uma no Frontend (para saber onde estão os certs) e uma no Backend (para saber como tratar a requisição na porta 8080). -- **SSL "Ping-Pong":** O Backend gerencia a renovação, mas o Frontend é quem *usa* o certificado. Isso exige reload sincronizado em dois containers diferentes. - -## 2. Problema do "Ovo e a Galinha" (SSL Bootstrap) -- O NGINX **não sobe** se o arquivo de certificado não existir. -- O Certbot **não gera** o certificado se o NGINX não estiver rodando (para responder o desafio HTTP-01). -- **Solução Atual (Gambiarra):** Criamos um script complexo (`pre-flight.sh` + `renew_ssl.sh`) que gera certificados falsos (self-signed) só para o NGINX subir, e depois tenta baixar os reais. Isso adiciona muita lógica propensa a falhas. - -## 3. Fragilidade de Deploy (Portainer / Docker) -- **Mount Error:** O Portainer falha ao tentar montar arquivos de configuração (`modsec_conf/...`) que ainda não foram baixados pelo git no host. -- **Solução Atual:** Tivemos que "assar" (bake) as configurações dentro da imagem Docker (`COPY conf.d ...`). Isso tira a agilidade de alterar uma config no git e dar deploy rápido; agora exige rebuild da imagem. - -## 4. Scripts de Automação Frágeis -- O script `pre-flight.sh` tenta fazer `git clone/pull` dentro do container. Isso gera erros de "Resource busy" quando tenta limpar pastas montadas via volume. -- Lógica de `sed/grep` para ler arquivos `.conf` e achar domínios é suscetível a erros de sintaxe no arquivo de config. - ---- - -# Recomendação de Simplificação (Para o Próximo Agente) - -### Opção A: Single "Super" Container (Recomendada) -Unificar tudo em um único container. -- **Base:** Usar a imagem oficial com ModSecurity já compilado (ou compilar num multi-stage build). -- **Benefício:** Resolve problemas de permissão (mesmo processo lê e escreve). Resolve problema de setup (um único serviço). Remove complexidade de rede (sem proxy pass interno desnecessário). - -### Opção B: Caddy Server (Radical) -Substituir NGINX + Certbot por **Caddy**. -- **Benefício:** Caddy tem HTTPS automático (resolve o problema do Ovo/Galinha nativamente). -- **WAF:** Existe plugin de WAF para Caddy (Coraza), mas exige validação se atende os requisitos de segurança do Oestepan. - -### Opção C: NGINX Proxy Manager (GUI) -Usar uma solução pronta como NGINX Proxy Manager. -- Tem interface web. -- Gerencia SSL sozinho. -- Pode ser difícil integrar ModSecurity customizado. - -### Resumo do Pedido de Refatoração -> "Simplificar a infraestrutura eliminando a separação Frontend/Backend. Criar um container único que faça WAF + Proxy + SSL Management, eliminando scripts complexos de bootstrap e problemas de permissão de volume." diff --git a/caddy_core/Caddyfile b/caddy_core/Caddyfile deleted file mode 100644 index ac3d66d..0000000 --- a/caddy_core/Caddyfile +++ /dev/null @@ -1,25 +0,0 @@ -{ - # Global Options - email admin@oestepan.com.br - # Enable Admin API for the watcher to trigger reloads - admin :2019 -} - -# Import dynamic sites -import sites/* - -# Default Site: Traccar GPS -gps.oestepan.com.br { - # Reverse Proxy to the backend service - reverse_proxy host.docker.internal:8083 { - # Trust original IPs - header_up X-Real-IP {remote_host} - header_up X-Forwarded-For {remote_host} - header_up X-Forwarded-Proto {scheme} - } - - # Enable logging - log { - output file /var/log/caddy/gps.access.log - } -} diff --git a/deploy.sh b/deploy.sh deleted file mode 100644 index 4d1198b..0000000 --- a/deploy.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash -set -e - -echo "Deploying Caddy Proxy..." - -# Pull latest code -git pull - -# Ensure containers are up -docker compose up -d - -# Force a reload just in case -docker compose exec caddy caddy reload - -echo "Deployment Complete." diff --git a/docker-compose.yml b/docker-compose.yml index 73b3976..f596a6a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,21 +1,21 @@ services: - caddy: - image: caddy:latest - container_name: proxy_caddy + traefik: + image: traefik:v2.10 + container_name: traefik restart: always ports: - "80:80" - "443:443" + - "8080:8080" # Dashboard Traefik (remover em produção se exposto) volumes: - - ./caddy_core/Caddyfile:/etc/caddy/Caddyfile - - ./sites:/etc/caddy/sites - - caddy_data:/data - - caddy_config:/config - - caddy_logs:/var/log/caddy - extra_hosts: - - "host.docker.internal:host-gateway" + - /var/run/docker.sock:/var/run/docker.sock:ro + - ./traefik.yml:/etc/traefik/traefik.yml:ro + - ./dynamic_conf.yml:/etc/traefik/dynamic_conf.yml:ro + - ./acme.json:/acme.json + networks: + - proxy_network -volumes: - caddy_data: - caddy_config: - caddy_logs: +networks: + proxy_network: + external: false + name: proxy_network \ No newline at end of file diff --git a/dynamic_conf.yml b/dynamic_conf.yml new file mode 100644 index 0000000..655a8cc --- /dev/null +++ b/dynamic_conf.yml @@ -0,0 +1,16 @@ +http: + routers: + # Exemplo de Backend + # backend-example: + # rule: "Host(`site.itguys.com.br`)" + # service: example-service + # entryPoints: + # - websecure + # tls: + # certResolver: letsencrypt + + services: + # example-service: + # loadBalancer: + # servers: + # - url: "http://172.16.x.x" diff --git a/sites/.gitkeep b/sites/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/traefik.yml b/traefik.yml new file mode 100644 index 0000000..7a71b74 --- /dev/null +++ b/traefik.yml @@ -0,0 +1,38 @@ +api: + dashboard: true + insecure: true + +entryPoints: + web: + address: ":80" + http: + redirections: + entryPoint: + to: websecure + scheme: https + + websecure: + address: ":443" + +providers: + docker: + endpoint: "unix:///var/run/docker.sock" + exposedByDefault: false + file: + filename: /etc/traefik/dynamic_conf.yml + watch: true + +log: + level: INFO + format: json + +accessLog: + format: json + +certificatesResolvers: + letsencrypt: + acme: + email: suporte@itguys.com.br + storage: acme.json + httpChallenge: + entryPoint: web