Cómo configurar alertas de incidentes vía Telegram para tu servidor de MU Online
Monta un sistema de alertas vía bot de Telegram para enterarte en segundos cuando el GameServer, MySQL o el sitio de tu servidor de MU Online se caigan, con scripts de monitoreo, escalamiento y pruebas de falla controladas.
Cuando el GameServer se cae a las 3 de la madrugada y nadie se entera hasta que los jugadores empiezan a quejarse en Discord, el costo no es solo técnico — es reputacional, y en servidores monetizados, también financiero (donaciones y eventos pagos interrumpidos sin aviso). Un sistema de alertas vía
Cuando el GameServer se cae a las 3 de la madrugada y nadie se entera hasta que los jugadores empiezan a quejarse en Discord, el costo no es solo técnico — es reputacional, y en servidores monetizados, también financiero (donaciones y eventos pagos interrumpidos sin aviso). Un sistema de alertas vía Telegram resuelve este punto ciego, avisando al equipo de administración en segundos, directo al celular, sin depender de que alguien esté mirando un panel. Este tutorial muestra cómo crear el bot, escribir los scripts de verificación de los servicios críticos de tu servidor de MU Online, configurar el escalamiento y probar fallas de forma controlada antes de confiar en el sistema en producción.
Por qué Telegram y no correo o SMS
El correo tiene un retraso de entrega variable y con frecuencia cae en spam cuando se envía desde un script automatizado sin infraestructura de SMTP con buena reputación. El SMS tiene costo por mensaje y no escala bien para alertas frecuentes. Telegram, en cambio, ofrece una API de bot gratuita, entrega casi instantánea vía push notification en el celular, y soporta grupos con múltiples administradores recibiendo la misma alerta simultáneamente — es el canal más usado hoy por administradores de servidores privados justamente por esta combinación de costo cero y velocidad.
Creando el bot en Telegram
- Abre una conversación con @BotFather dentro de Telegram.
- Envía
/newboty sigue las instrucciones, definiendo un nombre (por ejemplo, "ViciadosMU Monitor") y un username terminado en "bot" (por ejemplo,viciadosmu_monitor_bot). - BotFather devuelve un token con el formato
123456789:ABCdefGhIJKlmNoPQRsTUvwxYZ— guárdalo con el mismo cuidado que una contraseña de base de datos. - Crea un grupo de Telegram con los administradores y añade el bot a ese grupo.
- Descubre el
chat_iddel grupo accediendo ahttps://api.telegram.org/bot<TOKEN>/getUpdatesdespués de enviar cualquier mensaje en el grupo — elchat_iddel grupo aparece en el JSON devuelto (generalmente un número negativo).
Estructura de monitoreo: qué revisar en el servidor de MU
| Servicio | Qué verificar | Señal de falla |
|---|---|---|
| GameServer | Proceso activo y puerto escuchando (por ejemplo, 55901) | Proceso muerto o puerto cerrado |
| MySQL/MariaDB | Conexión y respuesta a una consulta simple (SELECT 1) | Timeout o error de conexión |
| ConnectServer | Puerto de entrada (por ejemplo, 44405) respondiendo | Puerto cerrado |
| Sitio/panel | HTTP 200 en la home y en la página de login | Estado distinto de 200 o timeout |
| Uso de RAM/CPU del host | Porcentaje por encima del umbral (por ejemplo, 90%) | Recurso saturado, riesgo de caída inminente |
| Espacio en disco | Porcentaje libre por debajo del umbral (por ejemplo, 10%) | Log o backup llenando el disco |
Script de verificación en Bash (Linux)
Un script simple, ejecutado por cron cada minuto, cubre la mayoría de los casos:
#!/bin/bash
# monitor_mu.sh
TOKEN="123456789:ABCdefGhIJKlmNoPQRsTUvwxYZ"
CHAT_ID="-1001234567890"
STATE_FILE="/tmp/mu_monitor_state"
send_alert() {
local message="$1"
curl -s -X POST "https://api.telegram.org/bot${TOKEN}/sendMessage" \
-d chat_id="${CHAT_ID}" \
-d text="${message}" \
-d parse_mode="Markdown" > /dev/null
}
check_process() {
local name="$1"
local proc="$2"
if ! pgrep -f "${proc}" > /dev/null; then
if ! grep -q "${name}_DOWN" "${STATE_FILE}" 2>/dev/null; then
send_alert "🔴 *ALERTA*: ¡${name} se cayó en el servidor!"
echo "${name}_DOWN" >> "${STATE_FILE}"
fi
else
if grep -q "${name}_DOWN" "${STATE_FILE}" 2>/dev/null; then
send_alert "🟢 *RECUPERADO*: ${name} volvió a la normalidad."
sed -i "/${name}_DOWN/d" "${STATE_FILE}"
fi
fi
}
check_process "GameServer" "GameServer"
check_process "ConnectServer" "ConnectServer"
check_process "MySQL" "mysqld"
Guárdalo como /opt/scripts/monitor_mu.sh, dale permiso de ejecución (chmod +x) y agéndalo en el cron:
* * * * * /opt/scripts/monitor_mu.sh
Monitoreando el sitio y el panel
Para verificar disponibilidad HTTP, agrega una función equivalente usando curl con verificación del código de estado:
check_http() {
local name="$1"
local url="$2"
local status
status=$(curl -s -o /dev/null -w "%{http_code}" --max-time 10 "${url}")
if [ "${status}" != "200" ]; then
send_alert "🔴 *ALERTA*: ${name} respondió con estado ${status} (se esperaba 200)."
fi
}
check_http "Sitio principal" "https://www.viciadosmu.com.br"
check_http "Panel de login" "https://www.viciadosmu.com.br/login"
Evitando la fatiga de alertas con cooldown
Enviar una alerta cada minuto mientras el servicio está caído vuelve el canal inútil rápidamente — el equipo termina silenciando las notificaciones. El patrón usado en el script anterior (archivo de estado STATE_FILE) resuelve esto: la alerta solo se reenvía cuando el estado cambia (de "arriba" a "abajo" o viceversa), no en cada ejecución del cron. Para casos que requieren recordatorios periódicos durante incidentes largos, agrega un segundo timestamp que dispare un "recordatorio" cada 30 minutos mientras el servicio permanezca caído.
Escalamiento por severidad
No toda alerta tiene la misma urgencia. Sepáralas por nivel de severidad para no mezclar una alerta de "disco 85% lleno" con "GameServer se cayó":
| Nivel | Ejemplo | Acción sugerida |
|---|---|---|
| Crítico | GameServer, ConnectServer o MySQL se cayeron | Envío inmediato + mención a todos (@all en el grupo, si está soportado) |
| Alto | Sitio caído, latencia alta | Envío inmediato al grupo |
| Atención | Disco por encima de 80%, RAM por encima de 85% | Envío único diario, sin repetición |
| Informativo | Backup completado, deploy realizado | Canal separado, sin push urgente |
Crea grupos o temas separados en Telegram por nivel, para que las alertas críticas no se pierdan entre mensajes informativos de rutina.
Probando el sistema antes de confiar en él
Nunca confíes en un sistema de alertas que nunca se ha disparado a propósito. Haz una prueba controlada: detén manualmente el GameServer en un horario de bajo movimiento (systemctl stop gameserver o kill en el proceso), confirma que la alerta llega a Telegram en menos de 1 minuto, vuelve a levantar el servicio y confirma que la alerta de "recuperado" también se dispara. Repite la prueba para MySQL y para el sitio, simulando la caída de cada uno de forma aislada.
Integrando con logs específicos del emulador
Además de procesos y puertos, muchos emuladores generan archivos de log con errores específicos (falla de autenticación masiva, error de conexión con la base de cuentas, excepciones no controladas). Un tail -F combinado con grep en un bucle puede disparar alertas cuando aparezcan patrones de error conocidos:
tail -F /home/mu/GameServer/Log/error.log | while read -r line; do
if echo "${line}" | grep -qi "database connection failed"; then
send_alert "⚠️ El log del GameServer reportó una falla de conexión con la base de datos."
fi
done
Corre este bucle como un servicio systemd separado, no dentro del cron principal, ya que se mantiene en ejecución continua.
Buenas prácticas de seguridad del bot
Nunca dejes el token del bot en un repositorio público ni en un script accesible vía URL del sitio. Trátalo como una credencial: guárdalo en una variable de entorno o en un archivo con permisos restringidos (chmod 600). Si el token se filtra, revócalo de inmediato desde BotFather (/revoke) y genera uno nuevo, actualizando todos los scripts que lo utilicen.
Errores comunes y soluciones
| Síntoma | Causa probable | Solución |
|---|---|---|
| El bot no envía mensajes | Token o chat_id incorrectos | Confirma el token en BotFather y el chat_id vía getUpdates |
| Alertas duplicadas cada minuto | Falta de control de estado (cooldown) | Implementa un archivo de estado para no repetir la misma alerta |
| La alerta no llega durante una caída real | El cron no está corriendo o el script se colgó | Verifica crontab -l y los logs del cron; agrega monitoreo del propio monitor |
| El mensaje llega cortado o sin formato | parse_mode incompatible con los caracteres usados | Escapa los caracteres especiales de Markdown o usa HTML como parse_mode |
| Token expuesto públicamente | Script confirmado en un repositorio público | Revoca el token en BotFather y mueve las credenciales a una variable de entorno |
Lista de verificación de implementación de las alertas
- Bot creado en BotFather y token almacenado de forma segura.
- Grupo de Telegram creado con los administradores y chat_id identificado.
- Script de verificación de procesos (GameServer, ConnectServer, MySQL) agendado en el cron.
- Verificación HTTP del sitio y panel configurada.
- Cooldown/estado implementado para evitar la fatiga de alertas.
- Niveles de severidad definidos y separados por canal/tema.
- Prueba controlada de caída y recuperación realizada para cada servicio.
- Monitoreo del propio monitor (watchdog) configurado.
Con las alertas corriendo de forma confiable, el siguiente paso es conectar este monitoreo con la rutina general de operación del servidor descrita en el tutorial de cómo crear un servidor de MU Online, garantizando que infraestructura, juego y comunidad estén todos cubiertos por el mismo proceso de respuesta a incidentes.
Preguntas frecuentes
¿Necesito pagar para usar un bot de Telegram para alertas?
No, la API de bots de Telegram es gratuita y no tiene un límite práctico de uso para el volumen de alertas de un servidor de MU. El único costo es el servidor/VPS que corre el script de monitoreo, que generalmente ya existe en tu infraestructura.
¿Cuál es la diferencia entre monitorear vía Telegram y usar un servicio como UptimeRobot?
Servicios como UptimeRobot verifican desde afuera si el puerto/sitio responde, lo cual es ideal para disponibilidad externa. Un script propio corriendo dentro del servidor puede revisar cosas específicas de MU, como procesos colgados, uso de RAM del GameServer o fallas de replicación de MySQL, que un monitor externo genérico no detecta.
¿El bot puede avisar a varios administradores al mismo tiempo?
Sí, puedes enviar el mismo mensaje a un grupo de Telegram con todos los admins, o a múltiples chat_id individuales. Los grupos son más simples de mantener porque no requieren actualizar la lista de destinatarios en el script cada vez que alguien entra o sale del equipo.
¿Cómo evito quedar inundado de alertas repetidas durante una caída prolongada?
Implementa un cooldown (por ejemplo, no reenviar la misma alerta durante 15 minutos) y una alerta de 'recuperado' cuando el servicio vuelva. Esto evita la fatiga de alertas, que ocurre cuando el admin empieza a ignorar las notificaciones por exceso de ruido.
¿Se puede integrar este sistema con el panel del juego (IGCN, MuEMU) directamente?
Sí, si el panel expone alguna API o log de errores, puedes leer esos archivos/endpoints en el mismo script de monitoreo y disparar alertas específicas, como caída de conexión con la base de cuentas o error de autenticación masivo.