Saltar a contenido

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.

Fuentes y trazabilidad