MAATRIX GAMES / Блог / Unturned: проблема с сохранением прогресса

Unturned: проблема с сохранением прогресса

MAATRIX GAMES

Перезапустили сервер Unturned — и вместо привычной базы либо откат на день назад, либо сейв вовсе не грузится и сервер стартует с ошибкой в консоли. Обидно, если группа неделю зачищала военную базу и копила лут в контейнерах. Хорошая новость: почти всегда дело не в кривой игре, а в одной из нескольких вполне конкретных и чинимых причин — разберём их по порядку, от самой частой к самой редкой, и сразу настроим страховку на будущее.

Как устроено сохранение в Unturned на сервере

Сервер Unturned хранит прогресс не в одном файле, а в структуре папок внутри директории u3ds/Servers/<ServerID>/, где <ServerID> — имя, которое вы указали при запуске (+InternetServer/MyServer → папка MyServer):

u3ds/Servers/MyServer/
├── Level/
│   └── PEI/            # сама карта: постройки, баррикады, транспорт, зомби-спавны
├── Players/
│   └── 76561198012345678/   # сейвы персонажей: инвентарь, скиллы, позиция
└── Server/
    ├── Commands.dat
    ├── Config.json
    ├── Rocket/          # если стоит Rocket или другой фреймворк модов
    └── WorkshopDownloadConfig.json

Level/ отвечает за мир целиком — карту, все постройки и разложенные предметы. Players/ — за персонажей: у каждого игрока свой подкаталог по SteamID64, и именно там теряется прогресс, если жалоба не "сервер откатился", а "у меня одного пропал инвентарь". Широко задокументированной консольной команды принудительного сохранения по требованию (условного save, как в некоторых других играх) у выделенного сервера Unturned нет — игра пишет данные на диск по внутренней логике и обязательно при штатном завершении процесса. Отсюда и большинство причин потери прогресса ниже.

Причина №1: сервер вырубают жёстко, а не останавливают штатно

Самая частая причина. Если процесс сервера (запущенный через ServerHelper.sh) убивают командой kill -9, обрывают SSH-сессию без screen/tmux, или хостинг-панель просто "прибивает" процесс при рестарте — сервер не успевает дописать текущий сейв. Пострадать может и мир, и данные конкретных игроков, которые были онлайн в момент обрыва.

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

ps aux | grep ServerHelper
kill -SIGTERM $(pgrep -f ServerHelper.sh)

SIGTERM даёт серверу шанс корректно завершиться и дописать Level/ и Players/. Если сервер работает через systemd-юнит, как в базовой инструкции по установке, проверьте, что TimeoutStopSec не слишком мал — на большой обжитой карте с кучей построек финальная запись может занять больше времени, чем дефолтные несколько секунд:

[Service]
KillSignal=SIGTERM
TimeoutStopSec=30

Если сервер поднят вручную через screen или tmux без systemd, при обрыве SSH-соединения без этих оболочек процесс может получить SIGHUP и умереть некорректно — подробнее о правильной организации автозапуска и остановки читайте в статье про systemd, screen и tmux для игровых процессов. Отдельно стоит проверить, что происходит при перезагрузке самого хоста — важно, чтобы процесс успел завершиться штатно до выключения VPS, а не оборвался на середине записи.

Поднять сервер Unturned за пару минут

Готовый образ MAATRIX GAMES: NVMe, AMD EPYC, DDoS-защита, панель управления. Локации UK, US, RU. Оплата картой РФ, СБП или криптой.

Создать сервер

Причина №2: не хватает места на диске

Вторая по частоте причина — банально забитый диск. Если места не хватает, сервер физически не может дописать Level/ или файлы конкретного игрока целиком, и в результате вы получаете либо повреждённый сейв, который не грузится, либо частично записанный — с потерянными постройками или предметами.

Проверка свободного места:

df -h

Смотрите именно на раздел, где физически лежит u3ds/ — если под данные примонтирован отдельный диск, корень системы может быть свободен, а рабочий том забит под ноль. Меньше 1-2 ГБ свободного — уже повод разбираться.

Что обычно съедает место на сервере Unturned незаметно:

  • Воркшоп-контент — карты и моды со временем накапливаются, особенно если тестировали разные сборки.
  • Кэш SteamCMD и остатки недокачанных обновлений после сбойного app_update.
  • Логи консоли без ротации, если вывод пишется в файл.
  • Ручные бэкапы "на всякий случай", сложенные в ту же папку и забытые.

Проверить, что конкретно занимает место:

du -sh /home/steam/u3ds/Servers/MyServer/* 2>/dev/null | sort -rh | head -10

Освобождайте место аккуратно — не трогайте активный Level/, свежие сейвы игроков в Players/ и последний рабочий бэкап.

Причина №3: права доступа к папкам Level, Players и Server

Если процесс сервера не может писать в Level/ или в конкретную папку игрока внутри Players/, поведение непредсказуемо: где-то ошибка попадёт в лог, где-то прогресс тихо перестанет сохраняться без явного предупреждения. Частая причина слёта прав — восстановление бэкапа вручную через scp или unzip от root, после чего владельцем файлов становится root, а сам сервер работает от отдельного пользователя (например, steam, как в инструкции по установке).

Проверка владельца:

ls -la /home/steam/u3ds/Servers/MyServer/

Если владелец не тот, от кого реально запущен процесс — чиним:

sudo chown -R steam:steam /home/steam/u3ds/Servers/MyServer
sudo chmod -R u+rwX /home/steam/u3ds/Servers/MyServer

Замените steam на реального пользователя вашего процесса — узнать можно так:

ps aux | grep ServerHelper

Колонка с именем пользователя в выводе покажет, кто фактически владеет процессом, а значит, кто должен владеть и папками сохранений.

Причина №4: конфликт после обновления воркшоп-карты или два процесса на одном ServerID

Более редкая, но неприятная причина: если вы используете карту сообщества из Steam Workshop, а автор выкатил новую версию, при следующем app_update или скачивании через WorkshopDownloadConfig.json формат некоторых данных на карте может измениться. Старый сейв в Level/ не всегда корректно "переживает" такое обновление — это известная в комьюнити Unturned проблема с воркшоп-картами, точное поведение зависит от того, что именно поменял автор карты. Если недавно обновлялась именно карта (а не сам сервер) и прогресс пропал сразу после этого — держите это в уме как отдельную версию.

Второй сценарий из этой же категории — два процесса сервера с одним ServerID пишут в одну и ту же папку Level/ и Players/. Такое бывает, если предыдущий процесс не завершился после неудачного рестарта, а скрипт автозапуска или systemd поднял новый экземпляр поверх него. Итог непредсказуем — от гонки за запись до порчи файлов.

Проверка на дубли процессов:

ps aux | grep ServerHelper

Если строк больше одной — определите, какой процесс реально держит игровой порт:

sudo ss -tulnp | grep 27015

Процесс, который порт не удерживает, — зомби от предыдущего запуска. Остановите его штатным сигналом (см. причину №1), убедитесь, что он действительно завершился, и только после этого запускайте сервер обычным способом.

Восстановление мира и персонажей из бэкапа

Если прогресс уже потерян, а автоматических точек отката нет, рабочий путь один — восстановление из бэкапа. Заодно это аргумент настроить регулярные бэкапы заранее, а не после первого инцидента — подробный разбор, что и как часто бэкапить, есть в статье про автобэкапы игрового сервера.

Порядок действий:

  1. Остановите сервер штатно (см. причину №1) — не копируйте файлы поверх работающего процесса.
  2. Переименуйте текущий (возможно, битый) сейв, а не удаляйте сразу — иногда часть данных из Players/ всё же удаётся вытащить вручную, даже если Level/ повреждён.
  3. Распакуйте последний рабочий архив на место:
tar -xzf ~/backups/myserver-20260828-0300.tar.gz -C /home/steam/u3ds/Servers/MyServer
  1. Проверьте владельца и права распакованных файлов — после tar от root они снова могут принадлежать не тому пользователю (см. причину №3).
  2. Запустите сервер и убедитесь, что карта грузится, а персонажи заходят с ожидаемым инвентарём.

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

Настройка автосейва и регулярного бэкапа как профилактика

Раз штатной команды принудительного сохранения по запросу у Unturned нет, единственная надёжная страховка — регулярный файловый бэкап Level/ и Players/ по расписанию, независимо от внутренней логики автосохранения игры.

Простой вариант — cron-задача, архивирующая обе папки каждые несколько часов:

crontab -e

Добавьте строку (бэкап каждые 4 часа):

0 */4 * * * tar -czf /home/steam/backups/myserver-$(date +\%Y\%m\%d-\%H\%M).tar.gz -C /home/steam/u3ds/Servers/MyServer Level Players 2>> /home/steam/backups/backup.log

Server/ с конфигами в этот бэкап можно не включать каждый раз — она меняется редко, достаточно бэкапить её отдельно после правок Commands.dat или Config.json.

Не забудьте почистить старые архивы, иначе бэкапы сами станут причиной нехватки места на диске (см. причину №2) — например, хранить только последние 10-14 копий:

ls -t /home/steam/backups/*.tar.gz | tail -n +15 | xargs -r rm

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

Поднять сервер Unturned за пару минут

Готовый образ MAATRIX GAMES: NVMe, AMD EPYC, DDoS-защита, панель управления. Локации UK, US, RU. Оплата картой РФ, СБП или криптой.

Создать сервер

Частые вопросы

Есть ли в Unturned команда принудительного сохранения из консоли сервера?

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

Почему у одного игрока пропал инвентарь, а карта и постройки на месте?

Скорее всего проблема не с Level/, а конкретно с папкой игрока в Players/<SteamID64>/ — проверьте права доступа и наличие свежего бэкапа именно этой папки, а не всего сервера.

Можно ли восстановить карту, если Level повреждён и сервер не стартует вовсе?

Без бэкапа — почти нет, повреждённый файл карты в большинстве случаев не грузится частично. Настраивайте регулярный бэкап заранее, а не полагайтесь на восстановление битого файла постфактум.

Как понять, что сервер завершился штатно, а не был убит?

Проверьте лог перед остановкой — при штатном завершении в консоли/логе обычно есть финальные строки о выходе процесса, тогда как обрыв через SIGKILL просто прерывает вывод без завершающих записей.

Обновление воркшоп-карты точно ломает старый сейв?

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