- README.md: project overview, server status, quick start guide, architecture diagram, tech stack, and content inventory - docs/architecture.md: technical architecture, service diagram, component details, and design decisions - docs/game-servers.md: setup and operation guide for OpenFusion, MapleStory 2, and Minecraft FTB Infinity Evolved - docs/cms-content.md: Strapi content model, i18n strategy, documentary structure, and API endpoints - docs/deployment.md: local dev, production deploy, CI/CD, SSL setup, backup procedures, and monitoring Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
6.0 KiB
Modelo de Contenido CMS
Strapi 5 — Content Types
Game
Entrada principal de cada juego preservado.
| Campo | Tipo | Requerido | Localizado | Descripcion |
|---|---|---|---|---|
| title | string | si | si | Nombre del juego |
| slug | uid | si | no | URL-friendly, auto-generado desde title |
| description | richtext | no | si | Descripcion larga del juego |
| genre | enum | si | no | MMORPG, FPS, Casual, Strategy, Sports, Other |
| releaseYear | integer | si | no | Ano de lanzamiento original |
| shutdownYear | integer | si | no | Ano de cierre de servidores |
| developer | string | si | no | Estudio desarrollador |
| publisher | string | no | no | Publisher/distribuidor |
| screenshots | media[] | no | no | Capturas de pantalla (solo imagenes) |
| coverImage | media | si | no | Imagen de portada principal |
| serverStatus | enum | no | no | online, maintenance, coming_soon (default) |
| serverLink | string | no | no | IP:puerto para conectarse |
| documentary | relation | no | no | oneToOne con Documentary |
Documentary
Documental interactivo asociado a un juego.
| Campo | Tipo | Requerido | Localizado | Descripcion |
|---|---|---|---|---|
| title | string | si | si | Titulo del documental |
| description | text | no | si | Descripcion/subtitulo |
| game | relation | no | no | oneToOne con Game |
| chapters | relation | no | no | oneToMany con Chapter (ordenados) |
Chapter
Capitulo individual de un documental.
| Campo | Tipo | Requerido | Localizado | Descripcion |
|---|---|---|---|---|
| title | string | si | si | Titulo del capitulo |
| content | richtext | si | si | Contenido narrativo completo |
| audioFile | media | no | no | Archivo de audio (narracion) |
| audioDuration | integer | no | no | Duracion en segundos |
| order | integer | si | no | Orden de aparicion (1, 2, 3...) |
| coverImage | media | no | no | Imagen de portada del capitulo |
| documentary | relation | no | no | manyToOne con Documentary |
Modelo i18n de Strapi 5
Strapi 5 maneja la internacionalizacion con filas separadas por locale. Cada documento tiene un document_id compartido y multiples filas:
document_id: "abc123"
├── id: 1 (locale: en, draft)
├── id: 2 (locale: en, published)
├── id: 3 (locale: es, draft)
└── id: 4 (locale: es, published)
Las relaciones (_lnk tables) conectan las filas del mismo estado. Un juego publicado en ES se conecta al documental publicado en ES, no al draft ni al EN.
Tablas de enlace
games_documentary_lnk— game_id ↔ documentary_idchapters_documentary_lnk— chapter_id ↔ documentary_id + chapter_ord
Contenido Actual
Juegos (3)
| Slug | document_id | Titulo | Genre | Release | Shutdown | Server |
|---|---|---|---|---|---|---|
| fusionfall | sx17hshy2d... | FusionFall | MMORPG | 2009 | 2013 | online |
| maplestory2 | ms2maple2d... | MapleStory 2 | MMORPG | 2015 | 2020 | online |
| minecraft-ftb-infinity | mcftbinfd... | Minecraft: FTB Infinity Evolved | Sandbox | 2011 | - | online |
Documentales (2)
FusionFall: "El Mundo Que No Queriamos Perder"
| # | Titulo | Contenido |
|---|---|---|
| 1 | El Sueno Imposible | Origenes, Cartoon Network, Grigon Entertainment |
| 2 | Cuando los Mundos Colisionaron | Desarrollo, motor Unity, estilo anime de Midori Foo |
| 3 | Bienvenido al Futuro | Lanzamiento, viajes en el tiempo, sistema de Nanos |
| 4 | La Caida de Grigon | Quiebra del estudio, CN asume el desarrollo |
| 5 | La Academia | Free-to-play, The Academy, Adventure Time |
| 6 | Seis Dias | Cierre con 6 dias de aviso, agosto 2013 |
| 7 | Afterlife | Comunidad, FusionFall Retro/Legacy, OpenFusion |
MapleStory 2: "El Mundo Que Construimos Juntos"
| # | Titulo | Contenido |
|---|---|---|
| 1 | El Siguiente Nivel | De MapleStory 1 a la vision 3D de NSquare |
| 2 | Un Mundo de Cubos y Color | Arte voxel, UGC, musica, housing |
| 3 | El Amanecer Coreano | Lanzamiento Korea julio 2015, primeros problemas |
| 4 | La Conquista Global | Lanzamiento global octubre 2018, hype de Twitch |
| 5 | La Tormenta Perfecta | Declive: RNG, limites semanales, exodo |
| 6 | El Ultimo Despertar | Expansion Awakening, demasiado tarde |
| 7 | Afterlife | Cierre mayo 2020, emulador MS2Community |
Crear Contenido Nuevo
Via Strapi Admin (recomendado)
- Ir a http://localhost:1337/admin
- Content Manager > Game / Documentary / Chapter
- Crear en un idioma, luego usar "Localization" para traducir
Via PostgreSQL (insercion directa)
Cuando la API de Strapi tiene restricciones de permisos, se puede insertar directamente en PostgreSQL. Cada contenido necesita 4 filas:
-- Draft EN
INSERT INTO games (document_id, title, slug, ..., locale)
VALUES ('unique_doc_id', 'Title', 'slug', ..., 'en');
-- Draft ES
INSERT INTO games (document_id, title, slug, ..., locale)
VALUES ('unique_doc_id', 'Titulo', 'slug', ..., 'es');
-- Published EN (con published_at)
INSERT INTO games (document_id, title, slug, ..., published_at, locale)
VALUES ('unique_doc_id', 'Title', 'slug', ..., NOW(), 'en');
-- Published ES (con published_at)
INSERT INTO games (document_id, title, slug, ..., published_at, locale)
VALUES ('unique_doc_id', 'Titulo', 'slug', ..., NOW(), 'es');
Para documentales, ademas de los inserts hay que crear las relaciones en las tablas _lnk:
INSERT INTO games_documentary_lnk (game_id, documentary_id) VALUES (game_id, doc_id);
INSERT INTO chapters_documentary_lnk (chapter_id, documentary_id, chapter_ord) VALUES (ch_id, doc_id, 1);
API Endpoints
La API de Strapi se consume desde Next.js via funciones en apps/web/src/lib/api.ts:
| Funcion | Descripcion |
|---|---|
getGames(locale) |
Lista todos los juegos con portada |
getGameBySlug(slug, locale) |
Juego con documental y capitulos |
getDocumentaryByGameSlug(slug, locale) |
Documental completo de un juego |
Todas las llamadas requieren el header Authorization: Bearer <STRAPI_API_TOKEN>.