PROYECTO_02

Maxipet

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
  • React 18
  • Vite
  • TailwindCSS
  • Java 17
  • Spring Boot 3
  • PostgreSQL
  • Flyway
  • Bucket4j
  • Docker
  • Nginx
  • Cloudflare Tunnel

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.