Rust Руководство

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

Восстановите мир Rust из полной резервной копии: проверьте архив, совместимость версии, identity и отдельный тестовый запуск.

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

Если после сбоя Rust открыл пустой мир, прекратите перезапуски. Сначала сохраните нынешние файлы, установите исходные identity и сборку резервной копии, затем проверьте восстановление отдельно. Большой файл .sav ещё не доказывает, что мир загрузится и соседние базы соответствуют этому сохранению.

Инструкция рассчитана на существующий сервер Ubuntu 24.04 и администратора с sudo. В примерах используются служба rust, установка /srv/rust/game и identity friends. Замените их своими значениями. Нужны окно обслуживания и место для архива, состояния после сбоя и отдельной проверочной установки.

Исходный архив и копия состояния после сбоя остаются нетронутыми до проверки мира игроком и успешного сохранения после перезапуска.

Выберите согласованную точку восстановления#

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

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

Сохраните внешние настройки и данные плагинов, ресурсы пользовательской карты, ветку и сборку сервера. У модифицированной установки данные дополнений могут находиться за пределами identity. Архив одной папки не включает их автоматически. До замены проверьте реальный состав своей резервной копии.

Если она сделана до принудительного вайпа, сначала разберитесь с совместимостью. Переименование версии в имени сохранения не конвертирует содержимое; Facepunch прямо предостерегает от такого обхода. Наличие старого бинарника тоже не гарантирует вход актуальных публичных клиентов.

Остановите запись и сохраните состояние после сбоя#

На время обслуживания отключите автоматические перезапуски, обновления и задания именно этого экземпляра. Через его защищённую консоль запросите сохранение, если оно уместно, затем выполните обычное корректное завершение. Когда нынешний мир нужен для расследования, лишнее сохранение может затереть последнюю полезную ротационную копию. Дождитесь завершения записи.

Проверьте службу и оставшиеся процессы:

bash
sudo systemctl show rust -p ActiveState -p SubState -p MainPID
pgrep -x RustDedicated
sudo ss -lunp

Другие экземпляры Rust могут продолжать работать. Сопоставьте их рабочие каталоги и identity приватно; соседние игры останавливать не нужно. Состояние inactive у службы не исключает второй процесс, запущенный вручную. До продолжения выясните, кто ещё использует восстанавливаемую папку.

После остановки отдельно сохраните нынешнюю identity целиком, настройки службы и запуска, нужные внешние данные. Дайте копии дату, запишите контрольные суммы и убедитесь, что файлы читаются. Исходный архив восстановления оставьте нетронутым: эксперименты проводятся на копиях, а не на единственном экземпляре нужного мира.

Распакуйте архив в закрытый временный каталог#

Собственный доверенный архив распаковывайте от обычного администратора, без root и без записи поверх /srv/rust/game. Пример рассчитан на локальный tar.gz и фильтры распаковки Python 3.12, доступного в Ubuntu 24.04. Замените путь к архиву. Сначала сравните контрольную сумму с записью, сделанной при создании копии:

bash
sha256sum /path/to/rust-backup.tar.gz
python3 -B - <<'PY'
from pathlib import Path, PurePosixPath
import tarfile, tempfile
archive = Path('/path/to/rust-backup.tar.gz')
stage = Path(tempfile.mkdtemp(prefix='rust-restore-'))
with tarfile.open(archive, 'r:gz') as source:
    members = source.getmembers()
    for member in members:
        path = PurePosixPath(member.name)
        if path.is_absolute() or '..' in path.parts:
            raise SystemExit('Unsafe archive path')
        if not (member.isfile() or member.isdir()):
            raise SystemExit('Only regular files and directories accepted')
    source.extractall(stage, members=members, filter='data')
print(stage)
PY

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

Проверьте мир без обращения к основным сервисам#

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

Закройте публичный доступ и выделите отдельные игровые, query- и административные порты. Исключите обращения плагинов к боевым базам, вебхукам и магазину. Отключите Rust+ у проверочного экземпляра: Facepunch документирует форму запуска +app.port 1- и запрещает использовать один companion.id на нескольких серверах. Для настоящего восстановления этот файл сохраните приватно.

По журналу убедитесь, что выбраны ожидаемые мир и identity. Остановитесь, если создаётся новая карта, обнаружена несовместимость или читается другая папка. Удаление баз наугад не объясняет причину ошибки загрузки и сокращает возможности восстановления.

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

Перенесите проверенный набор и проверьте сохранение#

Корректно остановите проверочную установку. Основной экземпляр пока остаётся выключенным. Сохраните старую identity отдельно и установите проверенный набор в нужное основное расположение. Восстановите владельца файлов для настоящего пользователя службы; перепроверьте identity, карту и конфигурацию в запуске.

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

При неудаче остановите экземпляр и верните сохранённое состояние после сбоя с его конфигурацией. Базы разных поколений не смешивайте. Автоматические задания и публичный доступ включайте после принятия результата; исходный архив и возможность отката сохраняйте по своей политике резервирования.