Palworld Server mit Docker

Diese Anleitung beschreibt die Erstellung eines Palworld Servers mit Einstellungen und Backup in einem isolierten Docker-Container.

Vorbereitung

Es wird Docker und rsync benötigt.

pacman -Syu docker rsync
apt update
apt install docker.io rsync

Server downloaden

Hinweis

Die Installation des Servers findet im Ordner /srv/docker/containers/steam/palworld/ statt, dieser muss an mehreren Stellen angepasst werden, falls ein anderer Ort gewünscht ist!

mkdir -p /srv/docker/containers/steam/palworld/
chown 1000:1000 /srv/docker/containers/steam/palworld/
docker run --network host --rm -it --name=steamcmd -v /srv/docker/containers/steam/palworld/:/home/steam/Steam/steamapps:rw cm2network/steamcmd /home/steam/steamcmd/steamcmd.sh +login anonymous +app_update 2394010 validate +quit

Server vorbereiten

Einfach eine docker-compose.yml anlegen

Hinweis

Die IP-Adresse (1.2.3.4) durch die öffentliche IP ersetzen und ggf. Port, falls ein anderer gewünscht ist.

version: "3"
services:
  palworld-server:
    container_name: 'steam_palworld'
    hostname: 'palworld-server'
    image: 'cm2network/steamcmd'
    ports:
    - 8211:8211/udp
    - 27015:27015/tcp
    volumes:
      - /srv/docker/containers/steam/palworld/:/home/steam/Steam/steamapps:rw
    entrypoint:
      - "/home/steam/Steam/steamapps/common/PalServer/PalServer.sh"
      # FALLS der Server gelistet werden soll, sonst Zeile löschen
      - "EpicApp=PalServer"
      # HIER öffentliche IP einsetzen
      - "-publicip=1.2.3.4"
      # FALLS ein anderer Port genutzt wird, anpassen
      - "-publicport=8211"
    environment:
      PGID: 1000
      PUID: 1000
    restart: unless-stopped
    networks:
      default:
        ipv4_address: 172.22.25.2
networks:
  default:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 172.22.25.0/24
    driver_opts:
      com.docker.network.bridge.name: br_steam

Nun muss die Server-Config selbst kopiert werden:

mkdir -p /srv/docker/containers/steam/palworld/common/PalServer/Pal/Saved/Config/
chown -R 1000:1000 /srv/docker/containers/steam/palworld
cp /srv/docker/containers/steam/palworld/common/PalServer/DefaultPalWorldSettings.ini /srv/docker/containers/steam/palworld/common/PalServer/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini

Danach kann die Konfiguration angepasst werden. Informationen zu den Parametern findet man zu genüge im Internet…

Start des Servers

docker-compose up -d

Grundsätzlich loggt der Server kaum etwas und man findet nur Hinweise auf den Kontakt des Steam-Netzwerks, ansonsten bleibt es recht ruhig:

2024-02-01T10:22:44.694623116Z - Existing per-process limit (soft=xxxxx, hard=xxxxx) is enough for us (need only xxxxx)
2024-02-01T10:22:44.694638425Z Increasing per-process limit of core file size to infinity.
2024-02-01T10:22:44.694641135Z - Existing per-process limit (soft=xxxxx, hard=xxxxx) is enough for us (need only xxxxx)
2024-02-01T10:22:44.775042934Z CAppInfoCacheReadFromDiskThread took 0 milliseconds to initialize
2024-02-01T10:22:44.787811558Z Setting breakpad minidump AppID = 2394010
2024-02-01T10:22:44.788494153Z [S_API FAIL] Tried to access Steam interface SteamUser021 before SteamAPI_Init succeeded.
2024-02-01T10:22:44.788499153Z [S_API FAIL] Tried to access Steam interface SteamFriends017 before SteamAPI_Init succeeded.
2024-02-01T10:22:45.224352804Z [S_API FAIL] Tried to access Steam interface STEAMAPPS_INTERFACE_VERSION008 before SteamAPI_Init succeeded.
2024-02-01T10:22:45.279131338Z [S_API FAIL] Tried to access Steam interface SteamNetworkingUtils004 before SteamAPI_Init succeeded.

Backup

Hinweis

Das Skript wird alle 10 Minuten ausgeführt und löscht alte Backups nach 7 Tagen.

Ein einfaches Skript unter /usr/local/bin/backup_palworld.sh anlegen.

#/bin/bash

# 7 Tage Backups behalten
BACKUP_ROTATE_HOURS="$(( 7 * 24 ))"
BACKUP_DIR="/srv/backup/palworld/"

DATE=$(date +'%Y-%m-%d-%H-%M-%S')
PATH_DST="${BACKUP_DIR}/${DATE}/"
PATH_SRC="/srv/docker/containers/steam/palworld/common/PalServer/Pal/Saved/"

mkdir -p ${BACKUP_DIR}

# kopieren des Backups
rsync -aH "${PATH_SRC}" "${PATH_DST}"
# Zeitstempel auf NOW()
touch "${PATH_DST}"

backup_timeout_minutes="$(( $BACKUP_ROTATE_HOURS * 60 ))"

# alte Backups finden die älter als Rotation sind und löschen
find "${BACKUP_DIR}" -maxdepth 1 -mmin +${backup_timeout_minutes} -exec rm -rv {} \;

Das Skript mmuss noch ausführbar gemacht werden und kann dann im Crontab hinterlegt werden:

chmod 700 /usr/local/bin/backup_palworld.sh

crontab -e

# alle 10 Minuten Backup ausführen
*/10 * * * * /usr/local/bin/backup_palworld.sh