Traefik

Por: Artiko
dokploytraefikproxyrouting

Traefik

Traefik es el reverse proxy que Dokploy usa internamente para enrutar el trafico HTTP/HTTPS a cada aplicacion. Entiende Docker de forma nativa: detecta contenedores automaticamente y configura las rutas sin intervencion manual.

Que es Traefik y su rol en Dokploy

Cuando despliegas una aplicacion en Dokploy y le asignas un dominio, Traefik es el componente que:

  1. Recibe todas las peticiones HTTP/HTTPS en los puertos 80 y 443
  2. Identifica a que aplicacion pertenece cada peticion por el header Host
  3. Reenvía la peticion al contenedor correcto en el puerto interno
  4. Gestiona los certificados SSL con Let’s Encrypt

Arquitectura

Internet
    |
    v
[Traefik :80/:443]
    |
    +---> app-frontend:3000
    +---> app-api:8080
    +---> app-admin:4000

Traefik corre como un contenedor Docker gestionado por Dokploy. Puedes ver su estado:

docker ps | grep traefik

Acceder a la configuracion

En el panel de Dokploy: Settings > Traefik

Desde ahi puedes ver y editar la configuracion del servidor Traefik y la configuracion especifica por aplicacion.

Configurar redirects

HTTP a HTTPS

Por defecto, Dokploy configura Traefik para redirigir HTTP a HTTPS cuando activas HTTPS en un dominio. Si necesitas forzarlo globalmente, edita la configuracion de Traefik en Settings > Traefik > Server Config:

entryPoints:
  web:
    address: ":80"
    http:
      redirections:
        entryPoint:
          to: websecure
          scheme: https
  websecure:
    address: ":443"

www a non-www

Para redirigir www.tudominio.com a tudominio.com, configura un middleware en la aplicacion.

En la pestana Advanced > Traefik de la aplicacion, agrega la configuracion del middleware:

http:
  middlewares:
    redirect-www:
      redirectRegex:
        regex: "^https?://www\\.tudominio\\.com/(.*)"
        replacement: "https://tudominio.com/${1}"
        permanent: true

Luego asocia el middleware al router de la aplicacion en la misma seccion.

non-www a www

Si prefieres la version con www:

http:
  middlewares:
    redirect-to-www:
      redirectRegex:
        regex: "^https?://tudominio\\.com/(.*)"
        replacement: "https://www.tudominio.com/${1}"
        permanent: true

Headers de seguridad

Traefik permite inyectar headers HTTP de seguridad a todas las respuestas sin modificar el codigo de la aplicacion.

Middleware de headers seguros

En Settings > Traefik > Server Config, o en la configuracion por aplicacion:

http:
  middlewares:
    security-headers:
      headers:
        # Forzar HTTPS durante 1 año
        stsSeconds: 31536000
        stsIncludeSubdomains: true
        stsPreload: true
        # Prevenir clickjacking
        frameDeny: true
        # Prevenir MIME type sniffing
        contentTypeNosniff: true
        # Bloquear si detecta XSS
        browserXssFilter: true
        # Controlar de donde se cargan recursos
        contentSecurityPolicy: "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'"
        # Controlar informacion del referrer
        referrerPolicy: "strict-origin-when-cross-origin"
        # Controlar que APIs del navegador puede usar la pagina
        permissionsPolicy: "camera=(), microphone=(), geolocation=()"

Que hace cada header

HeaderFuncion
HSTS (stsSeconds)Obliga al navegador a usar HTTPS siempre
X-Frame-Options (frameDeny)Bloquea la carga del sitio en iframes (anti-clickjacking)
X-Content-Type-Options (contentTypeNosniff)Previene que el navegador interprete archivos con MIME incorrecto
X-XSS-Protection (browserXssFilter)Activa el filtro XSS del navegador
CSP (contentSecurityPolicy)Define origenes permitidos para scripts, estilos e imagenes
Referrer-Policy (referrerPolicy)Controla que informacion se envia en el header Referer
Permissions-Policy (permissionsPolicy)Restringe acceso a APIs del dispositivo

Verificar headers

curl -I https://app.tudominio.com

Busca en la respuesta:

Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
X-Frame-Options: DENY
X-Content-Type-Options: nosniff

Rate limiting

Protege tus aplicaciones de abuso limitando el numero de peticiones por cliente.

Configurar rate limit

http:
  middlewares:
    rate-limit:
      rateLimit:
        average: 100
        period: 1m
        burst: 50
ParametroDescripcion
averagePeticiones permitidas por periodo
periodVentana de tiempo (1s, 1m, 1h)
burstPeticiones extra permitidas en rafagas

La configuracion anterior permite 100 peticiones por minuto con rafagas de hasta 50 peticiones adicionales.

Rate limit por IP

Para limitar por direccion IP del cliente:

http:
  middlewares:
    rate-limit-ip:
      rateLimit:
        average: 50
        period: 1m
        burst: 20
        sourceCriterion:
          ipStrategy:
            depth: 1

El parametro depth indica cuantos niveles de proxies hay delante. Con depth: 1, Traefik extrae la IP del header X-Forwarded-For.

Probar el rate limit

# Enviar 200 peticiones rapidas
for i in $(seq 1 200); do
  curl -s -o /dev/null -w "%{http_code}\n" https://app.tudominio.com
done | sort | uniq -c

Resultado esperado: las primeras peticiones retornan 200, las que exceden el limite retornan 429.

Middleware custom

Traefik permite encadenar multiples middlewares en un mismo router.

Combinar middlewares

http:
  middlewares:
    security-headers:
      headers:
        stsSeconds: 31536000
        frameDeny: true
        contentTypeNosniff: true

    rate-limit:
      rateLimit:
        average: 100
        period: 1m
        burst: 50

    compress:
      compress:
        excludedContentTypes:
          - "text/event-stream"

Middleware de compresion

Reduce el tamano de las respuestas automaticamente:

http:
  middlewares:
    compress:
      compress: {}

Traefik comprime las respuestas con gzip o brotli si el cliente lo soporta (header Accept-Encoding).

Middleware de autenticacion basica

Protege una aplicacion con usuario y contrasena a nivel de proxy:

# Generar el hash de la contrasena
htpasswd -nb admin tu-contrasena-segura
# Resultado: admin:$apr1$xxx...
http:
  middlewares:
    basic-auth:
      basicAuth:
        users:
          - "admin:$apr1$xxx..."

Middleware de IP allowlist

Restringe el acceso a ciertas IPs:

http:
  middlewares:
    ip-allowlist:
      ipAllowList:
        sourceRange:
          - "10.0.0.0/8"
          - "192.168.1.0/24"
          - "203.0.113.50/32"

Configuracion avanzada por aplicacion

Cada aplicacion en Dokploy puede tener su propia configuracion de Traefik.

Editar configuracion por aplicacion

  1. Selecciona la aplicacion
  2. Ve a Advanced > Traefik
  3. Edita la configuracion YAML

La configuracion de la aplicacion tiene prioridad sobre la configuracion global.

Ejemplo: API con rate limit y compresion

http:
  routers:
    api-router:
      rule: "Host(`api.tudominio.com`)"
      middlewares:
        - rate-limit
        - compress
        - security-headers
      service: api-service
      tls:
        certResolver: letsencrypt

  middlewares:
    rate-limit:
      rateLimit:
        average: 200
        period: 1m
        burst: 100

    compress:
      compress: {}

    security-headers:
      headers:
        stsSeconds: 31536000
        contentTypeNosniff: true

Ejemplo: aplicacion con path prefix

Si quieres servir una aplicacion en tudominio.com/api:

http:
  routers:
    api-router:
      rule: "Host(`tudominio.com`) && PathPrefix(`/api`)"
      middlewares:
        - strip-api-prefix
      service: api-service

  middlewares:
    strip-api-prefix:
      stripPrefix:
        prefixes:
          - "/api"

El middleware stripPrefix elimina /api antes de reenviar la peticion al contenedor. La aplicacion recibe /users en lugar de /api/users.

Skip YAML validation para Go templating (v0.27+)

Desde la version 0.27, Dokploy permite desactivar la validacion YAML en la configuracion de Traefik. Esto es util cuando usas Go templates en la configuracion de Traefik.

Cuando usar esta opcion

Los archivos de configuracion de Traefik soportan Go templates:

http:
  routers:
    app:
      rule: "Host(`{{ env "APP_DOMAIN" }}`)"

La sintaxis {{ }} no es YAML valido, por lo que el validador de Dokploy lo rechaza. Para permitirlo:

  1. En la configuracion de Traefik de la aplicacion
  2. Activa la opcion Skip YAML Validation

Precauciones

docker logs dokploy-traefik --tail 50

Siguiente: Capitulo 15: Redes y Puertos —>