Implementación multi-servicio del juego Y desarrollada para la asignatura de Arquitectura del Software en la Universidad de Oviedo.
![]() |
![]() |
![]() |
| Iyán Iglesias | Jimena Vázquez | Sara Naredo |
| UO302334 | UO301668 | UO300563 |
- Visión general de la arquitectura
- Estructura del proyecto
- Prerrequisitos
- Variables de entorno
- Ejecutar el proyecto
- Scripts disponibles
- Tests
- Documentación
- Resolución de problemas
El sistema se compone de cuatro servicios independientes. La comunicación entre el frontend y los servicios de usuarios y juego se realiza mediante HTTP/REST, mientras que la comunicación con el servicio de salas se realiza en tiempo real a través de WebSocket (Socket.io).
| Servicio | Tecnología | Puerto | Responsabilidad |
|---|---|---|---|
| webapp | React/Vite/TS | 80 | SPA frontend |
| users | Node.js/Express | 3000 | Registro y autenticación de usuarios |
| rooms | Node.js/Socket.io | 3001 | Gestión de salas y partidas multijugador en tiempo real |
| gamey | Rust/Axum | 4000 | Motor de juego y servicio de bots |
La documentación de arquitectura sigue la plantilla Arc42.
yovi_es2b/
├── webapp/ # Frontend React + Vite + TypeScript
├── users/ # Servicio de usuarios Node.js + Express
├── rooms/ # Servicio de salas multijugador Node.js + Socket.io
├── gamey/ # Motor de juego y bots en Rust
├── docs/ # Documentación de arquitectura Arc42
└── docker-compose.yml
Asegúrate de tener instalado lo siguiente antes de ejecutar el proyecto:
| Herramienta | Versión | Necesaria para |
|---|---|---|
| Docker | 24+ | Ejecución en contenedores |
| Docker Compose | 2.x | Ejecución en contenedores |
| Node.js | 22.x | Desarrollo local |
| npm | 10+ | Desarrollo local |
| Rust | stable | Desarrollo local de gamey |
| Cargo | stable | Desarrollo local de gamey |
Cada servicio se puede configurar mediante variables de entorno. Ajústalas en un archivo .env en la raíz o directamente en docker-compose.yml.
| Variable | Valor por defecto | Descripción |
|---|---|---|
PORT |
3000 |
Puerto en el que escucha el servicio |
USERS_DB_URL |
(ninguno) | Cadena de conexión a la base de datos |
| Variable | Valor por defecto | Descripción |
|---|---|---|
PORT |
3001 |
Puerto en el que escucha el servicio |
GAMEY_URL |
http://localhost:4000 |
URL del servicio gamey para relay de partidas |
| Variable | Valor por defecto | Descripción |
|---|---|---|
PORT |
4000 |
Puerto en el que escucha el servicio |
RUST_LOG |
info |
Nivel de log (debug, info, warn, error) |
| Variable | Valor por defecto | Descripción |
|---|---|---|
VITE_API_BASE_URL |
http://localhost:3000 |
URL base del servicio users |
VITE_API_URL_ROOMS |
http://localhost:3001 |
URL base del servicio rooms |
VITE_GAMEY_URL |
http://localhost:4000 |
URL base del servicio gamey |
Requiere Docker y Docker Compose.
# Construir e iniciar todos los servicios
docker-compose up --build
# Ejecutar en segundo plano
docker-compose up --build -d
# Detener todos los servicios
docker-compose downUna vez en marcha, los servicios están disponibles en:
| Servicio | URL |
|---|---|
| Aplicación web | http://localhost |
| API users | http://localhost:3000 |
| Salas multijugador | http://localhost:3001 |
| API gamey | http://localhost:4000 |
Ejecuta cada servicio en una terminal separada.
cd users
npm install
npm start
# Disponible en http://localhost:3000cd rooms
npm install
npm start
# Disponible en http://localhost:3001cd webapp
npm install
npm run dev
# Disponible en http://localhost:5173O arranca ambos a la vez desde el directorio webapp:
cd webapp
npm run start:allcd gamey
cargo build
cargo run
# Disponible en http://localhost:4000| Comando | Descripción |
|---|---|
npm run dev |
Inicia el servidor de desarrollo |
npm run build |
Compila para producción |
npm test |
Ejecuta los tests unitarios |
npm run test:e2e |
Ejecuta los tests end-to-end con Playwright |
npm run start:all |
Inicia webapp y el servicio users a la vez |
| Comando | Descripción |
|---|---|
npm start |
Inicia el servicio de usuarios |
npm test |
Ejecuta los tests |
| Comando | Descripción |
|---|---|
npm start |
Inicia el servicio de salas |
| Comando | Descripción |
|---|---|
cargo build |
Compila la aplicación |
cargo test |
Ejecuta los tests unitarios |
cargo run |
Ejecuta la aplicación |
cargo doc |
Genera la documentación de la API |
El proyecto utiliza distintas estrategias de testing por servicio:
- webapp — Vitest para tests unitarios, Playwright + Cucumber para tests E2E.
- users — Jest para tests unitarios e integración.
- gamey — Framework de testing nativo de Rust (
cargo test).
La cobertura de código se monitoriza mediante SonarCloud.
Para ejecutar todos los tests en local:
# webapp
cd webapp && npm test
# users
cd users && npm test
# gamey
cd gamey && cargo testLa documentación de arquitectura está escrita en AsciiDoc siguiendo la plantilla Arc42 y se encuentra en el directorio docs/.
Para generarla y visualizarla en local (requiere Asciidoctor):
asciidoctor docs/index.adoc -o docs/output/index.htmlPuerto ya en uso
# Encuentra y mata el proceso que usa el puerto (ej. 3000)
lsof -i :3000
kill -9 <PID>Errores de permisos con Docker en Linux
sudo usermod -aG docker $USER
# Cierra sesión y vuelve a entrarGamey no compila (cargo build falla)
Asegúrate de tener la toolchain de Rust actualizada:
rustup update stableLa webapp no alcanza el servicio users
Comprueba que VITE_API_BASE_URL apunta a la dirección real del servicio users. Dentro de Docker, los servicios se comunican por nombre de servicio, no por localhost.
La webapp no alcanza el servicio rooms
Comprueba que VITE_API_URL_ROOMS apunta a la dirección real del servicio rooms. Recuerda que rooms usa WebSocket, por lo que la URL debe ser accesible desde el navegador del cliente, no solo desde dentro de Docker.




