DevSecOps Sin Modas: Construye una Infraestructura Simple que Realmente Funciona

Search for a command to run...

No comments yet. Be the first to comment.
Línea de apertura (opcional, para el feed): Claude Code empieza cada sesión desde cero. No recuerda qué archivos modificaste ayer. No recuerda el bug que arreglaste la semana pasada. No recuerda que m

Línea de apertura (opcional, para el feed): En cada sesión nueva, Claude abre el README, escanea el árbol de directorios, busca el pom.xml, encuentra src/main/java... 33 tool calls para orientarse. Co

Línea de apertura (opcional, para el feed): Llevas tres meses usando Claude en tu proyecto Java. Los mismos errores de hace tres meses siguen apareciendo. == para comparar BigDecimal. LocalDate.now()

Línea de apertura (opcional, para el feed): Tu equipo hizo commit directo a main porque "era un cambio pequeño". Dos horas después, toda la rama de producción estaba rota, tres desarrolladores bloquea

Línea de apertura (opcional, para el feed): Llevas seis meses usando Claude para tus decisiones de arquitectura Java. Eres más rápido. Pero ya no sabes si elegirías Spring Security + JWT o Keycloak si

En el mundo del desarrollo de software, especialmente para equipos pequeños y medianos, existe una presión constante por adoptar las últimas tecnologías y arquitecturas "de moda". Kubernetes, microservicios complejos, y servicios cloud gestionados parecen ser la solución a todos los problemas. Sin embargo, ¿realmente necesitamos toda esa complejidad?
Este artículo explora un enfoque más pragmático: DevSecOps operado por el mismo equipo de desarrollo, con operaciones automatizadas y encapsuladas que sean:
✅ Manejables por el equipo: Sin necesidad de especialistas dedicados
✅ Predecibles: Comportamiento consistente y fácil de entender
✅ Seguras por defecto: Seguridad integrada desde el inicio
✅ Sin dependencia de "héroes": Cualquier miembro del equipo puede entender y operar el sistema
Kubernetes es una herramienta poderosa, pero también es compleja. Para equipos pequeños que trabajan con microservicios, existen alternativas más simples y efectivas:
Máquinas virtuales detrás de load balancers: Una arquitectura clásica pero efectiva
Docker Compose en servidores dedicados: Para aplicaciones que no requieren orquestación compleja
Plataformas PaaS más simples: Heroku, Railway, o Fly.io para casos menos complejos
La clave es: no uses Kubernetes solo por usar Kubernetes. Si tu equipo puede manejar VMs con Docker y un load balancer, probablemente sea suficiente y mucho más mantenible.
Servicios como GitHub Actions han cambiado sus modelos de pricing, y para equipos pequeños con muchos deployments, los costos pueden escalar rápidamente. Un servidor Jenkins auto-administrado puede ser significativamente más económico y te da control total sobre tu pipeline de CI/CD.
Jenkins (CI/CD)
Nexus Repository (Gestión de artefactos)
GitHub/GitLab (Control de versiones)
Plugins de Seguridad y Automatización
Visuale (Observabilidad)
Cada componente debe estar encapsulado y ser independiente:
Configuración como código (Infrastructure as Code)
Scripts de despliegue automatizados
Documentación clara y accesible
Escaneo automático de vulnerabilidades en cada build
Actualización automática de dependencias (con Renovate)
Políticas de seguridad aplicadas automáticamente
Secretos gestionados de forma segura (HashiCorp Vault, AWS Secrets Manager, o similar)
Pipelines idempotentes
Rollbacks automáticos en caso de fallo
Ambientes reproducibles
Logs centralizados y accesibles
Documentación completa y actualizada
Configuración versionada en Git
Scripts automatizados para operaciones comunes
Onboarding claro para nuevos miembros del equipo
Un equipo de 5-10 desarrolladores trabajando con:
5-10 microservicios
Deployments frecuentes (varios por día)
Presupuesto limitado
Necesidad de control y predecibilidad
Costo Predecible: Un servidor fijo vs. costos variables por minuto/ejecución
Control Total: Configuración y personalización sin límites
Simplicidad: Arquitectura fácil de entender y mantener
Escalabilidad Horizontal: Agregar más VMs según necesidad
GitHub Actions:
Costo por minuto de ejecución
Límites en minutos gratuitos
Costos pueden escalar rápidamente con muchos deployments
Dependencia de servicios externos
Jenkins Auto-administrado:
Costo fijo del servidor
Sin límites en número de ejecuciones
Control total sobre recursos y configuración
Independencia de servicios externos (excepto GitHub para repos)
Más de 100 deployments por mes
Necesidad de control sobre el ambiente de CI/CD
Requisitos específicos de plugins o configuración
Equipo con capacidad de mantener infraestructura básica
Pocos deployments al mes
Equipo sin experiencia en infraestructura
Necesidad de integración estrecha con GitHub
Presupuesto para servicios gestionados
Antes de profundizar en la implementación, aquí están las herramientas principales que forman parte de este stack y sus recursos oficiales:
Jenkins - Servidor de automatización CI/CD
Nexus Repository - Gestión de artefactos
GitHub - Control de versiones
Renovate - Actualización automática de dependencias
Snyk - Escaneo de vulnerabilidades
OWASP Dependency-Check - Análisis de seguridad
Visuale - Dashboard de observabilidad para microservicios
Cantara DevOps Scripts - Scripts para automatización de despliegues
El setup inicial es sencillo: necesitas levantar un servidor Jenkins (preferiblemente con Docker para facilitar el mantenimiento) y configurar las integraciones con las herramientas mencionadas anteriormente.
# Ejemplo básico: Levantar Jenkins con Docker
docker run -d \
--name jenkins \
-p 8080:8080 \
-p 50000:50000 \
-v jenkins_home:/var/jenkins_home \
jenkins/jenkins:lts
Una vez que Jenkins esté corriendo, puedes instalar los plugins necesarios (Snyk, OWASP Dependency-Check, Nexus Artifact Uploader) desde la interfaz de administración y configurar tus pipelines según las necesidades de tu proyecto.
Para configuraciones detalladas de cada herramienta, consulta la documentación oficial en los links proporcionados arriba. Cada proyecto tiene necesidades específicas, pero la base es siempre la misma: Jenkins como orquestador central, integrado con herramientas de seguridad y automatización.
Visuale es un dashboard en tiempo real diseñado específicamente para entornos de microservicios. Es perfecto para equipos pequeños que necesitan visibilidad sin la complejidad de soluciones enterprise.
Dashboard actualizado en tiempo real con información crítica (versión, uptime, IP, estado de salud)
Diseñado para pantallas de monitoreo y acceso móvil
Agrupación de servicios por tags y tipos
Alertas automáticas para servicios antiguos (>7 días sin actualizar)
# Ejecutar Visuale con Docker
docker run --rm -p 8080:8080 cantara/visuale:latest
Cada servicio debe configurar un script que reporte su estado periódicamente (cada 5-10 segundos) usando crontab o systemd timer. Visuale incluye scripts de agente pre-configurados que puedes usar como base.
Cada servicio debe enviar su información de salud a Visuale periódicamente usando un script y crontab (cada 5-10 segundos). Visuale incluye scripts de agente pre-configurados que puedes usar como base. Consulta la documentación de Visuale para detalles de implementación.
Diagrama de Visuale mostrando relaciones entre servicios con indicadores de conexión.
Los scripts de DevOps de Cantara permiten la actualización automática de instancias cuando hay nuevas versiones disponibles, eliminando la necesidad de intervención manual y asegurando que todas las instancias se mantengan actualizadas de forma predecible.
Los scripts se integran con Jenkins para detectar nuevas versiones en Nexus, actualizar instancias gradualmente (rolling updates), validar que la actualización fue exitosa, y hacer rollback automático si hay problemas. Consulta el repositorio de Cantara/devops para ejemplos de implementación.
Para equipos pequeños, las soluciones enterprise de observabilidad como Datadog, New Relic o Dynatrace pueden ser costosas y complejas. Visuale ofrece una alternativa ligera y efectiva diseñada específicamente para microservicios.
El dashboard de Visuale proporciona una vista en tiempo real de todos tus microservicios, mostrando información crítica como:
Estado de salud de cada instancia (verde/amarillo/rojo)
Versión semántica ejecutándose en cada nodo
Tiempo de ejecución (uptime) de cada servicio
IP interna de cada instancia
Agrupación lógica por tags o tipos de servicio
Esta visibilidad inmediata es crucial para equipos pequeños que necesitan entender rápidamente el estado de su arquitectura sin depender de herramientas complejas o costosas.
Simple y directo: Sin curva de aprendizaje compleja
Open Source: Control total sobre tu dashboard
Costo cero: Solo necesitas un servidor para ejecutarlo
Diseñado para microservicios: Agrupa servicios y nodos automáticamente
Mobile-friendly: Revisa el estado desde cualquier lugar
Pantallas de monitoreo: Dashboard en tiempo real para la oficina
Alertas tempranas: Servicios que no reportan se marcan automáticamente
Visibilidad de versiones: Ver qué versión está corriendo en cada instancia
Detección de servicios antiguos: Servicios sin actualizar >7 días marcados como vulnerables
Visuale se integra perfectamente con:
Jenkins: Notificar sobre nuevos deployments
Health endpoints: Cada servicio reporta su estado
Slack: Alertas automáticas a canales del equipo
Scripts de actualización: Actualizar estado después de deployments
Prevención: Renovate actualiza dependencias automáticamente
Detección: Snyk y OWASP Dependency-Check escanean en cada build
Respuesta: Pipelines fallan automáticamente si hay vulnerabilidades críticas
Monitoreo: Alertas automáticas a Slack/Email
Usar Jenkins Credentials Plugin
Integración con HashiCorp Vault o AWS Secrets Manager
Rotación automática de credenciales
Nunca hardcodear secretos en código
Semanal: Revisar logs de seguridad y actualizaciones
Mensual: Actualizar plugins y herramientas
Trimestral: Revisar y optimizar pipelines
Anual: Auditoría de seguridad completa
Runbook: Cómo operar cada componente
Troubleshooting Guide: Problemas comunes y soluciones
Architecture Diagram: Diagrama actualizado de la arquitectura
Onboarding Guide: Para nuevos miembros del equipo
Un enfoque de DevSecOps operado por el equipo no significa sacrificar calidad o seguridad. Al contrario, significa:
Pragmatismo sobre complejidad: Usar las herramientas adecuadas para tu contexto
Control sobre conveniencia: Entender y controlar tu stack completo
Sostenibilidad sobre modas: Construir algo que tu equipo puede mantener a largo plazo
Seguridad integrada: No como un afterthought, sino como parte fundamental del proceso
Para equipos pequeños, un servidor Jenkins auto-administrado con herramientas de seguridad integradas puede ser más económico, más controlable y más sostenible que depender completamente de servicios gestionados con modelos de pricing variables.
La clave está en encontrar el balance adecuado entre simplicidad, control y funcionalidad para tu equipo específico.
Uno de los mayores riesgos en proyectos de software, especialmente en startups y equipos pequeños, es caer en la sobreingeniería. Es tentador construir la "arquitectura perfecta" desde el día uno, pero esto puede ser fatal para proyectos que aún están validando su modelo de negocio.
Cuando construyes con un presupuesto limitado y necesitas validar tu producto con clientes reales, cada dólar y cada hora de desarrollo cuenta. Gastar recursos en:
Infraestructura compleja que "podría necesitarse en el futuro"
Herramientas enterprise que solo usarás al 10% de su capacidad
Arquitecturas "escalables" para un producto que aún no tiene usuarios
Equipos especializados para mantener sistemas complejos
... puede ahogar tu proyecto antes de que tenga oportunidad de despegar.
Otro riesgo crítico es construir sistemas que dependen de "héroes" — personas específicas que son las únicas que entienden cómo funciona todo. Esto crea:
Riesgo operacional: Si esa persona se va, el proyecto puede colapsar
Cuellos de botella: Todo pasa por una persona, limitando la velocidad del equipo
Conocimiento concentrado: El resto del equipo no puede contribuir efectivamente
Estrés innecesario: La presión sobre esas personas puede llevar al burnout
El enfoque que hemos descrito aquí — scripts automatizados, documentación clara, procesos predecibles — elimina la dependencia de héroes y permite que cualquier miembro del equipo pueda entender y operar el sistema.
En startups y proyectos nuevos, el presupuesto no es ilimitado. Cada inversión debe justificarse:
Primero valida: ¿Tienes clientes que paguen por tu producto?
Luego optimiza: ¿Tu infraestructura actual está limitando tu crecimiento?
Finalmente escala: ¿Realmente necesitas esa solución enterprise?
Un servidor Jenkins auto-administrado puede costar $50-200/mes. Una solución enterprise completa puede costar $2000-10000/mes. Si aún estás validando tu producto, esa diferencia puede ser la que te permita sobrevivir hasta encontrar product-market fit.
La estrategia correcta es:
✅ Empezar simple: Infraestructura básica que funcione y sea mantenible por el equipo completo
✅ Automatizar lo esencial: CI/CD, seguridad básica, monitoreo simple
✅ Documentar todo: Cualquier miembro del equipo debe poder entender y operar el sistema
✅ Escalar cuando sea necesario: Agregar complejidad solo cuando realmente la necesites y puedas justificarla
✅ Evitar modas tecnológicas: No uses Kubernetes "porque todos lo usan" — úsalo si realmente lo necesitas
Recuerda: La mejor arquitectura es la que te permite llegar a producción rápidamente, validar con clientes reales, y luego iterar basándote en datos reales, no en suposiciones sobre lo que "podrías necesitar en el futuro".
Construir una infraestructura simple y mantenible no es "hacer las cosas mal" — es ser inteligente con tus recursos limitados y enfocarte en lo que realmente importa: construir un producto que los clientes quieran y por el que estén dispuestos a pagar.
Visuale Dashboard - Dashboard de observabilidad para microservicios
Cantara DevOps Scripts - Scripts para automatización de despliegues y actualizaciones
¿Tienes experiencia con este tipo de setup? ¿Qué herramientas adicionales recomendarías? Comparte tus pensamientos en los comentarios.
José Díaz es CTO y ejecutivo con amplia experiencia liderando transformaciones tecnológicas en contextos de fusiones y adquisiciones empresariales. Especializado en decisiones estratégicas que balancean aspectos técnicos, organizacionales y financieros, ha guiado múltiples organizaciones a través de procesos complejos de consolidación de sistemas.
Con un enfoque práctico en management ejecutivo, combina conocimiento técnico profundo con habilidades de liderazgo estratégico, negociación y gestión del cambio organizacional. Sus experiencias abarcan desde startups hasta corporaciones multinacionales, siempre con el objetivo de convertir desafíos técnicos en ventajas competitivas sostenibles.