# Dockge / Caddy — Reverse Proxy y SSL > Servidor `dockge` (192.168.10.74) que ejecuta **Caddy** en Docker como reverse proxy central para los servicios públicos de la red. > > **Estado**: ✅ Caddy corriendo, certificados renovados. --- ## 1. Información General | Parámetro | Valor | |---|---| | **Hostname** | `dockge` | | **IP LAN** | `192.168.10.74` | | **Servicio** | Caddy v2.11.2 (contenedor Docker) | | **Imagen** | `caddy-cloudflare:latest` | | **Configuración** | `/etc/caddy/Caddyfile` dentro del contenedor | | **Panel Dockge** | `http://192.168.10.74:5001` | ### Contenedores principales | Contenedor | Función | Puerto expuesto | |---|---|---| | `caddy` | Reverse proxy + SSL automático | `443/tcp`, `80/tcp` | | `jellyfin` | Media server | `8096/tcp`, `1900/udp`, `7359/udp` | | `jellyseerr` | Requests de Jellyfin | `5055/tcp` | | `bazarr` | Subtítulos | `6767/tcp` | | `sonarr` | Series | `8989/tcp` | | `radarr` | Películas | `7878/tcp` | | `qbittorrent` | Torrents | `8080/tcp`, `6881/tcp+udp` | | `prowlarr` | Indexers | `9696/tcp` | | `dockge` | Gestor de stacks Docker | `5001/tcp` | --- ## 2. Dominios Gestionados por Caddy ### Dominios `consultoria-as.com` | Dominio | Backend | Estado | |---|---|---| | `jellyfin.consultoria-as.com` | `127.0.0.1:8096` | ✅ | | `mediarequest.consultoria-as.com` | `127.0.0.1:5055` | ✅ | | `immich.consultoria-as.com` | `192.168.10.78:2283` | ✅ | | `odoo.consultoria-as.com` | `192.168.10.81:8069` | ✅ | | `n8n.consultoria-as.com` | `192.168.10.83:5678` | ✅ | | `metabase.consultoria-as.com` | `192.168.10.170:3000` | ✅ | | `hacienda.consultoria-as.com` | `192.168.10.167:5172` | ✅ | | `apihotel.consultoria-as.com` | `192.168.10.167:4000` | ✅ | | `api-hacienda.consultoria-as.com` | `192.168.10.167:4000` | ✅ | | `nexus.consultoria-as.com` | `192.168.10.91:5000` | ✅ | | `git.consultoria-as.com` | `192.168.10.69:3000` | ✅ | | `navidrome.consultoria-as.com` | `192.168.10.85:4533` | ✅ | | `foro.consultoria-as.com` | `192.168.30.73:4567` | ✅ | | `status.consultoria-as.com` | `192.168.10.87:3001` | ✅ | | `cronicas.consultoria-as.com` | `192.168.10.92:3000` | ✅ | | `pagoda.consultoria-as.com` | `192.168.10.92:3001` | ✅ | | `mesh.consultoria-as.com` | `https://192.168.10.97:4443` | ✅ | | `recetas.consultoria-as.com` | `192.168.10.156:8080` | ✅ | | `afterlife.consultoria-as.com` | `192.168.10.84:3000` | ✅ | | `3d.consultoria-as.com` | `192.168.10.104:8000` | ✅ | | `play.consultoria-as.com` | `192.168.10.108:80` | ⚠️ Backend caído | | `gym.consultoria-as.com` | `192.168.10.123:80` | ⚠️ Backend caído | | `strada.consultoria-as.com` | `192.168.10.113:80` | ✅ | ### Dominios adicionales | Dominio | Backend | Estado | |---|---|---| | `horuxfin.com`, `www.horuxfin.com` | `192.168.10.90:3000` | ⚠️ No se puede renovar certificado (token solo cubre `consultoria-as.com`) | | `nexusautoparts.com.mx` | `192.168.10.91:80` | ✅ | | `*.nexusautoparts.com.mx` | `192.168.10.91:80` | ✅ | | `manager.nexusautoparts.com.mx` | `192.168.10.89:5003` | ✅ | --- ## 3. Certificados SSL (Let's Encrypt vía Cloudflare DNS) Caddy obtiene y renueva certificados automáticamente usando el **DNS challenge** de Cloudflare. ### Token de Cloudflare Ubicado en el encabezado del `Caddyfile`: ```caddyfile { acme_dns cloudflare } ``` El token debe tener permisos: - **Zone:Read** - **DNS:Edit** - Zona: `consultoria-as.com` > **Nota**: el token actual solo cubre `consultoria-as.com`. Para renovar `horuxfin.com` se necesita un token adicional con acceso a esa zona. ### Renovación de certificados Caddy renueva certificados automáticamente. Para forzar una renovación manual: ```bash ssh root@192.168.10.74 docker restart caddy ``` O recargar configuración: ```bash docker exec caddy caddy reload --config /etc/caddy/Caddyfile --force ``` ### Comandos útiles ```bash # Ver logs de Caddy ssh root@192.168.10.74 "docker logs caddy --tail 50" # Ver certificados activos ssh root@192.168.10.74 "docker exec caddy caddy list-modules --versions" # Validar Caddyfile ssh root@192.168.10.74 "docker exec caddy caddy validate --config /etc/caddy/Caddyfile" # Verificar expiración de un dominio echo | openssl s_client -servername strada.consultoria-as.com -connect strada.consultoria-as.com:443 2>/dev/null | openssl x509 -noout -enddate ``` --- ## 3.5 Problema Resuelto: Certificados nexusautoparts expirados (08 Sep 2026) **Síntoma**: todos los clientes de Nexus Autoparts veían "página no es segura" — `nexusautoparts.com.mx` y `*.nexusautoparts.com.mx` con certificado vencido (15 Ago 2026). **Causa raíz (combinada)**: 1. El storage de certificados de Caddy se corrompió: los directorios `/data/caddy/certificates/.../nexusautoparts.com.mx/` y `wildcard_.nexusautoparts.com.mx/` **desaparecieron**, quedando solo **lock files huérfanos** en `/data/caddy/caddy/locks/` que bloqueaban la re-emisión en bucle ("expected 1 zone, got 0" + "no such file or directory"). 2. El token de Cloudflare usado en esos bloques **solo tenía acceso a la zona `consultoria-as.com`**, por lo que el DNS-01 challenge para `nexusautoparts.com.mx` nunca podía funcionar. **Solución aplicada (08 Sep 2026)**: 1. Eliminar los lock files huérfanos: `rm /data/caddy/caddy/locks/issue_cert_*nexusautoparts*.lock` (volumen `/var/lib/docker/volumes/caddy_data/_data/caddy/locks/`) 2. Crear token de Cloudflare nuevo con **Zone:Read + DNS:Edit sobre la zona `nexusautoparts.com.mx`** y configurarlo en los 3 bloques `nexusautoparts` del Caddyfile (los de `consultoria-as.com` conservan el token original). 3. `docker restart caddy` → certificados re-emitidos (`certificate obtained successfully` para wildcard y apex), vigentes hasta Dic 2026. **Lección**: cada zona en Cloudflare necesita su propio token con permisos DNS en el Caddyfile. Zonas pendientes de token: `horuxfin.com`. --- ## 4. Problemas Resueltos (21 Jun 2026) - ✅ **Token de Cloudflare inválido**: se actualizó el token en el Caddyfile. - ✅ **Certificados expirados**: se reinició Caddy y se renovaron todos los certificados de `consultoria-as.com` y `nexusautoparts.com.mx`. - ✅ **IP incorrecta de StradaAutopartes**: se corrigió de `192.168.10.117` a `192.168.10.113`. ### Pendientes - [ ] Investigar servicios caídos detrás de `play.consultoria-as.com` (192.168.10.108) y `gym.consultoria-as.com` (192.168.10.123). - [ ] Generar token de Cloudflare para la zona `horuxfin.com` si se requiere HTTPS en ese dominio. --- ## 5. Backends Caídos Detectados | Dominio | Backend | Problema | |---|---|---| | `play.consultoria-as.com` | `192.168.10.108:80` | No responde (timeout) | | `gym.consultoria-as.com` | `192.168.10.123:80` | No responde (timeout) | Estos servicios generan errores `502` en Caddy porque sus backends no están accesibles. Revisar si las VMs/contenedores están apagados o cambiaron de IP. --- *Documentación Caddy / Dockge - Consultoria Alcaraz Salazar* *Actualizado: 21 de Junio de 2026* --- ## ⚠️ Caddy + GetAStatic: certificados y DNS (Sept 2026) — LECTURA OBLIGATORIA ### El problema y su causa raíz Los certificados nuevos fallaban con: ``` querying authoritative nameservers: read udp -> 162.159.38.193:53: no route to host ``` **Causa**: la verificación de propagación DNS de Caddy (certmagic) consulta los **nameservers autoritativos** directamente por UDP/53 — y el ISP de la oficina (CGNAT) **bloquea el DNS externo**. Los certificados existentes funcionan porque se emitieron antes de la mudanza. ### El fix aplicado 1. **`propagation_delay 120s` en TODOS los bloques `tls`** (24 bloques): hace que el solver **espere** en vez de fallar en la verificación. ⚠️ **Requiere unidad** (`120s`, no `120` — sin unidad el contenedor entra en **crash loop** y **todos los servicios caen**). 2. **Regla NAT "Redirect DNS" en el OPNsense**: todo el tráfico UDP/TCP 53 de la LAN se redirige al resolver local (127.0.0.1) — el resolver del OPNsense sí resuelve (usa DoT, no bloqueado). ### Procedimiento seguro para editar el Caddyfile (¡obligatorio!) ```bash # 1. extraer, editar docker exec caddy cat /etc/caddy/Caddyfile > /tmp/Caddyfile.host # (editar /tmp/Caddyfile.host) # 2. VALIDAR ANTES DE APLICAR ← la lección del crash loop docker exec -i caddy caddy validate --adapter caddyfile --config /dev/stdin < /tmp/Caddyfile.host # 3. solo si dice "Valid configuration": docker cp /tmp/Caddyfile.host caddy:/etc/caddy/Caddyfile docker exec caddy caddy reload --config /etc/caddy/Caddyfile ``` ### Otros hallazgos de la sesión - **Backoff largo de ACME**: tras fallos, Caddy reintenta en horas. Forzar con `docker restart caddy` (reintenta al arrancar). - **Backend de PegaProx colgado**: `127.0.0.1:5000` con conexiones en cola (app viva pero muda) → `systemctl restart pegaprox` en el LXC 125. Síntoma: el dominio da timeout tras completar el TLS. - **Medir TLS con SNI correcto**: `curl -H "Host: x"` NO cambia el SNI (da falsos 000). Usar `--resolve x:443:` u `openssl s_client -servername x`.