{"id":199189,"date":"2025-09-25T07:42:11","date_gmt":"2025-09-25T05:42:11","guid":{"rendered":"https:\/\/fivemx.com\/?p=199189"},"modified":"2026-08-16T13:45:10","modified_gmt":"2026-08-16T11:45:10","slug":"como-ejecutar-un-servidor-fivem-usando-docker","status":"publish","type":"post","link":"https:\/\/rpcrate.com\/es\/how-to-run-a-fivem-server-using-docker\/","title":{"rendered":"Ejecuta FiveM en Docker con datos persistentes y txAdmin privado"},"content":{"rendered":"<p>Una implementaci\u00f3n de Docker necesita datos de servidor persistentes, exposici\u00f3n de puertos deliberada y un par de imagen\/configuraci\u00f3n recuperable. El ejemplo siguiente utiliza la imagen spritsail mantenida por la comunidad en un host Linux; sus rutas y variables de entorno son espec\u00edficas de esa imagen, no opciones universales de FXServer.<\/p>\n<p>Los ejemplos de configuraci\u00f3n y c\u00f3digo aqu\u00ed est\u00e1n dirigidos a FiveM para GTA V Legacy. Enhanced tiene diferentes reglas de tiempo de ejecuci\u00f3n y compatibilidad; consulta <a href=\"https:\/\/docs.fivem.net\/docs\/developers\/legacy-vs-enhanced\/\">los cambios de Legacy a Enhanced de Cfx.re<\/a> antes de aplicarlos a un servidor Enhanced.<\/p>\n<h2 id=\"prepare-the-host\">Prepara el host<\/h2>\n<p>Instala Docker Engine y el plugin Compose usando <a href=\"https:\/\/docs.docker.com\/engine\/install\/\">las instrucciones de Docker para tu host<\/a>. Utiliza primero una implementaci\u00f3n de prueba aislada. Confirma que la arquitectura del host, los puertos disponibles y la versi\u00f3n de la imagen se ajustan a tu servidor previsto.<\/p>\n<p class=\"translation-block\">Crea un directorio privado de proyecto con los subdirectorios <code>data\/<\/code> y <code>txData\/<\/code>. La imagen utiliza <code>\/config<\/code> para los datos del servidor y <code>\/txData<\/code> para txAdmin. Restringe el acceso a los directorios del host y las copias de seguridad, porque contendr\u00e1n credenciales.<\/p>\n<h2 id=\"create-compose-yaml\">Crea compose.yaml<\/h2>\n<p>Guarda esto como <code data-no-translation=\"\" translate=\"no\">compose.yaml<\/code> en ese directorio del proyecto. Deja la configuraci\u00f3n de la licencia a la configuraci\u00f3n protegida de txAdmin\/servidor y enlaza el puerto de administraci\u00f3n al loopback del host.<\/p>\n<pre data-no-translation=\"\" translate=\"no\"><code data-no-translation=\"\" translate=\"no\">services:\n  fivem:\n    image: spritsail\/fivem:stable\n    environment:\n      NO_DEFAULT_CONFIG: \"1\"\n      NO_LICENSE_KEY: \"1\"\n    volumes:\n      - .\/data:\/config\n      - .\/txData:\/txData\n    ports:\n      - \"30120:30120\/tcp\"\n      - \"30120:30120\/udp\"\n      - \"127.0.0.1:40120:40120\/tcp\"\n    stdin_open: true\n    tty: true\n    restart: unless-stopped\n    logging:\n      driver: json-file\n      options:\n        max-size: \"10m\"\n        max-file: \"3\"<\/code><\/pre>\n<p class=\"translation-block\">La etiqueta <code>stable<\/code> de la imagen es mutable y sigue la definici\u00f3n del mantenedor de la imagen de origen. Lee la informaci\u00f3n de su versi\u00f3n y su c\u00f3digo fuente antes de desplegarla; no trates la palabra \u00abstable\u00bb como una garant\u00eda comprobada mediante pruebas. Despu\u00e9s de probarla, sustituye la referencia de la imagen por el digest exacto que hayas registrado de la imagen descargada.<\/p>\n<h2 id=\"start-and-configure-txadmin\">Inicia y configura txAdmin<\/h2>\n<p>Desde el directorio del proyecto en el host de Docker, ejecuta:<\/p>\n<pre data-no-translation=\"\" translate=\"no\"><code data-no-translation=\"\" translate=\"no\">docker compose config --quiet\ndocker compose pull\ndocker compose up -d\ndocker compose logs --tail=100 fivem<\/code><\/pre>\n<p>Accede a txAdmin localmente en <code data-no-translation=\"\" translate=\"no\">http:\/\/127.0.0.1:40120<\/code>. Desde tu estaci\u00f3n de trabajo, crea un t\u00fanel SSH a tu host real usando <code data-no-translation=\"\" translate=\"no\">ssh -L 40120:127.0.0.1:40120 user@your-server<\/code>, luego abre esa misma direcci\u00f3n local en tu navegador. Utiliza tu cuenta\/nombre de host SSH real. No publiques PINs de configuraci\u00f3n ni la salida del registro que contenga credenciales.<\/p>\n<p>Sigue la configuraci\u00f3n de txAdmin y elige una ubicaci\u00f3n de server-data dentro de <code data-no-translation=\"\" translate=\"no\">\/config<\/code>, o en otro directorio persistente montado expl\u00edcitamente. Introduce la licencia de servidor v\u00e1lida de forma privada. Si la receta seleccionada necesita una base de datos, provisi\u00f3nala por separado y mant\u00e9n su puerto privado; este ejemplo de Compose no incluye una.<\/p>\n<h2 id=\"verify-networking-and-persistence\">Verifica la red y la persistencia<\/h2>\n<p>Permite el punto final del jugador previsto a trav\u00e9s de la red del host\/proveedor para TCP y UDP. Comprueba el acceso desde fuera del host. Los puertos publicados por Docker interact\u00faan con las reglas del firewall de Docker y pueden omitir las reglas de entrada UFW ordinarias; consulta <a href=\"https:\/\/docs.docker.com\/engine\/network\/packet-filtering-firewalls\/\">la documentaci\u00f3n del firewall de Docker<\/a> en lugar de pegar un conjunto de reglas de firewall de reemplazo.<\/p>\n<p>Completa una conexi\u00f3n de prueba, inspecciona los errores de recursos y crea un cambio de configuraci\u00f3n inofensivo. Vuelve a crear el contenedor con <code data-no-translation=\"\" translate=\"no\">docker compose up -d --force-recreate<\/code> y confirma que el perfil\/configuraci\u00f3n persiste. Una respuesta HTTP de <code data-no-translation=\"\" translate=\"no\">info.json<\/code> es solo una verificaci\u00f3n b\u00e1sica de disponibilidad, no una prueba de la salud del juego.<\/p>\n<h2 id=\"back-up-a-consistent-set\">Haz una copia de seguridad de un conjunto consistente<\/h2>\n<p>Programa el mantenimiento y det\u00e9n las escrituras del juego. Haz una copia de seguridad de los directorios montados, la definici\u00f3n de Compose, la configuraci\u00f3n privada y cualquier base de datos externa como un conjunto de recuperaci\u00f3n coincidente. Para datos solo de archivos mientras el servicio est\u00e1 detenido, se puede crear un archivo privado desde el directorio del proyecto con:<\/p>\n<pre data-no-translation=\"\" translate=\"no\"><code data-no-translation=\"\" translate=\"no\">umask 077\ndocker compose stop fivem\ntar -czf \"..\/fivem-files-$(date -u +%Y%m%dT%H%M%SZ).tgz\" compose.yaml data txData\ndocker compose start fivem<\/code><\/pre>\n<p>Verifica que la creaci\u00f3n del archivo se haya realizado correctamente antes de reiniciar como parte de tu manual de procedimientos. Incluye archivos de configuraci\u00f3n adicionales y la copia de seguridad de la base de datos cuando tu configuraci\u00f3n los utilice. Un archivo de solo archivos no puede restaurar una base de datos externa. Prueba la recuperaci\u00f3n en directorios separados y una base de datos separada.<\/p>\n<h2 id=\"update-and-recover\">Actualiza y recupera<\/h2>\n<p>Registra el digest de la imagen actualmente en ejecuci\u00f3n y haz la copia de seguridad correspondiente antes de descargar una actualizaci\u00f3n. Prueba la imagen candidata con una copia, luego cambia la referencia de la imagen de producci\u00f3n durante el mantenimiento y repite las comprobaciones de conexi\u00f3n\/persistencia.<\/p>\n<p>Revertir solo la imagen puede no deshacer las migraciones de datos realizadas por los recursos. Recupera los archivos\/datos coincidentes deliberadamente y ten en cuenta las escrituras desde la copia de seguridad. <code data-no-translation=\"\" translate=\"no\">docker compose down<\/code> detiene\/elimina el servicio mientras conserva estos directorios montados; mant\u00e9n esos directorios hasta que la recuperaci\u00f3n ya no sea necesaria.<\/p>\n<h2 id=\"reference-documentation\">Documentaci\u00f3n de referencia<\/h2>\n<p><a href=\"https:\/\/github.com\/spritsail\/fivem\">Fuente: spritsail\/fivem<\/a> \u00b7 <a href=\"https:\/\/docs.docker.com\/reference\/compose-file\/services\/\">Fuente: docs.docker.com<\/a> \u00b7 <a href=\"https:\/\/docs.fivem.net\/docs\/resources\/txAdmin\/\">Cfx.re \u2014 txAdmin<\/a><\/p>","protected":false},"excerpt":{"rendered":"<p>Una implementaci\u00f3n de Docker necesita datos de servidor persistentes, exposici\u00f3n de puertos deliberada y un par de imagen\/configuraci\u00f3n recuperable. El ejemplo siguiente utiliza la imagen spritsail mantenida por la comunidad en un host Linux; sus rutas y variables de entorno son espec\u00edficas de esa imagen, no opciones universales de FXServer.<\/p>","protected":false},"author":1,"featured_media":199191,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1902,1899],"tags":[],"class_list":["post-199189","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-fivem-related","category-tutorials"],"_links":{"self":[{"href":"https:\/\/rpcrate.com\/es\/wp-json\/wp\/v2\/posts\/199189","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rpcrate.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rpcrate.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rpcrate.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/rpcrate.com\/es\/wp-json\/wp\/v2\/comments?post=199189"}],"version-history":[{"count":6,"href":"https:\/\/rpcrate.com\/es\/wp-json\/wp\/v2\/posts\/199189\/revisions"}],"predecessor-version":[{"id":217335,"href":"https:\/\/rpcrate.com\/es\/wp-json\/wp\/v2\/posts\/199189\/revisions\/217335"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/rpcrate.com\/es\/wp-json\/wp\/v2\/media\/199191"}],"wp:attachment":[{"href":"https:\/\/rpcrate.com\/es\/wp-json\/wp\/v2\/media?parent=199189"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rpcrate.com\/es\/wp-json\/wp\/v2\/categories?post=199189"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rpcrate.com\/es\/wp-json\/wp\/v2\/tags?post=199189"}],"curies":[{"name":"gracias","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}