Своя площадка Palworld - это совсем другой опыт, чем игра на публичных серверах. Здесь хозяин решает, насколько суровой будет смерть, как часто появляются палы, сколько игроков уживётся в одной гильдии и какой именно мир встретит друзей при первом подключении. Сборка такого сервера на Linux требует терпения и понимания, что движок Unreal Engine 5 под капотом игры далеко не самый экономный сосед. Ниже разложен путь от голой Ubuntu до сервера, который сам обновляется через systemd, переживает любые скачки нагрузки и грамотно использует выделенные ресурсы.

Аппаратные требования и подготовка серверной базы под нагрузку Palworld

Palworld - это не просто симулятор сбора зверушек. Это полноценный мир с физикой, AI-поведением десятков активных существ, симуляцией баз и процедурной генерацией событий. Минимальная конфигурация официальной документации скромна. 4 ГБ оперативки и любой современный CPU. Реальность жёстче. На карте с активными десятью игроками, тремя базами и сотней рабочих палов сервер уверенно съедает 16-20 ГБ памяти, а всплески при автосохранении доходят до 24 ГБ. Поэтому ориентир разумного администратора другой.

Для четырёх друзей хватит 8 ГБ и четырёх ядер, для среднего сервера на 16 человек комфортный минимум - это 16 ГБ и шесть-восемь ядер с высокой одноядерной производительностью. Сервер на 32+ игрока с десятком активных гильдий уверенно дышит только при 32 ГБ оперативной памяти и быстром NVMe-диске. Жёсткий диск убивает производительность практически мгновенно, потому что движок постоянно пишет save-файлы, и любая задержка превращается в зависшие палы и вылеты клиентов.

Базовая подготовка системы стандартна и занимает несколько минут:

sudo apt update && sudo apt upgrade -y
sudo apt install software-properties-common -y
sudo add-apt-repository multiverse
sudo dpkg --add-architecture i386
sudo apt update
sudo apt install -y lib32gcc-s1 curl wget unzip nano

Дальше создаётся отдельный системный пользователь, под которым будет жить весь набор файлов. Запуск игрового сервера от root - всё равно что доверить ключи от квартиры случайному прохожему. Безопаснее делать так:

sudo useradd -m -s /bin/bash steam
sudo passwd steam

Открытые порты тоже стоит подготовить заранее. По умолчанию Palworld использует UDP 8211 для игрового трафика, плюс некоторые администраторы открывают 27015 для протокола Steam Query, чтобы сервер виден был в общем списке. RCON, если планируется, обычно вешается на TCP 25575 с длинным паролем.

Установка SteamCMD и загрузка серверных файлов через официальный клиент Valve

SteamCMD - это командный интерфейс Steam, через который скачиваются и обновляются файлы любого выделенного сервера. Идентификатор приложения Palworld фиксированный, его имеет смысл запомнить - 2394010. Вход выполняется анонимно, никакого аккаунта Steam не требуется. Все действия лучше выполнять от имени созданного пользователя:

su - steam
mkdir -p ~/steamcmd && cd ~/steamcmd
wget https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz
tar -xvzf steamcmd_linux.tar.gz
chmod +x steamcmd.sh

Сама загрузка серверных файлов запускается одной строкой. Объём дистрибутива - примерно 4-5 ГБ, на быстром канале процесс занимает несколько минут:

./steamcmd.sh +force_install_dir /home/steam/PalServer +login anonymous +app_update 2394010 validate +quit

Параметр validate стоит держать всегда. Он сверяет контрольные суммы и переустанавливает повреждённые файлы. Лишняя минута проверки часто спасает от загадочных крашей при старте, причину которых потом ищут полночи в логах. После успешной загрузки появляется директория PalServer с исполняемым файлом PalServer.sh и всеми зависимостями Unreal Engine.

Один тонкий момент с Linux-версией. Сервер требует библиотеку steamclient.so в строго определённом месте, и не всегда находит её сам. Если при первом запуске сыплются ошибки про отсутствующие библиотеки, помогает создание символических ссылок:

mkdir -p ~/.steam/sdk64
cp ~/steamcmd/linux64/steamclient.so ~/.steam/sdk64/

Первый запуск делается руками, чтобы движок создал базовую структуру конфигов. Команда выглядит так:

cd /home/steam/PalServer
./PalServer.sh -useperfthreads -NoAsyncLoadingThread -UseMultithreadForDS

Через несколько секунд появятся папки Pal/Saved/Config/LinuxServer/ и связанные с ними файлы. После этого сервер можно остановить через Ctrl+C и переходить к настройке.

Глубокая работа с PalWorldSettings.ini и понимание формата конфигурационного файла

PalWorldSettings.ini - это нервный центр всего сервера. Один файл управляет десятками параметров, от скорости смены дня и ночи до штрафов за смерть и максимума рабочих в базовом лагере. Главная сложность не в количестве опций, а в их формате. Файл должен состоять ровно из двух строк. Заголовок секции и одна гигантская строка OptionSettings со всеми параметрами, перечисленными через запятую внутри скобок. Любая лишняя точка с запятой, пропущенная скобка или перенос строки - и сервер просто проигнорирует весь файл, откатившись к умолчаниям.

Сначала копируется шаблон по умолчанию в правильное место:

cp /home/steam/PalServer/DefaultPalWorldSettings.ini \
   /home/steam/PalServer/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini

Открывается файл через nano и приводится к нужному виду. Минимальный рабочий пример с продуманными значениями:

[/Script/Pal.PalGameWorldSettings]
OptionSettings=(Difficulty=None,DayTimeSpeedRate=1.000000,NightTimeSpeedRate=1.000000,ExpRate=1.500000,PalCaptureRate=1.200000,PalSpawnNumRate=1.000000,PlayerDamageRateAttack=1.000000,PlayerDamageRateDefense=1.000000,PalDamageRateAttack=1.000000,PalDamageRateDefense=1.000000,PlayerStomachDecreaceRate=0.700000,PlayerStaminaDecreaceRate=0.500000,PalStomachDecreaceRate=0.700000,PalStaminaDecreaceRate=0.500000,BuildObjectDamageRate=1.000000,BuildObjectDeteriorationDamageRate=0.500000,CollectionDropRate=1.500000,CollectionObjectHpRate=1.000000,CollectionObjectRespawnSpeedRate=1.000000,EnemyDropItemRate=1.000000,DeathPenalty=All,bEnablePlayerToPlayerDamage=False,bEnableFriendlyFire=False,bEnableInvaderEnemy=True,bIsPvP=False,bEnableNonLoginPenalty=True,bEnableFastTravel=True,bIsStartLocationSelectByMap=True,bExistPlayerAfterLogout=False,bEnableDefenseOtherGuildPlayer=False,CoopPlayerMaxNum=4,ServerPlayerMaxNum=32,ServerName="My Palworld Server",ServerDescription="A custom server",AdminPassword="strong_admin_password",ServerPassword="",PublicPort=8211,PublicIP="",RCONEnabled=True,RCONPort=25575,Region="",bUseAuth=True,BanListURL="https://api.palworldgame.com/api/banlist.txt",bIsUseBackupSaveData=True,LogFormatType="Text")

Каждый параметр заслуживает осмысления. Множители вроде ExpRate и PalCaptureRate стоит поднимать осторожно. Слишком щедрые значения убивают долгосрочный интерес уже через неделю, когда игроки получают всё топовое снаряжение и теряют мотивацию. Опытные администраторы рекомендуют для кооперативного сервера набор вроде ExpRate=1.5, CollectionDropRate=1.5 и DeathPenalty=Item. Это ускоряет старт, не превращая мир в песочницу с читами.

Параметры PlayerStomachDecreaceRate и StaminaDecreaceRate со значением 0.5 делают выживание заметно мягче, что разумно для серверов с друзьями, но категорически противопоказано для хардкорных PvP-площадок. Флаг bIsUseBackupSaveData=True включает встроенную систему резервных копий, которая делает 5 снапшотов раз в 30 секунд, 6 раз в 10 минут, 12 раз в час и 7 раз в сутки. На активном сервере это ест дисковое пространство ощутимо, поэтому через cron лучше настроить ротацию старых бэкапов.

Параметры запуска движка и оптимизация Unreal Engine под выделенный сервер

Сам бинарник PalServer.sh принимает несколько ключевых флагов, которые радикально влияют на производительность. Полный набор рекомендованных разработчиком опций выглядит так:

./PalServer.sh -useperfthreads -NoAsyncLoadingThread -UseMultithreadForDS \
  -port=8211 -players=32 -EpicApp=PalServer

Каждый флаг решает свою задачу. Параметр -useperfthreads включает специализированные потоки для производительности, что особенно заметно на серверах с шестью и более ядрами. Флаг -NoAsyncLoadingThread отключает отдельный поток асинхронной загрузки, и это парадоксально ускоряет работу. Меньше потоков - меньше переключений контекста, меньше борьбы за CPU. Опция -UseMultithreadForDS форсирует многопоточность для выделенного сервера, без неё движок по умолчанию работает в один поток на критичных участках.

Дополнительно стоит ограничить частоту тиков сервера. Хотя в документации это не выпячивается, добавление переменных окружения помогает движку не пытаться обгонять сам себя:

export TARGET_TICK_RATE=30

Полезно также обратить внимание на параметр CoopPlayerMaxNum в PalWorldSettings.ini. Он ограничивает максимум игроков в одной кооперативной команде и сильно влияет на нагрузку. Команда из четырёх человек на одной базе генерирует на порядок меньше сетевого трафика, чем гильдия из двадцати. Уменьшение BaseCampWorkerMaxNum со стандартных 15 до 10 на слабом железе спасает FPS клиентов в момент массовой работы палов.

Для тех, кто всерьёз хочет выжать максимум из машины, имеет смысл вручную задать привязку процессов к ядрам через taskset. Это убирает лишние перемещения процесса между ядрами и стабилизирует производительность. Команда выглядит примерно так - taskset -c 0-5 ./PalServer.sh ... - и привязывает сервер к первым шести ядрам.

Создание systemd службы для автозапуска сервера и удобного управления

Запускать сервер руками после каждой перезагрузки - путь, на котором быстро устаёт даже терпеливый администратор. Служба systemd решает вопрос раз и навсегда. Файл создаётся по адресу /etc/systemd/system/palworld.service со следующим содержимым:

[Unit]
Description=Palworld Dedicated Server
Wants=network-online.target
After=network-online.target

[Service]
Type=simple
User=steam
Group=steam
WorkingDirectory=/home/steam/PalServer
ExecStartPre=/home/steam/steamcmd/steamcmd.sh +force_install_dir /home/steam/PalServer +login anonymous +app_update 2394010 +quit
ExecStart=/home/steam/PalServer/PalServer.sh -useperfthreads -NoAsyncLoadingThread -UseMultithreadForDS -port=8211 -players=32
Restart=on-failure
RestartSec=15
TimeoutStartSec=900
StandardInput=null

[Install]
WantedBy=multi-user.target

Несколько деталей стоит разобрать. Директива ExecStartPre запускает SteamCMD перед каждым стартом сервера, что автоматически подтягивает свежие обновления. Это удобно после очередного патча от разработчиков, но имеет обратную сторону - старт занимает дольше. TimeoutStartSec=900 даёт пятнадцать минут на инициализацию, потому что первая загрузка большой карты с десятками сохранённых баз действительно может быть долгой. Параметр StandardInput=null отсекает попытки внешних процессов влиять на консоль сервера.

Активация и контроль службы выполняются стандартным набором команд:

  • sudo systemctl daemon-reload перечитывает юниты
  • sudo systemctl enable palworld включает автозапуск при загрузке
  • sudo systemctl start palworld делает первый ручной запуск
  • sudo systemctl status palworld показывает текущее состояние и PID
  • journalctl -u palworld -f выдаёт живой поток логов для отладки

Для регулярного перезапуска раз в сутки удобно повесить на cron строку с systemctl restart palworld. Это очищает накопившиеся утечки памяти движка Unreal Engine, которые в Palworld на длинных сессиях достигают пары гигабайт.

Защита от потери данных и финальная настройка резервных копий

Любая катастрофа на сервере без бэкапов превращается в потерянные часы построек игроков. Встроенная система Palworld пишет автоматические снапшоты, но они хранятся на том же диске, что и основной мир. Один сбой накопителя - и всё пропало. Грамотная защита строится в два слоя.

Первый слой - это локальная ротация. Простой скрипт backup.sh упаковывает папку Pal/Saved/SaveGames раз в час и складывает в /home/steam/backups, удаляя архивы старше семи дней:

#!/bin/bash
BACKUP_DIR="/home/steam/backups"
SAVE_DIR="/home/steam/PalServer/Pal/Saved/SaveGames"
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p $BACKUP_DIR
tar -czf $BACKUP_DIR/palworld_$DATE.tar.gz $SAVE_DIR
find $BACKUP_DIR -name "palworld_*.tar.gz" -mtime +7 -delete

Скрипт делается исполняемым через chmod +x и вешается на cron строкой 0 * * * * /home/steam/backup.sh. Второй слой - выгрузка свежих архивов на удалённое хранилище. Это может быть rsync на отдельный VPS, отправка на S3-совместимое облако или даже домашний NAS через SSH. Главное, чтобы копии физически не лежали на одной машине с сервером.

Что в итоге собирается у того, кто прошёл этот путь. Сервер Palworld, который сам обновляется при каждом старте, переживает падения через автоматический рестарт, грамотно использует ресурсы железа благодаря правильным флагам Unreal Engine и не теряет прогресс даже при катастрофических сбоях диска. Такая система выдерживает активную игру десятков людей, чинится одной командой systemctl и расширяется без переустановки с нуля. Главное преимущество самостоятельной сборки в том, что каждый параметр прозрачен. Если что-то ведёт себя не так, администратор знает, в какой именно файл смотреть, а не пишет в поддержку хостинга в надежде на ответ к утру.