5.2 KiB
5.2 KiB
Arquitectura de NovelasVM
Este documento describe la arquitectura técnica de NovelasVM, sus componentes y el flujo de publicación de una novela visual.
Componentes principales
┌──────────────────────────────────────────────────────────────────────┐
│ Cliente │
│ (navegador web) │
└───────────────────────────────┬──────────────────────────────────────┘
│ HTTP
┌───────────────────────────────▼──────────────────────────────────────┐
│ nginx (puerto 80) │
│ ┌─────────────────┐ ┌──────────────────┐ ┌─────────────────────┐ │
│ │ Portal web │ │ Juegos web │ │ /games/umineko/ │ │
│ │ /var/www/... │ │ /var/www/games/ │ │ → redirect :8081 │ │
│ └─────────────────┘ └──────────────────┘ └─────────────────────┘ │
└───────────────────────────────┬──────────────────────────────────────┘
│
┌───────────────────────┼───────────────────────┐
│ │ │
┌───────▼───────┐ ┌──────────▼─────────┐ ┌────────▼────────┐
│ build-novela │ │ detect-engine │ │ Umineko Web │
│ .sh │ │ .sh │ │ Docker :8081 │
└───────┬───────┘ └────────────────────┘ └─────────────────┘
│
┌───────▼───────┐
│ Ren'Py SDK │
│ /opt/novelas │
│ /tools/renpy│
└───────────────┘
Flujo de publicación
- El administrador coloca el proyecto en
/opt/novelas/projects/<slug>/. - Opcionalmente añade
meta.jsoncon metadatos. - Ejecuta
/opt/novelas/bin/build-novela.sh <slug> <ruta> [motor]. detect-engine.shidentifica el motor si no se especifica.- Según el motor:
- Ren'Py:
renpy.sh launcher web_buildgenera archivos web. - Unity/Web: se copian tal cual.
- ONScripter: se copia motor OnscripterYuri + índice.
- Ren'Py:
- Se genera
game.jsoncon metadatos. - Se copia a
/var/www/novelas/games/<slug>/. - Se genera snippet nginx si requiere COOP/COEP.
- Se actualiza
/var/www/novelas/games.json. - Se recarga nginx.
Archivos clave
| Ruta | Propósito |
|---|---|
/opt/novelas/bin/build-novela.sh |
Pipeline de build y publicación |
/opt/novelas/bin/detect-engine.sh |
Detección de motor |
/opt/novelas/bin/umineko-web.sh |
Gestión del contenedor Umineko |
/opt/novelas/config/nginx-snippet.template |
Plantilla de snippet COOP/COEP |
/var/www/novelas/index.html |
Portal principal |
/var/www/novelas/assets/app.js |
Lógica del portal |
/var/www/novelas/assets/styles.css |
Estilos y temas |
/var/www/novelas/games.json |
Catálogo global |
/var/www/novelas/games/<slug>/game.json |
Metadatos por juego |
/etc/nginx/snippets/novelas-games/*.conf |
Headers específicos por juego |
Catálogo global games.json
{
"games": [
{
"slug": "demo",
"title": "The Question",
"subtitle": "Demo oficial de Ren'Py",
"engine": "renpy",
"description": "...",
"cover": "/games/demo/web-presplash.jpg",
"version": "7.0",
"author": "Ren'Py Team",
"createdAt": "2026-06-14T10:35:09Z",
"entryPoint": "/games/demo/index.html",
"coopCoep": true
}
],
"updatedAt": "2026-06-14T22:07:10Z",
"version": "1.0"
}
Seguridad de headers
COOP/COEPse aplican solo a juegos Ren'Py porque requierenSharedArrayBuffer.- Unity WebGL y juegos web genéricos no los reciben para evitar bloqueo de recursos cross-origin.
Escalabilidad
- Cada juego es independiente en
/var/www/novelas/games/<slug>/. - El portal carga el catálogo asíncronamente, por lo que el número de juegos solo afecta el tamaño de
games.json. - Para Umineko, el contenedor Docker es independiente y puede escalarse o moverse a otro host.