Files
novelasvm/docs/INDEX.md

162 lines
5.7 KiB
Markdown

# 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/<nombre>`.
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 <nombre> /opt/novelas/projects/<nombre>
```
También puedes forzar el motor:
```bash
/opt/novelas/bin/build-novela.sh <nombre> /opt/novelas/projects/<nombre> renpy
```
4. La novela quedará disponible en `http://192.168.10.111/games/<nombre>/`.
## 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.