El mayor portal de MU Online de Brasil — desde 2003
Tutorial Avanzado Cliente

Cómo implementar autoupdate incremental del cliente en tu servidor de MU Online

Configura un launcher con autoupdate incremental para el cliente de tu servidor de MU Online: manifiesto de versión, diff de archivos, descarga por parche y verificación de integridad, evitando redescargas completas en cada actualización.

RO Rodrigo · Actualizado el 6 jul 2013 · ⏱ 17 min de lectura
Respuesta rápida

Cada vez que actualizas el cliente de tu servidor de MU Online —un mapa nuevo, un ítem personalizado, una corrección de bug— el jugador necesita descargar ese cambio antes de entrar. Sin un sistema de autoupdate incremental, esto normalmente significa descargar el cliente entero de nuevo, lo que ale

Cada vez que actualizas el cliente de tu servidor de MU Online —un mapa nuevo, un ítem personalizado, una corrección de bug— el jugador necesita descargar ese cambio antes de entrar. Sin un sistema de autoupdate incremental, esto normalmente significa descargar el cliente entero de nuevo, lo que aleja a jugadores con internet más lento y genera picos de tráfico en tu servidor de archivos. Un autoupdate incremental resuelve esto comparando lo que el jugador ya tiene con lo que cambió, descargando solo la diferencia. Este tutorial cubre la arquitectura completa: generación de manifiesto, verificación de integridad, descarga selectiva y manejo de fallos.

Cómo funciona el autoupdate incremental

El principio es simple: el servidor mantiene un manifiesto — una lista de todos los archivos del cliente con su hash y tamaño actuales. El launcher, al abrirse, descarga ese manifiesto y lo compara con un manifiesto local (generado a partir de los archivos que el jugador ya tiene instalados). Cualquier archivo cuyo hash sea diferente (o que no exista localmente) entra en la cola de descarga. Los archivos idénticos se ignoran. El resultado práctico: una actualización de 50 MB en un cliente de 3 GB descarga solo los 50 MB, no los 3 GB enteros.

Prerrequisitos

  • Un launcher ya funcional para tu servidor (personalizado o basado en algún framework de launcher de MU).
  • Acceso a un servidor de archivos (CDN, VPS o storage) para alojar el manifiesto y los parches.
  • Script o herramienta para generar el hash de todos los archivos del cliente (puede hacerse en PHP, Python o C#).
  • Entorno de pruebas separado del cliente de producción, para validar el flujo sin afectar a jugadores reales.

Estructura del manifiesto

El manifiesto es normalmente un archivo JSON alojado junto con los parches, listando cada archivo relevante del cliente:

{
  "version": "1.42.0",
  "generated_at": "2026-07-20T14:00:00Z",
  "files": [
    { "path": "Data/Item/Item1.bmd", "sha256": "a1b2c3...", "size": 184320 },
    { "path": "Data/Map/World1.map", "sha256": "d4e5f6...", "size": 942112 },
    { "path": "Main.exe", "sha256": "9f8e7d...", "size": 15728640 }
  ]
}

Generar este manifiesto debe ser un paso automatizado siempre que publiques una actualización — nunca manual, porque un solo hash equivocado invalida la actualización entera para todos los jugadores.

Generando el manifiesto en el servidor (ejemplo en script)

#!/bin/bash
# generate_manifest.sh - recorre la carpeta del cliente y genera manifest.json
OUTPUT="manifest.json"
echo '{"version":"'$1'","generated_at":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","files":[' > $OUTPUT
find ./client -type f | while read -r file; do
  hash=$(sha256sum "$file" | awk '{print $1}')
  size=$(stat -c%s "$file")
  relpath=$(echo "$file" | sed 's|^./client/||')
  echo '{"path":"'$relpath'","sha256":"'$hash'","size":'$size'},' >> $OUTPUT
done
sed -i '$ s/,$//' $OUTPUT
echo ']}' >> $OUTPUT

Ejecuta este script como parte de tu pipeline de publicación, generando siempre un manifiesto nuevo antes de subir los parches al servidor de archivos.

Lógica del launcher (comparación de hash)

El launcher necesita, al abrirse:

  1. Descargar el manifest.json remoto.
  2. Calcular (o leer de una caché local) el hash de cada archivo ya instalado.
  3. Comparar ambas listas y armar la cola de archivos divergentes o ausentes.
  4. Descargar solo los archivos de la cola, preferiblemente en paralelo (2-4 conexiones simultáneas).
  5. Validar el hash de cada archivo descargado antes de sobrescribir el original.
EtapaUbicación recomendadaObservación
Caché de hash localArchivo local_manifest.json junto al ejecutableEvita recalcular el hash de todo en cada apertura
DescargaCarpeta temporal _update_tmp/Nunca escribe directo en la carpeta final
Validación posdescargaHash SHA-256 del archivo descargadoSolo se mueve a la carpeta final si coincide
Log de actualizaciónArchivo de log con timestamp y lista de archivos actualizadosFacilita el soporte en caso de error

Diff binario para archivos grandes

Para archivos como el ejecutable principal o paquetes grandes de mapas, incluso un pequeño cambio fuerza la redescarga del archivo entero en el modelo básico. Una optimización adicional es usar diff binario (herramientas como bsdiff/bspatch): el servidor genera un parche pequeño que contiene solo la diferencia binaria entre la versión antigua y la nueva, y el launcher aplica ese parche localmente en lugar de descargar el archivo completo. Esto es más complejo de implementar, pero vale la pena para archivos grandes que cambian con frecuencia moderada.

CDN y distribución

Alojar el manifiesto y los parches en una CDN (en lugar de solo en el VPS del servidor de juego) reduce la carga en el servidor principal durante picos de actualización (por ejemplo, justo después del anuncio de una nueva season). Configura el cache-control apropiado en el manifiesto (corto, para reflejar cambios rápido) y en los archivos de parche (largo, ya que un archivo con hash fijo nunca cambia de contenido).

Manejo de fallos de descarga

Las conexiones inestables son comunes entre jugadores de MU Online en Latinoamérica. El launcher debe:

  • Reintentar automáticamente (2-3 intentos) un archivo que falló, antes de marcar la actualización como fallida.
  • Permitir reanudar desde donde se quedó (descarga parcial) en lugar de reiniciar el archivo desde cero, especialmente para archivos grandes.
  • Nunca aplicar un archivo descargado parcialmente — la validación de hash posdescarga es la protección final contra esto.
  • Mostrar un mensaje claro al jugador (nombre del archivo, progreso, error específico) en lugar de un "error genérico de actualización".

Versionado y rollback

Mantén los últimos 2-3 manifiestos anteriores accesibles en el servidor de archivos. Si una actualización causa un problema grave (crash generalizado, ítem roto), necesitas poder revertir el manifiesto activo a la versión anterior rápidamente, sin depender de reconstruir los parches desde cero.

Pruebas antes de publicar

Prueba siempre la actualización en al menos tres escenarios antes de liberarla para todos: (1) cliente limpio, sin ninguna instalación previa; (2) cliente en la versión inmediatamente anterior; (3) cliente en una versión muy antigua (varias actualizaciones atrás), para garantizar que el incremental cubra saltos mayores de versión, no solo el parche más reciente.

Errores comunes y soluciones

SíntomaCausa probableSolución
El launcher descarga todo aunque pocos archivos hayan cambiadoManifiesto local no generado o hash calculado incorrectamenteRevisa la generación y la caché del manifiesto local
La actualización se traba en un archivo específicoArchivo grande sin soporte para reanudar la descargaImplementa descarga reanudable (range requests)
Cliente corrupto tras la actualizaciónArchivo aplicado sin validación posdescargaAgrega verificación de hash antes de mover a la carpeta final
Jugadores antiguos no actualizan correctamenteEl incremental solo cubre la versión anterior, no saltos mayoresGenera el manifiesto siempre con la lista completa actual, no solo el diff de la última versión
Pico de error 503 en el servidor de archivosTodos los jugadores descargando al mismo tiempo sin CDNDistribuye los parches por CDN con caché adecuada

Lista de verificación de lanzamiento

  • Script de generación de manifiesto automatizado en el pipeline de publicación.
  • Launcher comparando hash local vs. remoto correctamente.
  • Descarga en carpeta temporal con validación posdescarga.
  • Soporte para reanudar descarga en archivos grandes.
  • CDN configurada para manifiesto y parches.
  • Rollback de manifiesto probado y documentado.
  • Pruebas en cliente limpio, versión anterior y versión antigua realizadas.

Con el autoupdate incremental funcionando, publicar nuevas actualizaciones deja de ser un evento arriesgado y se convierte en parte natural del ciclo de mantenimiento del servidor — para revisar cómo este cliente se conecta con la infraestructura general del proyecto, consulta la guía de cómo crear un servidor de MU Online.

Preguntas frecuentes

¿Cuál es la diferencia entre autoupdate incremental y descarga completa?

En la descarga completa, cada actualización descarga el cliente entero (varios GB), aunque solo haya cambiado un archivo. En el incremental, el launcher compara un manifiesto de versión y descarga solo los archivos modificados, reduciendo el tiempo de actualización de horas a segundos o minutos en la mayoría de los casos.

¿Necesito reescribir mi launcher desde cero para tener autoupdate incremental?

No necesariamente. La mayoría de los launchers de MU ya tienen una rutina de verificación de versión; el trabajo principal es generar el manifiesto (lista de archivos con hash) en el servidor y ajustar la lógica del launcher para comparar el hash local vs. el remoto en lugar de descargar todo.

¿Qué algoritmo de hash usar para comparar archivos?

SHA-256 es el más seguro y recomendado actualmente. MD5 todavía se usa en launchers legados por ser más rápido de calcular, pero tiene colisiones teóricas conocidas — para un cliente de MU el riesgo práctico es bajo, pero SHA-256 es la elección más robusta para proyectos nuevos.

¿Cómo manejo archivos muy grandes, como el ejecutable principal?

Para archivos grandes que cambian con frecuencia, considera usar diff binario (bsdiff/bspatch) en lugar de reenviar el archivo completo. Esto reduce aún más el volumen de descarga cuando solo una pequeña parte del binario cambia entre versiones.

¿Qué pasa si la actualización falla a mitad de la descarga?

El launcher debe validar el hash de cada archivo después de la descarga y, si no coincide, volver a descargar solo ese archivo (no la actualización entera). Mantén los archivos descargados en una carpeta temporal y muévelos a la carpeta final solo después de la validación, evitando corromper la instalación en caso de caída de conexión.

RO
Fundador y editor jefe

Rodrigo mantiene ViciadosMU desde los inicios del portal. Especialista en creación y administración de servidores de MU Online, historia del juego y la evolución de las seasons — escribió buena parte del archivo antes de 2024.

Sigue leyendo

Artículos relacionados