Wiki: agregar páginas iniciales (Home, Configuración avanzada, TLS-ACME, Middlewares, Ejemplos, Troubleshooting)
58
Configuracion-Avanzada.md
Normal file
58
Configuracion-Avanzada.md
Normal file
@@ -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
|
||||||
56
Ejemplos.md
Normal file
56
Ejemplos.md
Normal file
@@ -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
|
||||||
39
Home.md
39
Home.md
@@ -1 +1,38 @@
|
|||||||
¡Bienvenidos a la Wiki!
|
# 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
|
||||||
56
Middlewares-Seguridad.md
Normal file
56
Middlewares-Seguridad.md
Normal file
@@ -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
|
||||||
46
TLS-ACME.md
Normal file
46
TLS-ACME.md
Normal file
@@ -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
|
||||||
49
Troubleshooting.md
Normal file
49
Troubleshooting.md
Normal file
@@ -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
|
||||||
Reference in New Issue
Block a user