diff --git a/Configuracion-Avanzada.md b/Configuracion-Avanzada.md new file mode 100644 index 0000000..dfaf1bd --- /dev/null +++ b/Configuracion-Avanzada.md @@ -0,0 +1,58 @@ +# Configuración Avanzada + +## entryPoints +```yaml +entryPoints: + web: + address: ":80" + http: + redirections: + entryPoint: + to: websecure + scheme: https + websecure: + address: ":443" +``` +La redirección fuerza HTTPS para todo el tráfico. + +## Proveedores +```yaml +providers: + docker: + exposedByDefault: false + network: proxy + file: + directory: /etc/traefik/dynamic + watch: true +``` +Usa `exposedByDefault: false` para controlar qué servicios se publican. + +## Certificados +```yaml +certificatesResolvers: + letsencrypt: + acme: + email: admin@tudominio.com + storage: /letsencrypt/acme.json + httpChallenge: + entryPoint: web +``` +`storage` debe ser persistente para mantener renovaciones. + +## Dashboard +Se expone vía labels apuntando a `api@internal`. Protege con dominio + auth básica. + +## Staging vs Producción +Para pruebas masivas: +```yaml +caServer: https://acme-staging-v02.api.letsencrypt.org/directory +``` +Evita límites de emisión. + +## Ajustes recomendados +- Mantén el archivo estático mínimo. +- Mueve middlewares personalizados a `/etc/traefik/dynamic`. +- Versiona `traefik.yml` en Git. + +--- +Última actualización: Nov 2025 diff --git a/Ejemplos.md b/Ejemplos.md new file mode 100644 index 0000000..be58e8e --- /dev/null +++ b/Ejemplos.md @@ -0,0 +1,56 @@ +# Ejemplos de Servicios + +## Portainer +```yaml +- "traefik.enable=true" +- "traefik.http.routers.portainer.rule=Host(`portainer.tudominio.com`)" +- "traefik.http.routers.portainer.entrypoints=websecure" +- "traefik.http.routers.portainer.tls.certresolver=letsencrypt" +- "traefik.http.services.portainer.loadbalancer.server.port=9443" +- "traefik.http.services.portainer.loadbalancer.server.scheme=https" +``` + +## NGINX Proxy Manager +```yaml +- "traefik.enable=true" +- "traefik.http.routers.npm.rule=Host(`npm.tudominio.com`)" +- "traefik.http.routers.npm.entrypoints=websecure" +- "traefik.http.routers.npm.tls.certresolver=letsencrypt" +- "traefik.http.services.npm.loadbalancer.server.port=81" +``` + +## Jellyfin +```yaml +- "traefik.enable=true" +- "traefik.http.routers.jellyfin.rule=Host(`jellyfin.tudominio.com`)" +- "traefik.http.routers.jellyfin.entrypoints=websecure" +- "traefik.http.routers.jellyfin.tls.certresolver=letsencrypt" +- "traefik.http.services.jellyfin.loadbalancer.server.port=8096" +``` + +## Nextcloud +```yaml +- "traefik.enable=true" +- "traefik.http.routers.nextcloud.rule=Host(`files.tudominio.com`)" +- "traefik.http.routers.nextcloud.entrypoints=websecure" +- "traefik.http.routers.nextcloud.tls.certresolver=letsencrypt" +- "traefik.http.routers.nextcloud.middlewares=sec-headers" +- "traefik.http.services.nextcloud.loadbalancer.server.port=80" +``` + +## Vaultwarden +```yaml +- "traefik.enable=true" +- "traefik.http.routers.vault.rule=Host(`vault.tudominio.com`)" +- "traefik.http.routers.vault.entrypoints=websecure" +- "traefik.http.routers.vault.tls.certresolver=letsencrypt" +- "traefik.http.services.vault.loadbalancer.server.port=80" +``` + +## Consejos +- Reutiliza middlewares comunes (seguridad, auth). +- Usa nombres claros de routers y servicios. +- Comprueba logs tras el primer despliegue. + +--- +Última actualización: Nov 2025 diff --git a/Home.md b/Home.md index 0ab951d..a429724 100644 --- a/Home.md +++ b/Home.md @@ -1 +1,38 @@ -¡Bienvenidos a la Wiki! \ No newline at end of file +# Traefik Wiki + +Bienvenido a la wiki de **Traefik v2** para esta infraestructura. + +## Objetivo +Proveer un reverse proxy moderno con HTTPS automático, detección de servicios Docker y seguridad reforzada. + +## Componentes Clave +- entryPoints `web` (80) y `websecure` (443) +- Redirección HTTP→HTTPS +- Proveedor Docker (`exposedByDefault=false`) +- Let's Encrypt (HTTP-01) con almacenamiento ACME +- Dashboard vía dominio protegido + +## Despliegue Rápido +```bash +docker network create proxy +git clone https://git.ictiberia.com/groales/traefik +cd traefik +mkdir -p letsencrypt && echo > letsencrypt/acme.json +# chmod 600 letsencrypt/acme.json (Linux) +docker compose up -d +``` + +## Páginas +- [Configuración Avanzada](Configuracion-Avanzada.md) +- [TLS y ACME](TLS-ACME.md) +- [Middlewares y Seguridad](Middlewares-Seguridad.md) +- [Ejemplos](Ejemplos.md) +- [Troubleshooting](Troubleshooting.md) + +## Próximos Pasos +1. Ajusta email ACME en `traefik.yml` +2. Configura DNS del dashboard +3. Añade servicios con labels y red `proxy` + +--- +Última actualización: Nov 2025 \ No newline at end of file diff --git a/Middlewares-Seguridad.md b/Middlewares-Seguridad.md new file mode 100644 index 0000000..d46fbb9 --- /dev/null +++ b/Middlewares-Seguridad.md @@ -0,0 +1,56 @@ +# Middlewares y Seguridad + +## Basic Auth +```yaml +- "traefik.http.routers.traefik.middlewares=traefik-auth" +- "traefik.http.middlewares.traefik-auth.basicauth.users=admin:$apr1$..." +``` +Generar hash: `htpasswd -nb admin 'password'`. + +## Headers de Seguridad +```yaml +- "traefik.http.middlewares.sec-headers.headers.stsSeconds=63072000" +- "traefik.http.middlewares.sec-headers.headers.forceSTSHeader=true" +- "traefik.http.middlewares.sec-headers.headers.stsIncludeSubdomains=true" +- "traefik.http.middlewares.sec-headers.headers.stsPreload=true" +- "traefik.http.middlewares.sec-headers.headers.frameDeny=true" +- "traefik.http.middlewares.sec-headers.headers.contentTypeNosniff=true" +``` +Aplicar: `traefik.http.routers.app.middlewares=sec-headers`. + +## Rate Limit +```yaml +- "traefik.http.middlewares.rl.rateLimit.average=50" +- "traefik.http.middlewares.rl.rateLimit.burst=100" +``` +Útil para APIs públicas. + +## IP Whitelist +```yaml +- "traefik.http.middlewares.allow-admin.ipWhiteList.sourceRange=10.0.0.0/24,192.168.1.0/24" +``` + +## Chain Middleware +Combina varias: +```yaml +- "traefik.http.middlewares.chain-admin.chain.middlewares=traefik-auth,sec-headers" +``` + +## Redirect Regex +Ejemplo www→root: +```yaml +- "traefik.http.middlewares.www-redirect.redirectregex.regex=^https?://www\\.(.*)" +- "traefik.http.middlewares.www-redirect.redirectregex.replacement=https://$1" +- "traefik.http.middlewares.www-redirect.redirectregex.permanent=true" +``` + +## mTLS (Avanzado) +Requiere `serversTransport` y certificados cliente; no incluido por simplicidad. + +## Recomendaciones +- No abusar de basic auth: combinar con 2FA en app. +- Activar HSTS solo si seguro de usar HTTPS siempre. +- Revisar logs tras aplicar limitaciones. + +--- +Última actualización: Nov 2025 diff --git a/TLS-ACME.md b/TLS-ACME.md new file mode 100644 index 0000000..958dbe2 --- /dev/null +++ b/TLS-ACME.md @@ -0,0 +1,46 @@ +# TLS y ACME + +## Flujo HTTP-01 +1. Solicitud inicial de certificado. +2. Let's Encrypt envía desafío HTTP. +3. Traefik sirve el token en `/.well-known/acme-challenge/` sobre puerto 80. +4. Validación correcta → emisión de certificado. +5. Renovación automática ~30 días antes de expirar. + +## Requisitos +- Puertos 80 y 443 abiertos. +- DNS correcto apuntando al servidor. +- Email válido para notificaciones. + +## Errores comunes +| Problema | Causa | Acción | +|----------|-------|--------| +| Timeout | Puerto 80 cerrado | Abrir en firewall/router | +| NXDOMAIN | DNS no propagado | Verificar registros A/AAAA | +| Rate limit | Demasiadas peticiones | Usar staging y espaciar | +| Unauthorized | Token no accesible | Revisar reverse proxy adicional | + +## Staging +Usa staging para pruebas: evita límites y bloqueos. +```yaml +certificatesResolvers: + letsencrypt: + acme: + caServer: https://acme-staging-v02.api.letsencrypt.org/directory +``` + +## Revocación +Si comprometes una clave privada, genera nueva y deja expirar el anterior; la revocación rara vez es necesaria. + +## Multi-Dominio +Con labels múltiples: +```yaml +- "traefik.http.routers.app.rule=Host(`app1.tu.com`,`app2.tu.com`)" +``` +Un único certificado SAN. + +## Forzar renovación manual +No suele ser necesario. Eliminar entrada de `acme.json` concreta (avanzado) → Traefik solicitará de nuevo. + +--- +Última actualización: Nov 2025 diff --git a/Troubleshooting.md b/Troubleshooting.md new file mode 100644 index 0000000..278537a --- /dev/null +++ b/Troubleshooting.md @@ -0,0 +1,49 @@ +# Troubleshooting + +## Certificados no se emiten +- Verifica puertos 80/443 abiertos. +- DNS correcto (A/AAAA). +- Usa staging si haces muchas pruebas. + +## 404 en servicio +- Falta label `traefik.enable=true`. +- Regla Host incorrecta o sin DNS. +- Contenedor fuera de red `proxy`. + +## Dashboard no carga +- Dominio apuntando a servidor. +- Router y service `api@internal` definidos. +- Auth básica mal configurada → revisar hash. + +## ACME errores +Revisar logs: +```bash +docker logs traefik | Select-String -Pattern acme,error,challenge +``` + +## Puerto ya en uso +Ejecuta: +```bash +netstat -ano | findstr :80 +``` +Identifica proceso y libera puerto. + +## Renovación fallida +- Hora del sistema incorrecta. +- Firewall filtra HTTP. +- Eliminaste `acme.json` sin reinstalar correctamente. + +## Estrategia de Diagnóstico +1. Logs traefik. +2. Inspección labels (`docker inspect contenedor | Select-String traefik`). +3. DNS con `nslookup dominio`. +4. Verificar red: `docker network inspect proxy`. + +## Reinicio Seguro +```bash +docker compose down && docker compose up -d +``` +No borra volúmenes ni certificados si usas bind persistente. + +--- +Última actualización: Nov 2025