PROYECTO_02
Biblioteca Maxipet
Plataforma corporativa migrada de Flask a Spring Boot 3 (Java 17) conservando la base de datos: gestión documental, KPIs, quejas, acciones correctivas, alertas de seguridad, cuestionarios y bitácora.
- TIPO
- Migración · Spring Boot
- ESTADO
- EN PRODUCCIÓN
CONTEXTO
Una plataforma en producción que había que modernizar sin detener la operación ni tocar los datos existentes: mismo PostgreSQL, mismos usuarios, backend nuevo.
QUÉ CUBRE
- Gestión documental por categoría: documentos, manuales, cursos, lecciones, boletín y almacenes.
- KPIs y objetivos, quejas con evidencia y acciones correctivas con actividades por folio.
- Alertas de seguridad, cuestionarios con respuesta única por usuario, bitácora de auditoría y directorio.
- Cinco roles con permisos distintos, incluidos dos específicos para la gestión de almacenes.
LA MIGRACIÓN
- Flask → Spring Boot 3.5 sobre Java 17, conservando el esquema PostgreSQL existente.
- Flyway toma el control del esquema con migraciones versionadas; Hibernate solo valida, nunca modifica.
- Perfiles dev y prod separados: en prod la aplicación se niega a arrancar si los secretos siguen siendo los valores de desarrollo.
- Se eliminó el inicializador que creaba un usuario admin con contraseña conocida en cualquier base vacía.
SEGURIDAD
- Access token de 15 minutos y refresh rotativo de 7 días en cookie httpOnly; en base de datos solo vive su hash SHA-256.
- Detección de reuso: si llega un refresh ya rotado se revoca toda la familia de tokens del usuario.
- Cambiar la contraseña invalida los tokens anteriores comparando el claim iat con la fecha del cambio.
- 2FA TOTP (RFC 6238) con QR, y el secreto cifrado en base de datos con AES-256-GCM.
- Rate-limit con Bucket4j en login, verificación 2FA y registro; en memoria por defecto o en Redis para varias instancias.
- Archivos validados por extensión y magic bytes con protección contra path traversal: un .exe renombrado a .pdf se rechaza.
OPERACIÓN
- Docker Compose con usuario no-root y volumen persistente para los archivos subidos.
- Nginx y Cloudflare Tunnel al frente; el origen no expone puertos.
- Métricas con Micrometer y logs JSON con identificador de petición; el endpoint de Prometheus queda fuera de la red pública a propósito.
- Frontend React 18 + Vite en Vercel, con refresh de sesión transparente en el interceptor de axios.