06 arquitectura de la solucion - lfnavarroj1/sport-app-platform GitHub Wiki
Esta sección presenta la arquitectura general de SportApp para interesados técnicos y no técnicos. Resume la documentación detallada de arquitectura/ sin trasladar a la Wiki las instrucciones operativas destinadas al desarrollo con agentes.
Las vistas describen principalmente la arquitectura objetivo. Un elemento dibujado no se considera implementado hasta que exista código, prueba, despliegue o evidencia operativa enlazada.
| Vista | Pregunta que responde | Contenido |
|---|---|---|
| Contexto y alcance | ¿Quién usa SportApp y con qué sistemas se relaciona? | Actores, problema, capacidades, límites y diagrama de contexto. |
| Vista funcional | ¿Cómo se distribuyen las responsabilidades? | Clientes, BFF, dominios, mensajería, persistencia y flujos principales. |
| Vista de despliegue | ¿Dónde se ejecutan los componentes? | Entorno local, topología objetivo en GCP, comunicaciones y capacidad. |
| Vista de datos e información | ¿Quién es dueño de cada dato, cómo se relaciona y cómo se protege? | Entidades, propiedad por dominio, referencias lógicas, PostgreSQL, CQRS, eventos, seguridad y ciclo de vida. |
| Stack tecnológico | ¿Con qué tecnologías se construye y opera? | Web, móvil, backend, datos, nube, CI/CD, pruebas y estados de adopción. |
| Integración continua y releases | ¿Qué ocurre con un push y cómo se libera SportApp completo? | GitFlow con main, develop, feature/*, release/* y hotfix/*; pipelines por repositorio, release coordinada y comprobación de versiones. |
| Infraestructura Terraform | ¿Dónde vive la infraestructura, cómo se clona y cómo se controla su costo? | Propiedad, raíces por ambiente, topologías, encendido, suspensión y destrucción segura. |
| Costos estimados de producción en GCP | ¿Cuánto cuesta operar la arquitectura objetivo? | Escenarios, supuestos, desglose por servicio, sensibilidad de capacidad y presupuesto recomendado. |
| Planes y capacidades | ¿Qué incluye cada plan y cómo se habilitan sus funciones? | Gratuito, Intermedio y Premium; herencia, capacidades, precarga y autorización. |
| Inicio y navegación por tipo de usuario | ¿A qué pantalla entra cada actor y qué opciones puede ver? | Deportista, organizador y profesional; rutas iniciales, menús, canales y guardas. |
flowchart LR
ACT["Deportistas, organizadores,<br/>proveedores y administradores"]
WEB["Aplicación web<br/>Angular"]
MOB["Aplicación móvil<br/>Kotlin Android"]
BFW[BFF web]
BFM[BFF móvil]
EDGE[API Gateway e Ingress]
subgraph CORE[Microservicios por dominio]
U[Usuarios]
A[Afiliación]
S[Servicios]
T[Entrenamientos]
E[Eventos]
X[Terceros]
end
PS[Pub/Sub]
DB[("PostgreSQL<br/>por dominio")]
EXT[Strava y dispositivos]
ACT --> WEB
ACT --> MOB
WEB --> BFW --> EDGE
MOB --> BFM --> EDGE
EDGE --> CORE
CORE --> DB
CORE <--> PS
X <--> EXT
MOB <--> EXT
- Los microservicios se separan por dominio de negocio, no por pantalla.
- Web y móvil consumen un BFF propio y no acceden directamente a servicios internos ni bases de datos.
- Cada dominio es dueño de sus datos y no escribe en almacenes ajenos.
- Las operaciones síncronas usan API versionadas; la colaboración asíncrona usa eventos versionados en Pub/Sub.
- CQRS se aplica selectivamente a usuarios, entrenamientos y eventos.
- Los cambios de escritura y sus eventos se confirman mediante outbox transaccional.
- Strava y futuros terceros se aíslan detrás de adaptadores.
- Backend, web, móvil y plataforma conservan versiones independientes; la plataforma fija una composición reproducible por sprint.
Backend, frontend web, móvil y plataforma aplican el mismo GitFlow, pero cada repositorio conserva sus propias ramas, commits, pull requests, CI y versión. Una rama de plataforma nunca contiene ni publica el código interno de otro componente.
flowchart TB
subgraph NORMAL[Flujo normal]
direction LR
D["1. develop actualizado"] --> F["2. feature/HUxxx-descripcion"]
F --> CI["3. push y CI"]
CI --> PD["4. PR hacia develop"]
PD --> RL["5. release/vX.Y.Z"]
RL --> PM["6. PR hacia main"]
PM --> TAG["7. tag vX.Y.Z"]
RL -. correcciones .-> D
end
subgraph URGENTE[Flujo de hotfix]
direction LR
INC["Incidente en main o tag"] --> HF["1. hotfix/vX.Y.Z-descripcion"]
HF --> HPR["2. PR hacia main"]
HPR --> HT["3. nuevo tag PATCH"]
HT --> RET["4. retorno a develop y release activa"]
end
main contiene versiones liberadas; develop integra el siguiente sprint; feature/* implementa una HU; release/* estabiliza una versión sin agregar funcionalidades; y hotfix/* corrige urgentemente una versión publicada. Todas las integraciones a develop o main se realizan mediante pull request, CI y revisión. El flujo detallado, las responsabilidades y el manejo de una HU en varios repositorios están en Integración continua y releases.
| Área | Estado al 09/10/2026 |
|---|---|
| Backend | Nueve paquetes Python administrados con uv; seis servicios de dominio, dos BFF y paquete compartido; HU001 verificada localmente. |
| Persistencia local | PostgreSQL y migraciones Alembic verificadas para el alcance implementado. |
| Contenedores y Kubernetes local | Imagen OCI, manifiestos base y overlay local presentes; renderizado validado. |
| Web | Repositorio Angular disponible; integración vertical y E2E de HU001 pendientes. |
| Móvil | Repositorio creado; andamiaje funcional pendiente. |
| Plataforma | Repositorio integrador, submódulos, Wiki y proyecto SportApp Platform creados. |
| Terraform y GCP | Terraform centralizado en plataforma y arquitectura local/GCP aprobada; módulos, despliegue, WIF y evidencia remota pendientes. |
flowchart TB
P["sport-app-platform<br/>versión del sprint"]
R["Manifiesto de composición<br/>tags, commits y artefactos"]
B["sport-app-backend<br/>SemVer independiente"]
W["sport-app-frontend<br/>SemVer independiente"]
M["sport-app-movil<br/>SemVer y versionCode"]
P --> R
P -. submódulo .-> B
P -. submódulo .-> W
P -. submódulo .-> M
R --> B
R --> W
R --> M
Nota — SemVer: significa Semantic Versioning o versionado semántico. Una versión se expresa como
MAYOR.MENOR.PARCHE; por ejemplo,v2.3.1.MAYORaumenta cuando existen cambios incompatibles,MENORcuando se agregan funcionalidades compatibles yPARCHEcuando se publican correcciones compatibles. En SportApp cada repositorio conserva su propia versión, por lo que backend, frontend y móvil no tienen que compartir el mismo número. En Android,versionCodees adicionalmente un entero interno que siempre debe aumentar con cada publicación.
La síntesis de decisiones, fuentes y alcance se mantiene en Decisiones, fuentes y alcance.