Бэкап и восстановление мира 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 может захватить файл наполовину. Результат - архив, который распаковывается, но не грузится.
Правильная последовательность всегда такая:
- Отправить на сервер команду
Saveчерез RCON. - Подождать 2-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.
Разрушить связь можно тремя способами:
- Скопировали только
Level.savбез папкиPlayers. Мир есть, персонажей нет. - Сменили
<world-id>при копировании - положили файлы в новый id-каталог. Ссылки внутриPlayersбольше не совпадают. - Игрок сменил 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/
Что делает опция bIsUseBackupSaveData=True?
Она заставляет сервер держать резервную копию сейва рядом с основным и подгружать её, если Level.sav повредился при крэше. Это встроенная страховка от порчи файла, но не замена внешним бэкапам - она хранит только последнюю копию на том же диске.
Как проверить, что бэкап Palworld не битый?
Проверьте архив командой tar -tzf, убедитесь что Level.sav весит не ноль и в нём есть заголовок GVAS (hexdump -C Level.sav | head). Раз в неделю поднимайте бэкап на тестовом сервере и заходите в мир - только фактическая загрузка гарантирует целостность.