Diagramas de arquitectura
VoBo
Arquitectura
VoBo es una app móvil de palabras desarrollada como proyecto educativo y de portfolio. El objetivo es adivinar palabras o expresiones a partir de su definición, aplicando una regla de patrón de letra: la respuesta empieza por, contiene o termina en una letra concreta. El mazo tiene 27 cartas, una por letra del abecedario español. Se puede jugar en solitario o en salas multijugador de hasta 5 personas en tiempo real.
Desde el punto de vista técnico, es un proyecto full-stack construido de principio a fin: análisis, diseño, backend y frontend mobile. El backend está desarrollado en Golang con Gin, aprovechando la concurrencia nativa del lenguaje para gestionar múltiples conexiones WebSocket simultáneas en las partidas multijugador. Los datos se persisten en PostgreSQL y Redis actúa como caché para códigos OTP, rate limiting y estado de salas en tiempo real.
La app está construida con Ionic y Vue 3 sobre Capacitor, lo que permite compilar para iOS y Android desde un único código fuente. La autenticación es passwordless: el usuario recibe un código OTP por email y obtiene un JWT que le identifica en todos sus dispositivos.
Componentes del sistema y sus relaciones: app móvil iOS/Android, gateway Nginx, capas de Handlers, Services y Repositories en Golang, y capa de datos con PostgreSQL y Redis.
Autenticación passwordless: el usuario recibe un OTP por email, lo verifica contra Redis y obtiene un JWT de 24 horas válido en todos sus dispositivos.
Ciclo de una partida: creación con deck de 27 cartas cacheado en Redis, loop de validación de respuestas con normalización automática, y finalización con actualización de estadísticas.
Flujo completo de una sala multijugador vía WebSocket. Redis PubSub sincroniza el estado entre todas las conexiones activas simultáneamente.
Infraestructura de producción en VPS: Nginx actúa como proxy inverso SSL terminando en :443, reenvía tráfico REST y WebSocket al binario Go en localhost:8080 (gestionado por systemd), que accede a PostgreSQL y Redis exclusivamente por loopback. El SMTP externo envía los OTP por email.
SSL Let's Encrypt · :443 / :80
Proxy inverso"]:::proxy end subgraph PRIVATE["Zona privada · localhost"] Go["vobo-api · :8080
systemd vobo.service
Gin · Go 1.24"]:::app PG[("PostgreSQL 15
:5432")]:::db Redis[("Redis 7
:6379")]:::db end end SMTP["SMTP · mail.vobo.es · :465"]:::mail iOS -->|"HTTPS"| Nginx Android -->|"HTTPS"| Nginx Nginx -->|"proxy_pass /api/"| Go Nginx -->|"proxy_pass /ws WSS"| Go Go -->|"GORM · localhost"| PG Go -->|"caché OTP · localhost"| Redis Go -->|"SSL implícito"| SMTP