Cómo Configurar Backups Automáticos Externos en el Servidor de MU
Monta un flujo de backup automático que copia la base de datos y las configuraciones de tu servidor de MU a un almacenamiento externo, con rotación, verificación de integridad y alertas de falla.
Todo administrador de MU Online vive bajo la misma amenaza silenciosa: un disco que falla, un comando equivocado en el SQL, un ataque de ransomware o un proveedor que simplemente desaparece con tu máquina. La base de datos guarda cuentas, personajes, inventarios, guilds, resets y el historial económ
Todo administrador de MU Online vive bajo la misma amenaza silenciosa: un disco que falla, un comando equivocado en el SQL, un ataque de ransomware o un proveedor que simplemente desaparece con tu máquina. La base de datos guarda cuentas, personajes, inventarios, guilds, resets y el historial económico entero del servidor. Perder eso no es un problema técnico — es el fin del proyecto y de la confianza de la comunidad. Este tutorial muestra cómo montar un flujo de backup automático externo, es decir, que copia los datos críticos fuera de la máquina de origen, de forma programada, verificada y con rotación. El foco aquí no es solo "generar un .bak", sino garantizar que exista siempre una copia recuperable en un lugar que sobreviva a la muerte del servidor principal. Las rutas, versiones y valores citados son ejemplos y varían según el proveedor/versión — lo que importa es entender el concepto y adaptarlo a tu estructura.
Requisitos previos
Antes de automatizar cualquier cosa, asegúrate de que lo básico esté en su lugar. Este tutorial asume un servidor de MU ya corriendo (si todavía estás montando el tuyo, mira la guía de cómo crear un servidor de MU Online).
- Acceso administrativo al VPS o máquina que aloja el servidor (RDP en Windows, o SSH en Linux).
- Base de datos funcional — normalmente SQL Server (2008/2014/2019 son comunes en MU S6) o MySQL/MariaDB en servidores más modernos.
- Un destino externo definido: nube (almacenamiento de objetos, drive), un segundo VPS o storage remoto accesible por SFTP/rclone.
- Herramienta de sincronización instalada. El rclone es la elección más versátil por hablar con decenas de proveedores; SFTP nativo también sirve.
- Espacio en disco local suficiente para generar el archivo comprimido antes del envío (regla práctica: 2x el tamaño actual de la base).
- Un usuario de servicio dedicado para el backup, sin privilegios más allá de lo necesario.
Entiende qué realmente necesita copiarse
El error más común es creer que "backup del servidor" es solo la base de datos. Un MU tiene dos categorías de datos críticos, y las configuraciones no están dentro del SQL.
| Categoría | Qué contiene | Dónde queda (ejemplo) |
|---|---|---|
| Base de datos | Cuentas, personajes, inventario, guilds, resets, economía | SQL Server MuOnline / MySQL |
| Configuraciones del GameServer | Spots, drops por mapa, eventos, rates | GameServer\Data\ (archivos .txt/.ini/.xml) |
| ConnectServer / JoinServer | IPs, lista de servidores, puertos | Archivos .ini de la carpeta del servidor |
| Panel/sitio | Config del sitio, cash shop, integraciones | Carpeta web + base del sitio |
| Scripts personalizados | NPCs, eventos y quests que editaste | Carpetas de datos del GameServer |
Si personalizaste spots en mapas de fin de juego o drops de un evento, esos datos viven en archivos de texto del GameServer — un backup solo del SQL no los recupera. Trata la carpeta de datos del servidor como parte obligatoria del backup.
Paso 1 — Generar el backup de la base de forma consistente
El backup necesita ser un "retrato" consistente de la base, no una copia de archivos abiertos en uso. Nunca copies los archivos .mdf/.ldf (SQL) o el directorio de datos de MySQL "a mano" con el servicio corriendo — eso genera archivos corruptos.
En SQL Server, usa el comando nativo, que garantiza consistencia y además comprime:
BACKUP DATABASE [MuOnline]
TO DISK = N'D:\Backups\MuOnline\MuOnline_full.bak'
WITH
COMPRESSION, -- reduce mucho el tamaño del archivo
CHECKSUM, -- graba verificacion de integridad
INIT,
STATS = 10,
NAME = N'Backup completo MuOnline';
En MySQL/MariaDB, el mysqldump genera un dump lógico consistente:
mysqldump --single-transaction --routines --triggers \
-u backup_user -p muonline > /backups/muonline_$(date +%F).sql
El parámetro --single-transaction evita trabar las tablas durante el dump en bases InnoDB. El objetivo de esta etapa es tener, al final, un único archivo por ejecución, con fecha en el nombre, listo para ser comprimido y enviado.
Paso 2 — Empaquetar base y configuraciones juntas
Un backup útil junta la base y las carpetas de configuración en el mismo paquete fechado. Así, a la hora de restaurar, todo vino del mismo momento. Un script simple lo resuelve en Windows con PowerShell:
# gera-pacote.ps1 — junta .bak + carpeta Data en un zip fechado
$stamp = Get-Date -Format 'yyyyMMdd_HHmm'
$destino = "D:\Backups\Pacotes\mu_$stamp.zip"
# 1) ejecuta el backup SQL (procedure o comando directo)
sqlcmd -S localhost -Q "BACKUP DATABASE [MuOnline] TO DISK='D:\Backups\MuOnline\MuOnline_full.bak' WITH COMPRESSION, CHECKSUM, INIT"
# 2) empaqueta el .bak + la carpeta de configuraciones del GameServer
Compress-Archive -Path @(
"D:\Backups\MuOnline\MuOnline_full.bak",
"D:\MuServer\GameServer\Data"
) -DestinationPath $destino -Force
Write-Host "Paquete generado: $destino"
En Linux, el equivalente es un tar con el dump y la carpeta de datos:
tar -czf /backups/mu_$(date +%F_%H%M).tar.gz \
/backups/muonline_$(date +%F).sql \
/opt/muserver/GameServer/Data
Paso 3 — Enviar al destino externo con rclone
Con el paquete listo localmente, el envío externo es el corazón de este tutorial. El rclone conecta a prácticamente cualquier proveedor (drives, almacenamiento de objetos compatible con S3, SFTP) con la misma sintaxis. Después de correr rclone config una vez para crear el "remote", el envío es una línea:
# envia el paquete mas reciente y mantiene log
$arquivo = Get-ChildItem "D:\Backups\Pacotes\*.zip" |
Sort-Object LastWriteTime -Descending | Select-Object -First 1
rclone copy $arquivo.FullName "remote:backups/mu/" `
--bwlimit 8M ` # limita banda para no ahogar a los jugadores
--log-file "D:\Backups\Logs\rclone.log" `
--log-level INFO
El parámetro --bwlimit (ejemplo: 8 MB/s, ajusta a tu enlace) evita que la subida consuma todo el ancho de banda y cause lag en el juego. Si prefieres SFTP puro hacia un segundo VPS, el concepto es el mismo: transferir el paquete fechado a una máquina físicamente diferente de la de origen.
> Un destino externo solo es externo de verdad si está en otra máquina/infraestructura. Copiar a "otra carpeta" o "a otro disco del mismo VPS" no protege contra la pérdida de la máquina entera.
Paso 4 — Verificar la integridad antes de confiar
Enviar un archivo corrupto es peor que no tener backup, porque crea falsa seguridad. Valida siempre. En SQL Server, la verificación nativa comprueba el CHECKSUM sin restaurar:
RESTORE VERIFYONLY
FROM DISK = N'D:\Backups\MuOnline\MuOnline_full.bak'
WITH CHECKSUM;
Para el paquete enviado, compara el tamaño y el hash local con el remoto. El rclone tiene un comando dedicado que comprueba esto automáticamente:
rclone check "D:\Backups\Pacotes\" "remote:backups/mu/" --one-way
Si el hash coincide, el archivo llegó íntegro. Registra el resultado en el log de cada ejecución — así, si algo se traba en medio de la madrugada, sabes exactamente cuál fue el último backup bueno.
Paso 5 — Rotación y retención en capas
Guardar todo para siempre llena el storage y dificulta encontrar el archivo correcto en una emergencia. Usa retención en capas, manteniendo más granularidad en los datos recientes:
remote:backups/mu/
├── diario/ → ultimos 7 dias
├── semanal/ → 1 por semana, por 4 semanas
└── mensal/ → 1 por mes, por 6 meses
La limpieza de los antiguos también es automatizable. El rclone elimina archivos más viejos que cierta edad con un solo comando:
# elimina backups diarios con mas de 7 dias en el destino externo
rclone delete "remote:backups/mu/diario/" --min-age 7d
Localmente, haz la misma rotación para no llenar el disco del VPS, manteniendo solo los últimos días antes del envío.
Paso 6 — Programar la ejecución automática
El backup manual funciona mientras te acuerdas; el backup automático funciona mientras el servidor esté encendido. En Windows, usa el Programador de Tareas apuntando al script:
- Abre el Programador de Tareas (
taskschd.msc). - Crea una tarea con desencadenador diario en la madrugada (ejemplo: 03:00).
- Acción: iniciar
powershell.execon argumentos-NonInteractive -ExecutionPolicy Bypass -File "D:\Scripts\gera-pacote.ps1". - Marca "Ejecutar aunque el usuario no haya iniciado sesión" y usa el usuario de servicio dedicado.
- En la configuración, activa "Ejecutar la tarea lo antes posible si se pierde un inicio programado".
En Linux, una línea en crontab -e lo resuelve:
# 03:00 todos los dias: genera paquete y envia
0 3 * * * /opt/scripts/backup-mu.sh >> /var/log/backup-mu.log 2>&1
Paso 7 — Alertas de falla
Necesitas saber cuándo un backup no ocurrió, y no descubrirlo el día del desastre. Agrega una alerta al final del flujo, disparada solo en caso de error. Un ejemplo simple por e-mail en PowerShell:
if ($LASTEXITCODE -ne 0) {
Send-MailMessage -SmtpServer "smtp.seuprovedor.com" -Port 587 -UseSsl `
-From "[email protected]" -To "[email protected]" `
-Subject "FALLA en el backup externo del MU" `
-Body "El backup externo fallo en $(Get-Date). Verifica el log." `
-Encoding UTF8
}
Muchos administradores prefieren un webhook para el Discord del equipo — el concepto es el mismo: transformar un error silencioso en una notificación que alguien va a ver.
Errores comunes y soluciones
| Error / Síntoma | Causa probable | Solución |
|---|---|---|
| Archivo de backup corrupto al restaurar | Copia de archivos de la base con el servicio encendido | Usa siempre BACKUP DATABASE / mysqldump, nunca copies .mdf/.ldf en caliente |
| La subida deja el juego con lag | El envío consume todo el ancho de banda de subida | Limita la banda (--bwlimit) y programa para horario de bajo pico |
| El disco del VPS se llena y el servidor cae | Los backups locales nunca se eliminan | Aplica rotación local (borrar archivos más viejos que X días) |
| El backup corre pero nunca llega a la nube | Credencial del remote expirada o config errónea | Prueba con rclone lsd remote: y verifica el log; recrea el token OAuth |
| Las configuraciones de eventos "desaparecieron" tras restaurar | Solo se guardó el SQL, no la carpeta Data | Incluye siempre GameServer\Data en el paquete |
| La tarea programada no se dispara | Corriendo bajo usuario sin permiso o VPS reiniciado | Usa cuenta de servicio y marca "ejecutar si se pierde el inicio" |
Lista de verificación de lanzamiento
- Backup de la base generado con comando nativo (con compresión y checksum)
- Carpeta
GameServer\Datay configs del ConnectServer/JoinServer incluidas en el paquete - Destino externo en máquina/infraestructura diferente de la de origen
- Envío automático con límite de banda configurado
- Verificación de integridad (
RESTORE VERIFYONLY/rclone check) en el flujo - Rotación y retención en capas (diario/semanal/mensual) activas
- Rotación local del disco del VPS activa
- Programación automática corriendo bajo usuario de servicio dedicado
- Alerta de falla por e-mail o Discord funcionando
- Prueba de restauración mensual en base separada programada
Con ese flujo dejas de depender de tu propia memoria y pasas a tener un sistema que protege el servidor incluso mientras duermes: base y configuraciones empaquetadas, enviadas fuera de la máquina, verificadas, rotadas y monitoreadas. Es la diferencia entre que un imprevisto de hardware sea un susto de una hora o el fin de tu servidor.
Preguntas frecuentes
¿Un backup local en el mismo disco del servidor cuenta como backup?
No cuenta como protección real. Si el disco del VPS falla, se corrompe o es comprometido por ransomware, pierdes el servidor y el backup al mismo tiempo. Un backup válido es aquel que sale de la máquina de origen hacia un destino externo (nube, otro VPS, storage separado). Lo ideal es seguir la regla 3-2-1: tres copias, en dos tipos de medio, con una fuera del sitio.
¿Con qué frecuencia debo enviar el backup fuera del servidor?
Depende del movimiento. Para servidores activos, lo más común es backup completo diario en la madrugada y envío externo justo después. Los servidores con mucha economía interna (comercio de ítems, donaciones) se benefician de copias externas cada 4-6 horas. Ajusta según cuánto progreso de jugador aceptas perder en el peor escenario.
¿Necesito pagar por almacenamiento en la nube para tener backup externo?
No necesariamente. Muchos administradores empiezan con capas gratuitas de servicios de nube o con un segundo VPS barato recibiendo los archivos vía SFTP. A medida que la base crece, el costo de almacenamiento pago tiende a ser irrelevante frente al perjuicio de perder meses de progreso de los jugadores. Los valores citados aquí son ejemplo y varían según el proveedor.
¿El envío externo del backup puede dejar el servidor lento?
El cuello de botella rara vez es la CPU y sí el disco y el enlace de subida. Para reducir el impacto, genera el archivo comprimido en un disco separado antes de enviarlo, programa la subida en los horarios de menor pico y limita el ancho de banda de la herramienta de transferencia. Así el backup externo corre sin competir con los jugadores en línea.
¿Cómo sé que el backup externo realmente va a funcionar cuando lo necesite?
Un backup que nunca fue restaurado es solo una esperanza. Haz una prueba de restauración mensual en una base separada, valida la integridad del archivo antes del envío y revisa el log de cada ejecución. Sin ese hábito, solo descubres que el backup estaba roto el día del desastre.