TeaHost

обновлено 4 мин чтения

Как создать сервер Core Keeper

Запускаем сервер Core Keeper на Linux: SteamCMD, xvfb для headless, ServerConfig.json, Game ID против прямого IP, сиды мира и перенос сохранений

Кратко

Сервер Core Keeper ставится через SteamCMD (App ID 1963720) и на Linux запускается через виртуальный дисплей: xvfb-run -a ./_launch.sh. Режим мира, сид и число слотов задаются в ServerConfig.json, игроки подключаются по Game ID из лога сервера или напрямую по IP с открытым UDP 27015; для группы до 5 человек хватает около 2 ГБ RAM.

Подземелье в Core Keeper копается неделями, и обидно, когда прогресс всей группы стоит, потому что хост занят. Отдельный сервер Core Keeper решает это: мир доступен постоянно, фермы работают, а игроки заходят когда удобно. Установка проще, чем у большинства выживалок, но есть две вещи, которые ставят в тупик почти всех — необходимость виртуального дисплея на Linux и странная система подключения по Game ID вместо IP. Разберём и то, и другое.

Выделенный сервер Core Keeper и настройка подземного мира

Требования

Core Keeper — 2D-игра на Unity, и требования у неё скромные по сравнению с трёхмерными выживалками.

  • 2 ГБ RAM — группа до 5 человек, свежий мир;
  • 4 ГБ — 10–15 игроков или давно освоенное подземелье;
  • 6 ГБ — большой онлайн и мир, который копают несколько месяцев.

Процессору достаточно двух-четырёх ядер. Основной рост нагрузки идёт от размера освоенной территории: каждый прокопанный тоннель и каждая ферма остаются в мире и обсчитываются. Диск — 5 ГБ под установку, сейв растёт до нескольких сотен мегабайт.

Установка сервера Core Keeper на Linux

App ID — 1963720, логин анонимный.

код
steamcmd +force_install_dir /opt/corekeeper +login anonymous +app_update 1963720 validate +quit

Здесь начинается главная особенность. Сервер Core Keeper собран как обычное Unity-приложение и при запуске требует графическую подсистему, даже работая headless. На сервере без иксов процесс упадёт с ошибкой инициализации дисплея.

Лечится виртуальным дисплеем. Ставим xvfb:

код
apt install xvfb

И запускаем через него:

код
cd /opt/corekeeper
xvfb-run -a ./_launch.sh

В комплекте идёт скрипт _launch.sh, который сам выставляет нужные переменные окружения. Запускать бинарник напрямую в обход скрипта не советую — половина проблем на форумах именно от этого.

ServerConfig.json

Конфиг лежит в корне установки и создаётся при первом запуске.

json
{
  "gameId": "",
  "worldName": "TeaHost",
  "worldSeed": 0,
  "worldMode": 0,
  "gameMode": 0,
  "maxNumberPlayers": 10,
  "serverName": "TeaHost Core Keeper",
  "dataPath": "",
  "season": -1
}

По полям.

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

worldMode задаёт правила: 0 — обычный, 1 — хардкор с безвозвратной смертью, 2 — творческий, 3 — режим с ускоренным добыванием ресурсов. Менять его после генерации мира нельзя, решайте до старта.

maxNumberPlayers стоит выставить по реальной группе. Технически значение поднимается высоко, но комфортная игра заканчивается где-то на 10–15 одновременных игроках: синхронизация большого количества сущностей начинает отставать.

season в -1 отдаёт управление сезонными событиями календарю (Хэллоуин, зимний сезон включаются автоматически по дате). Число от 0 задаёт конкретный сезон принудительно.

gameId оставляем пустым при первом запуске — сервер сгенерирует его сам.

Game ID: как игроки заходят на сервер

Вот эта часть отличает Core Keeper от почти всех соседей по жанру.

При старте сервер печатает в лог строку вида Game ID: <длинная строка> и записывает её в файл рядом с конфигом. Игроки подключаются именно по этому идентификатору: в игре нужно выбрать Join Game и вставить Game ID. Никакого IP вводить не требуется — соединение идёт через инфраструктуру Steam.

Практические следствия:

  • Game ID меняется при пересоздании мира, но остаётся стабильным между рестартами, если он прописан в gameId конфига;
  • раздавать его можно так же, как ссылку-приглашение — это единственное, что нужно игроку;
  • проброс портов в классическом виде не обязателен, что сильно упрощает жизнь на домашней машине.

При этом сервер поддерживает и прямое подключение по IP с портом (по умолчанию 27015), если хочется классической схемы:

код
ufw allow 27015/udp

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

Где лежат миры

Сохранения по умолчанию попадают в каталог пользователя:

код
~/.config/unity3d/Pugstorm/Core Keeper/DedicatedServer/worlds/

Путь можно переопределить полем dataPath в конфиге — так удобнее, если хотите держать миры на отдельном диске или бэкапить одной командой.

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

Бэкапить эту папку стоит по расписанию: Core Keeper пишет мир при выходе, и жёсткое выключение процесса способно оставить сейв в неконсистентном состоянии. Общая схема копий разобрана в тексте зачем нужны автобэкапы.

Автозапуск и обслуживание

Сервер удобно оформить как systemd-юнит, чтобы он поднимался после перезагрузки машины и перезапускался при падении. Ключевое отличие от обычного юнита — тот же xvfb-run в строке запуска:

код
ExecStart=/usr/bin/xvfb-run -a /opt/corekeeper/_launch.sh
Restart=on-failure
RestartSec=15

Обновления ставятся повторным app_update 1963720 при остановленном сервере. Core Keeper относительно бережно относится к совместимости, но после крупных патчей клиент старой версии на сервер не пустят, так что обновляться придётся синхронно с игроками.

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

Итог

Всё сводится к четырём шагам: скачать 1963720 через SteamCMD, поставить xvfb и запускать через xvfb-run ./_launch.sh, настроить ServerConfig.json под нужный режим мира и число слотов, раздать игрокам Game ID или открыть UDP 27015 для прямого подключения. Дальше сервер практически не требует обслуживания.

Если возиться с виртуальным дисплеем и systemd не хочется, готовый сервер разворачивается из панели за пару минут — тарифы посмотрите здесь.

ПоделитьсяTelegramVK
Все статьи рубрики