Traefik, proxy inverso con Let’s Encrypt en Raspberry Pi

¡Hola Nómadas! Volvemos con un post sobre Raspberry Pi y Docker. Esta vez vamos a dar nombre a los servicios que tenemos en nuestra Raspberry Pi. En Cibernómadas os hemos enseñado a desplegar servicios como Gitea o Drone.

¿Qué es Traefik?

Seguro que conocéis el software Apache como servidor web, estos se caracterizan por ofrecer a los usuarios la información que se le solicita. Por otro lado, está el proxy inverso. El proxy inverso tiene un comportamiento completamente distinto, pero que muchas veces se confunde. Los proxis inversos “encaminan” por lo general la petición del usuario hacia un servidor web. Por ejemplo, si imaginamos que en cibernómadas utilizamos dos servidores web, uno para compartir los archivos estáticos (png, mp3, css, js, …) y otro para procesar las consultas a ficheros php, se puede encaminar al usuario cuando solicita https://www.cibernomadas.es/index.php hacia el servidor que procesa los archivos php.

Estructura clásica de proxy inverso

Este es el esquema habitual para entornos no dockerizados. Pero, ¿qué sucede en entornos dockerizados? ¿Qué sucede si nuestro servidor es en realidad un contenedor Docker? Un servidor o proxy inverso habitual no se adapta tan fácilmente y es ahí donde entra Traefik. Traefik es un proxy inverso con multitud de funcionalidades, y lo más importante, que es completamente compatible con entornos dockerizados.

Traefik escucha el tráfico interno de Docker a través del fichero docker.sock y con base a éste Traefik realiza unas acciones u otra, sobre todo las tareas de proxy inverso. Lo interesante de Traefik es que puede detectar contenedores nuevos y crear las reglas necesarias para “encaminar” el tráfico hacia el contenedor oportuno y todo es automático. Esa es la verdadera magia detrás de Traefik.

Para aclarar los conceptos vamos a fijarnos en la imagen superior e inferior. Si imaginamos que tanto el proxy inverso como ambos servidores están dockerizados, podemos entender que traefik ha detectado la creación de ambos servidores (estático y de contenido php), creando así las rutas necesarias para encaminar el tráfico. Además, en Traefik (al igual que en otros servidores/proxis, como Nginx, podemos encaminar el tráfico según el Host o la URI. Por ejemplo, cuando se accede a https://www.cibernomadas.es/index.php se encamina el tráfico al servidor de contenido php y cuando se accede a https://www.cibernomadas.es/static/jquery.js se encamina el tráfico al servidor de contenido estático.

Te puede interesar  Go con Gin, el mega tutorial (VII)

Arquitectura con proxy Traefik

Instalando Traefik

La verdad que está tarea no puede ser más sencilla. La gente de Traefik ya disponen tanto de binarios para muchas arquitecturas, arm una de ellas, e imágenes Docker para las mismas arquitecturas. Nosotros utilizaremos la imagen Docker para arm, de este modo podremos actualizar Traefik de forma sencilla con el comando: docker-compose pull && docker-compose stop && docker-compose up -d.

Configurando docker-compose

Tal como hemos estado haciendo en las entradas anteriores, vamos a crearnos una carpeta en el directorio principal del usuario, nosotros hemos usado ~/docker/traefik, y en ella crearemos el siguiente fichero docker-compose.yml.

Si ya habéis trabajado con Docker y en especial con Docker Compose entenderéis rápidamente el fichero docker-compose.yml, pero si no habéis trabajado con Docker vamos a explicar el contenido del fichero.

La primera línea indica cual es la versión del esquema utilizada en el fichero. La tercera línea es donde se define los servicios que vamos a desplegar, en este caso solo un servicio. Se define un nombre para el servicio, por ejemplo traefik, se especifica cual es la imagen Docker a utilizar, en la línea 6 indicamos que ante cualquier problema que automáticamente se reinicie el contenedor. Después definimos los puertos que utilizaremos para interactuar con Traefik y los servicios “proxificados”. Seguidamente, indicamos en la línea 11 la red en la que estará conectado el contenedor. El siguiente paso es definir qué queremos compartir de nuestro host (la Raspberry Pi) con el contenedor. Nosotros compartimos:

  • Un directorio para ver y guardar los logs de Traefik.
  • El socket de Docker, es donde Traefik detectará cualquier cambio en los contenedores.
  • La configuración de Traefik.
  • El fichero conde se guardarán los certificados, para el HTTPS.
Te puede interesar  Puesta en marcha de Odoo en Debian - Parte 3

Por último, indicamos el nombre de contenedor.

Para finalizar con el fichero, se define la red traefik_net y la crearemos con el comando docker network create traefik_net.

Configuración básica de Traefik

El siguiente paso es preparar el fichero traefik.toml. Este fichero es la configuración de Traefik y está en formato toml, bastante parecido al formato ini. La verdad es que es bastante sencillo, se puede ver todas las opciones en https://docs.traefik.io.

Las tres primeras opciones son auto explicativas, las líneas 7 y 11 es donde definimos los logs, uno es sobre el propio traefik (traefikLog) y el otro (accessLog) donde se registran los accesos a los contenedores. Este último log será el que consultaremos para ver quien o como se intenta acceder a nuestros contenedores. defaultEntryPoints indica cual será el protocolo con el que se accederá a los contenedores, nosotros por simplicidad en la Raspberry Pi utilizaremos solo HTTP. También se define en qué puerto se escucharán las peticiones del protocolo HTTP. Por último, se define la conexión entre Traefik y Docker, domain indica cual es el dominio por defecto, watch es para detectar los cambios en los contenedores constantemente y así crear reglas dinámicamente. La última opción está puesta por seguridad, ya que así evitamos exponer los contenedores por defecto, y habrá que indicar explícitamente que se quiere exponer un contenedor, lo explicamos más adelante.

Añadir servicios

Por el momento tenemos un proxy inverso que funciona con contenedores Docker. Este proxy inverso está a la escucha de cualquier cambio en Docker. En los posts donde utilizamos Gitea y Drone accedíamos a los servicios mediante la dirección IP, ahora configuraremos los servicios para acceder mediante nombre de dominio.

Tal como hemos configurado Traefik, con la opción exposedByDefault a false, nos permite configurar las etiquetas o labels para que Traefik se auto configurare y “proxifique” las peticiones de los usuarios. Esto es básicamente encaminar las peticiones de los puertos 80 y 443 hacia los contenedores oportunos, normalmente en puerto altos.

Te puede interesar  Go con Gin, el mega tutorial (VIII)

Actualizar el servicio Gitea

Para configurar un servicio y que Traefik lo detecte es necesario añadir unos labels específicos. Estos labels se pueden añadir en la línea de comandos cuando se ejecuta docker run o se pueden añadir en el fichero docker-compose. Nosotros hemos elegido la segunda opción.

Este docker-compsoe es idéntico al que creamos en la entrada donde instalamos Gitea en la Raspberry Pi. Aunque, ahora hemos añadido las líneas de la 17 a la 23.

En la línea 18 indicamos a Traefik que queremos utilizar este servicio. En la línea 19 indicamos que este contendor será utilizado para las peticiones con la cabecera Host: dev.cibernomadsa.es. En la siguiente línea, la 20, indicamos que las peticiones que vengan desde los entryPoints (http y/o https) deben ser encaminadas al puerto 3000 del contenedor. Indicamos también cual es el entryPoint, el backend (solo es un nombre) y la red de Traefik.

Actualizar el servicio Drone

Visto los cambios realizados en la configuración para Gitea, podemos deducir que los cambios para Drone serán iguales o muy parecidos.

En este caso podéis ver como la estructura de los labels es idéntica, pero hay un par de cambios significativos. El primero de ellos es donde se indica la dirección de Gitea, en la versión anterior teníamos la dirección IP y ahora tenemos un dominio completo. El segundo cambio es el parámetro extra_host. Esto ha sido necesario por que los nombres drone.cibernomadas.es y dev.cibernomadas.es no existen, así que se han simulado indicando cual es la IP para cada uno de los dominios, que sin ir más lejos es la misma dirección IP que la Raspberry Pi.

Pues Nómadas, esto es todo por ahora. Con este articulo completamos una serie de posts independientes pero relacionados en el despliegue de entornos para desarrollo.

Un saludo.

Si te ha gustado, compártelo
Traefik, proxy inverso con Let’s Encrypt en Raspberry Pi
Tagged on:                                                         

Deja un comentario

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