Initial commit: NovelasVM platform with multi-engine support and Umineko Web integration
This commit is contained in:
161
docs/INDEX.md
Normal file
161
docs/INDEX.md
Normal file
@@ -0,0 +1,161 @@
|
||||
# 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.
|
||||
Reference in New Issue
Block a user