Saltar a contenido

Arquitectura técnica

Documento complementario a arquitectura-general.md. Define el stack tecnológico, el diagrama de componentes UML y el diagrama de despliegue del sistema, con versiones exactas verificadas en documentación oficial.

1. Stack tecnológico del proyecto

1.1 Backend

Componente Tecnología Versión Fuente oficial
Lenguaje Python 3.11 LTS (soporte 3.10–3.13 en Django 5.2) docs.djangoproject.com/en/5.2
Framework web Django 5.2.x (LTS) github.com/django/django
Framework API Django Ninja 1.4.x django-ninja.readthedocs.io
ORM Django ORM (nativo) 5.2 Incluido en Django
Migraciones Django Migrations 5.2 Nativas
Validación / Schemas Pydantic v2 (vía Django Ninja) docs.pydantic.dev
Tareas asíncronas Celery 5.4.x docs.celeryq.dev
Broker de mensajes Redis 7.x redis.io/docs
Servidor ASGI Uvicorn 0.30.x uvicorn.dev
WSGI alternativo Gunicorn 22.x gunicorn.org
Auth backend django-allauth 0.63.x docs.allauth.org
Permisos django-rules 4.x github.com/dfunckt/django-rules
Filtros django-filter 24.x django-filter.readthedocs.io
Cache backend django-redis 5.4.x github.com/jazzband/django-redis
Auditoría django-auditlog 3.x github.com/jazzband/django-auditlog
Rate limit django-axes 6.x github.com/jazzband/django-axes
Variables de entorno django-environ 4.x django-environ.readthedocs.io
Almacenamiento django-storages 1.14.x django-storages.readthedocs.io
Pruebas pytest + pytest-django 8.x / 4.x docs.pytest.org
Canales (futuro WebSocket) Django Channels 4.x channels.readthedocs.io

1.2 Frontend

Componente Tecnología Versión Fuente oficial
Framework Vue.js 3.5.x (Composition API + <script setup>) vuejs.org
Build tool Vite 7.x (última estable de la línea 7) v7.vite.dev
Plugin Vue @vitejs/plugin-vue 5.x github.com/vitejs/vite-plugin-vue
Lenguaje TypeScript 5.6.x typescriptlang.org
Router Vue Router 4.4.x router.vuejs.org
Estado global Pinia 2.2.x pinia.vuejs.org
UI Components shadcn-vue última shadcn-vue.com
Estilos Tailwind CSS 3.4.x tailwindcss.com
Utilidades Vue @vueuse/core 11.x vueuse.org
Iconos @iconify/vue + @iconify-json/radix-icons última iconify.design
Composables i18n vue-i18n 9.x vue-i18n.intlify.dev
Cliente HTTP ofetch 1.x github.com/unjs/ofetch
Formularios VeeValidate 4.x vee-validate.logaretm.com
Esquemas validación Zod / Valibot 3.x zod.dev
Gráficos Vue ECharts 7.x github.com/ecomfe/vue-echarts
Notificaciones toast vue-sonner 1.x github.com/xiaoluoboding/vue-sonner
Testing unitario Vitest 2.x vitest.dev
Testing E2E Playwright 1.48.x playwright.dev
Linter ESLint + @antfu/eslint-config 9.x eslint.org
Formateador Prettier 3.3.x prettier.io

1.3 Datos e infraestructura

Componente Tecnología Versión
Base de datos PostgreSQL 16.x
Cache / broker Redis 7.x
Object Storage MinIO RELEASE.2024-10 (S3 compatible)
Búsqueda OpenSearch 2.x
Mensajería RabbitMQ (opcional) 3.13.x
Contenedores Docker + Docker Compose 24+ / 2.27+
Orquestación Kubernetes (opcional) 1.30+
Reverse proxy Nginx 1.26.x
TLS Let's Encrypt / Cert institucional
Logs Loki + Promtail (o ELK) última
Métricas Prometheus + Grafana última
CI/CD GitHub Actions

1.4 Documentación

Componente Tecnología Versión
Generador MkDocs 1.6.x
Tema mkdocs-material 9.5.x
Extensiones pymdown-extensions 10.x

2. Diagrama de componentes UML

flowchart TB
    subgraph Presentacion [Frontend - Vue 3.5 + Vite 7]
        UI[App SPA Vue Router]
        PWA[Service Worker / PWA]
        PiniaStore[Pinia Store]
        Componentes[shadcn-vue + Tailwind]
    end

    subgraph CapaAplicacion [Backend - Django 5.2 + Django Ninja]
        APIGateway[NinjaAPI - OpenAPI auto]
        Auth[Autenticación: django-allauth + RegID]
        Permisos[django-rules RBAC]
        Negocio[Servicios de Dominio]
        Tareas[Celery 5.4 + Redis 7]
        Auditoria[django-auditlog]
        Docs[Gestor Documental S3]
    end

    subgraph Dominio [Aplicaciones Django]
        ModProgramas[programas]
        ModMatricula[matricula]
        ModExpediente[expediente]
        ModAcademico[academico]
        ModEvaluacion[evaluacion_final]
        ModCertifica[certificacion]
    end

    subgraph Datos [Persistencia]
        DB[(PostgreSQL 16)]
        Cache[(Redis 7)]
        RepoDocs[(MinIO S3)]
    end

    subgraph Integraciones [Adaptadores]
        RegIDComp[Adaptador RegID - OAuth/OIDC]
        MoodleComp[Adaptador Moodle - REST]
        SGDComp[Adaptador SGD]
        ContableComp[Adaptador Contable]
        MESComp[Adaptador MES/COPEP]
    end

    UI --> APIGateway
    PWA --> UI
    PiniaStore --> UI
    Componentes --> UI

    APIGateway --> Auth
    APIGateway --> Permisos
    APIGateway --> Negocio
    APIGateway --> Auditoria
    Negocio --> Tareas
    Negocio --> Docs

    Negocio --> ModProgramas
    Negocio --> ModMatricula
    Negocio --> ModExpediente
    Negocio --> ModAcademico
    Negocio --> ModEvaluacion
    Negocio --> ModCertifica

    ModMatricula --> Docs
    Docs --> RepoDocs
    ModExpediente --> DB
    ModProgramas --> DB
    ModAcademico --> DB
    ModEvaluacion --> DB
    ModCertifica --> DB
    Tareas --> Cache
    Tareas --> DB
    Auditoria --> DB

    Auth --> RegIDComp
    ModAcademico --> MoodleComp
    Docs --> SGDComp
    ModMatricula --> ContableComp
    ModCertifica --> MESComp

3. Diagrama de despliegue

flowchart TB
    subgraph Cliente
        Navegador[Navegador Web - Vue 3.5 build Vite 7]
        Movil[Dispositivo Móvil / PWA]
    end

    subgraph DMZ
        Nginx[Nginx Reverse Proxy + TLS]
        WAF[ModSecurity WAF]
    end

    subgraph ClusterAplicacion [Docker Swarm / K8s]
        Django1[Django 5.2 + Gunicorn 1]
        Django2[Django 5.2 + Gunicorn 2]
        Django3[Django 5.2 + Gunicorn 3]
        Worker1[Celery Worker 1]
        Worker2[Celery Worker 2]
        Beat[Celery Beat - cron]
    end

    subgraph ClusterDatos
        PGPrimario[(PostgreSQL 16 Primario)]
        PGReplica[(PostgreSQL 16 Réplica)]
        RedisInst[(Redis 7 Cluster)]
        MinIO[MinIO S3]
    end

    subgraph Observabilidad
        Prom[Prometheus]
        Graf[Grafana]
        Loki[Loki + Promtail]
    end

    subgraph Externos
        RegIDExt[RegID - OIDC]
        MoodleExt[Moodle]
        SGDExt[Gestión Documental]
        MESExt[MES / COPEP]
    end

    Navegador --> Nginx
    Movil --> Nginx
    Nginx --> WAF
    WAF --> Django1
    WAF --> Django2
    WAF --> Django3

    Django1 --> PGPrimario
    Django2 --> PGPrimario
    Django3 --> PGPrimario
    PGPrimario -. replicación streaming .-> PGReplica

    Django1 --> RedisInst
    Django2 --> RedisInst
    Django3 --> RedisInst

    Beat --> Worker1
    Beat --> Worker2
    Django1 --> Worker1
    Django2 --> Worker2
    Worker1 --> PGPrimario
    Worker2 --> RedisInst

    Django1 --> MinIO
    Worker1 --> MinIO

    Django1 -. HTTPS/OIDC .-> RegIDExt
    Django1 -. HTTPS/REST .-> MoodleExt
    Django1 -. HTTPS/SOAP .-> SGDExt
    Django1 -. HTTPS/XML .-> MESExt

    Prom --> Django1
    Prom --> Django2
    Prom --> Django3
    Loki --> Django1

4. Estructura de carpetas propuesta

posgrado-backend/
├── manage.py
├── pyproject.toml
├── requirements/
│   ├── base.txt
│   ├── dev.txt
│   └── prod.txt
├── .env.example
├── conftest.py
├── posgrado/                # Proyecto Django
│   ├── settings/
│   │   ├── base.py
│   │   ├── dev.py
│   │   └── prod.py
│   ├── urls.py
│   ├── asgi.py
│   └── wsgi.py
├── apps/
│   ├── accounts/            # Auth, usuarios, roles
│   ├── programas/           # M-04 Programas
│   ├── ediciones/           # M-05 Ediciones
│   ├── convocatorias/       # M-06 Convocatorias
│   ├── matricula/           # M-07 Solicitudes + M-10 Matrícula
│   ├── documentos/          # M-08 Gestión documental
│   ├── expediente/          # M-09 Expediente
│   ├── academico/           # M-11 Ejecución + M-12 Seguimiento
│   ├── evaluacion_final/    # M-13 Evaluación final
│   ├── certificacion/       # M-14 Certificación y titulación
│   ├── reportes/            # M-15 Reportes
│   └── integraciones/       # M-16 Adaptadores externos
├── api/                     # Routers Django Ninja
│   ├── router.py
│   └── schemas/
├── core/                    # Utilidades compartidas
│   ├── permissions.py       # django-rules
│   ├── audit.py
│   └── exceptions.py
└── tests/

posgrado-frontend/
├── package.json
├── vite.config.ts
├── tsconfig.json
├── index.html
├── .env.example
├── src/
│   ├── main.ts
│   ├── App.vue
│   ├── router/              # Vue Router 4
│   ├── stores/              # Pinia 2
│   │   ├── auth.ts
│   │   ├── matricula.ts
│   │   └── programa.ts
│   ├── api/                 # Cliente HTTP + tipos
│   │   ├── client.ts
│   │   └── modules/
│   ├── components/          # shadcn-vue generados
│   │   └── ui/              # button, input, dialog, ...
│   ├── composables/         # @vueuse/core
│   ├── views/               # Páginas
│   ├── layouts/
│   ├── locales/             # vue-i18n
│   └── assets/
├── public/
└── tests/
    ├── unit/                # Vitest
    └── e2e/                 # Playwright

5. Decisiones de arquitectura (ADR resumen)

Decisión Alternativas Elección Motivo
Framework backend FastAPI / NestJS / Django Django 5.2 LTS + Django Ninja ORM maduro, admin, seguridad, ecosystem institucional, soporte LTS hasta abril 2028.
Framework API DRF / Ninja Django Ninja 1.4 Type hints, OpenAPI automático, rendimiento, menos boilerplate.
Frontend React / Vue Vue 3.5 + Vite 7 Curva de aprendizaje, ecosistema shadcn-vue/Tailwind, bundle ligero, PWA sencilla.
Build tool Webpack / Vite Vite 7 HMR instantáneo, builds con Rolldown, ESM nativo.
Estado global Vuex / Pinia Pinia 2.2 API moderna, TypeScript-first, recomendado oficialmente.
UI Components Vuetify / PrimeVue / shadcn-vue shadcn-vue + Tailwind Copia el código a tu repo, accesibilidad, customizable, basado en Reka UI.
Base de datos MySQL / PostgreSQL PostgreSQL 16 JSON nativo, replicación, extensiones, soporte GIS futuro.
Cache / broker Redis 6 / Redis 7 Redis 7 Streams, mejor rendimiento, soporte actual.
Tareas async RQ / Celery Celery 5.4 Madurez, dashboards Flower, integración Django.
Auth JWT propio / django-allauth django-allauth + RegID OIDC SSO institucional, MFA, recovery flows.
Permisos Django perms / django-rules django-rules Permisos por objeto sin tablas extra, alto rendimiento.
Despliegue On-premise / Nube On-premise institucional Soberanía del dato, normativa cubana.
Documentos DMS / MinIO MinIO S3 en MVP → DMS vía adaptador Compatibilidad S3, fácil migración futura.

6. Atributos de calidad priorizados

Atributo Prioridad Estrategia técnica
Seguridad Muy alta HTTPS, HSTS, CSP, RBAC con django-rules, cifrado en reposo (LUKS/KMS), django-axes para fuerza bruta, auditoría inmutable.
Trazabilidad Muy alta django-auditlog + tabla append-only + hash chain + exportación firmada.
Disponibilidad Alta PostgreSQL con réplica + failover, 3 instancias Django detrás de Nginx, Redis Sentinel, backups 3-2-1.
Escalabilidad Media Stateless (sesiones en Redis), Celery workers horizontales, CDN para assets Vite, code splitting por ruta.
Usabilidad Alta shadcn-vue accesible (ARIA), diseño responsivo, validación inline, i18n con vue-i18n.
Mantenibilidad Alta Capas separadas (apps Django por módulo), pruebas >80% cobertura, CI/CD con GitHub Actions, linters ESLint+Prettier+Black+Ruff.
Interoperabilidad Alta OpenAPI 3.1 autogenerado (Django Ninja), adaptadores con circuit breaker, formatos PDF/XLSX/XML oficiales.
Performance Alta select_related/prefetch_related, índices en PostgreSQL, paginación cursor, cache por consulta, bundle Vite con code splitting.
Observabilidad Alta Prometheus + Grafana + Loki + Sentry (errores) + OpenTelemetry tracing.

7. Entornos y configuración

Entorno Backend Frontend DB Redis
Local dev Django runserver Vite dev server (HMR) PostgreSQL 16 (Docker) Redis 7 (Docker)
CI pytest + ruff + mypy vitest + eslint + tsc SQLite in-memory fakeredis
Staging Gunicorn + Nginx build Vite servido por Nginx PostgreSQL 16 Redis 7
Producción Gunicorn + Nginx + K8s build Vite + CDN PostgreSQL 16 cluster Redis 7 cluster

8. Variables de entorno clave

# Backend
DJANGO_SETTINGS_MODULE=posgrado.settings.prod
DJANGO_SECRET_KEY=<generar>
DJANGO_ALLOWED_HOSTS=posgrado.uc.edu.cu
DATABASE_URL=postgres://user:pass@db:5432/posgrado
REDIS_URL=redis://redis:6379/0
CELERY_BROKER_URL=redis://redis:6379/1
CELERY_RESULT_BACKEND=redis://redis:6379/2
OIDC_RP_CLIENT_ID=<regid>
OIDC_RP_CLIENT_SECRET=<regid>
S3_ENDPOINT_URL=https://minio.uc.cu
S3_ACCESS_KEY=<minio>
S3_SECRET_KEY=<minio>
SENTRY_DSN=<sentry>

# Frontend
VITE_API_BASE_URL=https://api.posgrado.uc.cu
VITE_OIDC_ISSUER=https://regid.uc.cu
VITE_OIDC_CLIENT_ID=posgrado-frontend

9. Ciclo de vida de actualización

  • Django 5.2 LTS: soporte oficial hasta abril 2028 (3 años LTS + 1 año extendido).
  • Vue 3.5: línea estable; se actualizará a Vue 3.6 cuando sea GA.
  • Vite 7: rama estable; se evaluará migración a Vite 8 al estabilizarse.
  • Node.js 20 LTS para el toolchain de frontend.
  • Python 3.11 LTS para backend (compatible con 3.12 y 3.13).