Palworld Dedicated Server Configuration

Palworld is a popular creature-collecting and survival game that supports dedicated server hosting on Linux. This guide covers complete Palworld server installation, configuration through PalWorldSettings.ini, memory optimization, port setup, and systemd management. Palworld is relatively new but has become extremely popular, requiring careful resource allocation and network configuration.

Table of Contents

System Requirements

Palworld has significant memory requirements:

  • Ubuntu 20.04 LTS or later
  • 16GB RAM minimum (32GB recommended for 50+ players)
  • 100GB+ disk space (SSD recommended for performance)
  • 4+ CPU cores
  • Stable internet connection
  • Root or sudo access

Palworld servers consume significant RAM, often 15-25GB depending on player count.

Installing SteamCMD and Palworld

Install dependencies:

sudo apt-get update
sudo apt-get install -y curl wget file bzip2 gzip unzip python3 util-linux ca-certificates binutils lib32gcc1 lib32stdc++6

Create steam user:

sudo useradd -m -s /bin/bash steam
sudo -u steam mkdir -p /home/steam/steamcmd

Install SteamCMD:

cd /home/steam/steamcmd
sudo -u steam curl -sqL "https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz" | sudo -u steam tar zxvf -

Verify SteamCMD:

sudo -u steam /home/steam/steamcmd/steamcmd.sh +quit

Create Palworld directory:

sudo -u steam mkdir -p /home/steam/palworld

Install Palworld server (app ID 2394010). This may take 20+ minutes:

sudo -u steam /home/steam/steamcmd/steamcmd.sh \
    +force_install_dir /home/steam/palworld \
    +login anonymous \
    +app_update 2394010 \
    +quit

Verify installation:

ls -la /home/steam/palworld/
file /home/steam/palworld/PalServer.sh
chmod +x /home/steam/palworld/PalServer.sh

Create data directories:

sudo -u steam mkdir -p /home/steam/palworld-data/{Saved,Logs,backups}

Server Configuration

Create the main server startup script:

sudo tee /home/steam/palworld/start_server.sh > /dev/null <<'EOF'
#!/bin/bash

PALWORLD_DIR="/home/steam/palworld"
DATA_DIR="/home/steam/palworld-data"

cd "$PALWORLD_DIR"

mkdir -p "$DATA_DIR/Logs"
mkdir -p "$DATA_DIR/Saved"

# Export environment variables for Palworld
export UE_SERVER_PORT="${UE_SERVER_PORT:-8211}"
export STEAM_PORT="${STEAM_PORT:-8211}"
export QUERY_PORT="${QUERY_PORT:-27015}"

# Run the server
exec "$PALWORLD_DIR/PalServer.sh" \
    -port="${UE_SERVER_PORT}" \
    -queryport="${QUERY_PORT}" \
    -publiclobby \
    -log \
    -useperfthreads \
    -NoAsyncLoadingThread \
    -UseMultithreading \
    2>&1 | tee "$DATA_DIR/Logs/palworld_$(date +%Y%m%d).log"
EOF

sudo chmod +x /home/steam/palworld/start_server.sh
sudo chown steam:steam /home/steam/palworld/start_server.sh

PalWorldSettings.ini Configuration

Create the server configuration file:

mkdir -p /home/steam/palworld-data/Saved/Config/LinuxServer/
sudo tee /home/steam/palworld-data/Saved/Config/LinuxServer/PalWorldSettings.ini > /dev/null <<'EOF'
[/Script/Pal.PalGameWorldSettings]

OptionSettings=(
    Difficulty=None,
    DayTimeSpeedRate=1.0,
    NightTimeSpeedRate=1.0,
    ExpRate=1.0,
    PalCaptureRate=1.0,
    PalSpawnNumRate=1.0,
    PalDamageRateAttack=1.0,
    PalDamageRateDefense=1.0,
    PlayerDamageRateAttack=1.0,
    PlayerDamageRateDefense=1.0,
    PlayerStomachDecreaceRate=1.0,
    PlayerStaminaDecreaceRate=1.0,
    PlayerAutoHPRegeneRate=1.0,
    PlayerAutoHpRegeneRateInSleep=1.0,
    PalStomachDecreaceRate=1.0,
    PalStaminaDecreaceRate=1.0,
    PalAutoHpRegeneRate=1.0,
    PalAutoHpRegeneRateInSleep=1.0,
    BuildObjectDamageRate=1.0,
    BuildObjectDeteriorationDamageRate=1.0,
    CollectionDropRate=1.0,
    CollectionObjectHpRate=1.0,
    CollectionObjectRespawnSpeedRate=1.0,
    EnemyDropItemRate=1.0,
    DeathPenalty=All,
    bEnablePlayerToPlayerDamage=True,
    bEnableFriendlyFire=False,
    bEnableInvaderEnemy=True,
    bActiveUNKO=False,
    bEnableAimbot=False,
    bEnableNPCDelivery=True,
    bEnablePalWarp=True,
    bIsMultiPlay=True,
    bIsPvP=True,
    bCanPickupOtherGuildDeathPenaltyDrop=False,
    bEnableNonLoginPenalty=True,
    bEnablePalPass=True,
    GuildPlayerMaxNum=20,
    PalEggDefaultHatchingTime=72.0,
    WorkSpeedRate=1.0,
    bIsShowEnemyHealth=False,
    bIsMultiplayer=True,
    bServerLog=True,
    bServerDTLS=True,
    LogFormatType=Text
)

[/Script/Pal.PalNetworkPrivateSettings]
b_Enable_Private_Network=False
Private_Network_Authentication_Token=""

[/Script/Pal.PalGameSession]
SessionName=Palworld Server
MaxPlayer=32
Password=""
bIsLAN=False
bPublicSession=True
bUseVoiceChat=True
EOF

sudo chown steam:steam /home/steam/palworld-data/Saved/Config/LinuxServer/PalWorldSettings.ini

Configuration explanation:

  • Difficulty: None (standard), difficulty options available
  • ExpRate: 1.0 (default), increase for faster leveling
  • PalCaptureRate: 1.0, increase to make capturing easier
  • PalSpawnNumRate: 1.0, control creature spawning frequency
  • PlayerDamageRateAttack/Defense: 1.0, adjust PvP combat balance
  • GuildPlayerMaxNum: 20, maximum players in a guild/group
  • bEnablePvP: Enable/disable player versus player combat
  • bEnableNonLoginPenalty: Penalty for not playing for a period

Memory and Performance Settings

Create environment file with memory optimization:

sudo tee /home/steam/palworld/server.env > /dev/null <<'EOF'
# Memory settings (adjust based on available RAM)
UE_MALLOC_BIN_DETAILED_STATS=1
MALLOC_TRIM_THRESHOLD=536870912

# Performance settings
UE_SERVER_PORT=8211
STEAM_PORT=8211
QUERY_PORT=27015

# Threading options
UE_NUM_THREADS=8

# Logging
UE_LOG_LEVEL=warning

# Server options
SERVER_PASSWORD=
MAX_PLAYERS=32
COMMUNITY_NAME=MyPalworldServer
EOF

sudo chown steam:steam /home/steam/palworld/server.env
sudo chmod 600 /home/steam/palworld/server.env

Optimize system memory settings:

# Increase virtual memory if needed
sudo sysctl -w vm.swappiness=10
echo "vm.swappiness=10" | sudo tee -a /etc/sysctl.conf

# Increase max map count for large applications
sudo sysctl -w vm.max_map_count=262144
echo "vm.max_map_count=262144" | sudo tee -a /etc/sysctl.conf

# Apply changes
sudo sysctl -p

Monitor memory usage:

# Real-time monitoring
watch -n 1 'free -h && ps aux | grep PalServer | grep -v grep'

# Detailed memory breakdown
ps -o pid,vsz,rss,pmem,comm $(pgrep -f PalServer)

# Memory profiling
smem -s rss -p PalServer

Port Configuration

Palworld uses specific ports:

# Game server port (UDP)
UE_PORT=8211

# Query port for server list (UDP)
QUERY_PORT=27015

# Configure firewall (UFW)
sudo ufw allow 8211/udp
sudo ufw allow 27015/udp
sudo ufw allow 8211/tcp
sudo ufw allow 27015/tcp

# For iptables systems
sudo iptables -A INPUT -p udp --dport 8211 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 27015 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 8211 -j ACCEPT
sudo iptables-A INPUT -p tcp --dport 27015 -j ACCEPT

# Verify ports are listening
sudo netstat -tulnp | grep -E "8211|27015"
ss -tulnp | grep PalServer

Port forwarding on router:

# If accessing from outside your network, forward these to your server:
# External UDP 8211 -> Internal UDP 8211
# External UDP 27015 -> Internal UDP 27015

Running with Systemd

Create systemd service:

sudo tee /etc/systemd/system/palworld.service > /dev/null <<'EOF'
[Unit]
Description=Palworld Dedicated Server
After=network.target
Wants=network-online.target

[Service]
Type=simple
User=steam
Group=steam
WorkingDirectory=/home/steam/palworld
EnvironmentFile=/home/steam/palworld/server.env

ExecStart=/home/steam/palworld/start_server.sh

Restart=on-failure
RestartSec=30
StandardOutput=journal
StandardError=journal

# Critical resource limits for Palworld
LimitNOFILE=65536
LimitNPROC=32768
MemoryMax=28G

# Security
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=yes
ReadWritePaths=/home/steam/palworld-data

[Install]
WantedBy=multi-user.target
EOF

Enable and start the service:

sudo systemctl daemon-reload
sudo systemctl enable palworld.service
sudo systemctl start palworld.service
sudo systemctl status palworld.service

Monitor service logs:

sudo journalctl -u palworld.service -f
sudo journalctl -u palworld.service -n 100 --no-pager
tail -f /home/steam/palworld-data/Logs/palworld_$(date +%Y%m%d).log

Admin and Moderation

Palworld admin commands (via admin panel or console):

# Server management commands
/ShowPlayers              # List all connected players
/Info                     # Server information
/Save                     # Force save world

# Player management
/Kick PlayerName          # Kick a player
/Ban PlayerSteamID        # Ban a player
/Unban PlayerSteamID      # Unban a player
/BanList                  # Show banned players

# Game control
/Broadcast Message        # Send message to all players
/DoExit                   # Graceful server shutdown
/ForceStopGame            # Force stop the game

Create ban list file:

sudo tee /home/steam/palworld-data/Saved/bans.txt > /dev/null <<'EOF'
# Format: SteamID64 or IP address (one per line)
# Example:
# 76561198012345678
# 192.168.1.100
EOF

sudo chown steam:steam /home/steam/palworld-data/Saved/bans.txt

Create admin script for easy management:

sudo tee /home/steam/manage_palworld.sh > /dev/null <<'EOF'
#!/bin/bash

case "$1" in
    status)
        systemctl status palworld.service
        ;;
    restart)
        echo "Restarting Palworld server..."
        systemctl restart palworld.service
        sleep 5
        systemctl status palworld.service
        ;;
    logs)
        journalctl -u palworld.service -f -n 100
        ;;
    backup)
        /home/steam/backup_palworld.sh
        ;;
    *)
        echo "Usage: $0 {status|restart|logs|backup}"
        ;;
esac
EOF

sudo chmod +x /home/steam/manage_palworld.sh

Backup Strategy

Create automated backup script:

sudo tee /home/steam/backup_palworld.sh > /dev/null <<'EOF'
#!/bin/bash

DATA_DIR="/home/steam/palworld-data"
BACKUP_DIR="$DATA_DIR/backups"
RETENTION_DAYS=30
TIMESTAMP=$(date +%Y%m%d_%H%M%S)

mkdir -p "$BACKUP_DIR"

# Backup world save data
tar -czf "$BACKUP_DIR/palworld_backup_${TIMESTAMP}.tar.gz" \
    -C "$DATA_DIR" Saved/ \
    2>/dev/null

if [ $? -eq 0 ]; then
    SIZE=$(du -sh "$BACKUP_DIR/palworld_backup_${TIMESTAMP}.tar.gz" | awk '{print $1}')
    echo "[$(date)] Backup created: palworld_backup_${TIMESTAMP}.tar.gz ($SIZE)"
else
    echo "[$(date)] Backup failed!" >&2
    exit 1
fi

# Cleanup old backups
OLD_BACKUPS=$(find "$BACKUP_DIR" -name "palworld_backup_*.tar.gz" -mtime +${RETENTION_DAYS})
if [ ! -z "$OLD_BACKUPS" ]; then
    echo "$OLD_BACKUPS" | xargs rm -v
    echo "[$(date)] Old backups removed"
fi

# Keep track of backup sizes
du -sh "$BACKUP_DIR" | awk '{print "Total backup size: " $1}'
EOF

sudo chmod +x /home/steam/backup_palworld.sh
sudo chown steam:steam /home/steam/backup_palworld.sh

Schedule daily backups:

# Edit crontab
sudo tee -a /var/spool/cron/crontabs/steam > /dev/null <<'EOF'
# Daily backup at 3 AM
0 3 * * * /home/steam/backup_palworld.sh >> /home/steam/palworld-data/Logs/backup.log 2>&1

# Restart server daily at 4 AM for maintenance
0 4 * * * systemctl restart palworld.service >> /home/steam/palworld-data/Logs/maintenance.log 2>&1
EOF

sudo systemctl restart cron

Restore from backup:

sudo systemctl stop palworld.service
BACKUP="/home/steam/palworld-data/backups/palworld_backup_20240101_030000.tar.gz"
sudo -u steam tar -xzf "$BACKUP" -C /home/steam/palworld-data/
sudo systemctl start palworld.service

Optimization Techniques

For better performance with large player counts:

# CPU affinity for server process
PALPID=$(pgrep -f PalServer)
taskset -p -c 0-7 $PALPID

# Monitor CPU usage
htop -p $PALPID

# Increase UDP buffer sizes
sudo sysctl -w net.core.rmem_max=134217728
sudo sysctl -w net.core.wmem_max=134217728
sudo sysctl -w net.core.rmem_default=131072
sudo sysctl -w net.core.wmem_default=131072

# Enable TCP fast open (if supported)
sudo sysctl -w net.ipv4.tcp_fastopen=3

Monitor system resources continuously:

# Create monitoring dashboard
watch -n 2 'echo "=== Palworld Server Status ===" && \
  echo "" && \
  ps aux | grep PalServer | grep -v grep | awk "{print \"PID: \" \$2, \"MEM: \" \$6/1024 \"MB\", \"CPU: \" \$3 \"%\"}" && \
  echo "" && \
  netstat -s | grep -i udp && \
  echo "" && \
  df -h /home/steam/palworld-data | awk "NR==2 {print \"Disk: \" \$5 \" used\"}"'

Monitoring

Create comprehensive monitoring script:

sudo tee /home/steam/monitor_palworld.sh > /dev/null <<'EOF'
#!/bin/bash

echo "=== Palworld Server Status ==="
echo "Timestamp: $(date)"
echo ""

# Service status
if systemctl is-active --quiet palworld.service; then
    echo "✓ Service is running"
else
    echo "✗ Service is NOT running"
    exit 1
fi

# Process info
PID=$(pgrep -f PalServer)
if [ ! -z "$PID" ]; then
    MEM=$(ps -p $PID -o rss= | awk '{print $1/1024 " MB"}')
    CPU=$(ps -p $PID -o %cpu= | awk '{print $1 "%"}')
    echo "Process ID: $PID"
    echo "Memory: $MEM"
    echo "CPU: $CPU"
fi

# Port status
echo ""
echo "Port Status:"
for PORT in 8211 27015; do
    if ss -tulnp | grep -q ":$PORT "; then
        echo "  ✓ Port $PORT listening"
    else
        echo "  ✗ Port $PORT NOT listening"
    fi
done

# Disk space
echo ""
USAGE=$(df -h /home/steam/palworld-data | awk 'NR==2 {printf "%s / %s (%s)\n", $3, $2, $5}')
echo "Disk Usage: $USAGE"

# Recent errors or warnings
echo ""
RECENT_ERRORS=$(tail -50 /home/steam/palworld-data/Logs/palworld_*.log 2>/dev/null | grep -i "error\|fatal\|exception" | wc -l)
echo "Recent errors: $RECENT_ERRORS"

# Backup status
LATEST_BACKUP=$(ls -t /home/steam/palworld-data/backups/palworld_backup_*.tar.gz 2>/dev/null | head -1)
if [ ! -z "$LATEST_BACKUP" ]; then
    echo "Latest backup: $(basename $LATEST_BACKUP) - $(date -r $LATEST_BACKUP '+%Y-%m-%d %H:%M')"
fi
EOF

sudo chmod +x /home/steam/monitor_palworld.sh

Run monitoring:

/home/steam/monitor_palworld.sh
watch -n 10 '/home/steam/monitor_palworld.sh'

Update server to latest version:

sudo systemctl stop palworld.service
sudo -u steam /home/steam/steamcmd/steamcmd.sh \
    +force_install_dir /home/steam/palworld \
    +login anonymous \
    +app_update 2394010 \
    +quit
sudo systemctl start palworld.service

Conclusion

Your Palworld dedicated server is now fully configured with optimized memory settings, proper networking, and automated backup protection. Palworld provides exciting multiplayer creature-catching experiences with cooperative gameplay mechanics.

Key points:

  • Palworld demands significant RAM - monitor memory usage closely
  • Configure PalWorldSettings.ini for your desired gameplay experience
  • Implement daily automated backups for data protection
  • Monitor server performance and player experience
  • Keep the server updated with latest patches
  • Use admin commands for effective community management
  • Plan for scaling as your player base grows

A well-maintained Palworld server can provide hundreds of hours of engaging multiplayer entertainment for your player community.