Configuración de Traefik 2 con certificado SSL local

Recientemente actualicé nuestras pilas de desarrollo locales de Docker para usar Traefik  versión 2. Traefik es una aplicación de enrutador de borde que hace que la configuración de servicios y rutas sea bastante simple.

El proceso de imponer el tráfico HTTPS me pareció un poco desafiante y requirió mucho más esfuerzo que la versión 1 de Traefik. Todos nuestros proyectos usan HTTPS solo con un certificado autofirmado para desarrollo local, sin HTTP. Espero que compartir esta información ayude a algunas personas.

Primero, en su archivo docker-compose.yml, necesitamos actualizar el servicio Traefik para usar 2.0 y nuevos comandos:

traefik:
    image: traefik:v2.0
    container_name: "${PROJECT_NAME}_traefik"
    command:
      - --entrypoints.web.address=:80
      - --entrypoints.websecure.address=:443
      - --providers.docker=true
      - --providers.file.directory=/etc/traefik/dynamic_conf
    ports:
      - '80:80'
      - '443:443'
    volumes:
      - ./tools/certs:/tools/certs
      - ./tools/traefik/config.yml:/etc/traefik/dynamic_conf/conf.yml:ro
      - /var/run/docker.sock:/var/run/docker.sock

La sección de comandos proporciona al contenedor modificaciones de configuración en tiempo de ejecución. Aquí, estamos definiendo dos puntos de entrada con nombre en los puertos 80 y 443. También le decimos que Docker es el proveedor y que busque en un directorio en el contenedor la configuración del proveedor.

En segundo lugar, exponemos los puertos 80 y 443. Nada nuevo aquí.

En la sección de volúmenes, estoy montando un directorio en la raíz de mi proyecto en el contenedor. Este directorio contiene el certificado local para el proyecto. En segundo lugar, monta un archivo yaml en el contenedor, ubicado en el directorio que configuramos para ser el directorio de proveedores de la sección de comandos.

Ahora, crea el archivo config.yml. Contiene la ubicación del certificado y la clave para Traefik:

tls:
  certificates:
    - certFile: /tools/certs/cert.crt
      keyFile: /tools/certs/cert.key

Estas rutas existen en el contenedor, tal como se define en la sección de volúmenes.

Ahora, necesitamos configurar el contenedor de Apache (o Nginx si es tu caso) para Traefik y definir un middleware, y decirle a Traefik cómo enrutar el tráfico:

apache:
    ...other config truncated...
    labels:
      - traefik.http.middlewares.${PROJECT_NAME}_apache_https.redirectscheme.scheme=https
      - traefik.http.routers.${PROJECT_NAME}_apache.entrypoints=web
      - traefik.http.routers.${PROJECT_NAME}_apache.rule=Host(`${PROJECT_BASE_URL}`)
      - traefik.http.routers.${PROJECT_NAME}_apache.middlewares=${PROJECT_NAME}[email protected]
      - traefik.http.routers.${PROJECT_NAME}_apache_https.rule=Host(`${PROJECT_BASE_URL}`)
      - traefik.http.routers.${PROJECT_NAME}_apache_https.tls=true
      - traefik.http.routers.${PROJECT_NAME}_apache_https.entrypoints=websecure

La primera línea crea un middleware  que redirige a https. Las siguientes líneas definen un enrutador con punto de entrada y una regla para el tráfico HTTP con la URL del proyecto. También adjuntamos nuestro middleware a ese enrutador, que redirige todo el tráfico a https. Las líneas restantes definen un nuevo enrutador (tenga en cuenta el nombre del enrutador ligeramente diferente con _https adjunto) y la regla, con el punto de entrada websecure (443) y TLS habilitado. Esto configurará ese enrutador para aceptar solo solicitudes HTTPS.

Ahora, cualquier tráfico HTTP se dirigirá a HTTPS. Luego puede agregar su certificado autofirmado a su navegador para que sea reconocido y confiable para su entorno de desarrollo local.