Pterohost docs

Бэкап и восстановление мира Palworld

Как сделать бэкап Palworld dedicated server: где лежат сейвы SaveGames/0, скрипт tar с ротацией и cron, восстановление мира, world-id, инкрементальные бэкапы rsync и borg.

Мир Palworld - это несколько бинарных .sav-файлов, которые движок Unreal Engine 5 переписывает каждые 30 секунд. Один сбой во время автосейва, обрыв записи при нехватке места на диске или неудачное обновление - и прогресс десятков часов исчезает. При этом Palworld печально известен порчей сейвов и потерей персонажей при миграции между хостами. В этой статье разбираем узкую, но критичную тему: где именно лежат сохранения, что и в каком порядке бэкапить, как написать скрипт с ротацией и cron, как корректно восстановить мир и не потерять персонажей, а также как настроить инкрементальные бэкапы через rsync и borg. Установку сервера здесь не дублируем - если он ещё не поднят, начните с гайда установка Palworld dedicated server.

Где Palworld хранит сохранения

Все данные мира лежат внутри каталога сервера в Pal/Saved. Структура выглядит так:

Pal/Saved/
├── Config/
│   └── LinuxServer/
│       ├── PalWorldSettings.ini    # ваши настройки мира
│       └── GameUserSettings.ini
└── SaveGames/
    └── 0/
        └── <32-символьный-world-id>/
            ├── Level.sav           # основной мир: базы, палы, объекты
            ├── LevelMeta.sav       # метаданные мира
            ├── WorldOption.sav     # снимок настроек на момент создания
            └── Players/
                ├── 00000000000000000000000000000001.sav
                └── <player-id>.sav # по файлу на каждого игрока

Ключевые моменты, которые определяют всю стратегию бэкапа:

  • Level.sav - сердце мира. Здесь базы, пойманные палы, инвентари сундуков, состояние построек. Самый большой и самый важный файл, на активном сервере он растёт до сотен мегабайт.
  • Players/<player-id>.sav - персонаж конкретного игрока: уровень, технологии, инвентарь, статы. Эти файлы привязаны к world-id и к Steam GUID. Именно их теряют чаще всего.
  • WorldOption.sav - бинарный слепок игровых настроек на момент генерации мира. Параметры вроде bIsPvP берутся отсюда, а не из ini после старта.
  • <world-id> - 32-символьный идентификатор, созданный при первом запуске. Внутри Players персонажи ссылаются на этот id. Перепутать его при восстановлении - гарантированная потеря прогресса.

Именно поэтому бэкапить нужно всю папку Saved целиком, а не отдельные файлы. Config попадает в тот же архив и восстанавливается вместе с миром - это удобно, PalWorldSettings.ini всегда синхронен с сейвом. Базовую настройку самого конфига мы не расписываем, ей посвящён отдельный материал.

Встроенный бэкап: bIsUseBackupSaveData

В PalWorldSettings.ini есть опция, которую многие пропускают:

OptionSettings=(...,bIsUseBackupSaveData=True,...)

При True движок держит резервную копию сейва рядом с основным (в подкаталоге backup/ внутри папки мира) и при старте, если Level.sav не читается, попробует подгрузить последнюю рабочую копию. Это дешёвая страховка от порчи файла при крэше, и её стоит включить всегда.

Но это не замена внешним бэкапам. Встроенная копия:

  • хранится на том же диске - при сбое накопителя пропадёт вместе с оригиналом;
  • содержит только последнюю версию - откатиться на вчера или на прошлую неделю нельзя;
  • не защищает от логической ошибки (случайно снесённая база сохранится и в резервной копии).

Поэтому bIsUseBackupSaveData=True включаем, но всю реальную защиту строим на внешних архивах по расписанию.

Правильный порядок: сначала Save, потом архив

Главная ошибка ручных и скриптовых бэкапов - архивировать Level.sav в момент, когда движок его переписывает. Palworld пишет сейв не атомарно, и tar может захватить файл наполовину. Результат - архив, который распаковывается, но не грузится.

Правильная последовательность всегда такая:

  1. Отправить на сервер команду Save через RCON.
  2. Подождать 2-3 секунды, пока движок допишет файлы на диск.
  3. Только теперь запускать tar.

Команда Save по RCON (клиент rcon-cli от gorcon, установка описана в гайде по RCON-командам Palworld):

rcon -a 127.0.0.1:25575 -p strong-admin-pass "Save"
sleep 3

Останавливать сервер ради бэкапа не обязательно - Save + пауза дают консистентный снимок на живом сервере. Полная остановка нужна только при восстановлении.

Скрипт бэкапа с ротацией и cron

Собираем всё в один скрипт /home/palworld/backup.sh:

#!/bin/bash
set -euo pipefail

SAVE_DIR=/home/palworld/palserver/Pal/Saved
BACKUP_DIR=/backups/palworld
RCON=/usr/local/bin/rcon
RCON_ADDR=127.0.0.1:25575
RCON_PASS=strong-admin-pass
DATE=$(date +%Y%m%d-%H%M%S)
KEEP_DAYS=14

mkdir -p "$BACKUP_DIR"

# 1. Форсируем сейв мира и ждём записи на диск
if $RCON -a "$RCON_ADDR" -p "$RCON_PASS" "Save"; then
  sleep 3
else
  echo "$(date) RCON Save не прошёл, бэкаплю текущее состояние" >&2
fi

# 2. Архивируем SaveGames + Config одним файлом
ARCHIVE="$BACKUP_DIR/palworld-$DATE.tar.gz"
tar -czf "$ARCHIVE" -C "$SAVE_DIR" SaveGames Config

# 3. Проверяем, что архив не пустой и читается
if ! tar -tzf "$ARCHIVE" >/dev/null 2>&1; then
  echo "$(date) БИТЫЙ архив $ARCHIVE, удаляю" >&2
  rm -f "$ARCHIVE"
  exit 1
fi

# 4. Ротация: удаляем архивы старше KEEP_DAYS
find "$BACKUP_DIR" -name "palworld-*.tar.gz" -mtime +$KEEP_DAYS -delete

echo "$(date) OK: $ARCHIVE ($(du -h "$ARCHIVE" | cut -f1))"

Делаем исполняемым и ставим в cron от пользователя palworld:

chmod +x /home/palworld/backup.sh
crontab -e -u palworld

Расписание - каждые 2 часа плюс ежедневный ночной бэкап (они лягут в один каталог, ротация общая):

# Бэкап Palworld каждые 2 часа
0 */2 * * * /home/palworld/backup.sh >> /home/palworld/backup.log 2>&1

set -euo pipefail в начале гарантирует, что скрипт упадёт на первой же ошибке, а не продолжит с битым состоянием. Логи копятся в backup.log - раз в неделю проверяйте, что там строки OK, а не БИТЫЙ.

Pterohost - игровой хостинг Palworld с NVMe-дисками и DDoS-защитой, где бэкапы делаются в один клик. Промокод 4START даёт -20% на первый заказ. Заказать Palworld сервер

Хранить бэкапы отдельно от сервера

Архив на том же диске, что и мир, спасает от порчи сейва, но не от отказа накопителя. Держите хотя бы одну копию вне сервера. Простой вариант - синкать каталог бэкапов на удалённое хранилище по SSH:

# Раз в сутки отправляем свежие архивы на бэкап-хост
rsync -az --delete /backups/palworld/ backupuser@backup-host:/srv/palworld-backups/

Так у вас две линии обороны: локальные архивы для быстрого отката и внешняя копия на случай, если умрёт весь сервер.

Восстановление мира

Восстановление - обратная операция, и здесь главное правило: сервер должен быть остановлен. Если распаковать архив поверх работающего сервера, автосейв через несколько секунд перезапишет ваши файлы обратно, и вся операция окажется бессмысленной.

Пошагово:

# 1. Останавливаем сервер
sudo systemctl stop palworld

# 2. Отодвигаем текущий (возможно битый) сейв в сторону, а не удаляем
mv /home/palworld/palserver/Pal/Saved \
   /home/palworld/palserver/Pal/Saved.broken-$(date +%s)

# 3. Распаковываем нужный архив на место
mkdir -p /home/palworld/palserver/Pal/Saved
tar -xzf /backups/palworld/palworld-20260711-040000.tar.gz \
    -C /home/palworld/palserver/Pal/Saved

# 4. Возвращаем владельца
chown -R palworld:palworld /home/palworld/palserver/Pal/Saved

# 5. Запускаем
sudo systemctl start palworld

Никогда не удаляйте текущий сейв сразу - переименуйте его в Saved.broken-*. Если из восстановленного бэкапа вылезет неожиданная проблема, у вас останется исходное состояние.

Следите за world-id

После распаковки проверьте, что внутри SaveGames/0/ лежит тот же <world-id>, что и раньше, и что он ровно один:

ls /home/palworld/palserver/Pal/Saved/SaveGames/0/

Если каталогов несколько (например, после ручных экспериментов появился второй мир), Palworld загрузит первый попавшийся, и игроки могут очутиться в чужом мире с пустыми персонажами. Оставьте только нужный id. При переносе на новый сервер эта же логика критична - подробно перенос разобран в отдельном гайде перенос сохранений Palworld.

Потеря персонажей при смене хоста

Самая частая жалоба при миграции: мир загрузился, базы на месте, а игроки заходят голыми первого уровня. Причина почти всегда в папке Players.

Персонаж в файле Players/<player-id>.sav привязан к двум вещам:

  • к <world-id> каталога, в котором лежит;
  • к Steam GUID игрока внутри Level.sav.

Разрушить связь можно тремя способами:

  1. Скопировали только Level.sav без папки Players. Мир есть, персонажей нет.
  2. Сменили <world-id> при копировании - положили файлы в новый id-каталог. Ссылки внутри Players больше не совпадают.
  3. Игрок сменил Steam-аккаунт или сервер запущен без bUseAuth, из-за чего GUID не совпадает со старым.

Профилактика простая: всегда копируйте весь каталог SaveGames/0/<world-id>/ целиком, не меняя имя id, и держите bUseAuth=True. Если персонажи всё же отвязались, восстановление сводится к возврату исходного world-id и полной папки Players из бэкапа - именно поэтому в архив они попадают вместе с миром.

Инкрементальные бэкапы: rsync и borg

Полный tar каждые 2 часа - надёжно, но на большом мире каждый архив весит сотни мегабайт и место кончается. Инкрементальные бэкапы хранят только изменения между снимками.

rsync с жёсткими ссылками

Быстрый способ без стороннего софта - rsync --link-dest. Неизменившиеся файлы не копируются, а хардлинкуются на предыдущий снимок, занимая ноль дополнительного места:

#!/bin/bash
set -euo pipefail
SRC=/home/palworld/palserver/Pal/Saved/
DEST=/backups/palworld-snapshots
DATE=$(date +%Y%m%d-%H%M%S)

rcon -a 127.0.0.1:25575 -p strong-admin-pass "Save"; sleep 3

rsync -a --delete \
  --link-dest="$DEST/latest" \
  "$SRC" "$DEST/$DATE"

ln -sfn "$DEST/$DATE" "$DEST/latest"

Каждый каталог $DATE выглядит как полный снимок, но реально занимает место только под изменившиеся .sav.

borg для дедупликации и шифрования

Для внешнего хранилища лучше подходит BorgBackup - он дедуплицирует на уровне блоков, сжимает и шифрует:

# Один раз: инициализация репозитория
borg init --encryption=repokey /backups/borg-palworld

# В скрипте по расписанию
rcon -a 127.0.0.1:25575 -p strong-admin-pass "Save"; sleep 3

borg create --compression zstd \
  /backups/borg-palworld::palworld-{now:%Y%m%d-%H%M%S} \
  /home/palworld/palserver/Pal/Saved

# Прунинг: почасовые за сутки, дневные за 2 недели, недельные за полгода
borg prune -v /backups/borg-palworld \
  --keep-hourly=24 --keep-daily=14 --keep-weekly=26

Borg особенно выгоден на Palworld: между снимками Level.sav меняется лишь частично, и дедупликация сжимает историю в разы эффективнее, чем набор независимых tar.gz.

Проверка целостности сейва

Бэкап, который никто ни разу не восстанавливал, - это не бэкап, а надежда. Минимальные проверки, которые стоит автоматизировать:

  • Архив читается: tar -tzf palworld-*.tar.gz >/dev/null - уже встроено в скрипт выше.
  • Level.sav не пустой: файл нулевого размера означает, что сервер упал в момент записи. В скрипте можно добавить проверку [ -s Level.sav ].
  • Заголовок формата на месте: валидный .sav Palworld начинается с сигнатуры GVAS (формат сохранений Unreal Engine). Быстрая проверка:
hexdump -C Level.sav | head -n 1
# должно содержать  47 56 41 53  -> "GVAS"

Если вместо GVAS в начале нули или мусор - файл битый, бэкап брать нельзя.

Но никакая офлайн-проверка не заменит фактическую загрузку. Раз в неделю поднимайте свежий бэкап на тестовом сервере (или отдельном порту), заходите в мир и убеждайтесь, что базы и персонажи на месте. Только зашедший в восстановленный мир игрок доказывает, что бэкап рабочий.

Отдельно держите в голове порядок при обновлениях: перед каждым апдейтом сервера делайте полный бэкап руками, потому что новая версия иногда меняет формат сейва и откат на старый билд без бэкапа становится невозможен. Подробнее - в гайде обновление Palworld сервера.

Pterohost - размещаем Palworld на Ryzen с автоматическими снапшотами мира и защитой от DDoS. Промокод 4START даёт -20% на первый заказ. Арендовать хостинг Palworld

Часто задаваемые вопросы

Что именно бэкапить на Palworld сервере?

Всю папку Pal/Saved целиком - внутри и SaveGames (мир, персонажи), и Config (PalWorldSettings.ini). Достаточно заархивировать один каталог Saved, тогда в бэкап попадут и мир, и настройки. Отдельно бэкапить бинарники сервера не нужно, они восстанавливаются через SteamCMD.

Нужно ли останавливать сервер для бэкапа Palworld?

Останавливать не обязательно, но перед архивацией обязательно выполните команду Save через RCON и дайте 2-3 секунды на запись файлов. Иначе tar может захватить Level.sav в момент записи и бэкап окажется битым. Для восстановления сервер останавливать нужно всегда.

Почему после переноса на новый хостинг пропали персонажи Palworld?

Персонажи лежат в SaveGames/0//Players/.sav и привязаны к id мира и Steam GUID игрока. Если скопировать только Level.sav без папки Players или перепутать world-id, игроки зайдут пустыми. Копировать нужно весь каталог мира целиком.

Что делает опция bIsUseBackupSaveData=True?

Она заставляет сервер держать резервную копию сейва рядом с основным и подгружать её, если Level.sav повредился при крэше. Это встроенная страховка от порчи файла, но не замена внешним бэкапам - она хранит только последнюю копию на том же диске.

Как проверить, что бэкап Palworld не битый?

Проверьте архив командой tar -tzf, убедитесь что Level.sav весит не ноль и в нём есть заголовок GVAS (hexdump -C Level.sav | head). Раз в неделю поднимайте бэкап на тестовом сервере и заходите в мир - только фактическая загрузка гарантирует целостность.