Cómo ejecutar un servidor FiveM usando Docker

Cómo ejecutar un servidor FiveM usando Docker

Lista de verificación rápida para la configuración de Docker de FiveM

Una configuración útil de Docker mantiene los datos de txAdmin persistentes, expone los puertos correctos y hace que las actualizaciones sean reversibles.

  • Usa Docker Compose v2 y monta por bind-mount txData o el directorio de datos de tu servidor.
  • Expón 30120 TCP/UDP para FiveM y 40120 solo donde se requiera acceso a txAdmin.
  • Haz una copia de seguridad de server.cfg, resources, txData y los datos de la base de datos antes de cambiar artifacts o imágenes.

Rutas de tienda relacionadas: Paquetes de servidor | Scripts FiveM | Herramientas de administración

Ejecuta un servidor FiveM (FXServer) en Docker con esta guía de copia y pega: una imagen mínima, compose.yaml usando la spritsail/fivem mapeo de puertos correcto para 30120 (TCP+UDP) y 40120 (txAdmin), montajes persistentes para server.cfg, recursos y datos de txAdmin, manejo de la clave de licencia y pasos seguros de actualización y retroceso.

Resumen

  • Instala Docker Engine + Docker Compose v2 en Ubuntu. (Documentación de Docker)
  • Crea una carpeta de proyecto, agrega .env (set LICENSE_KEY, SERVER_NAME, puertos) y un compose.yaml.
  • Comienza con docker compose up -d; monitorea los registros con docker compose logs -f.
  • Editar data/server.cfg (hostname, endpoints, resources); reinicia el contenedor.
  • Abre el firewall para 30120/TCP+UDP y 40120/TCP (txAdmin). El puerto predeterminado de txAdmin es 40120. (Documentación de Cfx.re)
  • Siempre ejecuta el contenedor con stdin/tty habilitado para evitar bloqueos. (GitHub)

Prerrequisitos

  • Sistema operativo: Linux Ubuntu 22.04+ (notas para macOS/Windows abajo).
  • Hardware: 2+ vCPU, 4–8 GB de RAM (más para recursos pesados), Unidad de estado sólido recomendado.
  • Docker: Instalar Docker Engine y Compose v2 desde la documentación oficial. (Documentación de Docker)
  • Clave de licencia FiveM: Generar en el portal Cfx.re (Keymaster). Mantenerla en secreto. (soporte.cfx.re)
  • Firewall/NAT: Capacidad de abrir/reenviar puertos 30120 (TCP+UDP) y opcionalmente 40120 (TCP). (Documentación de Cfx.re)
  • (Opcional) Un dominio/subdominio para txAdmin.

Descripción general de la arquitectura

Un contenedor ejecuta Servidor FX usando la spritsail/fivem Los datos están montados por enlace persistir server.cfg, recursos y registros. Los puertos 30120/TCP+UDP están expuestos a los jugadores; 40120/TCP expone txAdmin cuando está habilitado. Una comprobación de estado puede sondear http://127.0.0.1:30120/info.json. (GitHub)

+-------------------- Docker Host (Ubuntu) --------------------+
| /home/fivem/data --> /config (in container) |
| /home/fivem/txData --> /txData (txAdmin data) |
| |
| Exposed: 30120/tcp+udp [FXServer] | 40120/tcp [txAdmin] |
| Healthcheck: GET 127.0.0.1:30120/info.json |
+-------------------------------------------------------------+

Inicio rápido (copiar y pegar)

1) Crear una carpeta de proyecto

# Optional: dedicated system user and directories
sudo useradd -r -m -d /home/fivem -s /usr/sbin/nologin fivem || true
sudo mkdir -p /home/fivem/{data,txData}
sudo chown -R "$USER":"$USER" /home/fivem
cd /home/fivem

2) Crear .env

cat > .env <<'EOF'
# === REQUIRED ===
LICENSE_KEY=REPLACE_WITH_YOUR_CFX_KEY

# Convenience (used by ports mapping below)
FXSERVER_PORT=30120
TXADMIN_PORT=40120

# Not read by the image directly; use it when editing server.cfg
SERVER_NAME="My Docker FiveM"

# Optional: if omitted, default config generation sets a random RCON password
RCON_PASSWORD=
EOF

3) Mínimo compose.yaml (fijar una etiqueta)

Configuración funcional más pequeña usando la imagen upstream. Usa tty+stdin para evitar el bloqueo. (GitHub)

# compose.yaml
services:
 fivem:
 image: spritsail/fivem:stable
 container_name: fivem
 environment:
 - LICENSE_KEY=${LICENSE_KEY}
 # Optional toggles (see table below):
 # - NO_DEFAULT_CONFIG=1 # required if you want to use txAdmin
 # - NO_LICENSE_KEY=1 # if you put the key in server.cfg instead
 # - NO_ONESYNC=1 # disable OneSync in default config
 # - RCON_PASSWORD=${RCON_PASSWORD}
 volumes:
 - ./data:/config # server.cfg, resources, logs
 ports:
 - "${FXSERVER_PORT}:30120/tcp"
 - "${FXSERVER_PORT}:30120/udp"
 tty: true # prevent startup crash (equiv. to -t)
 stdin_open: true # prevent startup crash (equiv. to -i)
 restart: unless-stopped

Iniciarlo:

docker compose up -d
docker compose logs -f

4) Variante extendida (txAdmin, healthcheck, límites)

# compose.extended.yaml
services:
 fivem:
 image: spritsail/fivem:stable
 container_name: fivem
 environment:
 - LICENSE_KEY=${LICENSE_KEY}
 - NO_DEFAULT_CONFIG=1 # enable txAdmin (no default +exec)
 # - NO_LICENSE_KEY=1 # if storing key in server.cfg
 # - RCON_PASSWORD=${RCON_PASSWORD}
 volumes:
 - ./data:/config
 - ./txData:/txData # persist txAdmin data
 ports:
 - "${FXSERVER_PORT}:30120/tcp"
 - "${FXSERVER_PORT}:30120/udp"
 - "${TXADMIN_PORT}:40120/tcp" # txAdmin Web UI (default 40120)
 tty: true
 stdin_open: true
 healthcheck:
 test: ["CMD-SHELL", "wget -qO- http://127.0.0.1:30120/info.json >/dev/null 2>&1"]
 interval: 30s
 timeout: 5s
 retries: 5
 start_period: 30s
 # Basic resource knobs for standalone Compose (not Swarm 'deploy')
 cpus: 2
 mem_limit: "6g"
 ulimits:
 nofile:
 soft: 1048576
 hard: 1048576
 restart: unless-stopped

Si wget no está disponible en la imagen, elimina el healthcheck o reemplázalo con una sonda TCP. txAdmin persiste bajo /txData, el puerto 40120 es su valor predeterminado. (GitHub)


Configuración y Persistencia

  • En la primera ejecución, los valores predeterminados se escriben en el montaje bind ./data (ruta del contenedor /config). Edita ./data/server.cfg y reinicia el contenedor. (GitHub)

Típico server.cfg bits:

# data/server.cfg
# Network endpoints (leave 0.0.0.0 to listen on all interfaces)
endpoint_add_tcp "0.0.0.0:30120"
endpoint_add_udp "0.0.0.0:30120"

# Server name
set sv_hostname "My Docker FiveM"

# License key (use this only if NOT using LICENSE_KEY env)
# sv_licenseKey "REPLACE_WITH_YOUR_CFX_KEY"

# Example: ensure a basic resource
# ensure chat

Estructura de directorios (anfitrión):

/home/fivem
├─ data/ -> /config (server.cfg, resources/, logs/)
└─ txData/ -> /txData (txAdmin profiles & DB)

Copias de seguridad

  • Copia de seguridad bind-mount:
tar -C /home/fivem -czf fivem-backup_$(date +%F).tgz data txData
  • Si cambias a volúmenes con nombre, haz la copia de seguridad así:
docker run --rm -v fivem_data:/data -v "$PWD":/backup busybox 
 sh -c 'tar -czf /backup/fivem_data_$(date +%F).tgz -C / data'

Variables de entorno (desde spritsail/fivem)

NombreObjetivoEjemplo
LICENSE_KEYRequerido Clave de licencia del servidor FiveM para iniciar FXServerLICENSE_KEY=xxxxx
RCON_PASSWORDContraseña RCON utilizada al crear configuraciones predeterminadas; 16 caracteres aleatorios si no se estableceRCON_PASSWORD=strongpass
NO_DEFAULT_CONFIGDeshabilitar la configuración predeterminada +exec para que txAdmin pueda gestionar el servidor1
NO_LICENSE_KEYNo leer la clave del entorno; mantenerla en server.cfg1
NO_ONESYNCDeshabilitar OneSync en configuraciones predeterminadas1

Estas variables de entorno y rutas /config, /txData, más la necesidad de -ti están definidas por la imagen upstream. (GitHub)

Secreto manejo: Prefiere NO_LICENSE_KEY=1 y coloca sv_licenseKey en server.cfg con permisos de archivo correctos si no deseas la clave en el entorno del contenedor. (GitHub)


Redes y Seguridad

Puertos requeridos

ObjetivoPuertoProto
Conexiones de jugadores / API30120TCP+UDP
txAdmin Web UI (opcional)40120TCP
Maestro heredado (rara vez necesario)30110UDP

FiveM por defecto usa 30120; el de txAdmin por defecto es 40120. (GitHub)

Ejemplos de UFW (Ubuntu)

sudo ufw allow 30120/tcp
sudo ufw allow 30120/udp
sudo ufw allow 40120/tcp # only if you enable txAdmin
sudo ufw reload

nftables (extracto de conjunto de reglas de ejemplo)

sudo nft add table inet filter
sudo nft add chain inet filter input '{ type filter hook input priority 0; policy drop; }'
sudo nft add rule inet filter input ct state established,related accept
sudo nft add rule inet filter input iif lo accept
sudo nft add rule inet filter input tcp dport {30120,40120} accept
sudo nft add rule inet filter input udp dport 30120 accept

Mínimo privilegio y secretos

  • Ejecutar en un host endurecido; evitar mapear capacidades extra; no ejecutar Docker como root usuario en el host.
  • Mantener RCON habilitado solo si es necesario; proteger txAdmin con credenciales sólidas y restringir el acceso en el firewall.
  • Si usas distribuciones basadas en SELinux (no Ubuntu), agrega :Z/:z a los montajes bind para solucionar problemas de contexto.

Actualizaciones y reversiones

Actualizar a la última etiqueta fijada

docker compose pull
docker compose up -d

Fijar por digest (inmutable)

# Pull and discover the digest of the current tag
docker pull spritsail/fivem:stable
docker inspect --format='{{index .RepoDigests 0}}' spritsail/fivem:stable
# Use the printed value in compose, e.g.:
# image: spritsail/fivem@sha256:abcdef...

Reversión

  • Cambia la referencia de la imagen de nuevo al tag/digest anterior y docker compose up -d.
  • Mantén los digests de imágenes recientes con docker image ls --digests.

La imagen proporciona stable y latest tags; prefiere stable para menos sorpresas. (GitHub)


Monitoreo y Mantenimiento

  • Estado: docker ps, docker compose ps
  • Registros: docker compose logs -f
  • Estadísticas: docker stats fivem
  • Healthcheck: Sondas info.json; eliminar/ajustar si falta la herramienta. (Documentación de Cfx.re)
  • Disco: docker system df, limpiar imágenes antiguas si es necesario.
  • Copias de seguridad: Programar el comando tar en “Configuración y Persistencia”.

Solución de problemas

  • Clave de licencia no válida: Verificar en el portal Cfx.re y asegurar que solo un servidor está usando la clave. (soporte.cfx.re)
  • Puertos ya en uso: sudo ss -lntup | grep 30120; detener servicio conflictivo o cambiar FXSERVER_PORT.
  • No se puede alcanzar txAdmin: Abierto 40120/TCP o cambiar puerto; confirmar NO_DEFAULT_CONFIG=1. (Documentación de Cfx.re)
  • El contenedor se cierra al iniciar: Asegurar tty: true y stdin_open: true están configurados. (GitHub)
  • Problemas de hora/DNS: Asegurar sincronización de hora del host (systemd-timesyncd/chrony) y DNS funcional (/etc/resolv.conf).
  • Denegaciones de SELinux (no Ubuntu): Usar :Z/:z en montajes bind o ajustar contextos.
  • info.json/players.json bloqueado: Algunas convars o proxies pueden afectar estos endpoints; confirma que el servidor responde en GET /info.json. (Documentación de Cfx.re)

Consejos de rendimiento

  • CPU/Memoria: Asigna CPUs y establece límites de memoria (ver compose extendido).
  • Almacenamiento: Usa SSD/NVMe; mantén los resource packs optimizados; evita assets grandes y sin comprimir.
  • Redes: Mantén baja latencia; asegúrate de que el host no tenga limitación de CPU; prioriza UDP 30120.
  • Kernel del host: Los valores predeterminados razonables funcionan; sysctls avanzados (net.core.*mem_max) se pueden ajustar si conoces tu carga de trabajo.
  • Registros: Usa rotación de logs (como en el ejemplo extendido).

Notas sobre macOS / Windows

  • macOS (Docker Desktop): La E/S de archivos montados con bind es más lenta que en Linux nativo; considera las Sincronizaciones de archivos compartidos de Docker Desktop para mejor rendimiento y asegura que la carpeta esté compartida en la configuración. (Documentación de Docker)
  • Windows (WSL2): Los puertos publicados son accesibles a través de host local en Windows; exponer a la LAN puede requerir configuración adicional según el modo. Prefiere alojar en Linux para servidores públicos. (Documentación de Docker)

Desinstalación limpia

# Stop and remove the container (keep data)
docker compose down

# Remove container + anonymous networks + images (keeps bind-mounted data)
docker compose down --rmi local --remove-orphans

# If you used named volumes (not in this guide), list and remove explicitly:
# docker volume ls
# docker volume rm <volume_name>

Para eliminar todo datos, elimine los directorios montados por bind:

sudo rm -rf /home/fivem/data /home/fivem/txData

Preguntas frecuentes

¿Puedo alojar múltiples servidores en un solo host?
Sí. Use directorios de proyecto separados, diferentes FXSERVER_PORT/TXADMIN_PORT, y montajes bind distintos. txAdmin admite datos por perfil en /txData. (Documentación de Cfx.re)

¿Cómo cambio el nombre/IP del servidor que se muestra en la lista?
Editar sv_hostname en data/server.cfg. La IP/puerto proviene de sus puertos publicados y la configuración NAT.

¿Puedo reiniciar automáticamente si falla?
Sí. restart: unless-stopped en Compose; también considere temporizadores systemd para watchdogs.

¿Dónde se encuentran las copias de seguridad?
Donde las crees, por ejemplo, fivem-backup_YYYY-MM-DD.tgz en tu directorio de trabajo. Consulta los comandos de copia de seguridad anteriores.

¿Cómo habilito txAdmin?
Colocar NO_DEFAULT_CONFIG=1, montaje bind /txData, y abrir 40120/TCP. (GitHub)

¿Necesito abrir el puerto 30110?
Raramente. Se usaba para listados heredados; las configuraciones modernas normalmente solo necesitan 30120 y el 40120 de txAdmin si se usa. (Comunidad Cfx.re)

¿Cómo muevo el servidor a otra máquina?
Copiar data/ y txData/ al nuevo host, recrea el mismo archivo Compose e inicia.


Enlaces y Créditos


Revisión editorial y política de fuentes

La guía de Docker distingue la política de reinicio de contenedores de la recuperación de aplicaciones. Fije las imágenes, persista los datos del servidor fuera de la capa de contenedor grabable, proteja los secretos y valide la copia de seguridad/restauración en la definición de composición exacta.

Esta página fue revisada técnicamente el 9 de agosto de 2026. Los comandos y la configuración deben verificarse con la documentación principal vinculada y la versión exacta del recurso instalada en el servidor. Pruebe los cambios en el entorno de prueba, registre la línea de base y conserve una copia de reversión antes de cambiar la producción.