DevOps e infraestructura
Despliego Laravel y Node en Linux con Docker, reverse proxies, copias y monitorización suficiente para saberlo antes que el cliente.
Docker significa que el entorno probado es el que sale a producción — los mismos contenedores, las mismas versiones de dependencias — en vez de un deploy que funciona en una máquina y falla misteriosamente en otra. Un reverse proxy termina TLS y enruta el tráfico al contenedor correcto, y CI/CD ejecuta los mismos pasos de build y test en cada push para que un deploy roto se detecte antes de llegar a producción, no después.
Las copias de seguridad solo son reales si se han restaurado al menos una vez. Configuro copias programadas para PostgreSQL, MySQL o SQLite según la pila, y verifico que la restauración realmente funciona en vez de confiar en que un cron tuvo éxito en silencio durante el último año.
La monitorización es deliberadamente aburrida: comprobaciones de disponibilidad, seguimiento de errores y agregación de logs del tamaño del equipo real, no un dashboard que nadie mira. El objetivo es saber de un problema por una alerta, no por un ticket de soporte de un cliente.
Problemas de negocio
- Un deploy que solo funciona porque vive en la cabeza de un desarrollador y en la configuración de un portátil.
- Copias de seguridad que nunca se han restaurado, así que nadie sabe realmente si funcionan hasta el día que se necesitan.
- Sin monitorización, así que el equipo se entera de una caída por un cliente en vez de por una alerta.
- Secretos y claves API subidos al repositorio o compartidos por chat, en vez de gestionados con variables de entorno o un gestor de secretos.
- Un único VPS corriendo la base de datos, la app y el reverse proxy sin separación, así que un mal deploy puede tumbar toda la pila de una vez.
- Ningún entorno de staging lo bastante parecido a producción para atrapar una diferencia de configuración antes de que llegue a los clientes.
- Una configuración de servidor manual y sin documentar, así que reemplazar un VPS caído significa reconstruir la configuración de memoria en vez de ejecutar un script.
- Logs dispersos entre contenedores sin un lugar central para buscarlos, así que depurar un problema significa conectarse por SSH a tres sitios distintos y buscar a mano.
Proceso de desarrollo
- Contenerizar la app con Docker para que el entorno probado sea el que sale a producción, con un reverse proxy gestionando TLS y el enrutamiento.
- Configurar CI/CD para que cada push ejecute los mismos pasos de build y test, detectando un deploy roto antes de que llegue a producción.
- Programar copias de seguridad para la base de datos realmente usada — PostgreSQL, MySQL o SQLite — y verificar la restauración, no solo el código de salida del job de backup.
- Gestionar los secretos con variables de entorno o un gestor de secretos, nunca subidos al repositorio, y rotarlos cuando alguien con acceso se va.
- Separar responsabilidades incluso en un solo servidor — base de datos, app, reverse proxy en sus propios contenedores — para que un mal deploy de uno no tumbe a los demás.
- Mantener el staging lo bastante cercano a producción — mismos contenedores, forma de datos similar — para que una diferencia de config aparezca ahí, no frente a los clientes.
- Programar el aprovisionamiento de servidores (o usar infraestructura como código) para que reemplazar un VPS caído sea ejecutar un script, no reconstruir configuración de memoria bajo presión.
- Centralizar los logs de cada contenedor en un solo lugar buscable, para que depurar un problema sea una búsqueda, no una sesión SSH en tres máquinas distintas.
Qué obtienes
- Un deploy que funciona igual en la siguiente máquina que en la primera, porque el entorno está definido en código, no en la memoria de alguien.
- Copias de seguridad cuya restauración realmente se ha probado, no solo programadas con la esperanza de que funcionen.
- Problemas revelados por una alerta antes de que un cliente los note, porque la monitorización está dimensionada para el equipo, no ignorada como un dashboard que nadie abre.
- Secretos que no están esperando en un historial git para que los encuentre cualquiera con acceso al repo.
- Un mal deploy que tumba un contenedor en vez de toda la pila, porque las responsabilidades se separaron desde el principio.
- Diferencias de configuración atrapadas en staging, antes de llegar a un cliente, en vez de depuradas en vivo en producción.
- Un servidor caído reemplazado ejecutando un script en minutos, en vez de una tarde estresante reconstruyendo configuración de memoria.
- Un problema depurado desde una sola vista de logs buscable en vez de sesiones SSH en tres contenedores distintos esperando encontrar la línea correcta.
- Un historial de deploys que muestra exactamente qué cambió y cuándo, para que una regresión se rastree hasta el commit que la causó en vez de adivinarse.
Proyectos seleccionados
FAQ
Do you work with AWS?
Yes, when the product needs it. Many products are better served by a well-run VPS plus Docker until traffic or compliance says otherwise.