435 - Que le DEN a Docker
DEN es un servicio de notificaciones que implementé en Rust para conocer lo que sucede con tus contenedores y otros objetos Docker en Telegram
No te preocupes, que esto de que le den a Docker, no significa que me vaya a olvidar de Docker, nada de eso y mas bien todo lo contrario. Y es que llevo algunas semanas frenéticas, entre actualizaciones, migraciones y otras historias, que me están haciendo poner el ojo precisamente en saber al instante que sucede con todos los servicios que tengo actualmente levantados en Docker.
Estaba revisando los servicios que tengo levantados en Docker, y actualmente están en torno a los 40. Aunque ya te digo que van variando según el día de la semana. Normalmente los fines de semana van creciendo.
La cuestión, es que poco a poco, estoy quitando algunos de los servicios que menos utilizo, en uno de los servidores y dejando los importantes. Todo ello, en el que actualmente se ha convertido en el VPS principal. Esto ha comenzado a preocuparme, en el sentido de que quiero estar informado de que está todo bien. Y es precisamente aquí donde nace DEN y el motivo de que le den a Docker.
Que le DEN a Docker
Las últimas semanas
Como sabes las últimas semanas han sido frenéticas y traumáticas. Frenéticas, por la actualización de algunos de los servicios que estoy utilizando, y la migración de algunas páginas web. Y traumáticas, por lo que ya te comenté la semana pasada, de los problemas, que me generé a mi mismo cuando hice esa migración de webs.
Esto de que algunos servicios me los encuentre caídos, no es nada nuevo. Ya te lo he comentado en mas de una ocasión, y es precisamente lo que me llevó a abandonar FreshRSS en su momento y reemplazarlo por MiniFlux.
Sin embargo, este reemplazo, no ha sido la panacea, porque por el momento sigo teniendo problemas de caídas de estos servicios. En estas últimas ocasiones, mas bien, soy yo el responsable de las mismas.
Pero, sin lugar a dudas, lo que mas me preocupa es no enterarme de lo que sucede, no enterarme de que tengo un servicio caído. Y sobre todo, evitarme la frustración de encontrarme que uno de los servicios en los que confío no está funcionando o no poder utilizarlo.
Uno de los problemas es WatchTower
Como te digo, esto me ha venido sucediendo desde hace algún tiempo, y de hecho, uno de los responsables de esto es WatchTower. Si como lo estás leyendo.
WatchTower es una auténtica maravilla, en tanto en cuanto te permite tener los servicios a la última. Pero en esta automatización, hay ocasiones en las que esto deja de funcionar.
Cierto es que para determinados servicios críticos puedo evitarlo, utilizando las pertinentes etiquetas, pero, que quieres que te diga… Mola tanto, tenerlo todo a la última que en muchas ocasiones me pierde.
El problema principal, o al menos, ese es para mi el problema principal, es no saber que tengo un servicio caído. Si se que un servicio está caído, pues ni tan mal. Simplemente cuando tenga acceso al servidor, no tengo mas que levantarlo y punto, pero hasta el momento no lo sabía, o no tenía forma de saberlo.
Poniendo soluciones
Mattermost
Vuelvo a la carga con Mattermost, y es que este se está convirtiendo en pieza fundamental de todas las notificaciones, y esta no podía ser menos. Sigo con la idea y la mantengo de utilizar Mattermost como centro de notificaciones manteniendome al margen de servicios externos.
Como te comenté en los podcast anteriores y por si acaso alguno de ellos te lo has saltado, indicarte que se trata de un servicio similar a Slack y que está organizado por canales.
De esta forma tengo para cada una de las notificaciones su propio canal y así puedo estar al tanto de lo que sucede.
Así ahora he integrado dos nuevas notificaciones. Una primera, como es Uptime Kuma, que hasta el momento solo lo tenía para monitorizar, pero no había habilitado las notificaciones.
Uptime Kuma
Uptime Kuma, es un servicio del que te hablé hace algunas semanas, y del que tengo publicado un vídeo en YouTube que te muestro a continuación.
Este servicio te permite monitorizar diferentes páginas web, pero no solo esto, sino que también te permite monitorizar DNS, contenedores y mas.
Hasta el momento solo estaba recogiendo las métricas para saber como estaban las distintas páginas que gestiono, pero, estaba desaprovechando la parte de notificaciones que también sirve Uptime Kuma.
Así que he configurado Uptime Kuma, para que en caso de que alguna de las páginas que tengo, entre ellas, las que están alojadas en este VPS, caiga me notifique de nuevo a través de Mattermost.
DEN
Y por fin la estrella de la fiesta DEN, y de ahí el título del episodio del podcast. Y es que con la solución anterior, no tenía suficiente, porque hay algunos de los servicios que ni siquiera tienen acceso desde fuera de la red, con lo que había que darle una solución.
La cuestión es que me puse a la caza y captura de un servicio que me permitiera conocer cada uno de los eventos que se producen en mis contenedores Docker. Cuando un contenedor se cae o se levanta, cuando se destruye, cuando pasa a unhealty, etc.
Sea como fuere, o porque no le puse empeño o porque encontré como estar enterado de estas cosas a través de la API, me lié bastante.
Hace ya algún tiempo que soy conocedor del API de Docker, pero hasta la fecha no le había prestado la mas mínima atención. Y eso que soy un ferviente enamorado de las APIs, cualquier cosa que se pueda hacer por API, ahí que me tienes.
La cuestión es que encontré en una web, alguien que en literalmente dos patadas, había desarrollado una sencilla solución. Y esto me gustó y mucho. Se trataba de una solución en Python, así que decidí hacer mi propia versión en Rust, como no podía ser de otra forma.
DEN Docker Event Notification, no es ni mas ni menos que un servicio Docker que te notifica cuando se produce un evento. Para ello, y mediante un archivo en formato YAML, se configura no solo porque eventos quieres que notifique, sino también, a través de que servicios de notificación.
He definido, al igual que el desarrollador original, los objetos Docker, contenedores, imágenes, volúmenes, etc, y a partir de ahí, puedes definir que eventos quieres que te notifique y el mensaje que te mostrará.
Para los mensajes, empecé con mi propia solución un tanto simplona, pero finalmente, me decanté por Jinja2 que está muy establecido y que te permite hacer cosas mas interesantes. Por ejemplo, te permite dar formato a las fechas, lo cual es muy interesante.
Jinja2, lo utilizo para reemplazar los valores que se obtienen del evento, como puede ser el nombre del contenedor, la imagen a la que pertenece, etc.
Así, ahora tengo un festival de notificaciones, sobre todo ocasionada por las pruebas.
Actualmente solo tengo definidos dos publicadores, Telegram y Mattermost, pero si quieres cualquier otro, no tienes mas que abrir un issue en GitHub y me pongo manos a la obra.
Un terrible error
Cuando empecé con esto, cada vez que llegaba un evento lo publicaba. La cuestión es que mientras era un solo evento no había problema, pero cuando llegaban varios se perdían… Era el tiempo que tardaba en enviar el mensaje a Mattermost… Error de primero de hilos. He tenido que sacar la publicación de los eventos a un segundo hilo para que no se pierda ninguno… Ahora problema resuelto.
Formatos
Respecto a los formatos, esto es algo muy peculiar y particular, y depende del servicio de notificación que utilices. Yo lo estoy haciendo todo con markdown, que al final es mi lenguaje de marcado ligero de referencia. En tu caso, dependiendo del servicio de notificación tendrás que utilizar este u otro.
Por otro lado, tengo que decirte, que a pesar de las reticencias que siempre me ofrece YAML, en este caso he estado realmente a gusto, creo, que se está conviertiendo en mi preferido frente a TOML o incluso JSON… Como JSON levante la cabeza…
HEALTHCHECK
Esta característica todavía no la había utilizado, y he aprovechado para hacer algunas pruebas con ella. Esto te permite definir cuando tu servicio está saludable o no lo está.
Así he creado un contenedor en este caso en Python, para hacer las pruebas tanto de healthy como de unhealthy, y en el caso es que ha estado muy interesante, así, que he aprovechado para implementarlo en algún servicio adicional, como es el que utilizo para las publicaciones.
A probar…
Por supuesto que te invito a que pruebes DEN. Actualmente está disponible únicamente para 64 bits, pero si lo quieres para ARM de 32 o 64 bits, me lo dices igualmente, y me pongo con ello, para que también lo puedas disfrutar.
No te quepa ninguna duda que estoy atento a cualquier idea, comentario o sugerencia para mejorar este servicio.
Más información,
Lástima, por un momento pensé que te ibas a pasar a systemd-nspawn 😉
No, era mi intención 😁😁😁
Nunca entenderé tanta obsesión con docker, con lo sano que es tenerlo todo en contenedores LXC separados. Scrips como éste https://tteck.github.io/Proxmox/ facilitan mucho la puesta en marcha y mantenimiento.
Esos LXC están genial y yo uso alguno, pero quizá la ventaja de docker es que hay muchas mas gente en la comunidad y tienes de todo. Además yo veo como ventaja que en docker hay imágenes para amd64 y x86, pero también para arm.
Sé que hay LXC para Arm, pero yo al menos he encontrado menos.
Asi que con docker en una raspberry pi te puedes montar muchos servicios.
Yo en una raspberry pi 4B DE 8GB me he montado Pimox7 y tengo varios LXC, pero la verdad es que son Ubuntu-jammy y les metido docker y luego ya a cada uno de ellos distintas imágenes docker.
No conocía eso de Pimox7 le daré un ojo!
Solo para entender, ¿por qué no usaste Uptime Kuma para monitorear los containers?
Buena información! Duda sobre el texto, los transcribes automaticamente y luego lo arreglas, o todo a manita? O luego haces el podcast? (Debo reconocer que no escuche el podcast todavía voy un poco más atrás).
Lo escribo y lo utilizo como guión para el podcast. Por eso en ocasiones me dejo o añado información
Otra cosa que te puede servir para lograr que se reinicien los contenedores es usar Docker Swarm, nosotros lo estamos usando en producción con 3 nodos, es simple (casi lo mismo que Compose) y funciona muy bien. También lo utilicé localmente con un solo nodo en lugar de Compose.
Hola,
El problema es mas por el servicio que tiene un mal funcionamiento, porque encontró un error no esperado, por ejemplo. En ese caso Docker Swarm fallaría igualmente, por esto no termina de ser una solución para mi.
Gracias por el comentario.
Fallaría igualmente pero Swarm solito se encargaría de reiniciarlo.
Y volvería a caer, porque como te digo el servicio no funciona correctamente. Es necesario un aviso antes que algo que levante el servicio
Hola Atareao, sigo tu blog desde hace mucho, pero las pocas veces que he comentado nunca recibí respuesta, cómo que mis comentarios fueran invisibles.
Entiendo que el comentario de Swarm puede no servirte y simplemente lo dejás pasar, pero tampoco respondiste mi pregunta sobre Uptime Kuma.
Hola,
Intento contestar todos los mensajes pero en ocasiones se me escapa alguno. En concreto el de Uptime Kuma, ni siquiera lo veo. Lo lamento.