Aplicación demostradora¶
La aplicación ofrece una gestión básica de usuarios para recorrer un cambio desde el código hasta Kubernetes. La documentación se concentra en sus contratos de construcción y ejecución, que son los que condicionan CI/CD e infraestructura.
Componentes¶
| Elemento | Backend | Frontend |
|---|---|---|
| Proyecto Maven | es.canals / artifact rest |
es.canals.web / artifact frontend |
| Runtime | Java 17; Spring Boot 3.3.3; WebFlux | Java 17; Spring Boot 3.3.3; WebFlux |
| Función | API REST, validación y persistencia JPA/MySQL | FreeMarker y componentes Vue servidos por Java |
| Artefacto | target/app.jar |
target/app.jar |
| Puerto efectivo por defecto | 8080 (REST_PORT) |
8080 (WEB_PORT) |
| Nombre en Kubernetes | rest |
web |
| Dependencia de ejecución | MySQL y Secret rest |
Acceso del navegador a las rutas API |
El frontend no se construye con un pipeline Node/npm: Maven empaqueta el servidor y sus recursos. El POM incluye tareas de Sass y minificación. No es necesario documentar cada componente visual para reproducir el recorrido DevOps.
API y persistencia¶
Los controladores implementan lectura, creación, modificación y borrado de usuarios bajo /api/v1/users, con una ruta de elemento /{username}. La colección acepta parámetros de búsqueda y paginación. Esta descripción sirve para localizar el contrato; no sustituye una especificación OpenAPI, que no está incluida en los repositorios revisados.
El backend consume REST_DB_HOST, REST_DB_PORT, REST_DB_DATABASE, REST_DB_USER y REST_DB_PASSWORD. Hibernate está configurado con ddl-auto: update. No hay un sistema versionado de migraciones de base de datos en el snapshot. Un rollback de imagen no revierte los cambios de esquema ni de datos.
Peticiones desde el navegador¶
El frontend usa WEB_REST_URL, con valor por defecto http://rest:8080 en su configuración. El Deployment establece explícitamente una cadena vacía. La generación de endpoints del frontend permite así rutas del mismo origen, como /api/v1/users, coherentes con el Ingress que dirige /api/v1 al backend y / al frontend.
El nombre DNS interno rest sólo es resoluble dentro del clúster: no debe presentarse como una URL que un navegador externo pueda alcanzar. Al cambiar la exposición de GKE, verificar las peticiones reales del navegador y conservar el enrutamiento de la API.
Contrato de contenedor¶
Ambos Dockerfiles parten de eclipse-temurin:17-jre-alpine, copian el JAR y ejecutan Java como UID 10001. Los manifiestos añaden GID 10002, raíz de solo lectura, capacidades eliminadas y seccomp. El frontend declara EXPOSE 8081 en el Dockerfile, mientras que la configuración y los manifiestos utilizan 8080; EXPOSE no cambia el puerto de Spring. Es una discrepancia documental que conviene normalizar.
Cada servicio tiene una réplica, 512 MiB de memoria solicitada y un límite de 1 GiB. Las sondas de disponibilidad y vida son TCP sobre 8080. No verifican que una consulta a la base de datos ni una operación de negocio funcionen. No se declaran solicitudes/límites de CPU, HPA ni PodDisruptionBudget.
Alcance de la demostración¶
El código de seguridad permite las peticiones sin autenticación de negocio; el backend además desactiva CSRF y admite CORS amplio. Las dependencias OAuth presentes en el POM no acreditan una integración de identidad operativa. Se deben utilizar datos de demostración y definir la autenticación antes de emplear este ejemplo con usuarios reales.
No hay suites src/test versionadas en ninguno de los dos proyectos y el empaquetado ejecuta -DskipTests. Los análisis de calidad y seguridad se explican en su capítulo; son controles distintos de las pruebas funcionales.