Después de mucho tiempo probando cómo desplegar mis side-projects a producción, he creado una herramienta, Airo (desarrollado en Go, en GitHub) para automatizar la gestión del despliegue fácilmente, sin necesidad de mantener demasiadas herramientas.
Cuando trabajas en un producto, lo clave es enfocarte en lo que realmente importa, porque el 20% de las acciones suelen generar el 80% de los resultados. Ahí es donde tienes que poner tu energía. El problema es que, mientras haces eso, también necesitas ir pagando la deuda técnica.
Trabajando en mis side-projects me preguntaba cuál es la mejor forma de desplegar mi código a producción, de forma que tuviese estabilidad en producción, me requiera el menor tiempo posible y a la vez me permita tener control sobre la parte técnica.
En mi equipo trabajamos con kubernetes (EKS por ser concretos) y ya sea managed o no, me encanta, igual que tener pipelines para que múltiples personas puedan trabajar en paralelo y se garanticen que se cumplen ciertos estándares (procesos).
La cosa es que en este blog (o en otros productos en los que trabajo), no necesito toda esa complejidad. He probado a usar Github actions y otras herramientas y al final acabo perdiendo mucho tiempo configurándolas, o me encuentro con limitaciones técnicas o con múltiples pagos por cada funcionalidad extra. Por eso mismo, terminé probando desplegar todo en un servidor y gestionarlo yo que, aunque me considero full-stack y me gusta trabajar en producto, siempre me he orientado más al lado de la infraestructura/plataforma y gestiono grandes cargas de trabajo en producción.
¿Tan difícil es gestionarte tu propio servidor? La respuesta es que no. Tengo un linode con un MySQL y un par de contenedores con Docker para gestionar este blog, y después de varios años funciona como el primer día y prácticamente sin mantenimiento. Es cierto que configurarlo requiere conocimientos y saber sobre diferentes temas, por ejemplo, gestionar el MySQL, copias de seguridad... y si quieres ir más allá y trabajar la observabilidad y poder ver datos requiere algo de tiempo, pero mola. O al menos, a mi me encanta y creo que merece la pena porque aprendo mucho en el camino.
Tras todo este tiempo mi experiencia me dice que tener este servidor es muy cómodo, funciona bien, y puedo dedicarle el mínimo tiempo. Aunque luego me apetece jugar y experimentar para aprender (que escribiré otro post sobre observabilidad pronto así que recuerda apuntarte a la newsletter).
Lo único que no me gustaba era tener que realizar ciertos pasos manuales para poder desplegar así que aquí es donde surge Airo, una herramienta que he desarrollado en Go para automatizar algunos de estos pasos con herramientas muy simples: Docker, SSH y un Registry.
Como trabajo yo solo, en general suelo trabajar en la rama main
ya que me ahorra tiempo tener que crear ramas, excepto que sea algún refactor importante, y commitear mucho pequeñas unidades de trabajo, y cuando termino, únicamente ejecuto airo deploy
y listo, código desplegado en producción.
El comando lo que hace es: lee el fichero de configuración y construye, en mi local, una imagen de Docker de los diferentes proyectos que tengo, los sube a un registry y se conecta a mi servidor mediante SSH para actualizar los contenedores con Docker compose. Además, actualiza el fichero de mi reverse proxy (ahora utilizo Caddy en lugar de Nginx, también para otro post).
El proyecto es una prueba de concepto que la verdad, me está funcionando muy bien y al final he decidido compartirlo en GitHub como open source ya que me está ayudando mucho. Hay muchas features que pueden añadirse para automatizar otros procesos, como incluir tests, uso con docker, configurar el reverse proxy...