deploya

Documento 1 de 4 · Documento de requisitos

Documento de requisitos

Qué construimos, para quién y con qué criterios de aceptación: alcance, actores, requisitos funcionales y no funcionales, casos de uso y trazabilidad con el enunciado.

01RequisitosQué hace y para quién
02DiseñoCómo está hecho y por qué
03Manual técnicoCómo se instala y opera
04Manual de usuarioCómo se usa
Institución
Facultad de Ingeniería
Ingeniería en Informática y Sistemas
Curso
Ingeniería de Software I · Proyecto final 2026
Entrega
Presentación final · 13 de noviembre de 2026
Repositorio
github.com/derekCmorales/deploya

Equipo

  • Eddy PorojCuentas, seguridad y notificaciones (M1, M10)
  • Javier RodríguezSuscripciones, pagos y administración (M2, M9)
  • Eduardo PortilloProyectos, observabilidad y design system (M3, M7)
  • Derek Calderón MoralesMotor de despliegue, arquitectura e infraestructura (M4–M6)
Versión
1.1
Fecha
13 de noviembre de 2026
Estado
Presentación final
Fuente
docs/sitio/doc/01-deploya-requisitos.html

Contenido

  1. 01Introducción4
  2. 1.1Propósito4
  3. 1.2Visión del producto4
  4. 1.3Definiciones y siglas5
  5. 1.4Referencias5
  6. 02Alcance6
  7. 2.1En una frase7
  8. 2.2Recorrido que se evalúa7
  9. 2.3Módulos del sistema7
  10. 2.4Servicios ofertados (planes)8
  11. 2.5Fuera de alcance8
  12. 2.6Supuestos y restricciones9
  13. 03Actores y roles10
  14. 3.1Actores10
  15. 3.2Matriz de permisos por rol10
  16. 04Requisitos funcionales12
  17. 4.1M1 · Identidad y acceso12
  18. 4.2M10 · Notificaciones13
  19. 4.3M2 · Suscripciones y pagos13
  20. 4.4M3 · Proyectos y fuentes14
  21. 4.5M4 · Motor de construcción14
  22. 4.6M5 · Orquestación y ejecución15
  23. 4.7M5 · Recursos de datos15
  24. 4.8M6 · Enrutamiento y TLS16
  25. 4.9M7 · Observabilidad16
  26. 4.10M9 · Administración17
  27. 4.11Instalación y código abierto17
  28. 05Requisitos no funcionales18
  29. 5.1Seguridad18
  30. 5.2Rendimiento y eficiencia19
  31. 5.3Fiabilidad y disponibilidad19
  32. 5.4Usabilidad y accesibilidad19
  33. 5.5Mantenibilidad20
  34. 5.6Portabilidad20
  35. 06Casos de uso21
  36. 6.1Vista general21
  37. 6.2Cuenta y acceso22
  38. 6.3Suscripción y pagos23
  39. 6.4Proyectos y despliegues24
  40. 6.5Administración y autoalojado25
  41. 6.6Especificación de los casos de uso principales26
  42. 07Reglas de negocio31
  43. 7.1Estados de la suscripción32
  44. 7.2Estados del despliegue33
  45. 08Trazabilidad34
  46. 8.1Enunciado del curso → Deploya34
  47. 8.2Lo que Deploya agrega al enunciado35
  48. 8.3Cobertura de verificación por módulo35

Introducción

Propósito

Este documento define qué hace Deploya, para quién y cómo se comprueba que lo hace. Reúne en un solo lugar lo que en el repositorio vive repartido entre la propuesta, el alcance, los specs de OpenSpec y las fichas de pantalla, y lo ordena con el formato que pide el enunciado del curso: introducción, alcance, requisitos funcionales, requisitos no funcionales y casos de uso.

Lo leen tres públicos:

Visión del producto

Deploya es una plataforma como servicio (PaaS) de alojamiento web. Un desarrollador pega la URL de un repositorio público de GitHub y, sin escribir configuración de infraestructura, obtiene su aplicación en línea en https://<proyecto>.deploya.larasolutions.dev, con certificado válido, límites de recursos que se cumplen de verdad y la posibilidad de volver a una versión anterior en segundos.

Dentro del enunciado, Deploya pertenece a la Opción C: Servidores Web como Servicio. Cubre las tres capacidades que la opción exige y va más allá en cada una:

El enunciado pideDeploya lo resuelve con
Crear entornos webUn proyecto por repositorio: Deploya detecta el stack (Dockerfile, Node, Python, Go o sitio estático), construye una imagen versionada y la ejecuta en un contenedor aislado
Gestionar configuracionesVariables de entorno cifradas (AES-256-GCM), rama, puerto, ruta del Dockerfile; redesplegar, reiniciar, detener, revertir y eliminar
Monitorear consumo de recursosCPU y memoria por minuto frente al límite del plan, tiempo por etapa, ritmo de construcciones del mes y bitácoras de construcción y de ejecución
Gestión de dominios simuladosSubdominio automático por proyecto (<proyecto>.deploya.larasolutions.dev) con HTTPS comodín real, no simulado

El problema que atiende. Publicar una aplicación en un servidor propio exige aprovisionarlo, escribir contenedores, configurar un proxy inverso, gestionar certificados y planear actualizaciones sin cortes. Las plataformas comerciales lo simplifican, pero a cambio encierran el código en un formato propietario y cobran por consumo difícil de prever. Deploya conserva la simplicidad, publica los límites de cada plan y, desde el sprint final, es de código abierto (AGPL-3.0) y se puede instalar en un servidor propio con un solo comando.

Definiciones y siglas

TérminoSignificado en Deploya
PaaSPlatform as a Service: el cliente trae el código y la plataforma se encarga de construirlo, ejecutarlo y publicarlo
ProyectoUna aplicación del cliente: un repositorio, una rama y un subdominio
DespliegueUn intento de poner en línea una versión del proyecto. Tiene número consecutivo (#n) y pasa por cinco etapas
EtapasRecepción → Construcción → Ejecución → Enrutamiento → Operación
ArtefactoLa imagen de contenedor inmutable que deja una construcción exitosa (deploya/<subdominio>:<n>)
ReversiónVolver a un artefacto anterior sin reconstruir: tarda segundos y no consume construcciones
RecetaPlantilla de construcción que Deploya usa cuando el repositorio no trae Dockerfile
SuscripciónEl plan contratado por una cuenta y su estado (Activa, Por vencer, Vencida, Suspendida, Cancelada)
CuotaLímites del plan: proyectos, CPU y memoria por proyecto, construcciones por mes
SandboxPlan gratuito que recibe toda cuenta nueva; no vence
Ciclo §4.4Tarea diaria que mueve las suscripciones entre estados según su vigencia
AutoalojadoModo de instalación en el que una organización corre Deploya en su servidor, sin cobro
Puerto / adaptadorContrato abstracto que necesita un servicio y la clase que lo implementa contra el exterior (arquitectura hexagonal)
OpenSpecFlujo de especificación que usa el equipo: cada historia es un change con propuesta, diseño, spec delta y tareas
RF / RNF / CU / RNRequisito funcional, requisito no funcional, caso de uso, regla de negocio

Referencias

DocumentoDónde
Enunciado del proyecto final 2026Entregado por el docente
Propuesta de proyecto (agosto)docs/propuesta.md
Alcance del núcleo v4.1 (fuente de verdad del alcance)docs/alcance.md
Specs por módulo (11 specs, 70 requisitos, 295 escenarios)openspec/specs/*/spec.md
Fichas de pantalla del design system v4.1docs/diseno/pantallas/
Documento de diseño, manual técnico y manual de usuarioDocumentos 2, 3 y 4 de esta entrega

Alcance

En una frase

Un cliente se registra, verifica su correo, contrata un plan con pago simulado, pega la URL de un repositorio público de GitHub y Deploya lo construye, lo corre en un contenedor con los límites de su plan y lo publica con HTTPS. Cada versión queda guardada y se puede volver a una anterior sin reconstruir. Un administrador ve a los usuarios, suspende o reactiva cuentas y supervisa el servidor.

Recorrido que se evalúa

  1. Registro → verificación de correo → inicio de sesión (la cuenta arranca en Sandbox, sin tarjeta).
  2. Ver planes → contratar con la pasarela simulada (aprobado o rechazado) → comprobante PDF.
  3. Crear proyecto: repositorio, variables, revisar → Desplegar.
  4. Ver el despliegue avanzar por las cinco etapas con su bitácora → Saludable → abrir la URL con HTTPS.
  5. Operar: redesplegar, revertir sin reconstruir, reiniciar, detener, cambiar variables o rama, eliminar.
  6. Ciclo de la suscripción: por vencer (aviso por correo) → vencida (bloquea despliegues) → suspendida (contenedores detenidos) → renovar (se reanudan).
  7. Administración: buscar usuarios, suspender y reactivar cuentas, ver la infraestructura.

Módulos del sistema

El sistema se divide en once módulos. Diez están implementados; M8 quedó como stub por decisión de alcance. El módulo de datos nació del primer cliente real del piloto, Nimbo, que necesitaba PostgreSQL con pgvector, Redis y S3.

IdMóduloResponsabilidadDueñoEstado
M1Identidad y accesoCuentas, sesiones, roles, recuperación, primera configuraciónEddyCompleto
M2Suscripciones y pagosCatálogo, contratación simulada, cuotas, ciclo de vida, comprobantesJavierCompleto
M3Proyectos y fuentesAlta desde GitHub, variables cifradas, configuraciónEduardoCompleto
M4Motor de construcciónCola, clonado, detección de stack, docker build, bitácoraDerekCompleto
M5Orquestación y ejecuciónContenedores con límites, salud, versionado, reversión, métricasDerekCompleto
M5 · datosRecursos de datosPostgreSQL + pgvector, Redis y S3 por proyecto, con volumen persistente, compartibles entre proyectos del mismo usuarioDerekCompleto
M6Enrutamiento y TLSSubdominio, Traefik, certificado comodín, conmutación sin corteDerekCompleto
M7ObservabilidadVista de despliegue, resumen, historial, consumo, métricasEduardoCompleto
M8Asistente e integraciónFuera de alcance; responde solo GET /herramientas/healthDerekStub
M9AdministraciónUsuarios, suspensión, reactivación, instalación, infraestructuraJavierCompleto
M10NotificacionesCorreo por puerto intercambiable; verificación, recuperación y avisosEddyCompleto

Servicios ofertados (planes)

El enunciado (§4.2) pide que cada servicio tenga nombre, descripción, precio y vigencia. Deploya vende entornos web administrados en cuatro planes, cargados por seed y leídos siempre de la base (nunca de constantes en la web):

PlanDescripciónPrecio (30 días)VigenciaProyectosCPU / proyectoMemoria / proyectoConstrucciones / mesBases de datosDisco por base
SandboxPara probar sin tarjetaSin costoSin vencimiento10.25 vCPU256 MB301512 MB
StarterProyectos personalesUSD 5.0030 o 365 días30.5 vCPU512 MB15032 GB
ProEquipos pequeñosUSD 15.0030 o 365 días101 vCPU1 GB5001010 GB
BusinessProducción ligeraUSD 40.0030 o 365 días252 vCPU2 GB2 0002525 GB

Los límites se aplican: CPU y memoria van como parámetros del contenedor (--cpus, --memory), y proyectos, construcciones y bases de datos se validan antes de crear nada. El disco de cada base se mide y se avisa al acercarse al límite; no se corta.

Fuera de alcance

Se diseñó en la propuesta, pero no entra en esta entrega. Cada punto podría volver con su propio change de OpenSpec.

QuéPor qué quedó fuera
Asistente con modelo de lenguaje y servidor de integración (M8)Mayor riesgo y sin pantalla en el canvas v4.1
Repositorios privados (OAuth de GitHub) y carga por archivo comprimidoSolo repositorio público; reduce superficie de ataque
Dominios personalizadosSin pantalla; el subdominio automático cubre el caso
Renovación automática y prorrateoLa renovación es manual; un ascenso paga el plan completo
Complementos y gestión de planes desde administraciónCatálogo fijo por seed
Roles Operador de infraestructura y Soporte técnicoEl enunciado los marca como opcionales; la vista de infraestructura la ve el Administrador
Transmisión en vivo por WebSocketEl polling cada 3 s cumple (ADR 0006)
Respaldo y restauración de una base desde la interfazEl snapshot diario del disco la cubre; la restauración es manual (ADR 0012)
Varios nodos, escalado horizontal y cobro con dinero realLa ruta de escala está propuesta en el ADR 0010

Supuestos y restricciones

TipoEnunciado
RestricciónUn solo nodo: una EC2 m7i-flex.large (2 vCPU, 8 GB) con Ubuntu 24.04 en AWS us-east-2, creada con Terraform; la landing va aparte en S3 y CloudFront
RestricciónSolo repositorios públicos de GitHub, con Dockerfile o con un stack reconocido
RestricciónPago simulado: no se procesa dinero real; del número de tarjeta solo se guardan los últimos 4 dígitos
RestricciónStack fijado por el equipo: NestJS + Next.js (Node.js 22), PostgreSQL 16, Redis 7, Docker, Traefik v3
SupuestoEl DNS del dominio tiene registros A para <dominio> y *.<dominio> y un token del proveedor para DNS-01
SupuestoHay un proveedor SMTP externo (Resend) con SPF y DKIM para que los correos lleguen a la bandeja
SupuestoLas aplicaciones de los clientes escuchan HTTP en un puerto interno (8080 por defecto)

Actores y roles

Actores

ActorTipoDescripción
VisitanteHumano, sin sesiónVe los planes, se registra, verifica su correo y recupera su contraseña
ClienteHumano, rol clienteDesarrollador que contrata un plan, crea proyectos, despliega y opera sus aplicaciones
AdministradorHumano, rol administradorSupervisa usuarios, suspende y reactiva cuentas, ajusta la instalación y ve la infraestructura. En la nube se crea por seed; en autoalojado, con el código de configuración
Quien instalaHumano, fuera de la plataformaCorre instalar.sh en un servidor propio y crea el primer administrador (modo autoalojado)
Tarea diariaSistema, programadoAvanza el ciclo de las suscripciones a las 00:00 UTC
TrabajadorSistema, proceso aparteConsume la cola: clona, construye, ejecuta, publica y toma métricas
GitHubSistema externoOrigen del código (API REST pública y git clone)
Proveedor SMTPSistema externoEntrega los correos (Mailpit en desarrollo)
Let's Encrypt y DNSSistemas externosCertificado comodín por DNS-01 y resolución de *.deploya.larasolutions.dev

Matriz de permisos por rol

Los permisos se aplican en la API con SesionGuard y RolGuard (un Cliente recibe 403 en cualquier ruta de administración) y en la web con el mismo criterio. Un cliente nunca ve recursos de otro: la API responde 404 a un proyecto, despliegue o pago ajeno, para no revelar que existe.

CapacidadVisitanteClienteAdministrador
Ver planes✓✓✓
Registrarse, verificar, recuperar contraseña✓——
Gestionar su cuenta y su sesión—✓✓
Contratar, renovar, cambiar de plan, ver pagos—✓—
Crear y operar sus proyectos—✓—
Ver y buscar todos los usuarios——✓
Suspender y reactivar cuentas (no a otro administrador)——✓
Ver infraestructura y ajustar la instalación——✓

Requisitos funcionales

Cada requisito resume un Requirement de OpenSpec. Prioridad: Debe es imprescindible para el núcleo; Debería es núcleo pero se dejó al final; Sprint entró en el sprint fuera de alcance aprobado el 20 de octubre. La columna Escenarios cuenta los criterios de aceptación del spec; cada uno tiene su prueba.

M1 · Identidad y acceso

IdRequisitoPrioridadPantallasEscenarios
RF-01El sistema crea una cuenta con correo único y contraseña de al menos 12 caracteres con mayúscula, minúscula, número y símbolo. La cuenta queda pendiente de verificación y con plan SandboxDebe01, 01b4
RF-02La cuenta se activa solo con un enlace de verificación vigente (24 h) y de un solo uso. Se puede pedir un reenvío tras una cuenta atrás de 60 s; el reenvío invalida el enlace anterior y responde igual exista o no la cuentaDebe025
RF-03El sistema inicia sesión solo a cuentas Activas, distingue credenciales incorrectas, cuenta sin verificar y cuenta suspendida (con su motivo), y cierra la sesión tras 7 días sin actividadDebe03, 03b, 287
RF-04El sistema distingue los roles Cliente y Administrador; las rutas de administración responden 403 a un ClienteDebe282
RF-05El cliente restablece su contraseña con un enlace de un solo uso que caduca en 30 minutos; la respuesta es neutra, pedir otro invalida el anterior y restablecer cierra todas las sesionesDebería047
RF-06El cliente edita su nombre (máx. 64), ve correo y rol, cambia su contraseña con la actual (cierra las demás sesiones) y cierra sesión en todos los dispositivosDebería05, 05b7
RF-07Mi cuenta · Seguridad muestra la fecha del último cambio de contraseñaSprint05b3
RF-08Las pantallas de acceso muestran una ilustración animada que respeta prefers-reduced-motion y es decorativa para lectores de pantallaSprint01, 033
RF-09En autoalojado y sin administrador, /configurar pide el código de un solo uso del instalador, crea un solo administrador aunque lleguen dos altas a la vez, prueba el SMTP o sigue sin correoSprint3110

M10 · Notificaciones

IdRequisitoPrioridadPantallasEscenarios
RF-10Todo correo sale por CorreoPuerto; el proveedor (SMTP real, Mailpit o consola) se elige por variables de entorno sin tocar código, y un fallo del proveedor se registra sin romper el flujoDebe—5
RF-11Existen plantillas en español de verificación (24 h) y recuperación (30 min, un uso, «si no la pediste, ignórala»), con botón y enlace en texto planoDebe243
RF-12El titular recibe un correo cuando un despliegue termina Saludable o Fallido y cuando su suscripción pasa a Por vencer o SuspendidaSprint24b4
RF-13En autoalojado el correo usa el SMTP guardado por el asistente o Admin · Instalación, sin reiniciarSprint31, 323

M2 · Suscripciones y pagos

IdRequisitoPrioridadPantallasEscenarios
RF-14El catálogo de planes activos se expone sin sesión, ordenado, con precio a 30 y 365 días y sus cuatro límitesDebe063
RF-15Toda cuenta nueva recibe una suscripción Sandbox Activa, sin costo ni vencimientoDebe—4
RF-16El cliente contrata un plan con la pasarela simulada: 4242… aprueba, …0002 rechaza, …3220 tarda 5 s y cualquier otra se rechaza. Un pago aprobado lleva comprobante consecutivo DPY-AAAA-NNNNNNDebe07, 07b5
RF-17El cliente renueva manualmente (suma la vigencia al final de la actual), asciende de plan (paga completo, vigencia nueva) o programa un descenso sin cobro que aplica al vencerDebería084
RF-18El cliente ve su historial de pagos con fecha, concepto, monto y estado, y descarga el comprobante PDF de los aprobados («simulado, sin valor fiscal»)Debería09, 09b4
RF-19El sistema impide crear proyectos y construcciones por encima del límite del plan; el período de construcciones es el mes calendario UTCDebe08, 102
RF-20Una tarea diaria mueve las suscripciones: Activa → Por vencer (≤ 7 días) → Vencida (gracia de 5 días, bloquea altas y despliegues) → Suspendida (detiene contenedores) → Cancelada (30 días suspendida). Es idempotente y Sandbox no venceDebe10c, 288
RF-21Mi suscripción muestra plan, estado, vigencia, días restantes, precio de renovar, consumo y descenso programadoDebería083
RF-22El seed crea de forma idempotente los planes, el administrador y las cuentas de demostración (cliente@, vencida@, suspendida@)Debe—5
RF-23Con MODO_INSTALACION=autoalojado hay un único plan sin cobro ni vencimiento, los límites los fija el administrador y el ciclo no correSprint30, 3210
RF-24El ciclo avisa por correo una sola vez al pasar a Por vencer y a SuspendidaSprint24b2

M3 · Proyectos y fuentes

IdRequisitoPrioridadPantallasEscenarios
RF-25El cliente ve solo sus proyectos, con búsqueda, estado del último despliegue y contador frente al límite; sin proyectos ve la guía del primero. La lista se actualiza cada 3 s mientras algo está en cursoDebe10, 10b4
RF-26El cliente crea un proyecto desde la URL de un repositorio público de GitHub, una rama y un nombre (que define el subdominio). El sistema verifica el repositorio, detecta cómo construirlo y propone el puerto desde EXPOSEDebe11a, 11e11
RF-27El alta se bloquea si se alcanzó el límite de proyectos, si la suscripción está Vencida o Suspendida o si se agotaron las construcciones; todas las verificaciones ocurren antes de guardarDebe10, 10c, 288
RF-28Al confirmar, el sistema guarda el proyecto y lanza el despliegue #1Debe11d2
RF-29Las variables de entorno se guardan cifradas (AES-256-GCM), se muestran enmascaradas y aplican en el próximo despliegue; se puede «guardar» o «guardar y desplegar»Debe11c, 174
RF-30El cliente cambia nombre, repositorio, rama, ruta del Dockerfile y puerto (el subdominio no cambia) y elimina el proyecto escribiendo su nombre; eliminar borra contenedor, imágenes y rutaDebería19, 19b7
RF-67En el alta, el cliente indica la ruta del Dockerfile si no está en la raíz (monorepos); se valida que exista en la rama elegidaDebería11a, 195
RF-68El cliente define un comando de inicio que reemplaza el CMD de la imagen (máx. 512 caracteres, sin pasar por un shell); aplica también al revertirDebería195
RF-69Un proyecto admite hasta 150 variables y el cliente puede pegar un archivo .env completoDebería11c, 172

M4 · Motor de construcción

IdRequisitoPrioridadPantallasEscenarios
RF-31Cada despliegue recibe el número siguiente del proyecto, nace Encolado con sus cinco etapas en Pendiente y se encola para el trabajador, fuera del ciclo HTTPDebe123
RF-32El trabajador clona la rama, registra el commit y construye con el Dockerfile del repositorio o con una receta, con un tiempo máximo de 10 minutos; cada construcción exitosa registra un artefacto con digest, tamaño, commit y recetaDebe12, 12c5
RF-33Si no hay Dockerfile, se reconoce Node, Python, Go o sitio estático (en ese orden); si hay, manda siempre el del repositorioDebe11a, 11e7
RF-34Cada línea de la bitácora se guarda numerada con marca de tiempo, etapa y nivel, y se consulta desde una posición (máx. 500 líneas)Debe122
RF-35El cliente cancela un despliegue en curso, reintenta uno fallido y redespliega un commit anterior (reconstruye y consume construcción)Debería12, 147
RF-36Las transiciones de estado pasan por una única máquina de estados pura; una transición inválida no persiste nadaDebe—2
RF-37Cada despliegue se consulta por su número dentro del proyecto, con las cinco etapas, su duración, commit, imagen, URL y código de salidaDebe123
RF-38El motor expone la duración de cada etapa de los últimos despliegues, con 0 en las omitidas y la etapa donde falló un FallidoSprint14c2

M5 · Orquestación y ejecución

IdRequisitoPrioridadPantallasEscenarios
RF-39Cada contenedor corre con la CPU y la memoria del plan, sin privilegios (CapDrop: ALL, no-new-privileges) y en una red propia del proyectoDebe132
RF-40Antes de publicar, el sistema verifica que el contenedor responde HTTP (< 500) en su puerto, cada segundo y hasta 60 sDebe122
RF-41El cliente reinicia y detiene el contenedor activo sin reconstruir; al eliminar el proyecto se borran contenedor, imágenes y rutaDebería13, 19b6
RF-42Si la suscripción o la cuenta se suspenden, los contenedores del cliente se detienen; al reactivar, vuelven a arrancarDebe10c, 25b3
RF-43Se conservan los 5 artefactos más recientes por proyecto más el activo; el resto se retiraDebe142
RF-44El cliente vuelve a un artefacto disponible sin reconstruir: el despliegue nace Revirtiendo, omite Recepción y Construcción, no consume construcciones y, si la salud falla, la versión activa no cambiaDebe146
RF-45Un despliegue que construye se rechaza si la suscripción está Vencida o Suspendida o si se agotaron las construcciones del mes; la reversión no cuentaDebe10c, 146
RF-46El contenedor recibe las variables descifradas y PORT; la bitácora registra cuántas, nunca sus valoresDebe123
RF-47El trabajador toma una muestra de CPU y memoria por minuto de cada contenedor Saludable y conserva 24 hSprint16, 13c6

M5 · Recursos de datos

IdRequisitoPrioridadPantallasEscenarios
RF-70El cliente crea un PostgreSQL 17 con pgvector, un Redis 7 o un almacenamiento S3 para su proyecto, con volumen persistente que sobrevive a despliegues, reversiones y reinicios; uno de cada tipo por proyecto y hasta el límite de su plan (409)Debe188
RF-71Las variables de conexión (DATABASE_URL, REDIS_URL, S3_*) se inyectan en el siguiente despliegue; las del cliente ganan y las DEPLOYA_* siempre lleganDebe18, 177
RF-72Un recurso se comparte solo con otros proyectos del mismo usuario; compartir con un proyecto ajeno o que ya tiene ese tipo se rechazaDebería184
RF-73Eliminar un recurso exige escribir su tipo y borra contenedor y volumen; desde un proyecto con el que se comparte solo lo desconecta; al eliminar el proyecto dueño se eliminaDebe18, 19b5
RF-74El S3 tiene dirección pública propia (<proyecto>-s3.<dominio>) y su bucket nace con versionadoDebería182
RF-75El trabajador mide el disco de cada recurso y la interfaz avisa al acercarse al límite del plan, sin cortar el servicioDebería18, 132
RF-76Los recursos de datos no publican puertos en el host y corren con capacidades mínimas; con la suscripción Vencida o Suspendida no se creanDebe183

M6 · Enrutamiento y TLS

IdRequisitoPrioridadPantallasEscenarios
RF-48Cada proyecto se publica en <subdominio>.<dominio> solo después de pasar la salud; renombrar no cambia el subdominioDebe12b, 132
RF-49En el servidor el tráfico va por HTTPS con un certificado comodín emitido por DNS-01; HTTP redirige a HTTPS y el panel muestra hasta cuándo vale el certificadoDebe12b3
RF-50Un despliegue nuevo recibe el tráfico antes de retirar el anterior; si no pasa la salud, la ruta sigue en el anteriorDebe12, 12c2

M7 · Observabilidad

IdRequisitoPrioridadPantallasEscenarios
RF-51La vista de despliegue muestra el riel de cinco etapas con estado y duración y la bitácora numerada, actualizada cada 3 s y copiable; el sondeo se detiene al terminarDebe12, 12b, 12c5
RF-52El resumen del proyecto muestra estado, URL, versión activa (número, commit, digest, tamaño), recursos aplicados y la línea de tiempo del último despliegueDebe133
RF-53El historial lista los despliegues de 20 en 20 con filtros (todos, saludables, fallidos), la versión activa resaltada y la acción de cada filaDebe144
RF-54Se expone el consumo del mes (proyectos y construcciones) y la actividad de las últimas 12 semanasDebería08, 133
RF-55El cliente ve CPU y memoria de la última hora o de 24 h frente al límite, con zona de aviso desde 80 %, despliegues marcados y alternativa en tablaSprint16, 13c6
RF-56El cliente ve la duración por etapa de los últimos 14 despliegues y la mediana de los saludablesSprint14c3
RF-57Mi suscripción muestra las construcciones acumuladas del mes contra la cuota y una proyección al cierreSprint08c3
RF-58El cliente ve las últimas 500 líneas de la salida de su contenedor, con filtro por nivel, búsqueda, pausa y descarga; Deploya no las guardaSprint153

M9 · Administración

IdRequisitoPrioridadPantallasEscenarios
RF-59El administrador lista usuarios con búsqueda por correo y filtro por estado de suscripción, y ve el detalle: rol, suscripción, proyectos y pagosDebe254
RF-60El administrador suspende una cuenta con motivo y detalle; queda registrada la acción y no se puede suspender a otro administradorDebe25b4
RF-61El administrador reactiva una cuenta suspendida; los contenedores vuelven solo si la suscripción está vigenteSprint25c4
RF-62En autoalojado el administrador cambia la política de registro (abierto, invitación, cerrado), crea y revoca invitaciones y fija los límites por proyectoSprint328
RF-63El administrador ve, de solo lectura, CPU, memoria y disco del servidor, el estado de la cola y la última muestra de cada entornoSprint273

Instalación y código abierto

IdRequisitoPrioridadPantallasEscenarios
RF-64El repositorio incluye licencia, README, guía de contribución y política de seguridad, y su historial se revisa con gitleaksSprint—2
RF-65instalar.sh comprueba requisitos, DNS y certificado antes de escribir nada, se detiene con instrucciones, se retoma con --continuar e imprime un código de configuración de un solo usoSprint3011
RF-66actualizar.sh respalda, migra y reinicia sin detener las aplicaciones de los clientes (--volver restaura); respaldar.sh conserva 7 respaldos sin la clave de cifradoSprint305

Requisitos no funcionales

Se agrupan según las características de calidad de ISO/IEC 25010. Cada uno tiene una métrica que se puede comprobar y dice cómo se verifica.

Seguridad

IdRequisitoMétrica / reglaVerificación
RNF-01Contraseñas nunca en claroHash scrypt con sal aleatoria por usuario y comparación en tiempo constantePrueba unitaria de HashContrasenaScrypt; columna hashContrasena
RNF-02Tokens de un solo uso que no se pueden reconstruir desde la baseSe guarda solo el SHA-256 del token de verificación, recuperación, sesión e invitaciónSpecs identidad y administracion
RNF-03Sesión resistente a robo por scriptCookie HttpOnly, SameSite=Lax, Secure en HTTPS; 7 días sin actividadcookie-sesion.ts y sus pruebas
RNF-04Respuestas que no revelan cuentasRegistro, reenvío y recuperación responden igual exista o no el correo; recursos ajenos → 404Escenarios «respuesta neutra» y «proyecto ajeno»
RNF-05Secretos del cliente cifrados en reposoVariables con AES-256-GCM, IV distinto por valor; nunca en la bitácoraCifradorAesGcm y escenario «La bitácora no muestra valores»
RNF-06Aislamiento entre clientesContenedor sin privilegios, CapDrop: ALL, no-new-privileges, red propia por proyecto; solo el trabajador monta docker.sockSpec orquestacion; ADR 0002 y ADR 0005
RNF-07Tráfico cifradoHTTPS en la app, la API y cada proyecto con certificado comodín (HTTP → 301); la landing, por CloudFront con HSTSinfra-vps.md §3
RNF-08Control de acceso por rolRolGuard: Cliente → 403 en administración; un administrador no suspende a otroEscenarios de identidad y administracion
RNF-09Repositorio público sin secretosgitleaks sobre todo el historial en cada PRJob «Secretos (gitleaks)» de CI
RNF-10Límite de intentos contra fuerza bruta5 intentos de código de configuración por IP cada 15 min; el sexto fallo de inicio de sesión responde 429 con Retry-AfterLimiteIntentos (hecho); EST-01a para el inicio de sesión (en curso al cerrar este documento)

Rendimiento y eficiencia

IdRequisitoMétrica
RNF-11La API nunca construye dentro de una peticiónCrear un despliegue responde al encolar; el trabajo pesado ocurre en el trabajador (BullMQ)
RNF-12Tiempos acotadosConstrucción ≤ 10 min; verificación de salud ≤ 60 s; consulta a GitHub ≤ 10 s
RNF-13Reversión en segundosRevertir no reconstruye: omite Recepción y Construcción y reutiliza la imagen local
RNF-14Bitácora eficienteSe escribe en lotes (cada 500 ms o 50 líneas) y se lee incrementalmente con desde= (máx. 500 líneas por respuesta)
RNF-15Panel sin sobrecargaPolling cada 3 s solo mientras algo está en curso; se detiene al terminar
RNF-16Métricas con almacenamiento acotadoUna muestra por minuto por contenedor, purga a las 24 h, promedio por cubos de 30 min

Fiabilidad y disponibilidad

IdRequisitoMétrica
RNF-17Publicar sin corteEl contenedor nuevo recibe tráfico antes de retirar el anterior; si falla la salud, sigue el anterior
RNF-18Un fallo no tumba lo que funcionaUn despliegue fallido o una variable ilegible nunca cambian la versión activa
RNF-19Operaciones idempotentesSeed, ciclo diario (una corrida mueve un estado como máximo), encolado (jobId = despliegueId) y borrado de proyecto
RNF-20Recuperación ante desastresRespaldo diario de base y configuración, 7 retenidos, restauración probada; actualizar.sh --volver
RNF-21Errores externos aisladosUn fallo del SMTP se registra y no se propaga; GitHub caído → «GitHub no disponible», no «repositorio inválido»
RNF-35Los datos de los clientes sobreviven y tienen copia fuera del nodoVolumen por recurso que no toca ningún despliegue; snapshot diario del disco con DLM, 7 días: pérdida máxima de 24 hinfra/terraform/respaldos.tf; escenario «Sobrevive al redespliegue»

Usabilidad y accesibilidad

IdRequisitoMétrica
RNF-22Coherencia visualToda pantalla usa solo los tokens y componentes del design system v4.1 (sin hex sueltos), en modo claro y oscuro
RNF-23Estados que no dependen del colorCada estado lleva palabra e icono, no solo color (WCAG 1.4.1)
RNF-24Movimiento respetuosoAnimaciones solo de transform y opacity; con prefers-reduced-motion quedan quietas
RNF-25Accesibilidad de formularios y gráficasCampos con aria-invalid y aria-describedby; gráficas con alternativa en tabla y navegación por teclado
RNF-26Lenguaje claroInterfaz y correos en español; errores que dicen qué pasó y qué hacer (p. ej. «falta Dockerfile» con ejemplo)

Mantenibilidad

IdRequisitoMétrica
RNF-27Arquitectura en capas con puertosEl dominio no importa Nest, Prisma, Docker ni HTTP; ~70 puertos como abstract class
RNF-28Pruebas por escenarioCada Scenario del spec tiene su prueba; 1 069 pruebas de API y 272 de web en verde
RNF-29Cobertura≥ 80 % de líneas en dominio y servicios tocados; hoy 97.1 % de líneas en toda la API
RNF-30Integración continuaCada PR corre pruebas, build, validación de diagramas, gitleaks, shellcheck y un smoke de compose
RNF-31Decisiones registradasCada decisión grande tiene su ADR (formato Nygard)

Portabilidad

IdRequisitoMétrica
RNF-32Un comando para levantar tododocker compose up arranca Postgres, Redis, API, trabajador, web, Traefik y Mailpit
RNF-33Configuración por entornoDominio, esquema, correo, motor y modo de instalación son variables; el mismo código corre en local, en AWS y en autoalojado
RNF-34Sin dependencia del proveedorLas aplicaciones son contenedores estándar; el cliente se lleva su imagen y su Dockerfile
RNF-36Infraestructura reproducibleToda la nube se crea con Terraform (infra/terraform/); ningún secreto pasa por Terraformterraform validate y terraform plan

Casos de uso

Vista general

El diagrama muestra los actores, los cuatro paquetes funcionales y los sistemas externos. Los casos de uso se numeran de CU-01 a CU-20; los detallados por subsistema están en las secciones siguientes.

Deploya

«actor»
Visitante

«actor»
Cliente

«actor»
Administrador

«actor»
Tarea diaria

Cuenta · M1 M10
CU-01 Registrarse
CU-02 Verificar correo
CU-03 Iniciar sesión
CU-04 Recuperar contraseña
CU-05 Gestionar mi cuenta

Suscripción y pagos · M2
CU-06 Consultar planes
CU-07 Contratar un plan
CU-08 Renovar o cambiar de plan
CU-09 Consultar historial de pagos
CU-15 Avanzar el ciclo de suscripciones

Proyectos y despliegues · M3 a M7
CU-10 Crear proyecto y desplegar
CU-11 Seguir un despliegue
CU-12 Revertir a una versión
CU-13 Operar el proyecto
CU-14 Monitorear recursos

Administración · M9
CU-16 Gestionar usuarios
CU-17 Suspender o reactivar cuenta
CU-18 Supervisar infraestructura
CU-19 Ajustar la instalación
CU-20 Instalar autoalojado

«sistema»
GitHub

«sistema»
Proveedor SMTP

«sistema»
Docker · Traefik
Let's Encrypt

Figura 1. Casos de uso — vista general de Deploya (núcleo v4.1 y sprint)

Cuenta y acceso

Deploya · Identidad y notificaciones

«include»

«include»

«include»

«include»

«include»

«extend»

«extend»

«extend»

«include»

«actor»
Visitante

«actor»
Cliente

«actor»
Administrador

CU-01 Registrarse

CU-02 Verificar correo

Reenviar verificación

CU-03 Iniciar sesión

Cerrar sesión

CU-04 Recuperar contraseña

CU-05 Gestionar mi cuenta

Cambiar contraseña

Cerrar sesión en todos
los dispositivos

Validar política
de contraseña

Enviar correo

Asignar plan Sandbox

«sistema»
Proveedor SMTP

Figura 2. Casos de uso — Cuenta y acceso (M1, M10)

Suscripción y pagos

Deploya · Suscripciones

«include»

«include»

«include»

«extend»

«extend»

«extend»

«include»

«include»

«include»

«actor»
Visitante

«actor»
Cliente

«actor»
Tarea diaria

CU-06 Consultar planes

CU-07 Contratar un plan

CU-08 Renovar ahora

Ascender de plan

Programar descenso

CU-09 Consultar historial
de pagos

Descargar comprobante PDF

CU-15 Avanzar el ciclo
de suscripciones

Cobrar con la
pasarela simulada

Cotizar

Detener o reanudar
contenedores

Avisar por correo

Figura 3. Casos de uso — Suscripción y pagos (M2)

Proyectos y despliegues

Deploya · Proyectos y motor de despliegue

«include»

«include»

«include»

«include»

«extend»

«extend»

«extend»

«extend»

«include»

«actor»
Cliente

CU-10 Crear proyecto
y desplegar

CU-11 Seguir un despliegue

CU-12 Revertir a una versión

CU-13 Operar el proyecto

Redesplegar, reintentar
o cancelar

Reiniciar o detener

Editar variables cifradas

Configurar o eliminar

CU-14 Monitorear recursos

Detectar stack

Verificar cuota
y suscripción

Construir, ejecutar
y publicar

«sistema»
GitHub

«sistema»
Docker y Traefik

Figura 4. Casos de uso — Proyectos, despliegues y observabilidad (M3 a M7)

Administración y autoalojado

Deploya · Administración

«include»

«include»

«extend»

«include»

«extend»

«include»

«actor»
Administrador

«actor»
Quien instala

CU-16 Gestionar usuarios

CU-17 Suspender cuenta

Reactivar cuenta

CU-18 Supervisar infraestructura

CU-19 Ajustar la instalación

Invitar usuarios

CU-20 Instalar Deploya
autoalojado

Configurar el primer
administrador

Registrar acción
administrativa

Detener o reanudar
contenedores

Figura 5. Casos de uso — Administración y autoalojado (M9, instalación)

Especificación de los casos de uso principales

Cada ficha sigue el formato de Cockburn simplificado: actor, precondiciones, flujo principal, flujos alternos y postcondición. Los números de pantalla son los del canvas v4.1.

CU-01 · Registrarse

ActorVisitante
RequisitosRF-01, RF-02, RF-10, RF-11, RF-15
Pantallas01 Registro, 01b Estados, 02 Verifica tu correo, 24 Correo de verificación
PrecondiciónEl visitante no tiene sesión. En autoalojado, la política de registro lo permite
Flujo principal
  1. 1El visitante abre /registro e ingresa nombre, correo y contraseña.
  2. 2La web valida la política de contraseña mientras escribe.
  3. 3La API crea la cuenta pendiente, le asigna Sandbox y guarda el hash de un token de verificación de 24 h.
  4. 4M10 envía el correo con botón y enlace en texto plano.
  5. 5El visitante abre el enlace; la cuenta pasa a Activa y el token queda usado
Alternos
  1. 2aContraseña débil → la web señala qué regla falta.
  2. 3aCorreo ya registrado → 01b «correo ya registrado» con enlace a iniciar sesión.
  3. 4aEl SMTP falla → la cuenta se crea y la pantalla ofrece reenviar.
  4. 5aToken vencido o usado → 02 ofrece reenviar (con cuenta atrás de 60 s)
PostcondiciónCuenta Activa con suscripción Sandbox; puede iniciar sesión

CU-03 · Iniciar sesión

ActorCliente o Administrador
RequisitosRF-03, RF-04
Pantallas03 Iniciar sesión, 03b Estados, 28 Estados del sistema
PrecondiciónLa cuenta existe
Flujo principal
  1. 1El usuario ingresa correo y contraseña.
  2. 2La API valida contra el hash scrypt.
  3. 3Crea una Sesion (guarda la huella del token) y responde con la cookie HttpOnly.
  4. 4La web lleva a Proyectos (Cliente) o a Usuarios (Administrador)
Alternos
  1. 2aCredenciales incorrectas → mensaje genérico.
  2. 2bCuenta sin verificar → 03b con «reenviar verificación».
  3. 2cCuenta suspendida → 03b con el motivo y la fecha.
  4. 4aSesión con 7 días sin actividad → 28 «sesión expirada»
PostcondiciónSesión vigente; cada petición renueva la actividad

CU-04 · Recuperar contraseña

ActorVisitante
RequisitosRF-05, RF-11
Pantallas04 Recuperar contraseña, 24 Correo de recuperación
Flujo principal
  1. 1El visitante pide el enlace con su correo.
  2. 2La API responde siempre «si la cuenta existe, te enviamos un enlace».
  3. 3Si la cuenta está Activa, crea un token de 30 min (invalida el anterior) y envía el correo.
  4. 4El visitante abre el enlace y escribe una contraseña que cumple la política.
  5. 5La API cambia el hash, marca el token usado y revoca todas las sesiones
Alternos
  1. 3aCorreo no registrado → misma respuesta, sin correo.
  2. 4aToken vencido, usado o reemplazado → 04 «enlace no válido» con opción de pedir otro.
  3. 4bContraseña débil → no consume el token
PostcondiciónContraseña nueva; las sesiones previas quedan cerradas

CU-07 · Contratar un plan

ActorCliente
RequisitosRF-14, RF-16, RF-18
Pantallas06 Planes, 07 Contratar, 07b Resultados, 09 Historial de pagos
PrecondiciónSesión iniciada
Flujo principal
  1. 1El cliente compara planes y elige uno con vigencia de 30 o 365 días.
  2. 2La web pide la cotización a la API (GET /suscripciones/cotizacion).
  3. 3El cliente ingresa una tarjeta de prueba.
  4. 4PasarelaPago simulada aprueba.
  5. 5La API registra el pago con comprobante DPY-AAAA-NNNNNN, deja la suscripción Activa con el plan nuevo y cancela un descenso pendiente.
  6. 607b muestra «Aprobado» y el enlace al comprobante PDF
Alternos
  1. 4aTarjeta …0002 → «Fondos insuficientes (simulado)», pago rechazado sin comprobante.
  2. 4bTarjeta …3220 → 07b muestra «Procesando» 5 s.
  3. 4cTarjeta que no es de prueba → rechazada.
  4. 1aPlan de menor nivel con vigencia en curso → es-descenso: se ofrece programar el descenso
PostcondiciónSuscripción Activa con las cuotas del plan; pago en el historial

CU-10 · Crear proyecto y desplegar

ActorCliente
RequisitosRF-25 a RF-29, RF-31 a RF-33, RF-39, RF-40, RF-48 a RF-50
Pantallas10 Proyectos, 11a Repositorio, 11c Variables, 11d Revisar, 11e Errores, 12 Despliegue en curso, 12b Saludable
PrecondiciónSesión iniciada; suscripción Activa o Por vencer; cupo de proyectos y de construcciones
Flujo principal
  1. 1El cliente pega la URL del repositorio y elige la rama.
  2. 2La API comprueba el límite del plan antes de llamar a GitHub.
  3. 3Valida el repositorio, lee el último commit y detecta el Dockerfile o el stack.
  4. 4Propone puerto y subdominio.
  5. 5El cliente agrega variables (opcional) y revisa.
  6. 6Al pulsar Desplegar, la API guarda el proyecto y encola el despliegue #1.
  7. 7El trabajador clona, construye, ejecuta con los límites del plan, verifica la salud y escribe la ruta en Traefik.
  8. 8El despliegue queda Saludable y la app responde en https://<subdominio>.deploya.larasolutions.dev
Alternos
  1. 2aLímite alcanzado o suscripción Vencida → 10c, sin llamar a GitHub.
  2. 3aRepositorio privado o inexistente → 11e «no accesible».
  3. 3bSin Dockerfile ni stack reconocido → 11e con ejemplo.
  4. 3cRama inexistente → error en el campo.
  5. 3dGitHub caído → «GitHub no disponible».
  6. 4aSubdominio ocupado → sugiere otro.
  7. 7aLa construcción falla o supera 10 min → Fallido (12c) con la línea del error.
  8. 7bEl contenedor no responde en 60 s → Fallido; no se publica
PostcondiciónProyecto con despliegue #1 Saludable y artefacto deploya/<subdominio>:1 registrado

CU-11 · Seguir un despliegue

ActorCliente
RequisitosRF-34, RF-37, RF-51
Pantallas12, 12b, 12c
Flujo principal
  1. 1El cliente abre /projects/<proyecto>/despliegues/<n>.
  2. 2La web pide el despliegue y la bitácora cada 3 s con desde=<última línea>.
  3. 3El riel marca la etapa en curso en color Señal y la duración de las completadas.
  4. 4Al terminar, el sondeo se detiene y la vista muestra la URL y el certificado (12b) o la etapa y la línea del fallo (12c)
Alternos
  1. 1aNúmero inexistente o proyecto ajeno →
  2. 404.
  3. 3aEl cliente cancela → Cancelado (si aún no se publicó)

CU-12 · Revertir a una versión anterior

ActorCliente
RequisitosRF-43, RF-44, RF-45
Pantallas14 Proyecto · Despliegues
PrecondiciónEl artefacto elegido sigue disponible y no es el activo; no hay otro despliegue en curso
Flujo principal
  1. 1En el historial, el cliente elige «Revertir a esta versión».
  2. 2La API crea un despliegue nuevo con disparador = reversion en estado Revirtiendo, con Recepción y Construcción omitidas.
  3. 3El trabajador arranca la imagen guardada con los límites y las variables vigentes, verifica la salud y conmuta la ruta.
  4. 4El despliegue queda Saludable en segundos y no consume construcciones
Alternos
  1. 1aArtefacto retirado por la retención → la acción no se ofrece.
  2. 1bYa es el activo o hay uno en curso →
  3. 409.
  4. 3aLa salud falla → Fallido; la versión activa no cambia

CU-15 · Avanzar el ciclo de suscripciones

ActorTarea diaria
RequisitosRF-20, RF-24, RF-42
Pantallas10c, 28, 24b
Flujo principal
  1. 1A las 00:00 UTC la tarea lee las suscripciones que no son Sandbox.
  2. 2PoliticaCiclo (pura) decide el siguiente estado de cada una.
  3. 3A Por vencer (≤ 7 días) → correo con fecha y precio.
  4. 4A Vencida → la lista de proyectos avisa y bloquea altas y despliegues; las apps siguen en línea durante la gracia de 5 días.
  5. 5A Suspendida → M5 detiene los contenedores por la cola de operación y se envía correo.
  6. 6A Cancelada tras 30 días suspendida
Alternos
  1. 2aHay un descenso programado y llegó la fecha → se aplica el plan nuevo.
  2. 2bSegunda corrida el mismo día → no mueve nada.
  3. 6aEl cliente renueva una Vencida o Suspendida → vuelve a Activa y M5 reanuda sus contenedores

CU-17 · Suspender o reactivar una cuenta

ActorAdministrador
RequisitosRF-59, RF-60, RF-61, RF-42
Pantallas25 Usuarios, 25b Suspender, 25c Reactivar, 03b
Flujo principal
  1. 1El administrador busca la cuenta y abre su detalle.
  2. 2Elige «Suspender», un motivo de la lista y un detalle.
  3. 3La API cambia la cuenta a Suspendida, revoca sus sesiones, registra la AccionAdministrativa y pide a M5 detener sus contenedores.
  4. 4Al intentar entrar, el usuario ve el motivo (03b)
Alternos
  1. 2aLa cuenta es de otro administrador → no se permite.
  2. 2bYa está suspendida o el motivo no está en la lista → error.
  3. 5Reactivar → la cuenta vuelve a Activa y sus contenedores arrancan solo si la suscripción está vigente

CU-20 · Instalar Deploya autoalojado

ActorQuien instala
RequisitosRF-09, RF-23, RF-62, RF-65, RF-66
Pantallas30 Instalación, 31 Asistente, 32 Admin · Instalación
Flujo principal
  1. 1Corre instalar.sh en un servidor con Docker.
  2. 2El script comprueba requisitos, DNS (raíz y comodín) y token del proveedor antes de escribir nada.
  3. 3Levanta los servicios, espera el certificado y imprime un código de configuración de un solo uso.
  4. 4En /configurar ingresa el código y crea el administrador.
  5. 5Prueba el SMTP o sigue sin correo y elige la política de registro
Alternos
  1. 2aEl DNS no apunta o es un CNAME → se detiene con pasos para corregirlo; --continuar retoma.
  2. 4aCódigo vencido o usado → 404 de configuración.
  3. 4bDos altas a la vez → solo una crea administrador

Reglas de negocio

IdRegla
RN-01Una cuenta tiene una suscripción, que cambia de plan y de estado; nunca hay dos activas
RN-02Los estados de despliegue y los de suscripción son máquinas distintas y no se mezclan
RN-03Sandbox no vence y no se cobra
RN-04Un ascenso cobra el plan completo y arranca una vigencia nueva; un descenso no se cobra y aplica al vencer
RN-05Renovar suma la vigencia al final de la actual, o desde hoy si ya terminó
RN-06Un proyecto cuyo último despliegue está Fallido no cuenta contra el límite de proyectos
RN-07La reversión no cuenta como construcción; redesplegar un commit sí
RN-08El período de construcciones es el mes calendario en UTC
RN-09Solo se puede cancelar en Encolado, Construyendo o Revirtiendo; reintentar, solo desde Fallido
RN-10El nombre del proyecto define el subdominio una sola vez; renombrar no lo cambia. No se permiten nombres reservados (api, www…)
RN-11La clave de una variable es MAYUSCULAS_Y_GUIONES_BAJOS de hasta 128 caracteres; PORT está reservada
RN-12Un administrador no puede suspender a otro administrador
RN-13Del número de tarjeta solo se guardan los últimos 4 dígitos; el comprobante dice «simulado, sin valor fiscal»

Estados de la suscripción

contratacion con pago aprobado
(Sandbox: Activa sin vencimiento)

faltan 7 dias o menos
(DIAS_POR_VENCER)

se cumple la fecha de vigencia
(un solo salto por corrida)

renovacion manual aprobada

se cumple la fecha
de vigencia sin renovar

descenso programado a Sandbox
al vencer (sin cobro)

descenso programado a un plan
de pago al vencer (sin cobro)

renovacion aprobada
durante la gracia

5 dias en Vencida
(DIAS_GRACIA)

renovacion aprobada
(M5 reanuda los contenedores)

30 dias en Suspendida
(DIAS_HASTA_CANCELAR)

contratacion aprobada
(M5 reanuda los contenedores)

Activa

PorVencer

Vencida

Suspendida

Cancelada

Todos los entornos operan
con la cuota contratada

Entornos en linea;
nuevos despliegues bloqueados

Contenedores detenidos (M5);
datos y configuracion conservados

Datos conservados;
solo cambia el estado

Tarea diaria 00:05 UTC (BullMQ)
o POST /admin/ciclo/ejecutar;
idempotente el mismo dia

Figura 6. Estados de la suscripción — ciclo §4.4 (no son los de despliegue)

Estados del despliegue

crearDespliegue (alta, manual, reintento, redespliegue, variables)

revertir a un artefacto disponible (no consume construcciones)

el trabajador toma el trabajo

el cliente cancela

artefacto #n registrado (digest y tamaño)

clon falla, stack no reconocido, docker build falla o pasa de 10 min

el cliente cancela

la imagen del artefacto sigue en el nodo

la imagen ya fue retirada

contenedor con límites del plan responde a la salud (máx. 60 s)

el contenedor no arranca o no responde

Traefik apunta al contenedor nuevo y se detiene el anterior

falla el enrutamiento

el cliente detiene o reinicia (cola operación), suscripción Suspendida o cuenta suspendida

el cliente reinicia (mismo contenedor, sin reconstruir ni consumir construcciones)

Encolado

Revirtiendo

Construyendo

Cancelado

Aprovisionando

Fallido

Publicando

Saludable

Detenido

Etapa Recepción pendiente.
Reintentar y redesplegar crean
un despliegue nuevo (#n+1).

Etapas Recepción y Construcción:
git clone, detección de stack,
docker build con Dockerfile o receta.

Recepción y Construcción
quedan «omitida».
Reusa la imagen deploya/p:n.

Etapa Ejecución: red del proyecto,
--cpus y --memory de cuotaDe,
sin privilegios.

Etapa Enrutamiento: ruta dinámica
de Traefik; conmutación sin corte.

Etapa Operación. Proyecto.despliegueActivo
cambia aquí; el anterior se detiene
y la retención deja 5 artefactos.

La versión activa sigue
sirviendo tráfico.
Guarda codigoSalida y motivo.

Figura 7. Estados del despliegue — núcleo v4.1 con reversión (no son los de suscripción)

Trazabilidad

Enunciado del curso → Deploya

Cada característica obligatoria del enunciado, con el requisito que la cumple, el caso de uso, la pantalla y el spec donde está su prueba.

EnunciadoRequisitosCaso de usoPantallasSpec
§4.1 Registro de nuevos usuariosRF-01CU-0101, 01bidentidad
§4.1 Validación de correo electrónicoRF-02, RF-11CU-0102, 24identidad, notificaciones
§4.1 Recuperación de contraseñaRF-05CU-0404identidad
§4.1 Autenticación seguraRF-03, RNF-01 a RNF-03CU-0303, 03bidentidad
§4.1 Manejo de sesionesRF-03, RF-06CU-03, CU-0505b, 28identidad
§4.1 Roles Administrador y ClienteRF-04, RNF-08CU-16, CU-1725, 28identidad, administracion
§4.2 Servicio con nombre, descripción, precio y vigenciaRF-14CU-0606suscripciones
§4.2 Visualización de planesRF-14CU-0606suscripciones
§4.2 Contratación de serviciosRF-16CU-0707, 07bsuscripciones
§4.2 Historial de pagosRF-18CU-0909, 09bsuscripciones
§4.2 Renovación de serviciosRF-17, RF-20CU-08, CU-1508suscripciones
§4.2 Simulación propia de pagosRF-16CU-0707bsuscripciones
§4.3 C · Crear entornos webRF-26 a RF-33, RF-39 a RF-40, RF-48 a RF-50CU-10, CU-1111a–11e, 12proyectos, motor-construccion, orquestacion, enrutamiento
§4.3 C · Gestionar configuracionesRF-29, RF-30, RF-35, RF-41, RF-44CU-12, CU-1314, 17, 19proyectos, orquestacion
§4.3 C · Monitorear consumo de recursosRF-47, RF-51 a RF-58CU-1413, 13c, 14c, 15, 16, 08cobservabilidad, orquestacion
§4.3 C · Gestión de dominios simuladosRF-48, RF-49CU-1012b, 13enrutamiento
§6 Arquitectura analizada y defendidaRNF-27, RNF-31——Documento de diseño, ADR 0001–0009
§7 Documentación obligatoria———Documentos 1 a 4 de esta entrega
§8 Sistema funcionandoRNF-32, RNF-33——Manual técnico; AWS y video de respaldo

Lo que Deploya agrega al enunciado

Más allá de lo pedidoDónde
Despliegue real de aplicaciones en contenedores, no simuladoM4, M5, M6
Detección de stack sin Dockerfile (Node, Python, Go, estático)RF-33, ADR 0003
Versionado inmutable y reversión en segundos sin reconstruirRF-43, RF-44, ADR 0004
HTTPS real con certificado comodínRF-49, ADR 0007
Métricas, bitácoras de ejecución y tiempos por etapaRF-55 a RF-58
Ciclo de vida completo de la suscripción con avisos por correoRF-20, RF-24
Comprobante PDF por pagoRF-18
Código abierto (AGPL-3.0) e instalación autoalojada con un comandoRF-64 a RF-66, ADR 0008
Design system propio en claro y oscuroRNF-22 a RNF-25
Bases de datos administradas (PostgreSQL + pgvector, Redis, S3) que se comparten entre proyectosRF-70 a RF-76, ADR 0012
Infraestructura como código en AWS y landing en CDNADR 0009, ADR 0011

Cobertura de verificación por módulo

83requisitos en 12 specs
354escenarios de aceptación
1 573pruebas automatizadas (API + web)
97.1 %líneas cubiertas en la API
SpecRequisitosEscenariosMódulos
identidad1054M1
notificaciones515M10
suscripciones1352M2
proyectos850M3
motor-construccion932M4
orquestacion1047M5
datos721M5 · datos
enrutamiento37M6
observabilidad830M7
administracion627M9
instalacion318Transversal
herramientas11M8 (stub)
Total83354