Como criar um servidor de Tibia (OTServ) no Linux com TFS

Guia prático pra subir um OTServ baseado em The Forgotten Server (TFS) no Ubuntu Linux: dependências, compilação, MySQL, login e firewall.

Subir um servidor próprio de Tibia (OTServ) é um projeto que mistura compilação de C++, configuração de banco MySQL, scripting Lua e gestão de rede em Linux. Este guia foca em colocar um servidor baseado no The Forgotten Server (TFS) 1.5 rodando do zero em uma VPS Ubuntu 24.04 LTS, do clone do repositório até o cliente conectando.

A persona deste tutorial é o owner novo de OTServ que tem familiaridade básica com linha de comando Linux e quer um servidor de testes funcional antes de customizar mapas, sprites e scripts. O caminho é: instalar dependências, compilar o TFS, configurar o MySQL, ajustar config.lua e abrir as portas no firewall. Em hardware razoável, o procedimento inteiro leva entre 30 e 45 minutos.

Não vamos cobrir customização de mapa (RME), criação de scripts Lua ou setup de login server compartilhado pra OT-list — esses são tópicos pra tutoriais dedicados. O foco aqui é o caminho mínimo viável pra ter um servidor que aceita conexões reais.

Pré-requisitos

Pré-requisitos

Ubuntu 24.04 LTS (ou Debian 12) com acesso sudo, no mínimo 2 GB de RAM, 10 GB de disco livre e IP público estável. SSH funcionando, firewall UFW disponível e portas 7171/7172 TCP liberáveis no provedor.

Sistema Ubuntu 24.04 LTS
RAM mínima 2 GB
Portas TCP 7171 + 7172
Cliente alvo Tibia 8.60

Confirme que está logado como usuário com sudo e atualize o índice de pacotes antes de começar:

sudo apt update && sudo apt upgrade -y

Instalação das dependências de compilação

O TFS 1.5 é escrito em C++17 e usa Boost, LuaJIT (ou Lua 5.4), MySQL client lib, PugiXML e CryptoPP. Você precisa de todos eles, mais o toolchain GCC e o CMake pra gerar os arquivos de build.

01

Instale o toolchain de compilação e bibliotecas de desenvolvimento:

sudo apt install -y build-essential cmake git
sudo apt install -y libluajit-5.1-dev libmariadb-dev libboost-system-dev \
  libboost-iostreams-dev libboost-filesystem-dev libboost-date-time-dev \
  libpugixml-dev libcrypto++-dev libfmt-dev

build-essential traz GCC, G++ e make. As libboost-*-dev são os módulos do Boost que o TFS realmente usa — instalar libboost-all-dev funciona mas baixa ~300 MB desnecessários.

02

Crie um usuário dedicado pra rodar o servidor (boa prática de isolamento):

sudo adduser --disabled-password --gecos "" otserv
sudo usermod -aG sudo otserv

A flag --disabled-password bloqueia login por senha — você acessa via sudo -iu otserv a partir do seu usuário principal.

Clone e compilação do TFS

Com as dependências instaladas, baixe o código-fonte e gere o binário.

03

Mude pro usuário otserv e clone o repositório oficial:

sudo -iu otserv
cd ~
git clone --depth 1 https://github.com/otland/forgottenserver.git tfs
cd tfs

A flag --depth 1 baixa só o último commit (em vez do histórico inteiro, que tem centenas de MB). Se você precisar contribuir de volta ao projeto, faça um clone completo depois.

04

Gere o projeto com CMake e compile usando todos os núcleos disponíveis:

mkdir build && cd build
cmake ..
make -j$(nproc)

nproc retorna o número de threads de CPU — em uma VPS com 4 vCPUs, isso paraleliza a build em 4 jobs. A compilação demora entre 3 e 10 minutos dependendo do hardware. Ao terminar, o binário tfs aparece em ~/tfs/build/.

Erro de memória ao compilar

Em VPS com menos de 2 GB de RAM, make -j$(nproc) pode estourar memória durante a compilação de arquivos pesados. Se você ver internal compiler error: Killed (program cc1plus), refaça com make -j1 (compilação serial, mais lenta mas estável).

Configuração do banco MySQL

O TFS persiste contas, personagens, casas, guildas e itens em um banco relacional. MariaDB é a implementação padrão no Ubuntu.

05

Saia do usuário otserv (voltando pro seu shell com sudo) e instale o servidor MySQL:

exit
sudo apt install -y mariadb-server
sudo mysql_secure_installation

mysql_secure_installation é um wizard interativo: defina senha root forte, remova usuários anônimos, bloqueie login remoto de root e remova o database test. Aceite tudo com Y.

06

Crie o database e o usuário do OTServ:

sudo mariadb

Dentro do prompt MySQL:

CREATE DATABASE forgottenserver CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'otserv'@'localhost' IDENTIFIED BY 'TROQUE_ESTA_SENHA';
GRANT ALL PRIVILEGES ON forgottenserver.* TO 'otserv'@'localhost';
FLUSH PRIVILEGES;
EXIT;

Substitua TROQUE_ESTA_SENHA por uma senha forte (mínimo 16 caracteres aleatórios — use openssl rand -base64 24 pra gerar uma).

07

Importe o schema inicial do TFS:

sudo -iu otserv
cd ~/tfs
mariadb -u otserv -p forgottenserver < schema.sql

O arquivo schema.sql está na raiz do repositório clonado e cria todas as tabelas necessárias (accounts, players, houses, guilds, etc).

Configuração do servidor

Com o banco pronto, ajuste o config.lua pra apontar pras credenciais corretas e definir parâmetros do mundo.

08

Copie o template de configuração:

cd ~/tfs
cp config.lua.dist config.lua
nano config.lua

Ajuste estes campos essenciais:

ip = "0.0.0.0"
mysqlHost = "127.0.0.1"
mysqlUser = "otserv"
mysqlPass = "TROQUE_ESTA_SENHA"
mysqlDatabase = "forgottenserver"
mysqlPort = 3306
loginProtocolPort = 7171
gameProtocolPort = 7172
statusProtocolPort = 7171
serverName = "Meu OTServ"
worldType = "pvp"

ip = "0.0.0.0" faz o TFS escutar em todas as interfaces — necessário pra aceitar conexões externas. Se você prefere restringir a uma interface específica, coloque o IP público da VPS.

Senha em texto puro

O config.lua guarda a senha do MySQL em texto puro. Garanta que as permissões do arquivo são restritas: chmod 600 config.lua. Nunca commite esse arquivo em repositório público (adicione no .gitignore).

Liberação do firewall e primeiro start

O TFS usa duas portas TCP: 7171 pro login (autenticação e seleção de personagem) e 7172 pro game (movimentação, chat, combate em tempo real).

09

Volte pro seu usuário com sudo e libere as portas no UFW:

exit
sudo ufw allow 7171/tcp
sudo ufw allow 7172/tcp
sudo ufw reload
sudo ufw status

Se o UFW estiver inativo (Status: inactive), ative com sudo ufw enable — mas antes confirme que a porta 22 (SSH) está liberada, senão você se tranca fora.

10

Inicie o servidor pra validar:

sudo -iu otserv
cd ~/tfs/build
./tfs

Se tudo deu certo, você vê algo como:

The Forgotten Server - Version 1.5
>> Loading config
>> Establishing database connection... MySQL 10.11.x
>> Running database manager
>> Loading vocations
>> Loading items
>> Loading script systems
>> Loading monsters
>> Loading map
>> Loaded map
>> Loaded all modules, server starting up...
>> A server has been started on 0.0.0.0:7171.

Verificação

Em outra máquina (ou no seu próprio desktop), abra um terminal e teste conectividade:

telnet SEU_IP_DA_VPS 7171

Se você ver Connected to ... e o terminal travar esperando input, a porta está aberta e o TFS está escutando. Aperte Ctrl+] e digite quit pra sair.

Pra teste real com cliente Tibia 8.60, ajuste o arquivo Tibia.dat/Tibia.spr da pasta do cliente pra apontar pro seu IP em vez do login.tibia.com oficial — ferramentas como OTClient permitem fazer isso pelo init.lua.

Resolução de problemas

MySQL connection failed

Se o TFS imprime MySQL connection failure!, cheque três coisas:

  1. O serviço está rodando: sudo systemctl status mariadb
  2. Credenciais batem: tente login manual com mariadb -u otserv -p forgottenserver
  3. mysqlHost no config.lua é 127.0.0.1, não localhost (em alguns setups o socket Unix falha mas o TCP funciona)

Port already in use

Erro bind: Address already in use na porta 7171 significa que outro processo está usando. Identifique com:

sudo ss -tulpn | grep 7171

Se for uma instância antiga do TFS, mate com pkill tfs e tente de novo.

Cliente conecta mas não passa do login

O cliente conecta na 7171 (login) mas falha ao mover pra 7172 (game). Quase sempre é firewall bloqueando 7172 enquanto 7171 está aberta — refaça o sudo ufw status e libere a porta que faltar. Se o servidor está atrás de NAT (não é caso comum em VPS), redirecione ambas as portas.

Próximos passos

  • Configure o TFS pra rodar como serviço systemd em vez de processo manual — facilita restart automático em queda
  • Edite scripts Lua em data/scripts/ pra customizar quests, NPCs e eventos
  • Use o RME (Remere’s Map Editor) no Windows pra editar data/world/forgottenserver.otbm
  • Configure backups automáticos diários do banco com mysqldump no cron
  • Se você está colocando isso em produção pra jogadores reais, uma VPS Hostini já vem com IPv4 fixo, proteção DDoS e disco NVMe — eliminando os três problemas de rede mais comuns em hospedagem doméstica.

Perguntas frequentes

Qual versão do TFS devo usar pra um OTServ novo?

A linha 1.5 do The Forgotten Server (branch master no GitHub) é a mais usada hoje em servidores customizados e roda em clients 8.60 com ajustes. Se você precisa de cliente mais antigo (7.4, 7.72), procure forks específicos como TFS 0.x ou OTX — eles têm requisitos de compilação diferentes.

Quanta RAM um OTServ pequeno consome?

Um servidor TFS 1.5 com até 100 jogadores online estabiliza entre 400 MB e 1 GB de RAM, dependendo do mapa e quantidade de scripts Lua ativos. O MySQL adiciona mais 200-400 MB. Pra começar com folga, 2 GB de RAM são suficientes.

Posso rodar o OTServ direto como root?

Tecnicamente sim, mas é má prática. Crie um usuário dedicado (ex.: otserv) e rode o binário com ele. Se um exploit no servidor for explorado, o atacante fica restrito ao escopo desse usuário em vez de comprometer o sistema inteiro.

Por que meu cliente Tibia não conecta mesmo com o servidor rodando?

As três causas mais comuns são: firewall bloqueando 7171/7172 (verifique com sudo ufw status), IP do servidor errado em config.lua (campo ip), ou o login server caiu silenciosamente (cheque o log do tfs). Teste a porta de fora com telnet IP 7171 antes de mexer no cliente.

Como faço backup do banco do OTServ?

Use mysqldump pra exportar o schema e os dados: mysqldump -u otserv -p forgottenserver > backup.sql. Agende esse comando no cron diariamente e envie o backup pra outro disco ou storage externo. Restore com mysql -u otserv -p forgottenserver < backup.sql.

Preciso de IP dedicado pro OTServ?

Sim, ou pelo menos um endereço estável. O cliente Tibia se conecta direto no IP listado em config.lua e no login server — IP dinâmico residencial muda e derruba seus jogadores. Uma VPS resolve isso com IPv4 fixo.

Tópicos:
Próximos passos VPS, dedicado ou painel gerenciado para FiveM, SAMP, MTA, Tibia e mais.Hospede seu servidor de jogos com a Hostini →
Esse tutorial foi útil?
Falar no WhatsApp