Como Criar o Website do Seu Servidor de MU Online do Zero
Guia completo para criar o website do seu servidor MU Online: instalação do stack web, integração com banco de dados SQL Server e configuração de painel.
Visão Geral
Criar o website do seu servidor de MU Online é uma etapa fundamental para oferecer aos jogadores um ponto centralizado de registro de contas, ranking, informações de eventos e suporte. Este guia cobre a instalação completa do stack web, integração com o banco de dados SQL Server do MuServer e configuração de funcionalidades essenciais.
MuOnline). Adapte os caminhos e versões conforme o seu ambiente.Pré-requisitos
Antes de começar, certifique-se de ter:
- Windows Server 2008 R2 ou superior (ou Windows 10/11 para testes locais)
- SQL Server 2012 ou superior com o banco
MuOnlinejá criado pelo MuServer - Acesso de administrador ao servidor
- Um domínio ou IP público apontado para o servidor (para produção)
Passo 1 — Instalar o IIS e o PHP
1.1 Abra o Gerenciador do Servidor → Adicionar Funções e Recursos → selecione Servidor Web (IIS).
Marque os componentes adicionais:
- CGI (necessário para PHP via FastCGI)
- Autenticação Básica
- Compactação de Conteúdo Estático e Dinâmico
- Reescrita de URL (URL Rewrite Module — baixe separado no site da Microsoft)
1.2 Baixe o PHP 8.1 (Non-Thread-Safe, x64) em https://windows.php.net/download/ e extraia para C:\PHP\.
1.3 Renomeie C:\PHP\php.ini-production para C:\PHP\php.ini e edite as seguintes linhas:
; C:\PHP\php.ini — configurações essenciais para MU website
extension_dir = "C:\PHP\ext"
extension=pdo_sqlsrv ; driver para SQL Server
extension=sqlsrv ; alternativa para SQL Server
extension=mbstring
extension=openssl
extension=curl
extension=gd
date.timezone = "America/Sao_Paulo"
upload_max_filesize = 10M
post_max_size = 10M
max_execution_time = 60
1.4 Configure o IIS para usar o PHP como handler FastCGI:
Abra o Gerenciador do IIS → site padrão → Mapeamentos de Manipulador → Adicionar Mapeamento de Módulo:
Caminho de solicitação: *.php
Módulo: FastCgiModule
Executável: C:\PHP\php-cgi.exe
Nome: PHP_via_FastCGI
Passo 2 — Criar a Estrutura de Diretórios do Website
Defina a raiz do site como C:\inetpub\muweb\ e crie a estrutura abaixo:
C:\inetpub\muweb\
├── index.php
├── register.php
├── ranking.php
├── events.php
├── admin\
│ ├── index.php
│ └── players.php
├── assets\
│ ├── css\
│ ├── js\
│ └── img\
├── includes\
│ ├── db.php ← conexão com SQL Server
│ ├── functions.php
│ └── config.php
└── web.config ← regras de reescrita do IIS
Crie o diretório e aplique permissões via PowerShell:
New-Item -ItemType Directory -Path "C:\inetpub\muweb\includes"
New-Item -ItemType Directory -Path "C:\inetpub\muweb\admin"
New-Item -ItemType Directory -Path "C:\inetpub\muweb\assets\css"
# Permissão de leitura para o IIS_IUSRS
icacls "C:\inetpub\muweb" /grant "IIS_IUSRS:(OI)(CI)R" /T
Passo 3 — Configurar a Conexão com o Banco de Dados SQL Server
Edite o arquivo C:\inetpub\muweb\includes\config.php:
<?php
// includes/config.php — configuração central do website MU
define('DB_HOST', '127.0.0.1'); // IP do SQL Server (localhost ou IP externo)
define('DB_NAME', 'MuOnline'); // nome padrão do banco do MuServer
define('DB_USER', 'mu_web'); // usuário SQL com permissão limitada
define('DB_PASS', 'SuaSenhaAqui');
define('DB_PORT', 1433);
define('SITE_NAME', 'Meu Servidor MU');
define('SITE_URL', 'http://seudominio.com');
define('MAX_CHARS', 4); // personagens por conta
define('SERVER_VERSION', 'Season 6 Episódio 3');
Crie o arquivo de conexão C:\inetpub\muweb\includes\db.php:
<?php
// includes/db.php — conexão PDO com SQL Server
require_once __DIR__ . '/config.php';
try {
$dsn = sprintf(
'sqlsrv:Server=%s,%d;Database=%s;TrustServerCertificate=1',
DB_HOST, DB_PORT, DB_NAME
);
$pdo = new PDO($dsn, DB_USER, DB_PASS, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::SQLSRV_ATTR_ENCODING => PDO::SQLSRV_ENCODING_UTF8,
]);
} catch (PDOException $e) {
die('Erro de conexão com o banco de dados: ' . $e->getMessage());
}
sa para conexões web. Crie um usuário SQL com permissões restritas apenas às tabelas necessárias. Execute no SQL Server Management Studio: CREATE LOGIN mu_web WITH PASSWORD='SuaSenhaAqui'; USE MuOnline; CREATE USER mu_web FOR LOGIN mu_web; GRANT SELECT, INSERT ON MEMB_INFO TO mu_web;Passo 4 — Criar o Sistema de Registro de Contas
A tabela principal de contas no MuServer Season 6 é MEMB_INFO no banco MuOnline. Estrutura relevante:
-- Colunas principais da tabela MEMB_INFO (Season 6)
-- memb__id varchar(10) -- login (máx 10 chars)
-- memb__pw varchar(10) -- senha (plain text no S6 padrão)
-- memb_name varchar(10) -- nome do membro
-- memb_guid int -- ID único (identity)
-- mail_addr varchar(60) -- e-mail
-- bloc_code tinyint -- 0=ativo, 1=bloqueado
-- ctl1_code tinyint -- nível de conta (0=jogador, 255=GM)
Crie o arquivo C:\inetpub\muweb\register.php:
<?php
require_once 'includes/db.php';
require_once 'includes/functions.php';
$erro = '';
$sucesso = false;
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$login = trim($_POST['login'] ?? '');
$senha = trim($_POST['senha'] ?? '');
$email = trim($_POST['email'] ?? '');
$nome = trim($_POST['nome'] ?? '');
// Validações básicas
if (!preg_match('/^[a-zA-Z0-9]{4,10}$/', $login)) {
$erro = 'Login deve ter entre 4 e 10 caracteres alfanuméricos.';
} elseif (strlen($senha) < 4 || strlen($senha) > 10) {
$erro = 'Senha deve ter entre 4 e 10 caracteres.';
} elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$erro = 'E-mail inválido.';
} else {
// Verificar se o login já existe
$stmt = $pdo->prepare("SELECT COUNT(*) FROM MEMB_INFO WHERE memb__id = ?");
$stmt->execute([$login]);
if ($stmt->fetchColumn() > 0) {
$erro = 'Este login já está em uso.';
} else {
// Inserir nova conta
$stmt = $pdo->prepare("
INSERT INTO MEMB_INFO
(memb__id, memb__pw, memb_name, mail_addr, bloc_code, ctl1_code)
VALUES
(?, ?, ?, ?, 0, 0)
");
$stmt->execute([$login, $senha, $nome, $email]);
$sucesso = true;
}
}
}
?>
memb__pw no banco e adapte a inserção: $senha = md5($_POST['senha']);Passo 5 — Criar a Página de Ranking
O ranking de personagens usa a tabela Character no banco MuOnline:
<?php
// ranking.php — top 10 personagens por resets e level
require_once 'includes/db.php';
$stmt = $pdo->query("
SELECT TOP 10
Name AS nome,
Class AS classe,
cLevel AS nivel,
Resets AS resets,
PkCount AS pks,
GuildName AS guild
FROM Character
ORDER BY Resets DESC, cLevel DESC
");
$ranking = $stmt->fetchAll();
Para exibir o nome da classe em vez do código numérico, use esta função auxiliar:
// includes/functions.php
function nomeClasse(int $codigo): string {
$classes = [
0 => 'Dark Wizard', 1 => 'Soul Master',
16 => 'Dark Knight', 17 => 'Blade Knight',
32 => 'Fairy Elf', 33 => 'Muse Elf',
48 => 'Magic Gladiator',
64 => 'Dark Lord',
80 => 'Summoner',
96 => 'Rage Fighter',
];
return $classes[$codigo] ?? "Classe $codigo";
}
Passo 6 — Configurar o web.config para URL Amigáveis
Crie C:\inetpub\muweb\web.config:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="PHP sem extensao" stopProcessing="true">
<match url="^([^.]+)$" />
<conditions>
<add input="{REQUEST_FILENAME}.php" matchType="IsFile" />
</conditions>
<action type="Rewrite" url="{R:1}.php" />
</rule>
</rules>
</rewrite>
<defaultDocument>
<files>
<add value="index.php" />
</files>
</defaultDocument>
</system.webServer>
</configuration>
Passo 7 — Configurar Permissões SQL Server para o Usuário Web
Execute no SQL Server Management Studio (SSMS) com o usuário sa:
-- Criar login e usuario para o website
USE [master];
CREATE LOGIN [mu_web] WITH PASSWORD = 'SuaSenhaSegura123!',
DEFAULT_DATABASE = [MuOnline],
CHECK_EXPIRATION = OFF,
CHECK_POLICY = OFF;
USE [MuOnline];
CREATE USER [mu_web] FOR LOGIN [mu_web];
-- Permissoes minimas necessarias
GRANT SELECT ON [dbo].[MEMB_INFO] TO [mu_web];
GRANT INSERT ON [dbo].[MEMB_INFO] TO [mu_web];
GRANT SELECT ON [dbo].[Character] TO [mu_web];
GRANT SELECT ON [dbo].[Guild] TO [mu_web];
GRANT SELECT ON [dbo].[GuildMember] TO [mu_web];
-- Negar acesso a tabelas sensiveis
DENY SELECT ON [dbo].[WAREHOUSE] TO [mu_web];
DENY SELECT ON [dbo].[AccountCharacter] TO [mu_web];
Solução de Problemas Comuns
Erro "Could not find driver" ao conectar com SQL Server
Verifique se os drivers PDO do SQL Server estão instalados. Baixe os Microsoft Drivers for PHP for SQL Server em https://learn.microsoft.com/en-us/sql/connect/php/ e coloque os arquivos .dll em C:\PHP\ext\. Confirme que php.ini tem as linhas extension=sqlsrv e extension=pdo_sqlsrv sem ponto e vírgula no início.
Página em branco após configurar o PHP
Ative a exibição de erros temporariamente em C:\PHP\php.ini:
display_errors = On
error_reporting = E_ALL
Reinicie o IIS com iisreset no prompt de comando e recarregue a página.
Personagens não aparecem no ranking
Confirme que a tabela Character existe no banco MuOnline e que o usuário mu_web tem permissão de SELECT. Execute no SSMS:
SELECT TOP 5 Name, cLevel, Resets FROM MuOnline.dbo.Character;
C:\xampp\, coloque os arquivos do site em C:\xampp\htdocs\muweb\ e configure a extensão php_sqlsrv.dll no C:\xampp\php\php.ini para conectar ao SQL Server local.Perguntas frequentes
Qual stack web é recomendado para servidores MU Online?
Para iniciantes, o XAMPP com PHP 7.4 e MySQL é o mais simples. Para servidores Season 6 com SQL Server, prefira o webEngineNET (ASP.NET + IIS) pois ele já possui conectores nativos para MSSQL e templates prontos para MU.
É possível usar MySQL em vez de SQL Server?
Sim, mas exige adaptação das queries. A maioria das estruturas de tabelas do MuServer usam tipos específicos do SQL Server (smalldatetime, tinyint). Se usar MySQL, converta os tipos e ajuste as stored procedures manualmente.
Como proteger o painel de administração do website?
Coloque o diretório /admin fora da raiz pública do servidor web, use HTTPS com certificado SSL (Let's Encrypt), implemente autenticação de dois fatores e restrinja acesso por IP no IIS ou no .htaccess do Apache.
O registro de contas no website cria o personagem automaticamente?
Não. O registro cria apenas o registro na tabela MEMB_INFO do banco MuOnline. O personagem é criado pelo próprio cliente do jogo após o primeiro login, na tela de seleção de personagens.