Saltar a contenido

Componentes y datos#

Contenedores, red y volúmenes#

Contenedores, red interna y volúmenesEn la máquina virtual corren cinco contenedores. web publica los puertos 80 y 443 y reenvía la API al puerto 8000 del contenedor api. api, postgres, worker y clamav están en una red interna de Docker que no se publica: api y worker usan PostgreSQL en el puerto 5432 y el worker usa ClamAV en el puerto 3310. Volúmenes: tls para web, db para postgres, clamav para el antivirus y datos, compartido por api y worker.MÁQUINA VIRTUAL · DOCKER ENGINERED INTERNA DE DOCKER · NO SE PUBLICAwebtrazo-webNginx sin root128 MB · 80 y 443apitrazo-appFastAPI · sin root768 MB · 8000postgrespostgres:16-alpinedatos y cola512 MB · 5432workertrazo-appcola · sin root1,5 GB · sin puertosclamavclamav/clamav:1.4antivirus1,5 GB · 3310HTTPS 443 · 80 redirige8000543254323310tlscertificado y clavedbbase de datosclamavfirmas del antivirusdatosinsumos originales, exportaciones (7 días), plantilla y licenciaVOLÚMENES EN ELDISCO DE LA VM
Contenedores, red y volúmenes. Solo web publica puertos; el resto conversa en una red interna de Docker. Las imágenes propias corren sin privilegios de root y cada contenedor tiene un límite de memoria.
Contenedor Imagen Función Memoria máxima
web trazo-web (Nginx sin root + React compilado) Termina TLS 1.2+, sirve la interfaz, reenvía /api 128 MB
api trazo-app (Python 3.12, FastAPI) API REST, autenticación, SCIM, licencia; aplica las migraciones al arrancar 768 MB
worker trazo-app Cola de trabajos en PostgreSQL: antivirus, extracción, transcripción, enmascaramiento, generación, exportación, correo, conservación 1,5 GB
postgres postgres:16-alpine Base de datos y cola (SELECT … FOR UPDATE SKIP LOCKED), sin Redis 512 MB
clamav clamav/clamav:1.4 Antivirus; las firmas vienen en la imagen del paquete y la plataforma no las descarga de internet 1,5 GB

Las imágenes trazo-app y trazo-web corren sin root y con no-new-privileges; api y worker tienen /tmp en memoria.

Volúmenes (todo en la VM, RO-14)#

Volumen Contenido
db PostgreSQL: procesos, insumos, textos, artefactos y versiones, comentarios, auditoría, cuotas, trabajos, licencia
datos insumos/ (archivos originales), exportaciones/ (7 días), plantillas/ (DOCX institucional), licencia/
tls Certificado y clave del servidor web
clamav Firmas del antivirus

Modelo de datos#

Modelo de datos principalUn área tiene procesos. Un proceso tiene insumos, cada uno con su texto; artefactos, cada uno con versiones inmutables e historial de estados; comentarios, anotaciones y registros de esfuerzo; y generaciones con IA, cada una con sus invocaciones y las versiones que creó. Los usuarios son autores de versiones, comentarios y cambios, y la auditoría registra accesos, modificaciones y eliminaciones.areasnombre, descripciónprocesoscódigo, nombre, dueño,estado, confidencialidadinsumostipo, archivo, personas,antivirus, conservacióntextos_insumosegmentos con tiempoo página, reemplazos,evidencia de borradoartefactosbpmn, documento, raci,sipoc, registrosversionesinmutables: autor,origen, contenido, XML,diferenciashistorial_estadosde → a, quién, cuándo,comentariogeneracionesproceso, modelo,estado, cuotainvocaciones_iausuario, servicio,tokens, costousuariosrol, origen: SSO o SCIM;grupos, cuotas, sesionescomentariosanotacionesesfuerzosauditoriaaccesos, cambios, eliminaciones1N1N111N1N1N1N1N1NN1También: trabajos, licencias, politicas_conservacion, exportaciones, respaldos, notificaciones y configuracion (25 tablas, migraciones con Alembic).
Modelo de datos. Cada artefacto guarda versiones inmutables y su historial de estados; cada generación deja sus invocaciones con tokens y costo. Notación: 1 a N.
  • Áreas y procesos (código, nombre, dueño, estado de revisión, confidencialidad).
  • Insumos y su texto (transcripción con marcas de tiempo o texto por página, servicio usado, evidencia de borrado del objeto temporal, tabla de reemplazos del enmascaramiento), con personas asociadas para la conservación (RD-16).
  • Artefactos (bpmn, documento, raci, sipoc, registros) con versiones inmutables (autor, origen ia/manual/importacion/restauracion, resumen, diferencias) y historial de estados (RD-15).
  • Comentarios anclados a elementos (RD-04), anotaciones de riesgos, controles, activos y datos personales (RD-05, RD-06), esfuerzo (horas y reuniones, RD-08).
  • Generaciones e invocaciones de IA (usuario, fecha, modelo, tokens, costo) y cuotas por usuario y mes (RO-09).
  • Auditoría (RO-08), usuarios, grupos y sesiones; licencia; políticas de conservación; exportaciones; respaldos; notificaciones; configuración.

Cola de trabajos#

Estados de un trabajo en la cola de PostgreSQLLa api y las tareas periódicas encolan trabajos en estado pendiente. Un worker lo toma con SELECT FOR UPDATE SKIP LOCKED y pasa a en_curso. Si termina bien queda hecho; si falla y le quedan intentos vuelve a pendiente con una espera creciente de 30 segundos, 2 minutos y 8 minutos; si se agotan los intentos queda fallido. Un trabajo pendiente puede cancelarse. Con la cola vacía, el worker programa las tareas periódicas.api y periódicosencolan un trabajoINSERT INTO trabajospendienteespera su turnoen_cursobloqueado porun workerhechoresultado guardadofallidointentos agotadoscanceladoantes de empezarencolaun worker lo tomaSELECT … FOR UPDATESKIP LOCKEDéxitoerror, sin intentoserror con intentos disponibles o bloqueo vencido:vuelve a esperar 30 s, 2 min, 8 min…se cancelaCon la cola vacíaprograma notificaciones (5 min) y conservación, alertas y limpieza (diario)
Cola de trabajos. Vive en PostgreSQL, sin Redis: varios workers pueden competir sin pisarse y un bloqueo de un worker caído se libera solo.

El worker toma trabajos de la tabla trabajos con bloqueo por fila, reintenta con espera creciente y deja el resultado o el error. Cuando la cola está vacía programa las tareas periódicas (notificaciones cada 5 minutos; conservación, alerta de almacenamiento y limpieza de exportaciones una vez al día), sin cron ni servicios extra.