Traefik: Enrutando nuestro WordPress

Traefik: Enrutando nuestro Wordpress

En el anterior post instalamos docker  y docker-compose  en una instancia EC2 de Amazon para testear el funcionamiento de Traefik como proxy inverso.

Dejamos corriendo la instalación de Traefik v2.3.6 con una url asegurada mediante certificado SSL Let’s Encrypt.

En este post utilizaremos de nuevo docker  y docker-compose  para levantar un WordPress que será enrutado a través de Traefik y será éste el encargado de dotarlo de certificado y el enrutamiento necesario. Traefik analizará a través del socket de Docker que le hemos pasado en su configuración que hay un nuevo contenedor en el sistema y a través de las labels  de éste le diremos qué url tendrá dicho contenedor y cómo servirlo, en este caso a través de https.

Recordemos que tenemos generado un Wildcard DNS para que todos los subdominios apunten a la IP de nuestra instancia EC2. En este caso, usaremos la url blog.canonigos.me  para desplegar el WordPress.

Generando el fichero docker-compose.yml

Vamos a crear un directorio wordpress  dentro del home de nuestro usuario y a generar un fichero docker-compose.yml  como el siguiente dentro de él:

En este fichero hemos definido dos servicios, uno llamado db  que correrá una imagen de MariaDB 10.5 y otro llamado wordpress  que es la imagen oficial de WordPress (el tag latest  incluye Apache2 + PHP 7.4.13).

Mas allá de configurar contraseñas y dependencias entre los servicios para definir el orden de arranque, son importantes varias cosas:

  • El contenedor WordPress tiene configuradas dos redes, la externa del proxy  que será la que utilizará Traefik para mandarle el tráfico cuando visitemos el blog y la default  por la que se comunicará con el servicio del contenedor db , la base de datos de nuestro WordPress.
  • Hemos creado un volumen llamado wp-db-data  para albergar los datos del contenedor db , así podremos actualizar la versión de WordPress o reiniciar el servicio sin miedo a perder los datos.
  • Las labels  de Traefik asignan este servicio al entrypoint websecure  (es decir, que irá sobre https) y el Host del que Traefik recogerá las peticiones y las enviará a este contenedor.

De esta forma, queda enrutada que cualquier petición que entre a Traefik con el Host:blog.canonigos.me  irá al servicio wordpress  de este stack que vamos a levantar.

Arrancando nuestro WordPress

Vamos a arrancar pues este docker-compose con nuestra aplicación:

Tras esperar un minuto aproximadamente deberíamos poder acceder a la url que hemos definido y que Traefik pasará a nuestro recién creado stack.

Os adjunto capturas del proceso de instalación ya en el navegador:

Traefik: Enrutando nuestro WordPress

Qué ha hecho Traefik por nosotros

Traefik nos ha generado un nuevo enrutamiento para nuestra url blog.canonigos.me enlazando este host con nuestro stack de docker-compose  recién desplegado:

Además ha generado un nuevo certificado para la url y ha configurado las cabeceras necesarias para que dicho certificado se muestre correctamente:

De esta forma Traefik ha solventado fácilmente muchas partes de la configuración y exposición de nuestra aplicación WordPress así como la segurización de la misma tanto por la capa de certificado como la cabeceras de seguridad.

En próximos posts hablaremos de las capacidades de Traefik como Ingress Controller  de Kubernetes.

4 respuestas a “Traefik: Enrutando nuestro WordPress”

  1. Avatar for Francisco Javier Funes Nieto Seba Madrid dice:

    Esta muy bueno el articulo, mi duda es como hago para tener una instancia mas de wordpress aparte de la que tengo

    • Avatar for Francisco Javier Funes Nieto cca-admin dice:

      Hola Seba,

      Es bastante simple, te explicamos:

      Debes crear una carpeta nueva, por ejemplo wordpress2, donde alojaremos una nueva configuración de docker-compose.

      Por ejemplo:


      # wordpress2/docker-compose.yml
      version: '3.7'

      services:
      db:
      image: mariadb
      container_name: db2
      volumes:
      - db-data-2:/var/lib/mysql
      networks:
      - default
      restart: always
      environment:
      MYSQL_ROOT_PASSWORD: PasswordSecreta
      MYSQL_DATABASE: wpdb
      MYSQL_USER: blog_dbuser
      MYSQL_PASSWORD: blogdbpassword
      wordpress:
      depends_on:
      - db
      image: wordpress:latest
      container_name: wordpress2
      environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_NAME: wpdb
      WORDPRESS_DB_USER: blog_dbuser
      WORDPRESS_DB_PASSWORD: blogdbpassword
      volumes:
      - ./wp-data:/var/www/html/wp-content
      networks:
      - proxy
      - default
      restart: always
      labels:
      - "traefik.enable=true"
      - "traefik.docker.network=proxy"
      - "traefik.http.routers.wordpress-secure.entrypoints=websecure"
      - "traefik.http.routers.wordpress-secure.rule=Host(
      blog2.canonigos.me)


      volumes:
      db-data-2:
      name: wp-db-data-2
      networks:
      proxy:
      external: true

      Debes prestar especial atención a lo siguiente:

      – Los nombres de los contenedores definidos en las claves container_name deberán ser únicos, como ves los he cambiado por wordpress2 y db2 respectivamente para que no colisionen con los del anterior servidor WordPress. Si omites el container_name, Docker generará un nombre de contenedor relacionado con el nombre de la carpeta donde se aloja el fichero docker-compose.yml.
      – Las etiquetas o labels que interpreta Traefik definidas en el contenedor de WordPress han de tener una nueva configuración de Host, en este caso blog2.canonigos.me que será el hostname que tendrá esta nueva instancia.
      – Y, por último, los volúmenes definidos para la persistencia de los datos en el fichero docker-compose.yml también deben ser nombrados de forma única, en este caso yo le he puesto wp-db-data-2. Es una buena práctica nombrar estos volúmenes con información relacionada al sitio que van a alojar, por ejemplo blog2.canonigos-db-data.

      Con esto debes poder lanzar dentro de este nuevo directorio wordpress2 un docker-compose up y tener una nueva instancia de WordPress funcionando que tendrá su certificado generado automáticamente por Traefik vía Let’s Encrypt, recuerda que el hostname definido dentro de las labels que interpreta Traefik tendrá que apuntar también a la misma ip del servidor.

      Por favor, cuando lo hayas probado cuéntanos si te funciona correctamente 😉

      ¡Un saludo!

  2. Avatar for Francisco Javier Funes Nieto Amado dice:

    ¿Serías tan amable de hacer esto mismo pero con un único dominio y subcarpetas?
    Por ejemplo, http://www.midonimio.com/wordpress1 , http://www.midomino.com/wordpress2, etc
    Mi proveedor de Internet me facilita un único dominio del tipo:
    midominio.ddns.jazztel.es
    Y tengo que utilizar subcarpetas en las urls, no tengo la posibilidad de utilizar Wilcard en el DNS.
    He probado de todo, ando cerca, pero no acaba de funcionar.
    Muchas gracias.

    • Avatar for Francisco Javier Funes Nieto Francisco Javier Funes Nieto dice:

      ¡Hola!

      Ante todo gracias por enviarnos tu consulta y disculpa la tardanza de nuestra respuesta.

      En el caso que nos comentas tendrás que utilizar dos características de Traefik. La primera es un Router específico que debes aplicar en la label del contenedor de la instancia wordpress1. Algo así cómo:

      traefik.http.routers.wordpress1.rule=PathPrefix(/wordpress1{regex:$$|/.*})

      De igual forma, para la aplicación wordpress2 en su definición de docker-compose.

      Y después tendrás que utilizar un middleware de tipo stripprefix también como label dentro de la definición del contenedor:

      traefik.http.middlewares.wordpress1-stripprefix.stripprefix.prefixes=/wordpress1

      Y de la misma forma para la aplicación wordpress2.

      Tienes más info sobre este router y middleware aquí:

      https://doc.traefik.io/traefik/routing/routers/
      https://doc.traefik.io/traefik/middlewares/http/stripprefix/

      ¡Esperamos que puedas echarlo a andar! ¡Cuéntanos al respecto!

      Un saludo.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *