Saltar al contenido principal

Arquitectura

Stack tecnológico

CapaTecnologíaRol
FrontendRefine + shadcn/ui + React FlowUI de gestión y administración
BackendNestJS + TypeScriptAPI REST, lógica de negocio
Base relacionalPostgreSQLDatos estructurados (cuentas, config, permisos)
Base documentalMongoDBDatos dinámicos (expedientes, documentos, tareas)
StorageMinIOArchivos binarios (content-addressed por SHA-256)
Auth / IDPKeycloakAutenticación multi-tenant, LDAP/AD/SAML
Motor de flujosWorkflowEngineServiceEjecución nativa de workflows
ColasBullMQ + RedisJobs asíncronos, reintentos, DLQ
BúsquedaTypesenseFull-text search typo-tolerant
ObservabilidadOTel + SigNoz + GrafanaTrazas, métricas, logs

Diagrama de arquitectura

Principios de diseño

Separación de responsabilidades por base de datos

PostgreSQL → datos tabulares con JOINs (cuentas, usuarios, config, permisos, auditoría)
MongoDB → datos con schema variable (expedientes, documentos, tareas)
MinIO → archivos binarios, identificados por SHA-256
Redis → sesiones, parámetros en caché, colas BullMQ
Typesense → índice de búsqueda full-text (replica datos de PG + Mongo)

Multitenancy

Cada tenant tiene su propio realm en Keycloak. El tenantId viaja en el JWT y se aplica en absolutamente todos los queries a PostgreSQL y MongoDB. No hay excepciones.

Content-addressed storage

Los documentos se identifican por el SHA-256 de su contenido. Si el mismo archivo se sube dos veces, Kuatia lo detecta y no duplica el almacenamiento — solo crea una nueva referencia.