Como configurar alertas de incidente via Telegram para o seu servidor de MU Online
Monte um sistema de alertas via bot do Telegram para ser avisado em segundos quando o GameServer, MySQL ou site do seu servidor de MU Online caírem, com scripts de monitoramento, escalonamento e teste de falha controlado.
Quando o GameServer cai às 3 da manhã e ninguém percebe até os jogadores começarem a reclamar no Discord, o custo não é só técnico — é reputacional, e em servidores monetizados, também financeiro (doações e eventos pagos interrompidos sem aviso). Um sistema de alertas via Telegram resolve esse ponto
Quando o GameServer cai às 3 da manhã e ninguém percebe até os jogadores começarem a reclamar no Discord, o custo não é só técnico — é reputacional, e em servidores monetizados, também financeiro (doações e eventos pagos interrompidos sem aviso). Um sistema de alertas via Telegram resolve esse ponto cego, avisando a equipe de administração em segundos, direto no celular, sem depender de alguém estar de olho em um painel. Este tutorial mostra como criar o bot, escrever os scripts de verificação dos serviços críticos do seu servidor de MU Online, configurar escalonamento e testar falhas de forma controlada antes de confiar no sistema em produção.
Por que Telegram e não e-mail ou SMS
E-mail tem atraso de entrega variável e frequentemente cai em spam quando enviado por script automatizado sem infraestrutura de SMTP reputada. SMS tem custo por mensagem e não escala bem para alertas frequentes. O Telegram, por outro lado, oferece uma API de bot gratuita, entrega quase instantânea via push notification no celular, e suporta grupos com múltiplos administradores recebendo o mesmo alerta simultaneamente — é o canal mais usado hoje por administradores de servidores privados justamente por essa combinação de custo zero e velocidade.
Criando o bot no Telegram
- Abra uma conversa com o @BotFather dentro do Telegram.
- Envie
/newbote siga as instruções, definindo um nome (ex.: "ViciadosMU Monitor") e um username terminado em "bot" (ex.:viciadosmu_monitor_bot). - O BotFather retorna um token no formato
123456789:ABCdefGhIJKlmNoPQRsTUvwxYZ— guarde-o com o mesmo cuidado de uma senha de banco de dados. - Crie um grupo do Telegram com os administradores e adicione o bot a esse grupo.
- Descubra o
chat_iddo grupo acessandohttps://api.telegram.org/bot<TOKEN>/getUpdatesdepois de enviar qualquer mensagem no grupo — ochat_iddo grupo aparece no JSON retornado (geralmente um número negativo).
Estrutura de monitoramento: o que checar no servidor de MU
| Serviço | O que verificar | Sinal de falha |
|---|---|---|
| GameServer | Processo ativo e porta escutando (ex.: 55901) | Processo morto ou porta fechada |
| MySQL/MariaDB | Conexão e resposta de query simples (SELECT 1) | Timeout ou erro de conexão |
| ConnectServer | Porta de entrada (ex.: 44405) respondendo | Porta fechada |
| Site/painel | HTTP 200 na home e na página de login | Status diferente de 200 ou timeout |
| Uso de RAM/CPU do host | Percentual acima de limiar (ex.: 90%) | Recurso saturado, risco de queda iminente |
| Espaço em disco | Percentual livre abaixo de limiar (ex.: 10%) | Log ou backup enchendo o disco |
Script de verificação em Bash (Linux)
Um script simples, rodado por cron a cada minuto, cobre a maior parte dos 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} caiu no servidor!"
echo "${name}_DOWN" >> "${STATE_FILE}"
fi
else
if grep -q "${name}_DOWN" "${STATE_FILE}" 2>/dev/null; then
send_alert "🟢 *RECUPERADO*: ${name} voltou ao normal."
sed -i "/${name}_DOWN/d" "${STATE_FILE}"
fi
fi
}
check_process "GameServer" "GameServer"
check_process "ConnectServer" "ConnectServer"
check_process "MySQL" "mysqld"
Salve como /opt/scripts/monitor_mu.sh, dê permissão de execução (chmod +x) e agende no cron:
* * * * * /opt/scripts/monitor_mu.sh
Monitorando o site e o painel
Para checar disponibilidade HTTP, adicione uma função equivalente usando curl com verificação de código de status:
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} respondeu com status ${status} (esperado 200)."
fi
}
check_http "Site principal" "https://www.viciadosmu.com.br"
check_http "Painel de login" "https://www.viciadosmu.com.br/login"
Evitando fadiga de alerta com cooldown
Enviar um alerta a cada minuto enquanto o serviço está fora do ar torna o canal inútil rapidamente — a equipe passa a silenciar as notificações. O padrão usado no script acima (arquivo de estado STATE_FILE) resolve isso: o alerta só é reenviado quando o estado muda (de "up" para "down" ou vice-versa), não a cada execução do cron. Para casos que exigem lembretes periódicos durante incidentes longos, adicione um segundo timestamp que dispara um "lembrete" a cada 30 minutos enquanto o serviço permanecer fora do ar.
Escalonamento por severidade
Nem todo alerta tem a mesma urgência. Separe por nível de severidade para não misturar um alerta de "disco 85% cheio" com "GameServer caiu":
| Nível | Exemplo | Ação sugerida |
|---|---|---|
| Crítico | GameServer, ConnectServer ou MySQL caíram | Envio imediato + menção a todos (@all no grupo, se suportado) |
| Alto | Site fora do ar, latência alta | Envio imediato para o grupo |
| Atenção | Disco acima de 80%, RAM acima de 85% | Envio único diário, sem repetição |
| Informativo | Backup concluído, deploy realizado | Canal separado, sem push urgente |
Crie grupos ou tópicos separados no Telegram por nível, para que alertas críticos não se percam entre mensagens informativas de rotina.
Testando o sistema antes de confiar nele
Nunca confie em um sistema de alertas que nunca disparou de propósito. Faça um teste controlado: pare manualmente o GameServer em um horário de baixo movimento (systemctl stop gameserver ou kill no processo), confirme que o alerta chega no Telegram em menos de 1 minuto, suba o serviço novamente e confirme que o alerta de "recuperado" também dispara. Repita o teste para o MySQL e para o site, simulando queda de cada um isoladamente.
Integrando com logs específicos do emulador
Além de processos e portas, muitos emuladores geram arquivos de log com erros específicos (falha de autenticação em massa, erro de conexão com o banco de contas, exceções não tratadas). Um tail -F combinado com grep em um loop pode disparar alertas quando padrões de erro conhecidos aparecerem:
tail -F /home/mu/GameServer/Log/error.log | while read -r line; do
if echo "${line}" | grep -qi "database connection failed"; then
send_alert "⚠️ Log do GameServer reportou falha de conexão com o banco."
fi
done
Rode esse loop como um serviço systemd separado, não dentro do cron principal, já que ele fica em execução contínua.
Boas práticas de segurança do bot
Nunca deixe o token do bot em um repositório público ou em um script acessível via URL do site. Trate-o como uma credencial: armazene em variável de ambiente ou arquivo com permissão restrita (chmod 600). Se o token vazar, revogue-o imediatamente pelo BotFather (/revoke) e gere um novo, atualizando todos os scripts que o utilizam.
Erros comuns e soluções
| Sintoma | Causa provável | Solução |
|---|---|---|
| Bot não envia mensagem | Token ou chat_id incorretos | Confirme o token no BotFather e o chat_id via getUpdates |
| Alertas duplicados a cada minuto | Falta de controle de estado (cooldown) | Implemente arquivo de estado para não repetir o mesmo alerta |
| Alerta não chega durante queda real | Cron não está rodando ou script travado | Verifique crontab -l e logs do cron; adicione monitoramento do próprio monitor |
| Mensagem chega cortada ou sem formatação | parse_mode incompatível com caracteres usados | Escape caracteres especiais do Markdown ou use HTML como parse_mode |
| Token exposto publicamente | Script commitado em repositório público | Revogue o token no BotFather e mova credenciais para variável de ambiente |
Checklist de implantação dos alertas
- Bot criado no BotFather e token armazenado com segurança.
- Grupo do Telegram criado com os administradores e chat_id identificado.
- Script de verificação de processos (GameServer, ConnectServer, MySQL) agendado no cron.
- Verificação HTTP do site e painel configurada.
- Cooldown/estado implementado para evitar fadiga de alerta.
- Níveis de severidade definidos e separados por canal/tópico.
- Teste controlado de queda e recuperação realizado para cada serviço.
- Monitoramento do próprio monitor (watchdog) configurado.
Com os alertas rodando de forma confiável, o próximo passo é conectar esse monitoramento à rotina geral de operação do servidor descrita no tutorial de como criar um servidor de MU Online, garantindo que infraestrutura, jogo e comunidade estejam todos cobertos pelo mesmo processo de resposta a incidentes.
Perguntas frequentes
Preciso pagar para usar bot do Telegram para alertas?
Não, a API de bots do Telegram é gratuita e não tem limite prático de uso para o volume de alertas de um servidor de MU. O único custo é o servidor/VPS que roda o script de monitoramento, que geralmente já existe na sua infraestrutura.
Qual a diferença entre monitorar via Telegram e usar um serviço como UptimeRobot?
Serviços como UptimeRobot verificam de fora se a porta/site responde, o que é ótimo para disponibilidade externa. Um script próprio rodando dentro do servidor pode checar coisas específicas do MU, como processos travados, uso de RAM do GameServer ou falhas de replicação do MySQL, que um monitor externo genérico não enxerga.
O bot consegue avisar authenticação de múltiplos administradores ao mesmo tempo?
Sim, você pode enviar a mesma mensagem para um grupo do Telegram com todos os admins, ou para múltiplos chat_id individuais. Grupos são mais simples de manter porque não exigem atualizar a lista de destinatários no script sempre que alguém entra ou sai da equipe.
Como evito ser inundado de alertas repetidos durante uma queda longa?
Implemente um cooldown (ex.: não reenviar o mesmo alerta por 15 minutos) e um alerta de 'recuperado' quando o serviço voltar. Isso evita fadiga de alerta, que é quando o admin passa a ignorar as notificações por excesso de ruído.
Dá para integrar esse sistema com o painel do jogo (IGCN, MuEMU) diretamente?
Sim, se o painel expõe alguma API ou log de erro, você pode ler esses arquivos/endpoints no mesmo script de monitoramento e disparar alertas específicos, como queda de conexão com o banco de contas ou erro de autenticação em massa.