{"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":"so-fuhren-sie-einen-fivem-server-mit-docker-aus","status":"publish","type":"post","link":"https:\/\/rpcrate.com\/de\/how-to-run-a-fivem-server-using-docker\/","title":{"rendered":"FiveM in Docker betreiben \u2013 mit persistenten Daten und privatem txAdmin"},"content":{"rendered":"<p>Ein Docker-Deployment braucht persistente Serverdaten, bewusst gesetzte Port-Freigaben und ein wiederherstellbares Paar aus Image und Konfiguration. Das Beispiel unten nutzt das von der Community gepflegte spritsail-Image auf einem Linux-Host; seine Pfade und Umgebungsvariablen sind spezifisch f\u00fcr dieses Image und keine universellen FXServer-Optionen.<\/p>\n<p>Die hier gezeigten Konfigurations- und Codebeispiele beziehen sich auf FiveM f\u00fcr GTA V Legacy. Enhanced hat andere Laufzeit- und Kompatibilit\u00e4tsregeln; \u00fcberpr\u00fcfe <a href=\"https:\/\/docs.fivem.net\/docs\/developers\/legacy-vs-enhanced\/\">die Legacy-zu-Enhanced-\u00c4nderungen von Cfx.re<\/a> bevor du sie auf einen Enhanced-Server anwendest.<\/p>\n<h2 id=\"prepare-the-host\">Den Host vorbereiten<\/h2>\n<p>Installiere Docker Engine und das Compose-Plugin anhand von <a href=\"https:\/\/docs.docker.com\/engine\/install\/\">Dockers Anleitung f\u00fcr deinen Host<\/a>. Verwende zuerst ein isoliertes Test-Deployment. Pr\u00fcfe, ob Host-Architektur, verf\u00fcgbare Ports und Image-Release zu deinem geplanten Server passen.<\/p>\n<p>Erstelle ein privates Projektverzeichnis mit den <code data-no-translation=\"\" translate=\"no\">data\/<\/code> und <code data-no-translation=\"\" translate=\"no\">txData\/<\/code> -Unterverzeichnissen. Das Image nutzt <code data-no-translation=\"\" translate=\"no\">\/config<\/code> f\u00fcr Serverdaten und <code data-no-translation=\"\" translate=\"no\">\/txData<\/code> f\u00fcr txAdmin. Beschr\u00e4nke den Zugriff auf die Host-Verzeichnisse und Backups, da sie Zugangsdaten enthalten werden.<\/p>\n<h2 id=\"create-compose-yaml\">compose.yaml erstellen<\/h2>\n<p>Speichere dies als <code data-no-translation=\"\" translate=\"no\">compose.yaml<\/code> in diesem Projektverzeichnis. Die Lizenzkonfiguration bleibt der gesch\u00fctzten txAdmin-\/Server-Einrichtung \u00fcberlassen; der Verwaltungsport wird an die Loopback-Adresse des Hosts gebunden.<\/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>Der <code data-no-translation=\"\" translate=\"no\">stable<\/code> -Tag des Images ist ver\u00e4nderlich und folgt der Definition des Upstream-Image-Maintainers. Lies vor dem Deployment dessen Release\/Quelle; behandle das Wort \u201estable\u201c nicht als getestete Garantie. Ersetze nach dem Test die Image-Referenz durch den exakten gepullten Digest, den du dokumentierst.<\/p>\n<h2 id=\"start-and-configure-txadmin\">txAdmin starten und konfigurieren<\/h2>\n<p>F\u00fchre im Projektverzeichnis auf dem Docker-Host Folgendes aus:<\/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>Greife lokal auf txAdmin zu unter <code data-no-translation=\"\" translate=\"no\">http:\/\/127.0.0.1:40120<\/code>. Erstelle von deinem Arbeitsrechner aus einen SSH-Tunnel zu deinem tats\u00e4chlichen Host mit <code data-no-translation=\"\" translate=\"no\">ssh -L 40120:127.0.0.1:40120 user@your-server<\/code>, \u00f6ffne dann dieselbe lokale Adresse in deinem Browser. Verwende dein echtes SSH-Konto bzw. deinen echten Hostnamen. Ver\u00f6ffentliche keine Setup-PINs oder Log-Ausgaben, die Zugangsdaten enthalten.<\/p>\n<p>Folge dem Setup von txAdmin und w\u00e4hle einen Speicherort f\u00fcr die Server-Daten innerhalb von <code data-no-translation=\"\" translate=\"no\">\/config<\/code>, oder in einem anderen explizit gemounteten persistenten Verzeichnis. Gib die g\u00fcltige Server-Lizenz privat ein. Wenn das gew\u00e4hlte Recipe eine Datenbank ben\u00f6tigt, stelle diese separat bereit und halte ihren Port privat; dieses Compose-Beispiel enth\u00e4lt keine.<\/p>\n<h2 id=\"verify-networking-and-persistence\">Netzwerk und Persistenz \u00fcberpr\u00fcfen<\/h2>\n<p>Gib den vorgesehenen Spieler-Endpunkt im Host-\/Provider-Netzwerk f\u00fcr TCP und UDP frei. Pr\u00fcfe den Zugriff von au\u00dferhalb des Hosts. Von Docker ver\u00f6ffentlichte Ports greifen in Dockers Firewall-Regeln ein und k\u00f6nnen gew\u00f6hnliche UFW-Input-Regeln umgehen; ziehe <a href=\"https:\/\/docs.docker.com\/engine\/network\/packet-filtering-firewalls\/\">die Firewall-Dokumentation von Docker<\/a> zurate, anstatt ein Ersatz-Firewall-Regelwerk einzuf\u00fcgen.<\/p>\n<p>F\u00fchre einen Test-Join durch, pr\u00fcfe Ressourcenfehler und nimm eine harmlose Konfigurations\u00e4nderung vor. Erstelle den Container neu mit <code data-no-translation=\"\" translate=\"no\">docker compose up -d --force-recreate<\/code> und best\u00e4tige, dass Profil\/Konfiguration erhalten bleiben. Eine HTTP-Antwort von <code data-no-translation=\"\" translate=\"no\">info.json<\/code> ist nur eine einfache Verf\u00fcgbarkeitspr\u00fcfung und kein Nachweis f\u00fcr einen gesunden Gameplay-Betrieb.<\/p>\n<h2 id=\"back-up-a-consistent-set\">Ein konsistentes Set sichern<\/h2>\n<p>Plane ein Wartungsfenster ein und stoppe Schreibvorg\u00e4nge aus dem Gameplay. Sichere die gemounteten Verzeichnisse, die Compose-Definition, die private Konfiguration und jede externe Datenbank als ein zusammenpassendes Wiederherstellungsset. F\u00fcr rein dateibasierte Daten kann bei gestopptem Dienst ein privates Archiv aus dem Projektverzeichnis erstellt werden mit:<\/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>Pr\u00fcfe als Teil deines Runbooks, ob die Archiverstellung erfolgreich war, bevor du neu startest. Nimm zus\u00e4tzliche Konfigurationsdateien und das Datenbank-Backup mit auf, wenn dein Setup sie nutzt. Ein Dateiarchiv allein kann keine externe Datenbank wiederherstellen. Teste die Wiederherstellung in separate Verzeichnisse und eine separate Datenbank.<\/p>\n<h2 id=\"update-and-recover\">Aktualisieren und wiederherstellen<\/h2>\n<p>Notiere den Digest des aktuell laufenden Images und erstelle das passende Backup, bevor du ein Update pullst. Teste das Kandidaten-Image gegen eine Kopie, \u00e4ndere dann w\u00e4hrend der Wartung die Image-Referenz in der Produktion und wiederhole die Join-\/Persistenz-Pr\u00fcfungen.<\/p>\n<p>Ein Rollback nur des Images macht Datenmigrationen, die von Ressourcen durchgef\u00fchrt wurden, m\u00f6glicherweise nicht r\u00fcckg\u00e4ngig. Stelle die passenden Dateien\/Daten bewusst wieder her und ber\u00fccksichtige Schreibvorg\u00e4nge seit dem Backup. <code data-no-translation=\"\" translate=\"no\">docker compose down<\/code> stoppt\/entfernt den Dienst und beh\u00e4lt dabei diese per Bind-Mount eingebundenen Verzeichnisse; behalte diese Verzeichnisse, bis eine Wiederherstellung nicht mehr n\u00f6tig ist.<\/p>\n<h2 id=\"reference-documentation\">Referenzdokumentation<\/h2>\n<p><a href=\"https:\/\/github.com\/spritsail\/fivem\">Quelle: spritsail\/fivem<\/a> \u00b7 <a href=\"https:\/\/docs.docker.com\/reference\/compose-file\/services\/\">Quelle: 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>Ein Docker-Deployment braucht persistente Serverdaten, bewusst gesetzte Port-Freigaben und ein wiederherstellbares Paar aus Image und Konfiguration. Das Beispiel unten nutzt das von der Community gepflegte spritsail-Image auf einem Linux-Host; seine Pfade und Umgebungsvariablen sind spezifisch f\u00fcr dieses Image und keine universellen FXServer-Optionen.<\/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\/de\/wp-json\/wp\/v2\/posts\/199189","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rpcrate.com\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rpcrate.com\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rpcrate.com\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/rpcrate.com\/de\/wp-json\/wp\/v2\/comments?post=199189"}],"version-history":[{"count":6,"href":"https:\/\/rpcrate.com\/de\/wp-json\/wp\/v2\/posts\/199189\/revisions"}],"predecessor-version":[{"id":217335,"href":"https:\/\/rpcrate.com\/de\/wp-json\/wp\/v2\/posts\/199189\/revisions\/217335"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/rpcrate.com\/de\/wp-json\/wp\/v2\/media\/199191"}],"wp:attachment":[{"href":"https:\/\/rpcrate.com\/de\/wp-json\/wp\/v2\/media?parent=199189"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rpcrate.com\/de\/wp-json\/wp\/v2\/categories?post=199189"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rpcrate.com\/de\/wp-json\/wp\/v2\/tags?post=199189"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}