Cómo configurar un servidor de Call of Duty 2 en Ubuntu Server
Call of Duty 2 sigue teniendo comunidad activa 20 años después de su lanzamiento, y su servidor dedicado (cod2_lnxded) es liviano: corre bien en un VPS chico, con poca RAM y casi nada de CPU en reposo. Lo que realmente frena a alguien que arranca de cero no es el hardware — es la combinación de un binario de 32 bits sobre un sistema moderno de 64, las dependencias que pide el mod, y afinar todo para que el servidor no se caiga solo. Esta guía documenta el proceso completo con la configuración real de un servidor en producción: Pug Latam, una comunidad de Call of Duty 2 en Latinoamérica del Norte que corre exactamente esta configuración, no una receta genérica.
Lo que necesitás antes de empezar
- Un servidor o VPS con Ubuntu 24.04 LTS (probado también en versiones anteriores).
- Acceso root o sudo por SSH.
- Una copia legítima de Call of Duty 2 versión 1.3, para copiar sus archivos base — el servidor no incluye los assets del juego.
- ~2 GB libres en disco (los assets base del juego pesan la mayor parte).
0. Conectarte al servidor y moverte por la terminal
Si nunca administraste un VPS, todo lo que sigue se hace escribiendo comandos en una terminal conectada por SSH — no hay ninguna interfaz gráfica de por medio. Es más simple de lo que parece: tu proveedor de VPS te da una IP, un usuario y una contraseña (o una clave). Desde Windows, el programa más usado para conectarte es PuTTY (gratis); desde Mac o Linux alcanza con la Terminal que ya viene instalada.
ssh root@TU_IP
Reemplazá TU_IP por la IP real de tu servidor, dale Enter, y escribí la contraseña cuando te la pida (no vas a ver los caracteres mientras la tipeás, es normal). Una vez adentro, cada comando de esta guía se pega ahí y se confirma con Enter.
Varios pasos piden crear o editar un archivo con nano, un editor de texto simple que ya viene instalado en Ubuntu. Siempre se usa igual: escribís o pegás el contenido, guardás con Ctrl+O + Enter y salís con Ctrl+X — esas tres teclas son las únicas que necesitás recordar para toda la guía.
1. Requisitos del sistema: por qué hace falta habilitar i386
cod2_lnxded es un binario de 32 bits — Call of Duty 2 es de 2005, y ningún servidor dedicado oficial de 64 bits llegó a existir para este juego. En un Ubuntu moderno (que es 64 bits por defecto) hay que habilitar la arquitectura i386 antes de instalar cualquier dependencia, o los paquetes ni siquiera se van a encontrar. Pegá estos tres comandos uno por uno, esperando a que termine cada uno antes del siguiente:
sudo dpkg --add-architecture i386 sudo apt-get update sudo apt-get -y install libstdc++5:i386
Si además vas a correr un mod que dependa de libcod (como zPAM, el más usado en la escena competitiva), hacen falta estas librerías adicionales para compilar/cargar la extensión de 32 bits:
sudo apt-get -y install gcc-multilib sudo apt-get -y install libmysqlclient-dev:i386 sudo apt-get -y install g++-multilib
2. Crear la carpeta del servidor
Todo el servidor vive bajo una sola carpeta (el fs_homepath del motor). Podés usar cualquier ruta — esta guía usa /home/gameserver/cod2 como ejemplo, y el script de arranque se auto-detecta, así que no hay rutas fijas que editar a mano más adelante. Creala así:
mkdir -p /home/gameserver/cod2/main cd /home/gameserver/cod2
Ahí adentro vas a terminar teniendo esta estructura — no hace falta crear cada archivo ahora, cada uno se explica en su propia sección más abajo:
/home/gameserver/cod2/
├── cod2_lnxded # Binario dedicado del servidor (32 bits)
├── libCoD2x.so # libcod, cargado via LD_PRELOAD
├── start_libcod.sh # Script de arranque (sección 4)
└── main/ # Assets del juego + mod
├── iw_00.iwd ... iw_15.iwd # Assets base (propios, ver sección 3)
├── zpam408.iwd # Mod (opcional)
├── zpam_maps_v7.iwd # Mapas comunitarios (opcional)
├── server.cfg # Configuración del servidor (sección 6)
└── games_mp.log # Log de eventos de partida
3. De dónde salen los archivos: propios vs. copiados de tu instalación
Acá es donde muchas guías generan confusión, porque hay dos grupos de archivos con origen completamente distinto:
cod2_lnxded,libCoD2x.soy el mod se pueden descargar libremente —cod2_lnxdedylibCoD2x.sosalen del proyecto github.com/callofduty2x/CoD2x, que mantiene el parche CoD2x y el binario dedicado.- Los assets base del juego (iw_00.iwd … iw_15.iwd y los de localización) son propiedad de Activision — hay que copiarlos por SFTP desde tu propia instalación legítima de Call of Duty 2, nunca vienen incluidos en ningún repositorio ni paquete de servidor.
Ambos grupos terminan mezclados en la misma carpeta main/, al mismo nivel — el motor no distingue de dónde vino cada archivo, solo los carga todos juntos.
4. Script de arranque
En vez de tipear a mano todas las variables del motor en cada arranque, conviene un script que las fije y ejecute el binario con LD_PRELOAD (necesario para que libcod se cargue dentro del proceso). Vamos a crear el archivo con nano — parado en la carpeta del servidor, escribí:
nano /home/gameserver/cod2/start_libcod.sh
Se va a abrir una pantalla vacía dentro de la terminal — pegá exactamente este contenido, y después guardá y salí (Ctrl+O, Enter, Ctrl+X, como se explicó en el paso 0):
#!/bin/bash DIR="$(cd "$(dirname "$0")" && pwd)" args=\ "+set fs_homepath \"$DIR\" "\ "+set fs_basepath \"$DIR\" "\ "+set sv_cracked 1 "\ "+set net_port 28960 "\ "+set com_hunkMegs 256 "\ "+set sv_maxclients 30 "\ "+exec server.cfg" exec env LD_PRELOAD="$DIR/libCoD2x.so" "$DIR/cod2_lnxded" $args +map_rotate
Por último, dale permiso de ejecución al archivo — sin este paso, el script no va a poder correr:
chmod +x /home/gameserver/cod2/start_libcod.sh
Dos detalles que no son obvios a simple vista:
exec env LD_PRELOAD=..., no soloLD_PRELOAD=... $cod: el exec reemplaza el proceso de bash por el del juego en vez de dejarlo como hijo — así systemd (sección siguiente) trackea el proceso real del servidor como Main PID, sin un wrapper de por medio.- $DIR se calcula desde la ubicación del propio script, así que corre igual sin importar en qué carpeta lo hayas clonado o copiado.
5. Servicio systemd, con el mismo tuning que usa un servidor real
Para que el servidor arranque solo al bootear la máquina y se reinicie si se cae, conviene un unit de systemd — el sistema que Ubuntu usa para administrar servicios en segundo plano. La mayoría de las guías se quedan en un Restart=always básico — acá está el tuning real que corre en producción, útil sobre todo si el VPS es chico y comparte CPU con otros procesos (un panel web, una base de datos). Este archivo NO va dentro de la carpeta del servidor: vive en una ruta fija del sistema, así que abrilo con:
sudo nano /etc/systemd/system/cod2server.service
Pegá exactamente este contenido (es el mismo archivo que corre en Pug Latam) y guardá igual que antes:
[Unit] Description=Call of Duty 2 Dedicated Server After=network-online.target Wants=network-online.target [Service] Type=simple User=root WorkingDirectory=/home/gameserver/cod2 # Prioridad de CPU: si otro proceso pide CPU al mismo tiempo en un # core compartido, el servidor de juego se lleva la mayor parte. Nice=-20 CPUWeight=9500 # Prioridad de I/O de disco (logs, demos, mapas). IOSchedulingClass=realtime IOSchedulingPriority=0 # El servidor de juego es de los últimos candidatos si el sistema # se queda sin RAM y el kernel tiene que matar un proceso. OOMScoreAdjust=-900 MemoryLow=200M MemorySwapMax=0 MemoryMax=400M ExecStart=/bin/bash /home/gameserver/cod2/start_libcod.sh Restart=always RestartSec=5 StandardOutput=journal StandardError=journal [Install] WantedBy=multi-user.target
Si tu VM no comparte CPU con nada más, alcanza con Nice=-20 solo — el resto son ajustes finos para cuando el servidor de juego tiene que competir por recursos con otros procesos. Ajustá también WorkingDirectory/ExecStart si usaste una ruta distinta a /home/gameserver/cod2 en el paso 2.
Con el archivo guardado, avisale al sistema que existe un servicio nuevo y arrancalo:
sudo systemctl daemon-reload sudo systemctl enable --now cod2server.service
enable hace que arranque solo cada vez que se reinicia la máquina; --now además lo arranca ahora mismo, sin esperar a un reinicio.
6. Configuración básica de server.cfg
Acá vive el gametype, el nombre del servidor y las variables de descarga. Este archivo sí va dentro de main/, la carpeta de assets del juego (ver el árbol de la sección 2):
nano /home/gameserver/cod2/main/server.cfg
Un ejemplo mínimo funcional — cambiá al menos sv_hostname, rcon_password y la IP de sv_wwwBaseURL antes de guardar:
set g_gametype "sd" set sv_hostname "Mi servidor CoD2" set sv_maxclients "18" set g_password "" // vacío = sin contraseña de acceso set rcon_password "" // NUNCA lo dejes vacío en producción // Descarga rápida por HTTP en vez del protocolo lento del propio juego seta sv_wwwBaseURL "http://TU_IP/cod2/" seta sv_wwwDownload "1" seta sv_wwwDlDisconnected "0"
Seguridad: con la contraseña de RCON, cualquiera puede ejecutar comandos de administración remota — kick, ban, cambiar el mapa, modificar cualquier variable del servidor. Cambiala por algo único antes de exponer el servidor a internet; no la dejes vacía ni copiada de un ejemplo.
Para que sv_wwwBaseURL funcione de verdad, tenés que servir esa misma carpeta (con el mod y los mapas) desde un servidor web aparte (nginx o Apache) en la ruta /cod2/ de esa IP — sin esto la variable no hace nada, el cliente sigue bajando por el protocolo lento del juego.
7. Verificar que el servidor está en línea
sudo systemctl status cod2server.service sudo journalctl -u cod2server.service -f
Con exec en el script de arranque (sección 4), el Main PID que muestra systemctl status debería ser directo el proceso de cod2_lnxded, no un wrapper de bash — si ves bash como Main PID, revisá que el script use exec y no solo LD_PRELOAD=... $cod.
El mod zPAM y por qué la mayoría de los servidores competitivos lo usan
zPAM agrega el modo Search & Destroy con reglas de competencia (ready-up, cambio de bando a mitad de partida, límites de armas) que no vienen en el juego base. Corre sobre libcod (LD_PRELOAD, ver sección 1) y se puede extender con módulos GSC propios — nuestro setup, por ejemplo, le suma un popup de puntaje al matar y efectos de sangre que el mod original tenía en sus assets pero nunca disparaba.
El código fuente del mod está publicado en github.com/eyza-cod2/zpam3.
Un caso real: Pug Latam
Esta guía documenta exactamente la configuración que corre Pug Latam, el servidor de Search & Destroy de la comunidad de Call of Duty 2 en Latinoamérica del Norte — con ranking de jugadores, historial de partidas, demos automáticas y un panel de administración propios. Si preferís jugar en vez de administrar tu propio servidor, en la guía para empezar a jugar está todo lo que necesitás para sumarte.
Preguntas frecuentes
¿cod2_lnxded es de 32 o 64 bits?
De 32 bits (i386), aunque el sistema operativo sea de 64. En Ubuntu 24.04 hay que habilitar la arquitectura i386 a mano antes de instalar las librerías que necesita, algo que muchas guías viejas dan por hecho.
¿Necesito comprar el juego para tener los archivos del servidor?
Sí. El binario del servidor y el mod se pueden descargar libremente, pero los archivos base del juego (los .iwd con los mapas y modelos originales) son propiedad de Activision — hay que copiarlos desde tu propia instalación legítima de Call of Duty 2, no vienen incluidos en ningún repositorio.
¿Qué es libcod y por qué hace falta para correr un mod como zPAM?
libcod es una librería que se carga con LD_PRELOAD y le agrega al motor comandos y variables de consola que no existen de fábrica. Mods de competencia como zPAM dependen de esas extensiones — sin libcod, el mod ni siquiera arranca.
¿Cómo protejo el rcon_password del servidor?
Con RCON, cualquiera que tenga la contraseña puede ejecutar comandos de administración remota (kick, ban, cambiar mapa, cambiar cualquier variable). Nunca lo dejes vacío ni con el valor de ejemplo de una guía — cambialo por algo único antes de exponer el servidor a internet.
¿Cómo hago que los jugadores descarguen el mod y los mapas rápido?
Configurando sv_wwwBaseURL en server.cfg para que apunte a un servidor HTTP (nginx o Apache) que sirva esos mismos archivos. Sin esto, el cliente los descarga por el protocolo lento del propio juego, y un mod de varios cientos de MB puede tardar minutos en vez de segundos.