¿Cómo redirigir http a https con Traefik 2.0 y las etiquetas Docker Compose?

14

Tenga en cuenta que es una pregunta de Traefik V2. Tuve una solución en V1 pero V2 es una renovación total.

Se supone que lo anterior redirige http://whoami.mysite.com a http s : //whoami.mysite.com.

  • El http s está funcionando bien.
  • El http no redirige a https y genera un error 404.

No hay otro archivo. Todo está en este Docker-compose.yml por el momento, ya que es una prueba para preparar una implementación adicional.

version: "3.3"

services:

  traefik:
    image: "traefik:v2.0"
    container_name: "traefik"
    command:
      - "--log.level=DEBUG"
      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.web-secure.address=:443"
      - "--certificatesresolvers.myhttpchallenge.acme.httpchallenge=true"
      - "--certificatesresolvers.myhttpchallenge.acme.httpchallenge.entrypoint=web-secure"
      #- "--certificatesresolvers.myhttpchallenge.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory"
      - "[email protected]"
      - "--certificatesresolvers.myhttpchallenge.acme.storage=/letsencrypt/acme.json"
    labels:
      - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"
    ports:
      - "80:80"
      - "443:443"
      - "8080:8080"
    volumes:
      - "./letsencrypt:/letsencrypt"
      - "/var/run/docker.sock:/var/run/docker.sock:ro"

  whoami:
    image: "containous/whoami"
    container_name: "whoami"
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.whoami.rule=Host(`whoami.mysite.com`)"
      - "traefik.http.routers.whoami.entrypoints=web"
      - "traefik.http.routers.whoami.middlewares=redirect-to-https@docker"
      - "traefik.http.routers.whoami-secured.rule=Host(`whoami.mysite.com`)"
      - "traefik.http.routers.whoami-secured.entrypoints=web-secure"
      - "traefik.http.routers.whoami-secured.tls=true"
      - "traefik.http.routers.whoami-secured.tls.certresolver=myhttpchallenge"
Thib
fuente

Respuestas:

10

Ahora hay una solución de trabajo en un tutorial de Gérald Croës en:

https://blog.containo.us/traefik-2-0-docker-101-fc2893944b9d

services:  
  traefik:  
    image: "traefik:v2.0.0"  
    # ...  
    labels:  
      # ...        
      # middleware redirect  
      - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"  
      # global redirect to https  
      - "traefik.http.routers.redirs.rule=hostregexp(`{host:.+}`)"  
      - "traefik.http.routers.redirs.entrypoints=web"  
      - "traefik.http.routers.redirs.middlewares=redirect-to-https"  
Martin Hryniewiecki
fuente
1
Aquí está el docker-compose.yml del artículo github.com/containous/blog-posts/blob/master/…
TheOneRing
1
Tenga en cuenta que tener un acme.json existente puede impedir que el middleware redirija a HTTPS. Elimínelo si ya existe al iniciar Traefik.
AymDev
7

No necesita configurar el servicio Traefik en sí. En Traefik solo necesita tener puntos de entrada a: 443 (web-secure) y: 80 (web)

Debido a que Traefik solo actúa como entryPoint y no realizará la redirección, el middleware en el servicio de destino lo hará.

Ahora configure su servicio de destino de la siguiente manera:

version: '2'
services:
  mywebserver:
    image: 'httpd:alpine'
    container_name: mywebserver
    labels:
      - traefik.enable=true
      - traefik.http.middlewares.mywebserver-redirect-web-secure.redirectscheme.scheme=https
      - traefik.http.routers.mywebserver-web.middlewares=mywebserver-redirect-web-secure
      - traefik.http.routers.mywebserver-web.rule=Host(`sub.domain.com`)
      - traefik.http.routers.mywebserver-web.entrypoints=web
      - traefik.http.routers.mywebserver-web-secure.rule=Host(`sub.domain.com`)
      - traefik.http.routers.mywebserver-web-secure.tls.certresolver=mytlschallenge
      - traefik.http.routers.mywebserver-web-secure.tls=true
      - traefik.http.routers.mywebserver-web-secure.entrypoints=web-secure
      # if you have multiple ports exposed on the service, specify port in the web-secure service
      - traefik.http.services.mywebserver-web-secure.loadbalancer.server.port=9000

Entonces, básicamente, el flujo es así:

Solicitud: http://sub.domain.com:80 -> traefik (servicio) -> mywebserver-web (enrutador, regla http) -> mywebserver-redirect-web-secure (middleware, redirigir a https) - -> mywebserver-web-secure (enrutador, regla https) -> mywebserver (servicio)

Lars
fuente
No estoy seguro de que ese sea el requisito. De la forma en que lo describió, parece que las solicitudes van en el puerto traefik 80 y el esquema se cambia a https antes de reenviarse al servicio back-end. Pero el servicio de backend no termina https, por lo que fallará. La idea sería hacer una redirección http real para que la solicitud regrese a traefik en el puerto 443 preservando el host. En Traefik v1 eso se hizo fácilmente a través de la configuración estática.
Andrei Dascalu
Esto funciona. Esto debería estar en la documentación. Solo tiene que hacer un enrutador para la versión http y poner el middleware de redireccionamiento en eso.
milosa
2

Ok, encontrado ... Supuse que los middlewares podrían declararse a nivel de Traefik, pero estos deben declararse a nivel de servicio.

Esta línea :

- "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"

Tiene que estar en las etiquetas del servicio whoami.

Otro punto, que no está relacionado con el problema descrito, es que el desafío http debe hacerse en el puerto 80.

- "--certificatesresolvers.myhttpchallenge.acme.httpchallenge.entrypoint=web-secure"

Elimine el "seguro" en "web-secure".

Thib
fuente
Es extraño. Tengo el middleware de redirección declarado en el servicio Traefik y al que se hace referencia desde el servicio de aplicaciones y funciona.
Izydorr
Con el código anterior parece funcionar pero el http en realidad no redirige a https.
Thib
¿Cómo se refiere al Middleware desde la aplicación?
Thib
En el servicio traefik tengo una etiqueta que define el middleware: traefik.http.middlewares.https-only.redirectscheme.scheme=https y en el servicio de aplicaciones tengo unas etiquetas: traefik.http.routers.myapp.rule=Host($ {} APP_HOST ), traefik.http.routers.myapp.entrypoints=web,traefik.http.routers.myapp.middlewares=https-only
Izydorr
1
Tengo todo en las etiquetas. Según tengo entendido, el uso de middleware requiere dos etiquetas: una para la declaración / configuración (traefik.http.middlewares.https-only.redirectscheme.scheme = https) y luego aplicarlo al servicio (traefik.http.routers.myapp.middlewares = solo https). La declaración puede encontrarse en el servicio de aplicaciones o en el servicio treafik, por ejemplo, tal como lo hago yo. Tenga en cuenta que incluso si declara un middlewawe en el servicio de aplicaciones, lo verá en el tablero junto con otros middlewares declarados en otros lugares. Tal vez me equivoque, pero creo que puedes usar cualquiera de ellos en cualquier servicio.
Izydorr
1

Estaba buscando esta respuesta cuando estaba buscando cómo redirigir todo a HTTPS a través de Traefik v2.2 y la mejor opción para mí era agregar estas variables ENV a Traefik y redirige automáticamente todo el tráfico a HTTPS.

TRAEFIK_ENTRYPOINTS_WEB_ADDRESS=:80
TRAEFIK_ENTRYPOINTS_WEBSECURE_ADDRESS=:443
TRAEFIK_ENTRYPOINTS_WEB_HTTP_REDIRECTIONS_ENTRYPOINT_TO=websecure

Con esto no tengo necesidad de agregar nada al middleware.

fperk
fuente