Резервная копия Minecraft должна пережить потерю VPS и содержать достаточно данных для возвращения прежнего сервера. Сначала остановите Paper и создайте согласованный архив, затем скачайте его через SSH. Перед заменой рабочего каталога проверьте восстановление отдельно.
Здесь используется установка из руководства по Paper на Ubuntu: служба minecraft, пользователь minecraft, каталог /srv/minecraft. Нужны SSH, sudo, GNU tar и место для архива и распакованного сервера. Для другой установки сначала измените пути. У Bedrock, модпаков и сетей с прокси состав данных будет другим.
Определите, что нужно вернуть#
Запишите допустимую давность копии: при ежедневном вечернем копировании можно потерять всё, что игроки построили после последнего архива. Перед обновлением или серьёзной сменой конфигурации нужна дополнительная точка возврата с понятной датой.
В примере с одним сервером копируется весь каталог. Так вместе остаются все локальные миры, состояние игроков, списки доступа, настройки, плагины и конкретный JAR Paper. Документация Paper по обновлению относит миры, конфигурацию и данные плагинов к материалам для копирования. Один сид или выгруженная карта сервер не восстановят.
Проверьте дополнительные миры, изменённые плагинами пути, символические ссылки и подключения к внешним базам. Архивирование ссылки не копирует её содержимое. База на другой службе находится за пределами /srv/minecraft: используйте её собственный механизм резервирования и согласуйте момент копирования с игрой. Если зависимости учтены не полностью, сначала разберитесь с ними.
В отдельной закрытой заметке сохраните версии Paper и игры, Java, имя мира, время копии, ориентиры для проверки и требования к внешним данным. Сохраните и определение службы: архив каталога не включает /etc/systemd/system и не устанавливает Java на новый VPS.
Проверьте службу и место на диске#
Выполните на VPS:
sudo systemctl cat minecraft
sudo systemctl show minecraft -p WorkingDirectory -p User -p ExecStart
sudo du -sh /srv/minecraft
df -h /srv /var/backups
sudo find /srv/minecraft -type l -ls
/usr/bin/java -version
Убедитесь, что служба действительно использует этот каталог. /usr/bin/java -version показывает версию именно этого файла; если в ExecStart указан другой путь Java, выполните -version для него. Проверьте, что другая служба, планировщик или вручную запущенный процесс туда не пишет. Места должно хватать на архив, его копию для скачивания и распакованный сервер при сохранении текущего каталога. Степень сжатия зависит от данных: большой мир не обязательно уменьшится настолько, чтобы поместиться.
В архиве бывают сведения об игроках и пароли к базам. Храните его с закрытым доступом; публичный каталог сайта для этого не подходит. Для управления собственным VPS через браузер можно рассмотреть панель Nexardo, которая требует отдельной настройки. Ручной архив не подключает службу к панели автоматически и не обеспечивает восстановление через неё.
Остановите Paper и дождитесь сохранения#
Предупредите игроков о перерыве, остановите службу и прочитайте последние сообщения о сохранении:
sudo systemctl stop minecraft
sudo journalctl -u minecraft -n 80 --no-pager
sudo systemctl show minecraft -p ActiveState -p MainPID -p Result
Продолжайте, только если сохранение завершилось штатно и вы видите ActiveState=inactive, MainPID=0, Result=success. Таймаут, принудительное завершение или ошибка диска не подтверждают корректную точку возврата. В руководстве systemd описано принудительное завершение после превышения времени остановки. Сначала устраните такую проблему, затем создавайте копию, которую можно считать исправной.
Команды сохранения мира не гарантируют согласованность локальных баз всех плагинов. Плановый перерыв позволяет не копировать каталог, который Paper и плагины ещё меняют. До завершения архива все процессы записи должны оставаться остановленными.
Создайте архив и подготовьте закрытое скачивание#
Запустите блок от обычного SSH-пользователя с sudo. Он проверяет контрольную сумму JAR, записанную в руководстве по установке. Если такого файла нет, сначала определите и зафиксируйте текущую известную сборку.
(
set -e
test "$(sudo systemctl show minecraft -p ActiveState --value)" = inactive
test "$(sudo systemctl show minecraft -p MainPID --value)" = 0
test "$(sudo systemctl show minecraft -p Result --value)" = success
sudo -u minecraft /bin/bash -c 'cd /srv/minecraft && sha256sum -c paper.jar.sha256'
sudo install -d -m 700 /var/backups/minecraft
MC_BACKUP="/var/backups/minecraft/backup-$(date +%F-%H%M%S).tar.gz"
sudo test ! -e "$MC_BACKUP"
sudo tar -C /srv -czf "$MC_BACKUP.partial" minecraft
sudo chmod 600 "$MC_BACKUP.partial"
sudo tar -tzf "$MC_BACKUP.partial" > /dev/null
sudo mv "$MC_BACKUP.partial" "$MC_BACKUP"
(
set -e
install -d -m 700 "$HOME/minecraft-transfer/restore"
chmod 700 "$HOME/minecraft-transfer"
chmod 700 "$HOME/minecraft-transfer/restore"
test ! -e "$HOME/minecraft-transfer/restore/backup.tar.gz"
test ! -e "$HOME/minecraft-transfer/restore/backup.tar.gz.sha256"
)
sudo install -o "$(id -un)" -m 600 "$MC_BACKUP" "$HOME/minecraft-transfer/backup.tar.gz"
cd "$HOME/minecraft-transfer"
umask 077
sha256sum backup.tar.gz > backup.tar.gz.sha256
)
При ошибке выполнение внутри скобок прекращается. Файл .partial — незавершённая работа, а не готовая резервная копия. Поставляемое Debian руководство GNU tar описывает ненулевой результат при изменении файлов во время создания архива. Ищите оставшийся процесс записи, а не принимайте такой архив. Просмотр содержимого проверяет читаемость, но не работоспособность мира.
Paper остаётся остановленным. После обычной успешной копии можно запустить его и проверить журнал. Если копия делается перед обновлением, оставьте сервер выключенным и переходите к порядку обновления.
На своём компьютере создайте новый закрытый каталог с датой и скачайте оба файла. До проверки суммы обе передачи должны завершиться успешно; ошибка прерывает блок. Замените SSH_USER и VPS_IP; для нестандартного SSH-порта добавьте к scp аргумент -P YOUR_SSH_PORT:
(
set -e
umask 077
MC_BACKUP_COPY="$(mktemp -d "$HOME/minecraft-backup-$(date +%F-%H%M%S).XXXXXX")"
chmod 700 "$MC_BACKUP_COPY"
cd "$MC_BACKUP_COPY"
scp SSH_USER@VPS_IP:minecraft-transfer/backup.tar.gz ./backup.tar.gz
scp SSH_USER@VPS_IP:minecraft-transfer/backup.tar.gz.sha256 ./backup.tar.gz.sha256
sha256sum -c backup.tar.gz.sha256
pwd
)
Оставьте оба имени файлов без изменений внутри датированного каталога: файл контрольной суммы ссылается на backup.tar.gz. Запишите выведенный путь и сведения о копии, затем удалите только временные файлы передачи на VPS. При ошибке передачи новый каталог содержит незавершённую попытку; к проверке восстановления переходить нельзя. Контрольная сумма обнаруживает отличие при передаче, но не подтверждает происхождение неизвестного архива. Хотя бы одна копия должна находиться за пределами хранилища и учётных данных VPS. Другой каталог на том же диске не переживёт потерю диска.
Проверьте копию отдельно от рабочего сервера#
Используйте только собственный архив, которому доверяете. На отдельной Linux-машине перейдите в осознанно выбранный датированный каталог скачивания с неизменённой парой архива и контрольной суммы, затем:
(
set -e
sha256sum -c backup.tar.gz.sha256
MC_INSPECT_DIR="$(mktemp -d)"
chmod 700 "$MC_INSPECT_DIR"
tar --no-same-owner -xzf backup.tar.gz -C "$MC_INSPECT_DIR"
test -f "$MC_INSPECT_DIR/minecraft/server.properties"
test -f "$MC_INSPECT_DIR/minecraft/paper.jar"
cd "$MC_INSPECT_DIR/minecraft"
sha256sum -c paper.jar.sha256
ls -la
)
Сверьте содержимое с перечнем данных, включая все настроенные миры и зависимости плагинов. Это проверка распаковки и контрольной суммы. Полноценная репетиция восстановления требует отдельного тестового сервера с подходящей Java: закройте вход обычным игрокам, отделите подключения плагинов от рабочей базы, затем проверьте мир, инвентари и важные действия плагинов в игре. Две копии сервера не должны одновременно использовать одну рабочую базу плагина.
Восстановите сервер, сохранив текущий каталог#
Выбирайте дату осознанно: восстановление убирает изменения, сделанные после копии. На новом VPS сначала создайте окружение Java, пользователя и службу по заметкам и руководству установки; оставьте службу остановленной. Этот пример сохраняет уже существующий /srv/minecraft. На VPS назначения подготовьте закрытый каталог SSH-пользователя перед загрузкой:
(
set -e
install -d -m 700 "$HOME/minecraft-transfer/restore"
chmod 700 "$HOME/minecraft-transfer"
chmod 700 "$HOME/minecraft-transfer/restore"
test ! -e "$HOME/minecraft-transfer/restore/backup.tar.gz"
test ! -e "$HOME/minecraft-transfer/restore/backup.tar.gz.sha256"
)
Подготовка отклоняет файлы, оставшиеся от прежней загрузки. Если проверки не прошли, определите эту предыдущую пару и переместите её в отдельный закрытый датированный каталог перед новой подготовкой. На своём компьютере замените путь-заглушку каталогом выбранной проверенной точки возврата и загрузите пару без переименования. При ошибке любой передачи остановитесь:
(
set -e
cd "/ABSOLUTE/PATH/TO/SELECTED_BACKUP_DIRECTORY"
sha256sum -c backup.tar.gz.sha256
scp backup.tar.gz SSH_USER@VPS_IP:minecraft-transfer/restore/backup.tar.gz
scp backup.tar.gz.sha256 SSH_USER@VPS_IP:minecraft-transfer/restore/backup.tar.gz.sha256
)
На VPS проверьте неизменённую пару в каталоге загрузки для восстановления:
(
set -e
cd "$HOME/minecraft-transfer/restore"
sha256sum -c backup.tar.gz.sha256
)
Остановите Paper и проверьте штатное сохранение, как выше. Убедитесь, что Java и параметры службы подходят архивной сборке. Внешние базы восстановите по отдельному согласованному порядку при остановленных процессах записи. Затем на VPS:
(
set -e
test "$(sudo systemctl show minecraft -p ActiveState --value)" = inactive
test "$(sudo systemctl show minecraft -p MainPID --value)" = 0
MC_RESTORE_STAGE="$(sudo mktemp -d /srv/minecraft-restore.XXXXXX)"
sudo tar --no-same-owner -xzf "$HOME/minecraft-transfer/restore/backup.tar.gz" -C "$MC_RESTORE_STAGE"
sudo test -f "$MC_RESTORE_STAGE/minecraft/paper.jar"
sudo test -f "$MC_RESTORE_STAGE/minecraft/server.properties"
sudo /bin/bash -c 'cd "$1/minecraft" && sha256sum -c paper.jar.sha256' _ "$MC_RESTORE_STAGE"
MC_PREVIOUS="/srv/minecraft.before-restore-$(date +%F-%H%M%S)"
sudo test ! -e "$MC_PREVIOUS"
sudo chown -R minecraft:minecraft "$MC_RESTORE_STAGE/minecraft"
sudo chmod 750 "$MC_RESTORE_STAGE/minecraft"
sudo mv /srv/minecraft "$MC_PREVIOUS"
sudo mv "$MC_RESTORE_STAGE/minecraft" /srv/minecraft
sudo systemctl start minecraft
sudo journalctl -u minecraft -n 100 --no-pager
)
Ничего не распаковывается поверх текущего мира. Если перемещение или запуск не удались, остановитесь и разберите состояние; не повторяйте весь блок вслепую. Прежний каталог сохранён, а проверенную распакованную копию или уже восстановленный каталог можно найти по их путям. Возврат к предыдущему состоянию тоже требует остановки службы и согласованного восстановления внешних данных.
Проверьте результат и сохраняйте несколько точек возврата#
Найдите Done, зайдите подходящей версией клиента и проверьте имя мира, знакомые постройки, состояние игроков и работу плагинов. Одного работающего процесса недостаточно.
| Наблюдение | Что проверить дальше |
|---|---|
| Появился новый пустой мир | Рабочий каталог службы, level-name и перечень распакованных миров; остановите сервер до новых построек |
| Ошибки доступа к файлам | Владельца каталога и чтение от имени minecraft, включая пути плагинов |
| Ошибка версии Java-классов | Ветку архивного Paper и исполняемый файл в ExecStart |
| Данные плагина не соответствуют миру | Восстановлена ли внешняя БД на согласованный момент |
| Архив читается, но мир не запускается | Сохраните журналы и текущие копии; проверьте более раннюю точку на отдельном сервере |
Храните несколько датированных копий и отдельную копию до обновления, пока новая версия не принята. Срок хранения выбирайте по допустимой потере прогресса и месту на диске. Удаляйте известную старую копию только после подтверждения другой копии вне VPS и проверки восстановления.




