RE:NODE

Minecraft10 мин чтения

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

Какие папки сервера Minecraft бэкапить, как снять согласованную копию через save-off и save-all, и как восстановить мир целиком, один участок или одного игрока.

0 прочтений

Бэкап сервера Minecraft - это папки мира (world, world_nether и world_the_end на Paper или одна папка world на vanilla и Fabric) плюс несколько файлов рядом с ними: server.properties, списки операторов, белый список и списки банов, а также папка plugins/ или config/. Чтобы копия получилась согласованной, выполните save-off, затем save-all flush, снимите копию и выполните save-on. Чтобы восстановить всё, остановите сервер и положите папки обратно. Чтобы откатить один участок, замените только соответствующие region-файлы; чтобы откатить одного игрока, замените его файл в playerdata/. Ниже разобран каждый из этих случаев, с арифметикой поиска нужного region-файла и с ошибками, которые превращают восстановление во вторую катастрофу.

Из чего состоит мир Minecraft на диске#

Мир - это не один файл. Это папка с множеством файлов, и понимание того, что где хранится, отличает восстановление разграбленной деревни от отката всего сервера на прошлый вторник.

Paper и все серверы, произошедшие от Bukkit, раскладывают три измерения по трём папкам верхнего уровня. Vanilla, Fabric, Forge и NeoForge держат их все внутри одной. Имя world берётся из параметра level-name в server.properties.

СодержимоеVanilla, Fabric, NeoForgePaper
Ландшафт обычного мираworld/region/world/region/
Ландшафт Нижнего мираworld/DIM-1/region/world_nether/DIM-1/region/
Ландшафт Эндаworld/DIM1/region/world_the_end/DIM1/region/
Инвентари и позиции игроковworld/playerdata/world/playerdata/
Настройки мира, сид, времяworld/level.datworld/level.dat

Внутри каждого измерения три папки хранят данные чанков в одном и том же формате region-файлов:

  • `region/` - блоки, блочные сущности вроде сундуков и печей, а также биомы. Собственно ландшафт.
  • `entities/` - начиная с 1.17 мобы, животные, рамки, стойки для брони, вагонетки и выброшенные предметы хранятся здесь, а не в файлах ландшафта.
  • `poi/` - точки интереса: рабочие места жителей, кровати, ульи, порталы. По ним жители находят себе работу и дом.

А в корне основной папки мира лежат:

  • `level.dat` хранит сид, точку спавна, игровые правила, границу мира, время и список датапаков. level.dat_old - предыдущая копия, которая записывается при каждом сохранении level.dat.
  • `playerdata/<uuid>.dat` хранит инвентарь, эндер-сундук, позицию, здоровье и опыт каждого игрока. Эта папка есть только у основного мира, даже на Paper.
  • `advancements/` и `stats/` хранят JSON для каждого игрока.
  • `data/` хранит карты (map_*.dat), рейды, скорборд и хранилище команд.
  • `datapacks/` хранит датапаки мира.

У мира, в который играли год, большая часть объёма приходится на region/. Всё остальное весит мало и, кроме playerdata/, само по себе редко представляет интерес.

Что ещё должно попасть в бэкап#

Восстановленный мир рядом с пустой папкой сервера - это ещё не рабочий сервер. Остальное содержимое корня сервера тоже важно:

Файл или папкаПочему это важно
server.propertiesСид, режим игры, дальность прорисовки, все настройки
ops.json, whitelist.jsonУ кого есть права и кто может заходить
banned-players.json, banned-ips.jsonКто заходить не может
plugins/ (Paper)Конфиги плагинов и их данные - приваты, права, экономика, логи
config/, bukkit.yml, spigot.ymlНастройки Paper и Spigot
mods/, config/, defaultconfigs/ (с модами)Точный набор модов, с которым был сохранён мир

Данные плагинов заслуживают отдельного предложения. Плагины приватов, прав и экономики часто хранят своё состояние в локальном файле базы данных внутри plugins/ - LuckPerms и CoreProtect по умолчанию делают именно так. Мир, восстановленный без соответствующих данных плагинов, вернёт игрокам постройки без приватов или приваты без построек. Бэкапьте их вместе и восстанавливайте вместе.

Что можно не включать: logs/ (полезно, но не входит в состояние), cache/, libraries/, versions/ и jar-файл сервера - всё это можно скачать заново. Без них бэкапы меньше и снимаются быстрее.

Как снять согласованную копию#

Сервер не пишет мир на диск непрерывно. Чанки живут в памяти и записываются в свои region-файлы во время автосохранений и при выгрузке. Если копировать папку в этот момент, можно захватить region-файл, записанный наполовину, или level.dat из одного момента и region-файлы из другого.

Решение - три консольные команды:

code
save-offsave-all flush... take the copy ...save-on

save-off останавливает автоматическое сохранение. save-all flush записывает на диск всё, что есть в памяти, и не возвращает управление, пока запись не закончится. Копия, снятая после этого, - согласованный снимок. save-on возвращает обычное сохранение; если про неё забыть, сервер продолжит работать, ничего не записывая на диск до следующего перезапуска, поэтому если вы автоматизируете это скриптом, убедитесь, что save-on выполняется даже тогда, когда копирование не удалось.

На своей машине бэкап может быть совсем простым:

bash
$ tar -czf backups/world-$(date +%F-%H%M).tar.gz \    world world_nether world_the_end plugins server.properties \    ops.json whitelist.json banned-players.json banned-ips.json

Запускайте это между save-all flush и save-on и копируйте архив туда, где нет того же диска: бэкап на диске, который он защищает, спасает от повреждённого чанка и больше ни от чего. О том, где должны лежать копии и сколько их хранить, рассказано в статье бэкапы, которые действительно восстанавливаются.

В панели та же последовательность превращается в расписание. В RE:NODE вкладка Schedules выполняет упорядоченные задачи по cron-выражению, так что одно расписание может отправить save-off, затем save-all flush, подождать, снять бэкап и отправить save-on. Слоты для бэкапов входят в каждый тариф Minecraft, хранятся вне машины, которую защищают, их можно скачать, а любой можно заблокировать, чтобы ротация его не удалила. Полная таблица времени для этого есть в статье запланированные задачи, которые стоит завести.

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

Полное восстановление - самое простое, и именно его люди делают неправильно, когда торопятся.

  1. Остановите сервер и дождитесь, пока он полностью завершит работу.
  2. Сохраните текущее состояние. Переименуйте world в world-broken (и папки Нижнего мира и Энда) или снимите его свежий бэкап. В текущем мире могут быть часы честного прогресса, который вы захотите спасти, а если речь о гриферах, это ещё и улика.
  3. Положите на место папки из бэкапа с точно такими же именами. На Paper это три папки, на vanilla - одна.
  4. Восстановите соответствующие данные плагинов из того же бэкапа, если приваты, права или экономика с тех пор изменились.
  5. Запустите сервер и прочитайте лог. Preparing level "world" без предупреждений об отсутствующих чанках означает, что мир загрузился.
  6. Зайдите и проверьте все три измерения. Новый пустой Нижний мир означает, что его папка лежит не там или называется не так - ваши данные всё ещё на месте, под другим именем.

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

Откат одного участка#

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

Каждый region-файл покрывает 32 на 32 чанка, то есть 512 на 512 блоков, и называется по своим region-координатам: r.<x>.<z>.mca. Чтобы найти файл, в котором лежит позиция блока, разделите координату на 512 и округлите вниз:

code
region x = floor(block x / 512)region z = floor(block z / 512)Block (1200, -300)  ->  r.2.-1.mcaBlock (-40, 700)    ->  r.-1.1.mcaBlock (511, 512)    ->  r.0.1.mca

Округление вниз важно для отрицательных чисел: блок -40 находится в регионе -1, а не 0. База рядом с границей регионов занимает два или четыре файла.

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

  1. Запишите координаты пострадавшего участка из F3 и определите все region-файлы, которые он задевает.
  2. Остановите сервер.
  3. Скопируйте из бэкапа эти файлы из region/, а также одноимённые файлы из entities/ и poi/ поверх рабочих в папке нужного измерения.
  4. Запустите сервер и проверьте участок.

Скопировать только region/ - классическая ошибка. На 1.17 и новее ландшафт возвращается, а сущности ему не соответствуют: рамки и стойки для брони исчезают или дублируются, животные пропадают, жители теряют рабочие места, потому что poi/ всё ещё описывает разграбленное состояние.

Region-файлы - инструмент грубый: 512 блоков - это много чужих построек. Для участков поменьше стандартный инструмент - MCA Selector. Он открывает мир на вашем компьютере, показывает карту и позволяет выбрать отдельные чанки, чтобы удалить их или импортировать из другой копии мира. Схема такая: скачайте бэкап и текущий мир, перенесите в MCA Selector пострадавшие чанки из бэкапа в копию текущего мира, затем загрузите результат на остановленный сервер.

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

Восстановление одного игрока#

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

  1. Найдите UUID игрока. usercache.json в корне сервера сопоставляет недавние ники с UUID, а на сервере в режиме online-mode UUID тот же, что показывает любой сервис поиска профилей Minecraft.
  2. Убедитесь, что игрок не в сети. Сервер записывает его файл при выходе и перезапишет ваш, если игрок онлайн.
  3. Скопируйте world/playerdata/<uuid>.dat из бэкапа поверх рабочего файла. Если нужно, скопируйте также advancements/<uuid>.json и stats/<uuid>.json.
  4. Попросите игрока зайти.

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

Когда повреждён level.dat#

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

  1. Остановите сервер.
  2. Переименуйте level.dat в level.dat_broken.
  3. Скопируйте level.dat_old в level.dat.
  4. Запустите сервер.

Если повреждены оба, восстановите из бэкапа только level.dat. Он хранит общее состояние мира, а не ландшафт, поэтому старая копия обходится очень дёшево: могут откатиться время суток, граница мира и недавние изменения игровых правил.

Поэтому же важна чистая остановка. В RE:NODE кнопки Stop и Restart выполняют чистую остановку, которая сначала сохраняет мир. Контейнер, упёршийся в лимит памяти, останавливается и чисто перезапускается, а не уходит в swap, - это защищает машину, но сохранением не является: всё, что было после последнего автосохранения, теряется. Запас памяти - часть заботы о сохранности мира.

Проверка бэкапа до того, как он понадобится#

Бэкап, который вы ни разу не восстанавливали, - это догадка. Самая дешёвая проверка занимает десять минут:

  1. Скачайте свежий бэкап.
  2. Распакуйте его на своём компьютере рядом с тем же jar-файлом сервера и той же версией Java.
  3. Запустите локально и подключитесь к localhost.
  4. Дойдите до недавней постройки, откройте сундук, проверьте Нижний мир.

Если всё работает, бэкап рабочий. Если нет, вы узнали об этом в спокойный день, а не во время аварии. Статья проверка восстановления до того, как оно понадобится превращает это в регулярную процедуру.

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

БэкапКогдаХранить
АвтоматическийЕжедневно, в самый тихий часНесколько последних
Ручной, заблокированныйПеред каждым обновлением, установкой плагина или крупным событиемПока изменение не докажет, что с ним всё в порядке
СкачанныйРаз в неделю или в месяцВне хостинга, бессрочно

FAQ#

Можно ли бэкапить мир Minecraft, пока сервер работает?

Да, если сначала выполнить save-off и save-all flush, а после - save-on. Flush записывает всё на диск и задерживает дальнейшие записи, пока вы копируете. Копирование без этого может захватить region-файлы посреди записи.

Как откатить только один участок мира?

Определите, какие region-файлы его покрывают (разделите координаты блока на 512 и округлите вниз), затем на остановленном сервере скопируйте эти файлы из папок region/, entities/ и poi/ бэкапа поверх рабочих. Для участков меньше региона используйте MCA Selector, чтобы импортировать отдельные чанки.

Как восстановить инвентарь одного игрока?

Когда игрок не в сети, а сервер запущен или остановлен, замените world/playerdata/<uuid>.dat копией из бэкапа. UUID есть в usercache.json. Игрок также переместится туда, где стоял в момент снятия бэкапа.

Почему после восстановления Нижний мир пустой?

Папка Нижнего мира лежит не там, где её ищет ваше серверное ПО. Paper использует world_nether/DIM-1/region, vanilla и Fabric - world/DIM-1/region. Сервер сгенерировал новый Нижний мир, потому что ничего не нашёл там, где искал.

Стоит ли использовать плагины для бэкапов?

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


Комментарии

Полностью анонимно: без аккаунта, без почты, без cookie. Мы храним имя, которое вы ввели, текст и время - больше ничего. Количество ссылок ограничено, разметка не отображается.

0/2000