317 - Automatización con Python y Docker, y por supuesto Buy me a coffee
Un caso práctico y real de una automatización con Python y Docker, en este caso Buy me a coffee utilizando además SQLite y un poco de ingenio
Este es el tercer episodio en el que te explico como he montado, o mejor dicho he montado, la automatización del apoyo al proyecto atareao.es. En este caso, te voy a explicar la parte de la automatización con Python y Docker, y Buy me a cofee.
Antes que nada quiero explicarte que no pienses que esto es nada complejo y que queda completamente fuera de tu alcance. Nada mas lejos de la realidad. Con unos pocos conocimientos de Python, pero muy pocos. Con unos pocos conocimientos de Docker, esto lo vas a poder montar tu mismo.
La verdad es que estoy muy satisfecho de esta serie de episodios del podcast, porque me están permitiendo mostrarte un proyecto de principio a fin. Bueno, realmente a fin, no, porque ya te digo, que por el momento fin no tiene, como te contaré mas adelante en el podcast. La cuestión, es que se trata de un ejemplo, donde tocamos todos los palos, pero de forma sencilla, sin realizar operaciones realmente complejas. Y esto es realmente interesante.
Así, que vamos al turrón a contarte como es esto de la automatización con Python, Docker y Buy me a coffee.
Automatización con Python y Docker, y por supuesto Buy me a coffee
Como te decía en la introducción, estoy muy satisfecho de esta serie de artículos, porque vemos de una forma práctica y totalmente real la aplicación, de determinados conceptos, lenguajes, ideas, tecnologías, que durante estos últimos años has podido encontrar en atareao.es.
Si no has escuchado ninguno de los capítulos anteriores te invito a hacerlo para que te hagas una idea global de todo el proyecto. Se trata de los episodios 313 sobre como financiar un proyecto Open Source y el episodio 315 sobre programar tareas en un contenedor.
Por resumirte… Llevaba un tiempo con la idea de que todas las formas económicas de apoyar el proyecto atareao.es quedaran recogidas en un servicio. El objetivo era automatizar al máximo todo el proceso de apoyo. No solo las opciones, sino también, lo que es mas importante, poder ofrecer mas a cambio del apoyo.
Para ello, y tal y como te cuento, en los mencionados episodios, lo primero fue decantarme por Buy me a coffee, y lo siguiente poder hacer una serie de comprobaciones periódicas.
Sobre Docker
Como ves una parte importante de esta automatización está el hecho de apoyarme en Docker. Desde el principio, tuvo claro que todo el servicio tenía que estar montado en una imagen de Docker. Esto me permite de forma sencilla, realizar los despliegues en el VPS donde está alojado, y realizar un mantenimiento correcto.
Aunque hubiera preferido hacerlo todo con Podman, lo cierto es que no puede ser, de momento. Y esto es porque está detrás de Traefik, que me permite alojar muchos otros servicios en compañía de este.
Python3 y Flask
Este dueto es tremendamente sencillo de gestionar para lo que ahora mismo estoy haciendo y creo que como puedes seguir también en el tutorial de YouTube de bots para Telegram en Python, es relativamente sencillo.
De cualquier forma, como verás en el código fuente que está disponible en GitHub, se trata de operaciones realmente sencillas, y que no necesitan de mucho estudio. De verdad, si necesitas hacer una API o cualquier servicio del estilo, no te va a llevar nada de tiempo, ponerlo en marcha.
Base de datos SQLite
Otra de las piezas del proyecto es la base de datos. Podía haber recurrido a una base de datos como Postgresql, que en concreto es mi preferida. Sin embargo, para el tráfico inicial, me parecía excesivo, y de ahí recurrir a SQLite. Verás que lo utilizaré para la última parte de estos episodios.
En este caso, de forma inicial está todo programada a pelo, sin utilizar un framework para el tema de la base de datos. Sin embargo, para el último episodio, si que he implementado una solución mas general, lo que me obligará a recondiderar los puntos anteriores.
Correo electrónico
La cuarta de las patas de todo esto es el correo electrónico. En este caso, también utilizo Python para enviar los correos. Sin embargo, he tenido algún que otro problema, con el envío de los correos como te cuento en el episodio del podcast. Lo cierto es que, es toda una garantía tener alojado atareao.es en WebEmpresa, porque por un lado se que está mas protegida la web, y por otro, cuando tengo cualquier problema, en seguida lo resuelven.
De nuevo todo el código relativo al envío de correos está también disponible en el repositorio de GitHub.
Plantillas
Para los distintos eventos que se producen, por ejemplo, cuando alguien realiza una donación se envía el correspondiente correo de agradecimiento. Este correo, va tanto en texto plano como con HTML. ¿Pero, como hacerlo de forma efectiva?. Para ello he utilizado unas plantillas en markdown, como no podía ser de otra forma.
Sin embargo, estos correos de agradecimiento son personalizados, con lo que determinados campos hay que sustituirlos. Como te puedes imaginar, para hacer estas sustituciones, utilizo, por supuesto, expresiones regulares. De forma que cualquier campo del tipo ||campo||
, lo sustituyo por su correspondiente valor.
Webhooks
Como te conté en el episodio anterior, para determinados eventos, se recibe un webhook de Buy me a coffee. La verdad, es que lleva una serie de mecanismos, que me permite confirmar en cualquier caso que se trata de un webhook, de Buy me a coffee. Algo, que evidentemente me deja mas que tranquilo. Se utiliza un secreto, un hash, y algunos detalles adicionales interesantes. De nuevo, te animo a que revises el código para que veas lo sencillo, pero efectivo que es.
Además otra cuestión interesante implementada por Buy me a coffee, son las pruebas, lo que nos permite comprobar de forma relativamente sencilla que el código que hemos implementado hace lo esperado.
Y cuando no hay webhooks
El otro problema que me encontré y que te resolví en el capítulo anterior son aquellas llamadas periódicas. La cuestión es ¿como enlazar el contenedor de croni con el contenedor de bmc?. Tan sencillo como un curl
. Si, como lo estás escuchando. Simplemente en el cron tengo que añadir la línea curl bmc:5000/update
, por ejemplo, y problema resuelto. Eso si, con la programación que considere. Actualmente una vez al día.
Testing
Otra cuestión que he implementado, aunque no del todo es el testing. A esto le tengo que dar una vuelta mas, para poder comprobar todos los métodos, y no es que sean muchos.
Conclusiones
Después de esto, quiero que te centres, no tanto en cada detalle técnico del proceso, sino el proceso total, donde he implementado diferentes piezas,
- algo de Alpine. Alpine es una distribución Linux
- cron, para programar las tareas
- Docker para empaquetar cada uno de los servicios.
docker-composer
para atar todos los servicios entre si- Python y Flask, para levantar el servicio principal, que me permite enviar los correos y comprobar los miembros
- SQLite para guardar el estado de los diferentes elementos.
Si te fijas en el repositorio de GitHub, verás que se trata todo de piezas de código relativamente sencillas y prácticas. No hay nada muy complejo, ni con miles de líneas de código.
Con todo esto te quiero decir, que no es tan complejo, la automatización con Python y Docker, y por supuesto Buy me a coffee. Y en este caso es Buy me a coffe, pero de la misma manera puede ser un bot de Telegram, como te cuento en YouTube, o cualquier otra cosa. Es muy sencillo.
Con un poco de práctica y paciencia, puedes hacer auténticas cosas fantásticas, que seguro te van a permitir mejorar mucho todo lo que quieras automatizar.
Espero que te haya gustado este nuevo episodio del podcast. Si puedes, te agradecería una valoración en iVoox y/o en Apple Podcast.
Imagen de portada de Mathyas Kurmann