diff --git a/dynamic/README.md b/dynamic/README.md index 5bbdbd6..a9ef5c4 100644 --- a/dynamic/README.md +++ b/dynamic/README.md @@ -5,7 +5,10 @@ Este directorio contiene configuración que Traefik recarga automáticamente sin ## Archivos - **middlewares.yml**: Middlewares reutilizables (headers seguridad, rate limit, auth, etc.) -- **routers.yml**: Ejemplos de routers y servicios estáticos (alternativa a labels Docker) +- **routers.yml**: Routers HTTP/HTTPS (ejemplos comentados) +- **services.yml**: Servicios backend (ejemplos comentados) + +**Nota:** Los archivos NO usan la raíz `http:` porque Traefik los carga automáticamente bajo `http.middlewares`, `http.routers`, y `http.services` respectivamente. ## Autenticación Básica diff --git a/dynamic/dynamic.yml b/dynamic/dynamic.yml deleted file mode 100644 index 3f268f5..0000000 --- a/dynamic/dynamic.yml +++ /dev/null @@ -1,108 +0,0 @@ -# ============================================ -# CONFIGURACIÓN DINÁMICA DE TRAEFIK -# ============================================ -# Este archivo contiene middlewares, routers y servicios -# Traefik recarga automáticamente los cambios (~10s) - -http: - # ============================================ - # MIDDLEWARES - # ============================================ - middlewares: - # Headers de seguridad - security-headers: - headers: - stsSeconds: 63072000 - forceSTSHeader: true - stsIncludeSubdomains: true - stsPreload: true - frameDeny: true - contentTypeNosniff: true - browserXssFilter: true - referrerPolicy: "strict-origin-when-cross-origin" - customResponseHeaders: - X-Robots-Tag: "none,noarchive,nosnippet,notranslate,noimageindex" - - # Rate limiting - rate-limit: - rateLimit: - average: 100 - burst: 200 - period: 1m - - # IP Allow List (ejemplo - ajusta tus IPs) - ip-allowlist: - ipAllowList: - sourceRange: - - "127.0.0.1/32" - - "10.0.0.0/8" - - "172.16.0.0/12" - - "192.168.0.0/16" - - # Autenticación básica (genera hash con: docker run --rm httpd:alpine htpasswd -nbB admin tu_password) - auth-basic: - basicAuth: - users: - - "admin:$2y$05$example_hash_CHANGE_THIS" # CAMBIA ESTE HASH - - # Redirect www a root - redirect-www: - redirectRegex: - regex: "^https?://www\\.(.+)" - replacement: "https://${1}" - permanent: true - - # ============================================ - # ROUTERS (Ejemplos comentados) - # ============================================ - # routers: - # # Ejemplo: Router para aplicación web con HTTPS y middlewares - # whoami: - # rule: "Host(`whoami.tudominio.com`)" - # entryPoints: - # - websecure - # middlewares: - # - security-headers - # - rate-limit - # service: whoami-service - # tls: - # certResolver: letsencrypt - # - # # Ejemplo: Router con autenticación básica y restricción IP - # admin-panel: - # rule: "Host(`admin.tudominio.com`)" - # entryPoints: - # - websecure - # middlewares: - # - auth-basic - # - ip-allowlist - # - security-headers - # service: admin-service - # tls: - # certResolver: letsencrypt - - # ============================================ - # SERVICES (Ejemplos comentados) - # ============================================ - # services: - # # Ejemplo: Servicio apuntando a contenedor local - # whoami-service: - # loadBalancer: - # servers: - # - url: "http://whoami:80" - # - # # Ejemplo: Servicio apuntando a servidor externo - # admin-service: - # loadBalancer: - # servers: - # - url: "http://192.168.1.100:8080" - # - # # Ejemplo: Servicio con health check - # api-service: - # loadBalancer: - # servers: - # - url: "http://api:3000" - # healthCheck: - # path: "/health" - # interval: "10s" - # timeout: "3s" diff --git a/dynamic/middlewares.yml b/dynamic/middlewares.yml new file mode 100644 index 0000000..9cc2b9b --- /dev/null +++ b/dynamic/middlewares.yml @@ -0,0 +1,46 @@ +# ============================================ +# MIDDLEWARES +# ============================================ + +# Headers de seguridad +security-headers: + headers: + stsSeconds: 63072000 + forceSTSHeader: true + stsIncludeSubdomains: true + stsPreload: true + frameDeny: true + contentTypeNosniff: true + browserXssFilter: true + referrerPolicy: "strict-origin-when-cross-origin" + customResponseHeaders: + X-Robots-Tag: "none,noarchive,nosnippet,notranslate,noimageindex" + +# Rate limiting +rate-limit: + rateLimit: + average: 100 + burst: 200 + period: 1m + +# IP Allow List (ejemplo - ajusta tus IPs) +ip-allowlist: + ipAllowList: + sourceRange: + - "127.0.0.1/32" + - "10.0.0.0/8" + - "172.16.0.0/12" + - "192.168.0.0/16" + +# Autenticación básica (genera hash con: docker run --rm httpd:alpine htpasswd -nbB admin tu_password) +auth-basic: + basicAuth: + users: + - "admin:$2y$05$example_hash_CHANGE_THIS" # CAMBIA ESTE HASH + +# Redirect www a root +redirect-www: + redirectRegex: + regex: "^https?://www\\.(.+)" + replacement: "https://${1}" + permanent: true diff --git a/dynamic/routers.yml b/dynamic/routers.yml new file mode 100644 index 0000000..ca807c5 --- /dev/null +++ b/dynamic/routers.yml @@ -0,0 +1,29 @@ +# ============================================ +# ROUTERS Y SERVICIOS (Ejemplos comentados) +# ============================================ +# Descomentar y adaptar según necesites + +# Ejemplo: Router para aplicación web con HTTPS y middlewares +# whoami: +# rule: "Host(`whoami.tudominio.com`)" +# entryPoints: +# - websecure +# middlewares: +# - security-headers +# - rate-limit +# service: whoami-service +# tls: +# certResolver: letsencrypt + +# Ejemplo: Router con autenticación básica y restricción IP +# admin-panel: +# rule: "Host(`admin.tudominio.com`)" +# entryPoints: +# - websecure +# middlewares: +# - auth-basic +# - ip-allowlist +# - security-headers +# service: admin-service +# tls: +# certResolver: letsencrypt diff --git a/dynamic/services.yml b/dynamic/services.yml new file mode 100644 index 0000000..9fbb3af --- /dev/null +++ b/dynamic/services.yml @@ -0,0 +1,26 @@ +# ============================================ +# SERVICIOS (Ejemplos comentados) +# ============================================ +# Descomentar y adaptar según necesites + +# Ejemplo: Servicio apuntando a contenedor local +# whoami-service: +# loadBalancer: +# servers: +# - url: "http://whoami:80" + +# Ejemplo: Servicio apuntando a servidor externo +# admin-service: +# loadBalancer: +# servers: +# - url: "http://192.168.1.100:8080" + +# Ejemplo: Servicio con health check +# api-service: +# loadBalancer: +# servers: +# - url: "http://api:3000" +# healthCheck: +# path: "/health" +# interval: "10s" +# timeout: "3s"