# NovelasVM Plataforma web aliada de Afterlife para ejecutar y probar novelas visuales directamente en el navegador. Soporta multiples motores: Ren'Py (WebAssembly), Unity WebGL, proyectos HTML5 personalizados y ONScripter-RU/Umineko Web. ## Información general | Campo | Valor | |-------|-------| | VMID | 111 | | Host Proxmox | Cisco1 (192.168.10.185) | | IP estática | 192.168.10.111 | | Gateway | 192.168.10.254 | | DNS | 8.8.8.8, 8.8.4.4 | | Recursos | 8 vCPUs, 16 GB RAM, 150 GB disco | | SO | Ubuntu 24.04 LTS | | Usuario admin | `novelas` | | Web | http://192.168.10.111 | ## Estructura de directorios ``` /opt/novelas/ ├── bin/ │ ├── build-novela.sh # Script principal: compila y publica novelas │ └── detect-engine.sh # Detecta el motor de un proyecto ├── builds/ # Builds intermedias generadas ├── projects/ # Proyectos fuente de novelas ├── tools/ │ └── renpy/ # Ren'Py SDK 8.3.4 + web package ├── config/ │ └── nginx-snippet.template# Plantilla para snippets nginx ├── templates/ │ └── portal/ # Plantillas del portal web (NO USADAS EN RUNTIME) └── docs/ ├── README.md # Esta documentación └── DESIGN.md # Sistema de diseño del portal /var/www/novelas/ # Raíz servida por nginx ├── index.html # Portal principal ├── assets/ # CSS, JS e iconos del portal │ ├── styles.css │ ├── app.js │ └── icons/ ├── games.json # Catálogo global de juegos └── games/ ├── demo/ # The Question (Ren'Py) ├── web-demo/ # Ejemplo HTML5 ├── unity-demo/ # Ejemplo Unity WebGL └── umineko/ # Solo cover.jpg; juego en contenedor Docker /etc/nginx/snippets/novelas-games/ └── *.conf # Headers COOP/COEP por juego Ren'Py ``` ## Motores soportados | Motor | Detección automática | Compilación | Headers COOP/COEP | |-------|---------------------|-------------|-------------------| | Ren'Py | `project.json` o `game/script.rpy` | Si, via `renpy.sh launcher web_build` | Si | | Unity WebGL | `Build/`, `TemplateData/` e `index.html` | No, copia directa | No | | Web genérico | `index.html` | No, copia directa | No | | ONScripter estándar | `0.txt`, `nscript.dat`, `ons.cfg` | Copia + OnscripterYuri web | No | | ONScripter-RU / Umineko | `*.file` + `default.cfg` | Contenedor Docker `umineko_web_asm` | No | ## Cómo agregar una novela visual 1. Coloca el proyecto en `/opt/novelas/projects/`. 2. (Opcional) Añade un archivo `meta.json` en la raíz del proyecto: ```json { "title": "Mi Novela", "subtitle": "Subtítulo opcional", "description": "Breve descripción de la novela.", "author": "Tu nombre", "version": "1.0", "cover": "/games/mi-novela/cover.jpg" } ``` 3. Ejecuta como root o con sudo: ```bash /opt/novelas/bin/build-novela.sh /opt/novelas/projects/ ``` También puedes forzar el motor: ```bash /opt/novelas/bin/build-novela.sh /opt/novelas/projects/ renpy ``` 4. La novela quedará disponible en `http://192.168.10.111/games//`. ## Umineko no Naku Koro ni (ONScripter-RU Web) Umineko utiliza el motor ONScripter-RU compilado a WebAssembly mediante el proyecto `umineko_web_asm`. Se sirve desde un contenedor Docker dedicado y se accede a traves de una redireccion en nginx. ### Estructura ``` /opt/novelas/tools/umineko-web-asm/ # Fuente del contenedor ├── run-umineko-web.sh # Script para levantar/actualizar ├── docker-compose.yml └── ... /opt/novelas/projects/umineko/ # Archivos del juego /var/www/novelas/games/umineko/cover.jpg # Portada para el portal ``` ### URL - Portal: `http://192.168.10.111/games/umineko/` (redirige al contenedor) - Directa: `http://192.168.10.111:8081/` ### Gestión del contenedor ```bash # Levantar o recrear cd /opt/novelas/tools/umineko-web-asm ./run-umineko-web.sh # Detener docker-compose down # Estado docker ps docker logs -f umineko-web-asm_umineko-web_1 ``` ### Modos de hosting Edita `run-umineko-web.sh` para cambiar `HOSTING_MODE`: - `local` (actual): sirve los archivos originales. Inicio rapido. - `production`: convierte PNG→WebP, MP4→WebM, etc. Tarda en iniciar la primera vez. - `remote`: el usuario sube sus propios archivos desde el navegador. ## Portal web El portal principal (`http://192.168.10.111/`) muestra el catálogo de novelas disponibles con: - Diseño moderno y responsive. - Selector de temas: oscuro, claro e inmersivo. - Tarjetas con portada, metadatos y badge del motor. - Carga dinámica desde `/games.json`. La preferencia de tema se guarda en `localStorage` del navegador. ## Servicios instalados - nginx (puerto 80) - ufw (firewall: 22, 80, 443) - docker + docker-compose - nodejs + npm - python3 + pip - xvfb (para compilar Ren'Py Web sin display) ## Diseño El sistema de diseño del portal está documentado en `/opt/novelas/docs/DESIGN.md`. Se inspiró en los design systems de [designmd.ai](https://designmd.ai) y define tokens para los tres temas visuales. ## Notas de seguridad - Cambiar el password de root y del usuario `novelas` si aun no se ha hecho. - Considerar habilitar HTTPS con Caddy o certbot. - Evaluar autenticación si las novelas son privadas. - Los headers `Cross-Origin-Opener-Policy` y `Cross-Origin-Embedder-Policy` solo se aplican a juegos Ren'Py, ya que son los unicos que requieren `SharedArrayBuffer`. Unity WebGL y juegos web genericos no los necesitan y podrian romperse con ellos.