O maior portal de MU Online do Brasil — desde 2003
Tutorial Intermediário Infra

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.

RO Rodrigo · Atualizado em 17 jul 2013 · ⏱ 13 min de leitura
Resposta rápida

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

ComponenteO que checarPor quê
ConnectServerPorta TCP aberta (geralmente 44405)É o primeiro ponto de contato do cliente
GameServerPorta TCP aberta (varia por servidor, ex. 55901+)Sem isso o jogador não entra no mundo
Banco de dadosConexão bem-sucedida e tempo de respostaJogo pode "parecer" online mas travar no login
Site/lojaResposta HTTP 200 na home e no checkoutLoja fora do ar impacta receita diretamente
LatênciaTempo de resposta médio das portas acimaDetecta 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

SintomaCausa provávelSolução
Status page também cai junto com o servidorHospedada no mesmo VPS monitoradoHospedar em provedor separado ou usar serviço de terceiros
Contagem de jogadores online sempre zeradaQuery errada ou coluna ConnectStat com valor diferente do esperadoValidar a query direto no banco e ajustar a condição
Notificação de queda chega atrasadaIntervalo de checagem longo demaisReduzir intervalo do cron/monitoramento para 1 minuto
Falso positivo de queda (flapping)Timeout de conexão curto demais, latência normal sendo lida como falhaAumentar timeout e exigir 2-3 falhas consecutivas antes de registrar incidente
Histórico de incidentes não fecha automaticamenteFalta de checagem de recuperação após quedaImplementar registrarRecuperacao() disparado pela mesma rotina de checagem
Página não atualiza em tempo realCache do navegador ou intervalo de polling não configuradoAjustar 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.

RO
Fundador e editor-chefe

Rodrigo mantém o ViciadosMU desde os primórdios do portal. Especialista em criação e administração de servidores de MU Online, história do jogo e a evolução das seasons — escreveu boa parte do acervo antes de 2024.

Continue lendo

Artigos relacionados