MAATRIX GAMES / Блог / Управление регионами и мирами на сервере

Управление регионами и мирами на сервере

MAATRIX GAMES

Рано или поздно любой админ песочницы или выживалки упирается в один и тот же набор вопросов: как поднять чистый мир с конкретным сидом, чтобы потом можно было его воспроизвести; как погонять новую сборку модов на тестовом мире, не трогая боевой; и что делать, когда папка мира разрослась на десятки гигабайт, а диска на сервере жалко. Разбираем по шагам на конкретных играх — Minecraft, Rust, 7 Days to Die, Valheim, ARK и Terraria — с реальными файлами, флагами запуска и командами.

Что вообще считается "миром" в разных играх

Прежде чем чистить или копировать, нужно понимать, из чего мир состоит физически — иначе легко удалить не то или скопировать половину.

  • Minecraft — мир это папка (по умолчанию world, плюс world_nether и world_the_end), внутри level.dat с метаданными и сидом, и подпапка region/ с файлами r.X.Z.mca — каждый файл это область 32×32 чанка. Чем больше игроки исследуют карту, тем больше .mca-файлов появляется.
  • Rust — один файл <identity>/<mapname><size>.sav (плюс .sav.trim и .map), это готовый процедурный ландшафт, сгенерированный один раз по сиду при первом старте. Он не растёт по мере исследования — растёт только файл сохранения построек и лута рядом, <identity>/player.blueprints.3.db, <identity>/player.deaths.3.db и т.д. в той же папке.
  • 7 Days to Die — сохранение живёт в Saves/<WorldName>/<GameName>/, а сама карта (если это не фиксированная Navezgane) генерируется RWG (Random World Generator) по сиду в отдельную папку GeneratedWorlds/<WorldName>.
  • Valheim — два файла на мир: <name>.db (сама карта и всё, что в ней) и <name>.fwl (метаданные, включая сид). Лежат в .config/unity3d/IronGate/Valheim/worlds_local на Linux-сборке сервера.
  • ARK: Survival — сохранение в ShooterGame/Saved/SavedArks/<Map>/, файл <Map>.ark плюс профили игроков и племён рядом. Карты в оригинальном ARK по большей части статичные (The Island, Ragnarok и т.д.), но есть режим Procedurally Generated Map с сидом.
  • Terraria — один файл <world>.wld на мир, плюс .wld.bak — резервная копия предыдущего сохранения, которую движок делает сам перед каждой записью.

Дальше держим это в голове: "почистить мир" в Minecraft значит удалить конкретные .mca, а в Rust — просто перегенерировать всё заново, промежуточного варианта там нет.

Создание нового мира с воспроизводимым сидом

Сид нужен, если хотите гонять один и тот же ландшафт на нескольких серверах (тест и прод), делиться картой с другим админом или просто зафиксировать удачную генерацию.

Minecraft, server.properties:

level-name=survival-s3
level-seed=8172644190537216543
generator-settings={}

Сид можно взять из уже существующего мира — команда /seed в игре покажет число, которое затем вписываем в новый server.properties. Важно: одинаковый сид даёт одинаковый ландшафт только при одинаковой версии игры и одинаковых generator-settings — между версиями (например, при апдейте с 1.20 на 1.21) генерация может слегка отличаться из-за новых блоков и структур.

Rust, флаги запуска:

./RustDedicated -batchmode +server.identity "wipe2026" \
  +server.seed 918273645 +server.worldsize 4000 \
  +server.level "Procedural Map"

Тот же server.seed и server.worldsize при следующем запуске с новым server.identity дадут идентичный ландшафт (мобы, лут и постройки, естественно, будут другие, это же новый мир).

7 Days to Die, serverconfig.xml:

<property name="GameName" value="TestRun2026"/>
<property name="WorldGenSeed" value="dune26"/>
<property name="WorldGenSize" value="6144"/>
</property>

Сид тут текстовый, можно писать словами — RWG хеширует строку в число сам.

Valheim — сид задаётся один раз при первом запуске нового мира флагом -world "Ironwood" -saveinterval 1800; если файлов Ironwood.db/Ironwood.fwl ещё нет, сервер сам предложит их создать со случайным сидом. Задать свой сид напрямую через флаг нельзя — проще всего сгенерировать нужный мир один раз в одиночной игре с введённым сидом в меню создания, а потом перекинуть готовые .db/.fwl на сервер.

Нужен игровой сервер?

MAATRIX GAMES — 45+ игр, деплой за минуты, DDoS-защита, автобэкапы. Тарифы от 399 ₽/мес.

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

Тестовый и боевой мир на одном сервере

Общий принцип для всех игр одинаковый: один и тот же движок/бинарник, но два независимых набора — данные, порт и (если есть) идентификатор мира. Смешивать в одной папке нельзя — часть игр (Rust, 7DTD) блокирует файлы сохранения на время работы процесса, и параллельный запуск второй копии с теми же путями либо не стартует, либо портит сейв.

Практический вариант на VPS — отдельные systemd-юниты с шаблоном:

# /etc/systemd/system/mcserver@.service
[Unit]
Description=Minecraft server (%i)
After=network.target

[Service]
WorkingDirectory=/opt/minecraft/%i
ExecStart=/usr/bin/java -Xmx4G -jar server.jar nogui
Restart=on-failure
User=mcserver

[Install]
WantedBy=multi-user.target

Тогда systemctl start mcserver@test и systemctl start mcserver@live — это два процесса с разными рабочими папками /opt/minecraft/test и /opt/minecraft/live, каждая со своим server.properties (и, соответственно, своим портом — 25565 для боевого, 25566 для тестового).

Для Rust и 7 Days to Die то же самое, но переключателем служит не отдельная папка, а +server.identity (Rust) или отдельный serverconfig-test.xml с другим GameName и портом (7DTD) — в остальном логика идентична: два конфига, два порта, два набора файлов сохранения.

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

Переключение между мирами

Здесь важно понимать: у большинства игр переключение мира — это не команда в чате, а смена конфига и перезапуск процесса.

  • Minecraft (ваниль/Paper) — меняете level-name в server.properties, останавливаете и запускаете сервер заново. Если нужен переход без даунтайма и с телепортацией игроков между мирами прямо в рантайме — ставьте плагин Multiverse-Core (Bukkit/Paper), он держит несколько миров одновременно в одном процессе: /mv create testworld normal -s 8172644190537216543, /mv tp Steve testworld.
  • Rust — меняете server.identity на флаге запуска (это по сути и есть переключатель "какую папку сохранения открывать") и перезапускаете RustDedicated.
  • 7 Days to Die — меняете GameName (и при необходимости WorldGenSeed) в serverconfig.xml, перезапуск обязателен — RWG-карта и сейв привязаны к этому имени.
  • Valheim — меняете флаг -world на другое имя и рестартуете; если файлов с этим именем ещё нет, сервер сгенерирует новый мир при старте.
  • ARK — карта задаётся именем исполняемого файла запуска (TheIsland_WP, Ragnarok_WP и т.д.) прямо в команде старта, плюс ?AltSaveDirectoryName= в строке параметров, если хотите развести сохранения одной карты на разные слоты.

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

Чистка неиспользуемых регионов карты

Больнее всего это бьёт по Minecraft — сервер, где игроки активно исследуют территорию, легко нагоняет region/-папку на десятки гигабайт за пару сезонов, при этом реально используется (где стоят базы и где ходят игроки) обычно небольшой процент площади.

Рабочие варианты:

  1. WorldBorder (плагин для Bukkit/Spigot/Paper) — команда /wb trim <world> <chunkTimeoutInMs> удаляет чанки за пределами текущей границы мира, которые не открывались дольше заданного времени. Сначала задайте разумную границу: /wb set 6000 (радиус в блоках от центра), затем /wb trim world 0.
  2. MCA Selector — отдельная desktop-утилита (не плагин) для визуального выбора и удаления .mca-файлов по игровым координатам, если нужно точечно вычистить конкретный залётный остров или старую тестовую постройку без плагинов на сервере. Работает офлайн, поэтому сервер на время чистки лучше остановить, чтобы не расходились файлы, которые утилита не видит.
  3. Chunky — обратная задача: заранее сгенерировать (pregenerate) весь нужный радиус карты, чтобы потом не было лагов от догенерации на лету, когда игрок бежит в новую зону. Не про чистку, но часто идёт в связке.

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

Для Rust ситуация другая и проще — карта не растёт с исследованием, она фиксированного размера с момента генерации. "Чистка" там по факту означает вайп: +server.seed меняется на новый, старый .sav архивируется или удаляется. Экономия места достигается не обрезкой, а обычной ротацией старых сохранений — держите на диске 2-3 последних вайпа, остальное сносите или уводите в холодное хранилище.

Бэкап конкретного мира отдельно от остального сервера

Полный бэкап сервера (конфиги, плагины, моды, все миры разом) — штука тяжёлая и не всегда нужная, если поменять хочется что-то одно. Часто удобнее бэкапить именно папку мира отдельным заданием — она компактнее и её проще откатить точечно, не трогая настройки и установленные плагины.

Пример для Minecraft — архивируем только мир, с ротацией на 7 копий:

#!/bin/bash
WORLD_DIR="/opt/minecraft/live/world"
BACKUP_DIR="/opt/minecraft/backups/world"
DATE=$(date +%Y%m%d-%H%M)

mkdir -p "$BACKUP_DIR"
tar -czf "$BACKUP_DIR/world-$DATE.tar.gz" -C "$(dirname "$WORLD_DIR")" "$(basename "$WORLD_DIR")"

ls -1t "$BACKUP_DIR"/world-*.tar.gz | tail -n +8 | xargs -r rm --

Перед архивацией мира на живом сервере в Minecraft полезно на секунду включить save-off, дождаться save-all, снять архив и включить save-on обратно через RCON-консоль — иначе есть небольшой шанс поймать файл в момент записи.

Для Rust и 7DTD принцип тот же: в задание для cron идёт не вся папка сервера, а конкретно <identity>/*.sav* или Saves/<WorldName>/<GameName>/. Общая логика планирования (cron-расписание, ротация, куда складывать копии вне сервера) разобрана в статье про настройку автобэкапов игрового сервера — берите оттуда каркас и просто сужайте путь до конкретной папки мира. А если бэкап уже пригодился и нужно накатить его обратно — шаги по восстановлению смотрите в статье про восстановление сервера из бэкапа.

Перенос мира между серверами

Отдельный от бэкапа сценарий — не откат, а осознанный перенос: взяли готовый мир с тестового сервера и хотите поднять его как боевой на другом железе. Набор файлов тот же, что и при бэкапе, но распаковывается не поверх старого мира, а в свежую установку сервера с той же версией игры — несовпадение версии Minecraft при переносе частая причина, почему часть блоков после переноса отображается как "воздух" или конвертируется криво.

Коротко: останавливаете исходный сервер (или приостанавливаете сохранение через RCON), копируете именно папку/файлы мира — не весь каталог сервера, на новом месте ставите тот же движок и версию, кладёте мир на место, прописываете правильное имя в конфиге (level-name, GameName, -world — см. раздел про переключение выше) и стартуете, проверив логи на ошибки конвертации перед тем как пускать игроков.

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

Нужен игровой сервер?

MAATRIX GAMES — 45+ игр, деплой за минуты, DDoS-защита, автобэкапы. Тарифы от 399 ₽/мес.

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

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

Можно ли поменять сид у уже существующего мира?

Нет. Сид фиксирует ландшафт в момент первой генерации; смена сида в конфиге на действующем мире не пересоздаст уже сгенерированные чанки/регионы, а в некоторых играх (Minecraft) просто создаст новые чанки на границе старой карты, что визуально выглядит как шов между старым и новым ландшафтом.

Сколько места реально экономит обрезка регионов в Minecraft?

Зависит от того, сколько игроки успели исследовать и сколько там было структур (деревень, крепостей) — заранее точное число никто не назовёт. Смотрите на текущий размер region/ через du -sh world/region до и после, ориентируйтесь на свою карту, а не на чужие цифры из форумов.

Нужно ли останавливать сервер для бэкапа мира?

Не обязательно, если используете save-off/save-all через RCON (Minecraft) или встроенный автосейв игры перед архивацией — файловая система в момент tar всё равно снимет консистентный снапшот, если запись в этот момент приостановлена. Полная остановка сервера — самый надёжный, но самый неудобный для игроков вариант.

Сколько тестовых миров разумно держать на одном сервере одновременно?

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

Что делать, если после обрезки региона игрок жалуется на пропавшую базу?

Восстановить конкретный .mca-файл из бэкапа, снятого до обрезки, и вручную подложить его в region/ при остановленном сервере — отсюда и правило "бэкап перед любой чисткой" из раздела выше.