El día que mi SaaS respiró por primera vez

Hay momentos en el desarrollo de un SaaS que se sienten como una primera respiración.
No por la línea de código, sino por lo que significa:
tu aplicación deja de vivir solo en tu cabeza y empieza a existir en el mundo real.
Es más, después de un parón de 6 meses por el nacimiento de mi cuarta hija, estar escribiendo estas líneas es un auténtico lujo además de un subidón por ver que funciona!
Contexto - Diario de un SaaS
Hasta ahora, todo funcionaba en el entorno local. React servía la interfaz, Flask respondía felizmente en localhost:5000, y PostgreSQL obedecía en el portátil.
Pero nada de eso importa hasta que el mundo pueda verlo.
El reto: desplegar Flask en un VPS con Plesk, sin romper nada, sin sobrecargar el servidor y con la seguridad intacta.
Los desafíos (y los fantasmas del deploy)
- Gunicorn peleando por el puerto 5000 ocupado por otro proceso zombie.
- systemd resistiéndose a arrancar por permisos o rutas.
- Firewall bloqueando el acceso externo a pesar de los logs perfectos.
- Y esa mezcla de frustración y adrenalina cuando todo parece estar bien, pero desde el navegador ves solo:
ERR_CONNECTION_TIMED_OUT.
La solución paso a paso
Después de varias iteraciones, apareció la fórmula mágica:
- Crear un
app_XXX.pylimpio, seguro y con variables.env. - Configurar Gunicorn en el puerto
5001, con logs JSON y workers controlados. - Abrir el firewall temporalmente con
firewall-cmd --add-port=5001/tcp. - Testear internamente con
curl http://127.0.0.1:5001/healthhasta ver el santo grial:{"status": "ok", "database": true} - Finalmente, crear el servicio systemd para que el backend renazca automáticamente al reiniciar el VPS.
El momento “Funcionaaa”
“Funcionaaa”, escribí en la terminal con una sonrisa que no me cabía en la cara.
Después de muchas respuestas de "ERROR" desde el servidor, mi API respondía desde fuera del VPS.
Era oficial: mi SaaS respiraba por primera vez.
Lecciones aprendidas
- Gunicorn + systemd = matrimonio estable.
- El firewall es ese amigo que siempre llega sin avisar.
- No subestimes lo que significa ver
status":"ok"en uncurl. - Cada paso debe tener propósito: documentar, probar, ajustar.
Este resumen de lecciones no plasma los "ratos" o momentos de desesperación que he tenido.
Cada paso que esbozaba un avance, se convertía en un problema.
Pero...
¿Qué es un problema?
Un problema es un desafío, un reto a superar.
Ya sabes, si no aportas soluciones al problema, formas parte del problema.
Así que ahora puedo decir que "ya no formo parte del problema"!
Próximo paso
El siguiente hito será configurar el proxy inverso con NGINX/Plesk, redirigiendo el tráfico HTTPS del dominio XYZ.net hacia el backend interno en 127.0.0.1:5001.
Así cerraremos el circuito de forma segura y profesional.
De hecho, ya lo hice en su momento pero se ha roto por alguna razón o por algo que he tocado y no soy consciente.
No pasa nada.
Mi promesa conmigo mismo, mi compromiso es que voy a formar parte de la solución y no del problema.
Vamos!
Cierre / Reflexión
Hoy mi SaaS dejó de ser un conjunto de archivos.
Hoy late, responde y se defiende solo.
De localhost al mundo: este es el salto que separa un proyecto… de una realidad.
Parece una tontería, algo que quizás un ingeniero informático puede llegar aquí sin pestañear.
O bien un backend developer, pero no es mi caso.
No soy developer, ni backend, ni frontend ni nada.
Soy un buscador de soluciones motivado que no se para ante un desafío.
Así que ahi voy!
Si quieres conocer otros artículos parecidos a El día que mi SaaS respiró por primera vez puedes visitar la categoría Proyecto-IA.

Deja una respuesta