Updated game-servers.md with full setup guides for: - SM64 Coop DX (headless, UDP 7777, build patches, mods) - N64 Netplay / gopher64 (Mario Party 1-3, relay server, client setup) - Dolphin Traversal (GC/Wii NAT hole-punching, all Dolphin games) Updated README.md service table and game listings. Updated deployment.md with new ports and connection info. Fixed MapleStory 2 ports (20002→20003) to match INSTANCED_CONTENT fix. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
15 KiB
Servidores de Juegos
Guia de setup, operacion y troubleshooting de cada servidor de juegos.
OpenFusion (FusionFall)
Resumen
| Dato | Valor |
|---|---|
| Emulador | OpenFusion |
| Lenguaje | C++ |
| Puerto | 23000 (login), 23001 (shard) |
| Base de datos | SQLite (embebida) |
| RAM | ~254 MB |
Archivos
servers/openfusion/
├── Dockerfile # Ubuntu 24.04, copia binario + config
├── docker-entrypoint.sh # Genera config.ini desde env vars
├── config.ini # Configuracion del servidor
├── fusion # Binario compilado (no en git)
├── sql/ # Migraciones SQLite
└── tdata/ # Datos del juego (NPCs, mobs, drops)
Configuracion
Variables de entorno en docker-compose.dev.yml:
OPENFUSION_SHARD_IP: IP publica del servidor (default: 192.168.10.234)OPENFUSION_MOTD: Mensaje del dia
Conexion de cliente
- Descargar el cliente FusionFall
- Usar el launcher de OpenFusion apuntando a
192.168.10.234:23000
Troubleshooting
- "Connection refused": Verificar que el contenedor esta corriendo y los puertos estan mapeados
- Datos de juego: Los archivos
tdata/contienen los NPCs, mobs y drops. Si faltan, el mundo estara vacio
MapleStory 2
Resumen
| Dato | Valor |
|---|---|
| Emulador | Maple2 |
| Lenguaje | C# / .NET 8 |
| Puertos | 20001 (login), 21001 (world), 20003/21003 (game ch0), 4000 (web) |
| Base de datos | MySQL 8.0 (puerto 3307) |
| RAM total | ~1.4 GB (5 contenedores) |
Arquitectura Multi-Servicio
maple2-mysql (3307)
│
├── maple2-world (21001) ← Coordinador central, gRPC
│ │
│ ├── maple2-login (20001) ← Autenticacion, seleccion de personaje
│ │
│ └── maple2-game-ch0 (20003/21003) ← Canal de juego (channelId=1)
│
└── maple2-web (4000) ← API web auxiliar
Los servidores se comunican entre si via gRPC (HTTP/2). El World server actua como coordinador central. Los Game servers se conectan al World al iniciar.
Setup Inicial (Primera Vez)
1. Clonar el repositorio
cd servers/
git clone --recurse-submodules https://github.com/MS2Community/Maple2.git maple2
2. Descargar datos del cliente
Se necesita el cliente de MapleStory 2 (~14 GB). Los archivos se colocan en servers/maple2/client-data/Data/.
Fuentes del cliente:
- adventure-island-online-2 releases (6 partes ZIP)
- Extraer todo a
servers/maple2/client-data/
3. Aplicar XML Patches
Descargar MapleStory2-XML v1.2.1 y copiar los archivos Server.m2d, Server.m2h, Xml.m2d, Xml.m2h a servers/maple2/client-data/Data/ (reemplazar los originales).
4. Configurar .env
cp servers/maple2/.env.example servers/maple2/.env
# Editar con las IPs correctas:
# GAME_IP=192.168.10.234
# LOGIN_IP=192.168.10.234
5. Verificar .dockerignore
El archivo servers/maple2/.dockerignore DEBE incluir:
client-data
client-download
xml-patches
Sin esto, el build de Docker intentara copiar 14 GB de datos al contexto.
6. Ingestar datos del juego
cd docker/
docker compose -f docker-compose.maple2.yml up -d maple2-mysql
# Esperar a que MySQL este healthy
docker compose -f docker-compose.maple2.yml run --rm maple2-file-ingest \
bash -c "cd /app && dotnet restore && cd Maple2.File.Ingest && dotnet run"
Este proceso importa todos los datos del cliente a MySQL. Toma ~10 minutos.
7. Construir y levantar servidores
docker compose -f docker-compose.maple2.yml build
docker compose -f docker-compose.maple2.yml up -d
Conexion de cliente
- Tener el cliente de MapleStory 2 instalado
- El cliente debe apuntar a
192.168.10.234:20001(Login Server) - Las IPs se configuran en
servers/maple2/.env(GAME_IP,LOGIN_IP)
Troubleshooting
- "No space left on device" al buildear: Verificar
.dockerignoreincluyeclient-data - "Scripting/Scripts not found": Ya corregido — se removio la linea COPY del Dockerfile del Game server
- "project.assets.json not found" en file-ingest: Ejecutar
dotnet restoreantes dedotnet run - Servidores no se conectan entre si: Verificar que
GRPC_WORLD_IP=maple2-worldyGRPC_GAME_IP=maple2-game-ch0estan configurados en el compose - "Server not found" al seleccionar personaje:
INSTANCED_CONTENTdebe ser"false"para que el canal se registre como non-instanced. Con"false", el channelId es 1 y los puertos son 20003/21003 (base + channelId)
Agregar mas canales de juego
Para agregar un segundo canal, duplicar el servicio maple2-game-ch0 en el compose cambiando:
- Nombre:
maple2-game-ch1 - Puertos:
20004:20004y21004:21004(channelId=2) GRPC_GAME_IP: maple2-game-ch1
Nota sobre puertos: Con
INSTANCED_CONTENT: "false", el primer canal es channelId=1 (puertos 20003/21003), el segundo seria channelId=2 (20004/21004), etc. Los puertos se calculan comoBasePort + channelId.
Minecraft: FTB Evolution
Resumen
| Dato | Valor |
|---|---|
| Imagen Docker | itzg/minecraft-server:java21 |
| Modpack | FTB Evolution v1.29.1 |
| Minecraft | 1.21.1 |
| NeoForge | 21.1.218 |
| Puerto | 25565 |
| RAM | ~3.5 GB (6 GB JVM heap, 8 GB limite contenedor) |
| Mods | 200+ |
Configuracion
El servidor se configura via variables de entorno en docker-compose.dev.yml:
environment:
EULA: "TRUE"
TYPE: FTBA
FTB_MODPACK_ID: 125
FTB_MODPACK_VERSION_ID: 100181
MEMORY: 6G
MAX_MEMORY: 6G
MOTD: "Project Afterlife - FTB Evolution"
DIFFICULTY: normal
MAX_PLAYERS: 20
VIEW_DISTANCE: 10
ENABLE_COMMAND_BLOCK: "true"
Primer inicio
El primer inicio toma 5-10 minutos porque:
- Descarga el FTB App installer
- Descarga los 200+ mods del modpack
- Instala NeoForge 21.1.218
- Genera el mundo
Conexion de cliente
- Instalar FTB App, MultiMC, ATLauncher, o Prism Launcher
- Instalar modpack FTB Evolution version 1.29.1
- Multiplayer > Add Server:
192.168.10.234:25565
Fix: Watchdog crash en primer inicio
Con 200+ mods, el mod Hexerei tarda mas de 60 segundos generando recetas al iniciar, lo que activa el watchdog de Minecraft. Se resuelve con MAX_TICK_TIME: -1 en las variables de entorno del compose.
Troubleshooting
- Server lag: Reducir
VIEW_DISTANCEde 10 a 8, o aumentarMEMORYsi hay RAM disponible - NeoForge install fails: Verificar que la imagen Docker es
java21(no java8 ni java17) - Watchdog crash (single tick took 60s): Verificar que
MAX_TICK_TIME: -1esta configurado
Super Mario 64 Coop (sm64coopdx)
Resumen
| Dato | Valor |
|---|---|
| Proyecto | sm64coopdx |
| Lenguaje | C |
| Puerto | 7777 (UDP) |
| Jugadores | Hasta 16 |
| RAM | ~45 MB |
Archivos
servers/sm64coopdx/
├── Dockerfile # Multi-stage: compila desde fuente + runtime
├── .dockerignore
├── .gitignore # Excluye ROMs (*.z64, *.n64, *.v64)
└── baserom.us.z64 # ROM de SM64 US (no en git, requerida para build)
Requisitos
Se necesita la ROM de Super Mario 64 US (baserom.us.z64, MD5: 20b854b239203baf6c961b850a4a51a2) en servers/sm64coopdx/ antes de construir la imagen Docker.
Cómo funciona
El Dockerfile compila sm64coopdx desde fuente con HEADLESS=1 DISCORD_SDK=0 COOPNET=0. Incluye dos parches:
- float.h — GCC 11 requiere include explícito de
<float.h>paraFLT_EPSILON - platform.c — El fallback headless (sin SDL2) tiene funciones renombradas que upstream no actualizo (
sys_exe_path_dir,sys_resource_path)
La ROM es necesaria tanto en build (extracción de assets) como en runtime (validación MD5 al iniciar).
Configuracion
Variables de entorno en docker-compose.dev.yml:
SM64_PORT: Puerto UDP del servidor (default: 7777)SM64_PLAYERS: Maximo de jugadores (default: 16)
Conexion de cliente
- Descargar sm64coopdx (requiere compilar con la misma ROM)
- Abrir sm64coopdx → Join → Direct Connection
- Ingresar
play.consultoria-as.com:7777(o192.168.10.234:7777en LAN)
Mods incluidos
El build incluye mods bundled del repositorio: character-select, star-road, arena, day-night-cycle, sm74.
Troubleshooting
- "could not find valid vanilla us sm64 rom": La ROM debe estar tanto en el build como en el runtime. Verificar que el Dockerfile copia
baserom.us.z64al stage de runtime - 100% CPU: Normal — el game loop headless no tiene frame limiter porque no renderiza graficos
- No se conectan jugadores: Verificar que el puerto 7777/UDP esta abierto en el router y que el firewall permite UDP
N64 Netplay (gopher64 — Mario Party 1-3)
Resumen
| Dato | Valor |
|---|---|
| Proyecto | gopher64-netplay-server |
| Imagen Docker | k4rian/gopher64-netplay-server |
| Lenguaje | Go |
| Puertos | 45000-45004 (TCP + UDP) |
| Jugadores | 4 por sala, 4 salas concurrentes |
| RAM | <1 MB (heap ~660 KB) |
Cómo funciona
Servidor relay headless que retransmite inputs de controles N64 entre jugadores via WebSocket (lobby) + UDP (gameplay). No ejecuta el juego — cada jugador corre su propio emulador con su ROM. El servidor solo coordina la sincronización.
- Puerto 45000: WebSocket lobby (creación de salas, chat, conexión)
- Puertos 45001-45004: Sesiones de juego individuales (TCP + UDP)
- LAN discovery: Activado por defecto, los emuladores en la misma red lo detectan automáticamente
Configuracion
Variables de entorno en docker-compose.dev.yml:
G64NS_NAME: Nombre del servidor ("Afterlife N64 - Mario Party")G64NS_PORT: Puerto base (default: 45000)G64NS_MAXGAMES: Partidas concurrentes (default: 4)G64NS_MOTD: Mensaje de bienvenidaG64NS_DISABLEBROADCAST: Desactivar LAN discovery (default: false)G64NS_ENABLEAUTH: Activar autenticación (default: false)
Juegos soportados
Cualquier juego de N64, pero diseñado especialmente para:
- Mario Party 1 (N64)
- Mario Party 2 (N64)
- Mario Party 3 (N64)
Todos los jugadores deben usar el mismo emulador y el mismo ROM (se verifica MD5).
Emuladores compatibles (cliente)
| Emulador | Custom server | Estado |
|---|---|---|
| gopher64 | Si (v1.1.1+) | Activo, recomendado |
| RMG (Rosalie's Mupen GUI) | Si (v0.8.0+) | Activo |
| simple64 | Si | Archivado (usar gopher64) |
Conexion de cliente
- Descargar gopher64 o RMG
- Tener el ROM de Mario Party
- Netplay → Server: seleccionar "Custom"
- Ingresar
play.consultoria-as.com:45000(o192.168.10.234:45000en LAN) - Un jugador crea sala, los demás se unen
Troubleshooting
- "Different ROM" error: Todos los jugadores deben tener exactamente el mismo archivo ROM (se compara MD5)
- No se puede conectar: Verificar puertos TCP+UDP 45000-45004 abiertos en router
- Cross-emulator no funciona: Todos deben usar el mismo emulador (no mezclar gopher64 con RMG)
Dolphin Traversal Server (GameCube / Wii)
Resumen
| Dato | Valor |
|---|---|
| Proyecto | Dolphin Emulator (componente traversal_server) |
| Lenguaje | C++ |
| Puertos | 6262, 6226 (UDP) |
| RAM | <10 MB |
Cómo funciona
Servidor de NAT hole-punching para Dolphin netplay. No retransmite datos de juego — solo facilita la conexión inicial entre dos instancias de Dolphin que están detrás de NAT/firewall. Una vez conectados, el tráfico de juego fluye directamente peer-to-peer.
- Puerto 6262 (UDP): Puerto principal de traversal
- Puerto 6226 (UDP): Puerto alternativo para probar tipo de NAT
El servidor es completamente stateless (sin persistencia), single-threaded, y las entradas de clientes expiran después de 30 segundos de inactividad.
Build
Multi-stage Docker build que compila solo el target traversal_server del repositorio completo de Dolphin. La build es pesada (~20 min) pero el binary final es tiny.
servers/dolphin-traversal/
├── Dockerfile # Multi-stage: debian build + debian-slim runtime
└── .dockerignore
Configuracion
El traversal server no tiene opciones de configuración. Los puertos (6262/6226) están hardcodeados en el código fuente. No acepta argumentos de línea de comandos ni variables de entorno.
Juegos soportados
TODOS los juegos de GameCube y Wii que se pueden jugar en Dolphin, incluyendo:
- Mario Party 4, 5, 6, 7
- Mario Kart: Double Dash
- Super Smash Bros. Melee
- F-Zero GX
- Kirby Air Ride
- The Legend of Zelda: Wind Waker
- Y cualquier otro juego de GC/Wii
Conexion de cliente
- Descargar Dolphin Emulator
- Ir a Config → General → Netplay (o Config → Network en versiones nuevas)
- Cambiar Traversal Server a:
play.consultoria-as.com - Traversal Port:
6262 - Un jugador hostea (NetPlay → Host), los demás se unen con el Host Code generado
- Todos necesitan la misma ISO/ROM del juego
Troubleshooting
- No se genera Host Code: Verificar que los puertos UDP 6262 y 6226 están abiertos
- Conexión lenta o fallida: El traversal solo facilita el handshake; si la conexión P2P falla, los jugadores pueden intentar Direct Connection (requiere que el host abra puertos)
- Sin logs: Normal — el servidor no logea nada por defecto (solo errores a stderr)
- Desyncs en juego: Ambos jugadores deben usar la misma versión de Dolphin y la misma ISO
Operaciones Comunes
Ver logs de un servidor
docker logs -f minecraft-ftb # Minecraft
docker logs -f maple2-world # MapleStory 2 World
docker logs -f docker-openfusion-1 # OpenFusion
docker logs -f sm64coopdx # SM64 Coop
docker logs -f n64-netplay # N64 Netplay (Mario Party)
docker logs -f dolphin-traversal # Dolphin Traversal (GC/Wii)
Reiniciar un servidor
docker restart minecraft-ftb
docker restart maple2-world maple2-login docker-maple2-game-ch0-1
docker restart docker-openfusion-1
docker restart sm64coopdx
docker restart n64-netplay
docker restart dolphin-traversal
Ver uso de recursos
docker stats --no-stream
Backup de datos
# PostgreSQL (CMS)
docker exec docker-postgres-1 pg_dump -U afterlife afterlife > backup_cms.sql
# MySQL (MapleStory 2)
docker exec maple2-db mysqldump -u root -pmaplestory --databases maple-data game-server > backup_ms2.sql
# Minecraft (mundo completo)
docker cp minecraft-ftb:/data/world ./backup_minecraft_world/