Como criar uma status page pública para o seu servidor de MU Online
Monte uma status page pública para o seu servidor de MU Online, mostrando disponibilidade em tempo real, jogadores online, histórico de quedas e notificações automáticas de incidentes.
Servidores de MU Online caem — por manutenção, atualização, pico de conexões ou simplesmente um bug. O que diferencia um servidor profissional de um amador não é nunca cair, é como ele comunica isso. Uma status page pública, hospedada de forma independente do servidor principal, mostra em tempo real
Servidores de MU Online caem — por manutenção, atualização, pico de conexões ou simplesmente um bug. O que diferencia um servidor profissional de um amador não é nunca cair, é como ele comunica isso. Uma status page pública, hospedada de forma independente do servidor principal, mostra em tempo real se o ConnectServer e o GameServer estão no ar, quantos jogadores estão conectados, e mantém um histórico de incidentes transparente. Isso reduz drasticamente tickets de suporte perguntando "caiu?" e constrói confiança com a comunidade. Este tutorial mostra como montar essa página, desde o monitoramento de portas até notificações automáticas de incidentes.
Por que uma status page muda a percepção do jogador
Quando o servidor cai sem aviso, o jogador não sabe se é problema da conexão dele, se é queda temporária ou se o servidor "morreu de vez" (medo comum em comunidade de MU privado, dado o histórico de servidores abandonados). Uma status page pública elimina essa incerteza: o jogador confere em segundos, sem precisar perguntar a ninguém.
O que monitorar, no mínimo
| Componente | O que checar | Por quê |
|---|---|---|
| ConnectServer | Porta TCP aberta (geralmente 44405) | É o primeiro ponto de contato do cliente |
| GameServer | Porta TCP aberta (varia por servidor, ex. 55901+) | Sem isso o jogador não entra no mundo |
| Banco de dados | Conexão bem-sucedida e tempo de resposta | Jogo pode "parecer" online mas travar no login |
| Site/loja | Resposta HTTP 200 na home e no checkout | Loja fora do ar impacta receita diretamente |
| Latência | Tempo de resposta médio das portas acima | Detecta degradação antes da queda total |
Passo 1 — Escolher a arquitetura de monitoramento
Duas abordagens complementares:
- Serviço de terceiros (UptimeRobot, Better Uptime, StatusCake): monitora disponibilidade HTTP/porta de fora para dentro, com página de status pronta e alertas nativos. Rápido de configurar, independente da sua infraestrutura.
- Monitoramento próprio: um script que roda em outro servidor/VPS, checando as portas e o banco, alimentando uma página customizada com dados específicos do MU (jogadores online, mapa mais populoso).
A recomendação prática é combinar os dois: serviço de terceiros para a camada de disponibilidade "está no ar?", e página própria para os dados de jogo.
Passo 2 — Script de checagem de portas (ConnectServer/GameServer)
<?php
// monitor/checar_portas.php — roda em um servidor DIFERENTE do MuServer
function portaAberta(string $host, int $porta, float $timeout = 3.0): bool {
$conexao = @fsockopen($host, $porta, $errno, $errstr, $timeout);
if ($conexao) {
fclose($conexao);
return true;
}
return false;
}
$status = [
'connect_server' => portaAberta('seuservidor.com', 44405),
'game_server' => portaAberta('seuservidor.com', 55901),
'checado_em' => date('c'),
];
file_put_contents('/var/status/ultimo_status.json', json_encode($status));
# crontab no servidor de monitoramento
* * * * * php /opt/monitor/checar_portas.php
Passo 3 — Expor o número de jogadores online
Consulte o banco do MuServer (a partir de uma API própria, com usuário somente leitura) para contar conexões ativas:
<?php
// api/jogadores_online.php
$total = consultarQuery("SELECT COUNT(*) as total FROM MEMB_STAT WHERE ConnectStat = 1");
echo json_encode(['jogadores_online' => $total]);
Cuidado com o custo dessa query em bancos grandes — cacheie o resultado por 30-60 segundos em vez de consultar a cada requisição da página pública.
Passo 4 — Montar a página pública
<div class="status-page">
<h1>Status do Servidor</h1>
<div class="status-item">
<span class="dot" data-status="connect-server"></span> ConnectServer
</div>
<div class="status-item">
<span class="dot" data-status="game-server"></span> GameServer
</div>
<p id="jogadores-online">Carregando...</p>
<h2>Histórico de incidentes</h2>
<ul id="lista-incidentes"></ul>
</div>
async function atualizarStatus() {
const status = await fetch('/api/status.json').then(r => r.json());
document.querySelector('[data-status="connect-server"]').classList.toggle('online', status.connect_server);
document.querySelector('[data-status="game-server"]').classList.toggle('online', status.game_server);
const jogadores = await fetch('/api/jogadores_online.php').then(r => r.json());
document.getElementById('jogadores-online').textContent = `${jogadores.jogadores_online} jogadores online`;
}
setInterval(atualizarStatus, 30000);
atualizarStatus();
Passo 5 — Histórico de incidentes
Registre toda queda detectada (início e fim) em uma tabela própria, e exiba os últimos 30 dias na página — isso é o que diferencia uma status page profissional de um simples "bolinha verde/vermelha":
CREATE TABLE incidentes (
id INT AUTO_INCREMENT PRIMARY KEY,
componente VARCHAR(50),
inicio DATETIME,
fim DATETIME NULL,
descricao TEXT
);
function registrarQueda(string $componente) {
if (!existeIncidenteAberto($componente)) {
inserirIncidente($componente, date('Y-m-d H:i:s'));
}
}
function registrarRecuperacao(string $componente) {
fecharIncidenteAberto($componente, date('Y-m-d H:i:s'));
}
Passo 6 — Notificações automáticas de incidente
Dispare um webhook para o Discord assim que uma queda for detectada, e outro quando o serviço normalizar:
async function notificarDiscord(mensagem, cor) {
await fetch(process.env.DISCORD_WEBHOOK_STATUS, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
embeds: [{ title: 'Status do Servidor', description: mensagem, color: cor }],
}),
});
}
// uso: notificarDiscord('🔴 GameServer está fora do ar desde 21:04', 0xff0000);
Passo 7 — Hospedar a status page fora do servidor principal
Este é o ponto mais frequentemente ignorado: se a status page vive no mesmo VPS do jogo, uma queda total do VPS derruba a página junto, e o jogador fica sem nenhuma informação justamente no pior momento. Hospede a página em outro provedor (mesmo que seja um plano gratuito de hospedagem estática) ou use a própria página do serviço de uptime monitoring como página oficial de status.
Passo 8 — SLA e manutenções programadas
Anuncie manutenções programadas com antecedência diretamente na status page, marcando o período como "manutenção programada" em vez de deixar aparecer como incidente — isso evita alarme desnecessário na comunidade e demonstra organização.
Erros comuns e soluções
| Sintoma | Causa provável | Solução |
|---|---|---|
| Status page também cai junto com o servidor | Hospedada no mesmo VPS monitorado | Hospedar em provedor separado ou usar serviço de terceiros |
| Contagem de jogadores online sempre zerada | Query errada ou coluna ConnectStat com valor diferente do esperado | Validar a query direto no banco e ajustar a condição |
| Notificação de queda chega atrasada | Intervalo de checagem longo demais | Reduzir intervalo do cron/monitoramento para 1 minuto |
| Falso positivo de queda (flapping) | Timeout de conexão curto demais, latência normal sendo lida como falha | Aumentar timeout e exigir 2-3 falhas consecutivas antes de registrar incidente |
| Histórico de incidentes não fecha automaticamente | Falta de checagem de recuperação após queda | Implementar registrarRecuperacao() disparado pela mesma rotina de checagem |
| Página não atualiza em tempo real | Cache do navegador ou intervalo de polling não configurado | Ajustar headers de cache da API e revisar setInterval no front |
Checklist da status page
- Monitoramento de ConnectServer, GameServer, banco de dados e site configurado.
- Status page hospedada fora do servidor/VPS principal do jogo.
- Contagem de jogadores online exposta com cache adequado.
- Histórico de incidentes sendo registrado automaticamente (início e fim).
- Notificações automáticas configuradas (Discord/e-mail) para queda e recuperação.
- Manutenções programadas anunciadas com antecedência na página.
- Testes de falso positivo (flapping) realizados e ajustados.
- Link da status page visível no site principal e no Discord.
Com a transparência de disponibilidade resolvida, vale revisar o restante da infraestrutura do servidor para reduzir a frequência real das quedas, não só comunicá-las melhor — comece pelo guia de criação de servidor de MU Online para revisar a arquitetura de ponta a ponta.
Perguntas frequentes
Por que ter uma status page se eu já aviso no Discord quando o servidor cai?
Porque nem todo jogador está no Discord no momento da queda, e uma página pública é a fonte única de verdade, acessível sem precisar entrar em nenhum app. Ela também reduz o volume de tickets/perguntas repetidas do tipo 'o servidor caiu?'.
Preciso monitorar o quê, exatamente, além de 'ligado ou desligado'?
No mínimo: porta do ConnectServer, porta do GameServer, latência de resposta e disponibilidade do site/loja. Idealmente também o banco de dados, já que o jogo pode parecer 'no ar' mas travar no login por falha de banco.
Uma ferramenta pronta (tipo UptimeRobot) resolve, ou preciso construir algo próprio?
Ferramentas prontas resolvem bem o monitoramento de disponibilidade HTTP/porta e já têm página de status pronta. Para mostrar dados específicos do MU (jogadores online, nome do mapa mais populoso) você precisa complementar com uma página própria alimentada por uma API sua.
A status page pode ficar no mesmo servidor que estou monitorando?
Não é recomendado. Se o VPS principal cair por completo, a status page cai junto e o jogador não recebe nenhuma informação. O ideal é hospedar a status page em outro provedor ou usar um serviço de terceiros para a camada de disponibilidade.
Como faço para notificar automaticamente quando o servidor cai?
Configure o monitoramento para disparar um webhook (Discord, e-mail, SMS) assim que detectar uma queda, e outro quando o serviço voltar. A maioria das ferramentas de uptime monitoring já suporta isso nativamente, sem precisar programar do zero.