Traefik, mi nuevo mejor amigo (III)

Saca provecho de tu servidor enrutando las peticiones de distintos servicios a través de un proxy inverso

Traefik, mi nuevo mejor amigo (III)

Siguiendo con la saga de publicaciones sobre Traefik, y partiendo de la base de que tenemos todo como nos quedó en el anterior post, en esta entrada veremos cómo levantar un servidor web sencillo y la configuración que necesitamos insertar para que Traefik nos lo detecte.

Para ello, vamos a partir de una imagen Docker de lighttpd, el cual es un servidor web ligero y a la vez rápido y flexible, muy útil para pequeños proyectos, además de ser software libre y estar bajo la licencia BSD.

Como siempre, os pondré primero el fichero docker-compose.yml que usaremos y después detallaremos cada una de sus partes, a fin de entender qué estamos haciendo y configurando, y poder extrapolarlo a cualquier servicio que queramos conectar con nuestro Traefik.

version: '2.3' 
services: 
  web: 
    image: sebp/lighttpd:latest 
    container_name: "web" 
    restart: always 
    volumes: 
      - ./www:/var/www/localhost/htdocs 
      - ./config:/etc/lighttpd 
    networks: 
      - traefiknet 
    tty: true 
    labels: 
      - "traefik.enable=true" 
      - "traefik.port=80" 
      - "traefik.backend=web" 
      - "traefik.frontend.rule=Host:example.org" 
      - "traefik.docker.network=traefiknet" 
      - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https" 
      - "traefik.http.routers.webserver.entrypoints=http" 
      - "traefik.http.routers.webserver.rule=Host(`example.org`) || Host(`www.example.org`)" 
      - "traefik.http.routers.webserver.middlewares=redirect-to-https" 
      - "traefik.http.routers.webserver-secure.entrypoints=https" 
      - "traefik.http.routers.webserver-secure.rule=Host(`example.org`) || Host(`www.example.org`)" 
      - "traefik.http.routers.webserver-secure.tls=true" 
      - "traefik.http.routers.webserver-secure.tls.certresolver=leresolver" 
      
networks: 
  default: 
    traefiknet: 
      external: 
        name: traefiknet
docker-compose.yml para el servidor web

Veamos a continuación cada una de sus partes más relevantes (omito las que ya comenté en la primera entrada de esta saga):

  • volumes: Necesitamos definir dónde estarán los ficheros de configuración del servidor web (lighttpd.conf) y la web en sí que servirá (que se copiará en el directorio /var/www/localhost/htdocs y donde tendremos nuestro index.html y todos los ficheros que necesitemos para ella... aunque para probar que funciona nos bastará con el clásico It works! simple y sencillo. 🤓
  • networks: Definimos la red de Traefik que tengamos desplegada.
  • traefik.enable=true: Habilitamos el servicio para que esté disponible en Traefik y el puerto al que debe redirigir las peticiones (el 80 en este caso).
  • traefik.docker.network=traefiknet Definimos la red de Traefik, ésta etiqueta es para Traefik, mientras que la anterior (bajo networks es para Docker).
  • traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https: En esta etiqueta definimos un middleware que Traefik usará para redirigir las peticiones HTTP a HTTPS. Lo podemos definir aquí o, si lo vamos a usar para más servicios, lo suyo es definirlo en el fichero de Traefik y así tenerlo centralizado.
  • traefik.http.routers.webserver.entrypoints=http: Definimos el enrutado webserver y lo conectamos al entryPoint http, que es en el que en Traefik tenemos escuchando en el puerto HTTP.
  • traefik.http.routers.webserver.rule=Host(\`example.org\` || Host(\`www.example.org\`): De los más importantes, le estamos diciendo que el enrutado webserver está interesado en recibir todas las peticiones que vengan de nuestro dominio. En este caso, hemos puesto una condición de OR para que, bien con www o bien sin ello, Traefik sepa redirigir correctamente la petición.
  • traefik.http.routers.webserver.middlewares=redirect-to-https: Al enrutado webserver le conectamos el middleware que definimos antes y que redireccionará las peticiones. El nombre que le he puesto en este caso es para saber lo que hace con leerlo, pero en lugar de redirect-to-https perfectamente se podría llamar pepito... ¡siempre que coincida con el que definimos anteriormente!
  • traefik.http.routers.webserver-secure.entrypoints=https: Definimos otro nuevo enrutado, llamado webserver-secure (para distinguirlo del anterior y saber que éste es el "seguro") y lo conectamos al entryPoint https que definimos en Traefik y que está escuchando en el puerto de HTTPS.
  • traefik.http.routers.webserver-secure.rule=Host(\`example.org\` || Host(\`www.example.org\`): Al igual que en caso anterior, debemos decirle a este enrutado en qué está interesado, por lo que todas las peticiones que lleguen por HTTPS y que contengan nuestro dominio (con o sin www) querrá procesarlas.
  • traefik.http.routers.webserver-secure.tls=true: El enrutado webserver-secure está securizado, por lo que le indicamos que tiene TLS mediante la propiedad tls=true.
  • traefik.http.routers.webserver-secure.tls.certresolver=leresolver: Le referenciamos el resolvedor que contiene los certificados TLS, y que podemos ver definido en el docker-compose que definimos para Traefik.

Con esto, cuando ejecutemos el comando:

docker-compose up -d

Se nos levantará un servidor web y, si accedemos a la consola de Traefik, podremos verlo ahí listado, registrado en el entryPoint http y en el https, este último con un escudito en verde indicándonos que está securizado. Si ahora accedemos a nuestro dominio example.org tanto con http:// como https:// y con o sin www, nos redirigirá a la versión segura de la misma. 😎

Y con esto finalizo esta "saga" sobre cómo desplegar nuestra propia web haciendo uso de Traefik y redirigiendo y securizando nuestro endpoint.