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.
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.
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
| Capa | Elección | Por qué | Decisión |
|---|---|---|---|
| Sitio público | Astro | Es casi todo contenido y necesita SEO. Rápido, barato y aislado: si cae el sitio, la plataforma sigue. | ADR-0008 |
| Plataforma | TanStack Start + React, TypeScript | Pantallas 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 datos | PostgreSQL + Drizzle | Matrículas, notas y cartera son datos relacionales con transacciones. Auditoría por triggers que la app no puede borrar. | ADR-0002 |
| Arquitectura | Monolito modular | Un equipo pequeño: módulos con límites claros dentro de una app, sin el costo de operar microservicios. | ADR-0003 |
| Infraestructura | Azure: Container Apps, Postgres Flexible, Blob | Usa el crédito de Microsoft de INEC sin amarrar el código: imágenes Docker estándar, movibles a otro proveedor. | ADR-0004 |
| Acceso | Better Auth + Google Workspace | Personal 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 plano | pg-boss sobre Postgres | Mora diaria, PDF y correos sin pagar ni operar Redis, que Azure está retirando. | ADR-0006 |
| Integraciones | Lo crítico en código; Make solo para marketing | Pago → 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.
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.
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.
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.
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.
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.
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