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

Требования
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
Конфиг лежит в корне установки и создаётся при первом запуске.
{
"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 не хочется, готовый сервер разворачивается из панели за пару минут — тарифы посмотрите здесь.


