Cómo crear un servidor de Tibia (OTServ) en Linux con TFS
Guía práctica para levantar un OTServ basado en The Forgotten Server (TFS) en Ubuntu Linux: dependencias, compilación, MySQL, login y firewall.
Levantar un servidor propio de Tibia (OTServ) es un proyecto que combina compilación de C++, configuración de base de datos MySQL, scripting Lua y gestión de red en Linux. Esta guía se enfoca en poner en marcha un servidor basado en The Forgotten Server (TFS) 1.5 desde cero en un VPS Ubuntu 24.04 LTS, desde el clonado del repositorio hasta la conexión del cliente.
La persona de este tutorial es el owner nuevo de OTServ que tiene familiaridad básica con la línea de comandos Linux y quiere un servidor de pruebas funcional antes de personalizar mapas, sprites y scripts. El camino es: instalar dependencias, compilar el TFS, configurar MySQL, ajustar config.lua y abrir los puertos en el firewall. En hardware razonable, el procedimiento entero toma entre 30 y 45 minutos.
No vamos a cubrir personalización de mapas (RME), creación de scripts Lua ni el setup de login server compartido para OT-list — esos son temas para tutoriales dedicados. El foco aquí es el camino mínimo viable para tener un servidor que acepte conexiones reales.
Prerrequisitos
Ubuntu 24.04 LTS (o Debian 12) con acceso sudo, mínimo 2 GB de RAM, 10 GB de disco libre e IP pública estable. SSH funcionando, firewall UFW disponible y puertos 7171/7172 TCP liberables en el proveedor.
Ubuntu 24.04 LTS 2 GB 7171 + 7172 Tibia 8.60 Confirma que estás logueado como usuario con sudo y actualiza el índice de paquetes antes de empezar:
sudo apt update && sudo apt upgrade -y
Instalación de las dependencias de compilación
TFS 1.5 está escrito en C++17 y usa Boost, LuaJIT (o Lua 5.4), librería cliente de MySQL, PugiXML y CryptoPP. Necesitas todos ellos, más el toolchain GCC y CMake para generar los archivos de build.
Instala el toolchain de compilación y las bibliotecas de desarrollo:
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-devbuild-essential trae GCC, G++ y make. Las libboost-*-dev son los módulos de Boost que TFS realmente usa — instalar libboost-all-dev funciona pero descarga ~300 MB innecesarios.
Crea un usuario dedicado para ejecutar el servidor (buena práctica de aislamiento):
sudo adduser --disabled-password --gecos "" otserv
sudo usermod -aG sudo otservLa flag --disabled-password bloquea el login por contraseña — accedes vía sudo -iu otserv desde tu usuario principal.
Clonado y compilación del TFS
Con las dependencias instaladas, descarga el código fuente y genera el binario.
Cambia al usuario otserv y clona el repositorio oficial:
sudo -iu otserv
cd ~
git clone --depth 1 https://github.com/otland/forgottenserver.git tfs
cd tfsLa flag --depth 1 descarga solo el último commit (en lugar del historial completo, que tiene cientos de MB). Si necesitas contribuir de vuelta al proyecto, haz un clonado completo después.
Genera el proyecto con CMake y compila usando todos los núcleos disponibles:
mkdir build && cd build
cmake ..
make -j$(nproc)nproc retorna el número de threads de CPU — en un VPS con 4 vCPUs, esto paraleliza el build en 4 jobs. La compilación tarda entre 3 y 10 minutos según el hardware. Al terminar, el binario tfs aparece en ~/tfs/build/.
En VPS con menos de 2 GB de RAM, make -j$(nproc) puede desbordar la memoria durante la compilación de archivos pesados. Si ves internal compiler error: Killed (program cc1plus), repítelo con make -j1 (compilación serial, más lenta pero estable).
Configuración de la base de datos MySQL
TFS persiste cuentas, personajes, casas, gremios e ítems en una base de datos relacional. MariaDB es la implementación estándar en Ubuntu.
Sal del usuario otserv (volviendo a tu shell con sudo) e instala el servidor MySQL:
exit
sudo apt install -y mariadb-server
sudo mysql_secure_installationmysql_secure_installation es un asistente interactivo: define una contraseña root fuerte, elimina usuarios anónimos, bloquea el login remoto de root y elimina la base de datos test. Acepta todo con Y.
Crea la base de datos y el usuario del OTServ:
sudo mariadbDentro del prompt de MySQL:
CREATE DATABASE forgottenserver CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'otserv'@'localhost' IDENTIFIED BY 'CAMBIA_ESTA_CONTRASENA';
GRANT ALL PRIVILEGES ON forgottenserver.* TO 'otserv'@'localhost';
FLUSH PRIVILEGES;
EXIT;Sustituye CAMBIA_ESTA_CONTRASENA por una contraseña fuerte (mínimo 16 caracteres aleatorios — usa openssl rand -base64 24 para generar una).
Importa el esquema inicial del TFS:
sudo -iu otserv
cd ~/tfs
mariadb -u otserv -p forgottenserver < schema.sqlEl archivo schema.sql está en la raíz del repositorio clonado y crea todas las tablas necesarias (accounts, players, houses, guilds, etc).
Configuración del servidor
Con la base de datos lista, ajusta config.lua para apuntar a las credenciales correctas y definir los parámetros del mundo.
Copia el template de configuración:
cd ~/tfs
cp config.lua.dist config.lua
nano config.luaAjusta estos campos esenciales:
ip = "0.0.0.0"
mysqlHost = "127.0.0.1"
mysqlUser = "otserv"
mysqlPass = "CAMBIA_ESTA_CONTRASENA"
mysqlDatabase = "forgottenserver"
mysqlPort = 3306
loginProtocolPort = 7171
gameProtocolPort = 7172
statusProtocolPort = 7171
serverName = "Mi OTServ"
worldType = "pvp"ip = "0.0.0.0" hace que TFS escuche en todas las interfaces — necesario para aceptar conexiones externas. Si prefieres restringir a una interfaz específica, coloca el IP público del VPS.
El config.lua guarda la contraseña de MySQL en texto plano. Asegúrate de que los permisos del archivo sean restrictivos: chmod 600 config.lua. Nunca subas este archivo a un repositorio público (agrégalo al .gitignore).
Liberación del firewall y primer arranque
TFS usa dos puertos TCP: 7171 para el login (autenticación y selección de personaje) y 7172 para el game (movimiento, chat, combate en tiempo real).
Vuelve a tu usuario con sudo y libera los puertos en UFW:
exit
sudo ufw allow 7171/tcp
sudo ufw allow 7172/tcp
sudo ufw reload
sudo ufw statusSi UFW está inactivo (Status: inactive), actívalo con sudo ufw enable — pero antes confirma que el puerto 22 (SSH) esté liberado, de lo contrario te bloqueas fuera.
Inicia el servidor para validar:
sudo -iu otserv
cd ~/tfs/build
./tfsSi todo salió bien, verás 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.Verificación
En otra máquina (o en tu propio escritorio), abre una terminal y prueba la conectividad:
telnet TU_IP_DEL_VPS 7171
Si ves Connected to ... y la terminal se congela esperando entrada, el puerto está abierto y TFS está escuchando. Pulsa Ctrl+] y escribe quit para salir.
Para una prueba real con cliente Tibia 8.60, ajusta el archivo Tibia.dat/Tibia.spr de la carpeta del cliente para que apunte a tu IP en lugar del login.tibia.com oficial — herramientas como OTClient permiten hacer esto a través de init.lua.
Resolución de problemas
MySQL connection failed
Si TFS imprime MySQL connection failure!, revisa tres cosas:
- El servicio está corriendo:
sudo systemctl status mariadb - Las credenciales coinciden: prueba el login manual con
mariadb -u otserv -p forgottenserver mysqlHostenconfig.luaes127.0.0.1, nolocalhost(en algunos setups el socket Unix falla pero el TCP funciona)
Port already in use
Error bind: Address already in use en el puerto 7171 significa que otro proceso lo está usando. Identifícalo con:
sudo ss -tulpn | grep 7171
Si es una instancia antigua del TFS, mátala con pkill tfs e inténtalo de nuevo.
El cliente conecta pero no pasa del login
El cliente conecta en la 7171 (login) pero falla al moverse a la 7172 (game). Casi siempre es el firewall bloqueando la 7172 mientras la 7171 está abierta — repite el sudo ufw status y libera el puerto que falte. Si el servidor está detrás de NAT (no es caso común en VPS), redirige ambos puertos.
Próximos pasos
- Configura el TFS para ejecutarse como servicio
systemden lugar de proceso manual — facilita el restart automático en caso de caída - Edita scripts Lua en
data/scripts/para personalizar quests, NPCs y eventos - Usa el RME (Remere’s Map Editor) en Windows para editar
data/world/forgottenserver.otbm - Configura backups automáticos diarios de la base de datos con
mysqldumpen cron - Si estás poniendo esto en producción para jugadores reales, un VPS Hostini ya viene con IPv4 fijo, protección DDoS y disco NVMe — eliminando los tres problemas de red más comunes en hospedaje doméstico.
Preguntas frecuentes
¿Qué versión de TFS debo usar para un OTServ nuevo?
La línea 1.5 de The Forgotten Server (branch master en GitHub) es la más usada hoy en servidores personalizados y funciona en clientes 8.60 con ajustes. Si necesitas un cliente más antiguo (7.4, 7.72), busca forks específicos como TFS 0.x u OTX — tienen requisitos de compilación diferentes.
¿Cuánta RAM consume un OTServ pequeño?
Un servidor TFS 1.5 con hasta 100 jugadores en línea se estabiliza entre 400 MB y 1 GB de RAM, dependiendo del mapa y la cantidad de scripts Lua activos. MySQL añade otros 200-400 MB. Para empezar con holgura, 2 GB de RAM son suficientes.
¿Puedo ejecutar el OTServ directamente como root?
Técnicamente sí, pero es una mala práctica. Crea un usuario dedicado (ej.: otserv) y ejecuta el binario con él. Si se explota una vulnerabilidad en el servidor, el atacante queda restringido al ámbito de ese usuario en lugar de comprometer todo el sistema.
¿Por qué mi cliente Tibia no conecta aunque el servidor esté funcionando?
Las tres causas más comunes son: firewall bloqueando 7171/7172 (verifica con sudo ufw status), IP del servidor incorrecto en config.lua (campo ip), o el login server cayó silenciosamente (revisa el log del tfs). Prueba el puerto desde fuera con telnet IP 7171 antes de tocar el cliente.
¿Cómo hago backup de la base de datos del OTServ?
Usa mysqldump para exportar el esquema y los datos: mysqldump -u otserv -p forgottenserver > backup.sql. Programa ese comando en cron diariamente y envía el backup a otro disco o almacenamiento externo. Restaura con mysql -u otserv -p forgottenserver < backup.sql.
¿Necesito IP dedicado para el OTServ?
Sí, o al menos una dirección estable. El cliente Tibia se conecta directo al IP listado en config.lua y en el login server — un IP dinámico residencial cambia y desconecta a tus jugadores. Un VPS resuelve esto con IPv4 fijo.