Cómo habilitar la redirección hacia https en Traefik 2.1.x

Desde hace unos días estoy probando la versión 2.1.x de Traefik y encontré que no hay una forma de que todo el tráfico que llegue por http, lo redireccione a https.

En los managers de dos cluster de Docker Swarm que tengo corro la versión 1.7 de Traefik y lo configure para que por defecto redirija el tráfico que va a http hacía https para todo lo que es sitios y aplicaciones web. Nunca trajo ningún problema y funciona como se espera, renueva certificados solito y balancea de lujo cuando escalo servicios, incluso entre diferentes hosts.

Hace unos meses que hay una versión 2 que, de alguna manera, lo hicieron desde cero, la configuración de 1.7 no aplica para esta nueva versión, así que era cuestión de aprender lo que había cambiado. Me dispuse a hacerlo en un host que tengo para testing y después de un rato, de haber configurado todo, me encuentro con que no hacía la redirección de http a https de todos los hosts que estaban configurados para recibir tráfico https.

Si iba al recurso web por http de manera directa respondía, por https también, pero no hacía la redirección. Claramente desde el balanceador esa redirección no funcionaba, así que me puse a investigar y las configuraciones que encontré, ninguna lo solucionaba, así que mi approach fue, entender que labels de Traefik deberían estar en el contenedor para lograr la tan deseada redirección. Por lo menos de esta manera, lo lograría resolver hasta que Traefik soporte el escenario.

Estos son las labels que hay que poner en cada contenedor que necesita exponerse hacia el balanceador.

    deploy:
      labels:
        traefik.http.routers.tuapp_web.middlewares: tuapp_redirect
        traefik.http.middlewares.tuapp_redirect.redirectscheme.scheme: https
        traefik.http.routers.tuapp_websec.rule: Host(`tudominio.com`)
        traefik.http.services.tuapp_web.loadbalancer.server.port: '80'
        traefik.http.routers.tuapp_websec.tls.certresolver: letsencryptresolver
        traefik.http.routers.tuapp_web.rule: Host(`tudominio.com`)
        traefik.http.routers.tuapp_web.entrypoints: web
        traefik.enable: 'true'
        traefik.http.routers.tuapp_websec.entrypoints: websecure

La cosa es así. Básicamente hay que generar en total 9 labels en donde está definido el sitio por http, por https, un middleware que se encargará de apuntar procesar la redirección y la redirección misma. Es un montón, lo se, pero es básicamente un workaround hasta que se resuelva la redirección desde el balanceador directamente o que en realidad sea capaz de mandar el request hacia el middleware y este lo trabaje de alguna manera.

Así que bueno, si tenés tu contenedor que tiene que accederse a través del balanceador y estás probando Traefik v2.x.x, probate esta solución y me cuentas.