Con qué está hecho y por qué

Cada elección responde a algo concreto de INEC: pocas sedes, un equipo pequeño, datos de menores y de salud, y el crédito de Microsoft. Las decisiones están escritas y se pueden revisar; ninguna amarra a INEC a un proveedor.

Cómo se conectan las piezas

Arquitectura propuesta para producción.

Sitio público

Astro · Static Web Apps

Programas, sedes, preinscripción con autorización de datos.

API del catálogo y preinscripciones

Plataforma INEC

TanStack Start · Container Apps

Admisiones, matrícula, cartera, notas, portal del estudiante y tablero. Permisos por rol y sede en cada petición.Worker con pg-boss: mora diaria, PDF y correos.

Consultas y transacciones

PostgreSQL

Azure Flexible · B2s

Datos y auditoría.

Archivos

Blob privado

Documentos y comprobantes con enlace firmado.

Correo: Resend, detrás de un adaptador.

Integraciones: AnyChat, Certopus y BreezeDoc, cada uno con su adaptador.

Despliegue: GitHub Actions + Bicep; secretos en Key Vault.

El stack, capa por capa

Sitio públicoAstroEs casi todo contenido y necesita SEO. Rápido, barato y aislado: si cae el sitio, la plataforma sigue.ADR-0008
PlataformaTanStack Start + React, TypeScriptPantallas de listados, filtros y formularios detrás de un login. Una sola app con funciones de servidor, sin una API aparte.ADR-0001
Base de datosPostgreSQL + DrizzleMatrículas, notas y cartera son datos relacionales con transacciones. Auditoría por triggers que la app no puede borrar.ADR-0002
ArquitecturaMonolito modularUn equipo pequeño: módulos con límites claros dentro de una app, sin el costo de operar microservicios.ADR-0003
InfraestructuraAzure: Container Apps, Postgres Flexible, BlobUsa el crédito de Microsoft de INEC sin amarrar el código: imágenes Docker estándar, movibles a otro proveedor.ADR-0004
AccesoBetter Auth + Google WorkspacePersonal con su cuenta institucional y doble factor; estudiantes con código al correo. Roles y sede en nuestra base, revocables al instante.ADR-0005
Trabajos en segundo planopg-boss sobre PostgresMora diaria, PDF y correos sin pagar ni operar Redis, que Azure está retirando.ADR-0006
IntegracionesLo crítico en código; Make solo para marketingPago → matrícula y nota → certificado con pruebas y auditoría. Cada proveedor detrás de un adaptador.ADR-0007

Decisiones que cambian lo que pedía el documento

Lo que proponía el documento de requisitos, lo que proponemos y lo que cuesta.

Sin NestJS ni API separadaUna sola app TanStack Start con funciones de servidor. El sitio va aparte en Astro.
El documento proponía
Next.js para el frontend y NestJS para la API.
Lo que cuesta
Menos desarrolladores lo conocen; se compensa con módulos claros, pruebas y estos registros de decisión.
Registro de decisión ADR-0001, estado propuesto.
Monolito modular, no microserviciosUn paquete por dominio (admisiones, académico, cartera, certificados) dentro de una app y un worker.
El documento proponía
«Cada módulo es un servicio independiente».
Lo que cuesta
Los límites entre módulos dependen de reglas del linter, no de la red.
Registro de decisión ADR-0003, estado propuesto.
Azure solo como destinoContenedores estándar, Postgres administrado y almacenamiento detrás de un adaptador.
El documento proponía
Servicios propios de Azure en toda la arquitectura.
Lo que cuesta
La renovación anual del crédito no está garantizada; la salida es bajar de plan o mudar los contenedores.
Registro de decisión ADR-0004, estado propuesto.
Better Auth en vez de Entra External IDLogin con Google Workspace para el personal y código al correo para estudiantes; permisos en nuestra base.
El documento proponía
Entra External ID con Google Authenticator.
Lo que cuesta
La seguridad de sesiones queda de nuestro lado: dependencia al día y pruebas de permisos.
Registro de decisión ADR-0005, estado propuesto.
Sin Redis ni AI SearchColas en el mismo Postgres con pg-boss y búsqueda con sus índices.
El documento proponía
Redis para caché y colas; AI Search para el histórico.
Lo que cuesta
Los trabajos cargan la base; irrelevante con este volumen y vigilado con un umbral.
Registro de decisión ADR-0006, estado propuesto.
Lo crítico no pasa por MakeEsas transiciones viven en el código con pruebas; Make queda para marketing. Pagos V1 con comprobante y conciliación.
El documento proponía
Make orquesta pago → matrícula y nota → certificado.
Lo que cuesta
Tesorería concilia a mano al principio.
Registro de decisión ADR-0007, estado propuesto.

Costo estimado en Azure

USD 94–149

al mes, dentro del crédito anual de USD 2.000 de Microsoft.

Contenedores en consumo, Postgres B2s en East US 2, almacenamiento y sitio estático. Cifra de ADR-0004, por confirmar con la suscripción real.

Qué es prototipo y qué será producción

  • Datos en memoria con respaldo en archivoPostgreSQL con auditoría por triggers
  • Selector de rolLogin con Google Workspace o código al correo, y permisos por persona, rol y sede
  • Bandeja que se refresca cada 3 sIgual, o eventos en vivo si el volumen lo pide
  • Comprobante: solo el nombre del archivoArchivo en almacenamiento privado con enlace firmado
  • Contrato y certificados simuladosPDF generado en el worker y firma con el proveedor que se elija