Traefik, mi nuevo mejor amigo (II)

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

Traefik, mi nuevo mejor amigo (II)

En la anterior entrada vimos cómo crear un contenedor de Traefik y tenerlo preparado para enrutar todos los servicios que levantemos y queramos tener accesibles desde el mismo puerto.

Para ello, partiremos del fichero docker-compose.yml que usamos en el anterior post y haremos que el propio Traefik se auto registre a sí mismo, con el fin de tener un endpoint accesible en nuestra LAN.

Para ello, en dicho fichero añadiremos el tag labels para nuestro servicio y lo informaremos con lo siguiente:

labels:
      - "traefik.http.routers.api.service=api@internal"
      - "traefik.http.routers.api.middlewares=auth"
      - "traefik.http.middlewares.auth.basicauth.users=admin:admin"
      - "traefik.enable=true"
      - "traefik.port=8080"
      - "traefik.backend=traefik"
      - "traefik.frontend.rule=Host:traefik.lan"
      - "traefik.docker.network=traefik_net"
      - "traefik.http.routers.api.entrypoints=lan"
      - "traefik.http.routers.api.rule=Host(`traefik.lan`)"
Labels para conectar el propio Traefik a sí mismo

De nuevo, desgranemos el contenido de lo que estamos añadiendo:

  • traefik.http.routers.api.service=api@internal: Creamos una ruta llamada api y le indicamos que apunte al servicio api@internal de Traefik, para poder acceder al dashboard.
  • traefik.http.routers.api.middlewares=auth: Añadimos un middleware que será el encargado de añadir cierta autenticación al dashboard, con el fin de no tenerlo expuesto sin ningún tipo de seguridad.
  • traefik.http.middlewares.auth.basicauth.users=admin:admin: Creamos una entrada de autenticación básica, en este ejemplo será el usuario admin y contraseña igual... Obviamente en nuestro sistema lo pondremos más "currado".
  • traefik.enable=true: La etiqueta más importante de todas. Con ella hacemos que el componente sea visible para Traefik. Si no la ponemos es lo mismo que si la pusiéramos a false, por lo que no veríamos dicho componente en Traefik.
  • traefik.port=8080: Indicamos el puerto, de entre los expuestos por Traefik, al que queremos conectar nuestro servicio. En nuestro caso, para mostrar el dashboard que se expone en el puerto 8080, lo redirigimos al mismo puerto en Traefik.
  • traefik.backend=traefik: Nombre del servicio que le hemos dado al contenedor, para que Traefik sepa llamarlo.
  • traefik.frontend.rule=Host:traefik.lan: Indicamos el host que escuchará el componente. En nuestro caso, vamos a exponerlo en la intranet, bajo el host traefik.lan.
  • traefik.docker.network=traefiknet: La red que creamos para Traefik y que deberán tener todos los componentes que queramos conectar con él. Puesto que nuestro componente puede estar conectado a varias redes, aquí le indicamos cuál es la que usa Traefik.
  • traefik.http.routers.api.entrypoints=lan: Indicamos en qué entryPoint de los que Traefik tiene desplegados queremos que el componente se conecte. Recordad que declaramos 2 entryPoints, uno para las peticiones HTTPS y otro para la LAN, cuyo puerto no estará accesible desde el exterior.
  • traefik.http.routers.api.rule=Host(`traefik.lan`): Aquí indicamos qué regla asociamos con el componente. Podemos especificar un host o varios, un path (por ejemplo, todas las peticiones que vayan a /dashboard redirigirlas aquí), combinarlas, añadir más reglas... etc. Para este caso iremos a lo simple.
Las rutas que estamos declarando para este ejemplo reciben el nombre de api, cada servicio tendrá que tener su nombre o entrarán en conflicto.

Una vez tenemos las etiquetas configuradas, iniciamos el componente con la orden docker-compose up -d y accedemos en el navegador a http://traefik.lan:8080 y veremos algo como lo siguiente:

Dashboard de Traefik
Dashboard de Traefik

Como podéis ver en la imagen, tengo 2 entryPoints creados, cada uno escuchando en un puerto, y con los servicios y rutas creados. Si accedemos a dichas rutas, veremos algo como:

Donde vemos la regla que hemos creado y a través de la cual hemos accedido a dicho dashboard.

En la siguiente entrada, veremos cómo levantar otro servicio, como por ejemplo una página web.