Фабрика должна расти: настраиваем игровой кластер Factorio

a12957d9dca0131064ad4800282c5d3e.png


Игроки Factorio делятся на две группы. Одни отвергают игру в первые часы, а другие «залипают» на несколько суток и строят масштабные производственные линии. Несмотря на отличную оптимизацию игры, некоторые базы настолько велики, что даже самый мощный компьютер перестает справляться. Это, конечно, не устраивает тех, кто намерен продолжать играть.

Привет, Хабр! В этой статье покажу, как поднять выделенный игровой сервер Factorio. А также также поведаю о проекте, который соединяет отдельные серверы в один большой мир. Подробности под катом!

Возможно, эти тексты тоже вас заинтересуют:

→ Что такое Factorio и зачем нужен сервер
→ Как запустить сервер
→ Как запустить кластер
→ Заключение

Что такое Factorio и зачем нужен сервер


Factorio — специфичная игра про выживание на неизвестной планете. Впрочем, она объединяет большинство привычных механик и сценариев для подобного жанра.

  • Герой может спастись. Для этого ему нужно добывать ресурсы и «поднимать науку». Только тогда получится построить ракету и отправиться домой.
  • Количество ресурсов ограничено. Мир велик, но не бесконечен, как в том же Minecraft.
  • На планете встречаются противники научно-технического прогресса: плеваки и кусаки.


e5e1e266edf8523db4a6b3b6317bec68.png


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

Автоматизация в Factorio возведена в абсолют. Для построения гибкого производства в игре есть поезда и логистическая сеть. Например, вы можете построить железную дорогу, которая соединяет нефтеперерабатывающий завод с четырьмя месторождениями. Затем — объединить месторождение и станцию в общую логистическую сеть и указать, что поезд может останавливаться на станции только при условии, если в хранилище более 50 тонн нефти. Вот и все, теперь поезд не будет «прохлаждаться» на станциях, которые не могут заполнить цистерну до краев.

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

Кто-то считает, что совместная игра в Factorio — лучшая замена техническому собеседованию, а кто-то проверяет архитектурные стили или объясняет принципы работы Apache Kafka. Если у вас достаточно свободного времени и есть желание все автоматизировать, то Factorio для вас.


Гораздо веселее проходить игру с друзьями. Для этого потребуется выделенный игровой сервер.

auj4h4dcfw4ipieenxqmazu-crc.png

Как запустить сервер


Выбор подходящей конфигурацию


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

  • раз в секунду и большинство действий выполняется в одном потоке. Это значит, что нужен сервер с высокой тактовой частотой, а не с большим количеством ядер.
  • Для прохождения базовой игры подойдет любой облачный сервер с двумя ядрами, но с модами может быть по-разному. Для Krastorio 2 облачного сервера хватит, а вот для Sea Block придется переехать на выделенный сервер CL23-SSD с процессором i3–12300. Спустя 900 часов игры мой компьютер уже тормозит от количества объектов на карте, а выделенный сервер пока справляется и выдает стабильные 60 тактов в секунду.

yqu91ql5iodqhxwpr_1bo0jw0ti.pngЛюбите детективы? Пройдите квест «В поисках пропавших ссылок»! Регистрируйтесь на сайте и попробуйте себя в роли сыщика: найдите на страницах Selectel спрятанные ссылки и первыми дойдите до финала. Выиграйте эксклюзивный мерч и промокод на сервисы Selectel.

Аренда сервера


В качестве примера развернем выделенный сервер CL23-SSD — этой конфигурации хватит с запасом.

1. Открываем панель управления и переходим в раздел Серверы и оборудование → Серверы. В пункте Готовые серверы выбираем интересующую нас конфигурацию.

50311ff558db3e5ffbc699fef7b4f01c.png


2. Настраиваем сервер: выбираем операционную систему и модель потребления трафика. Выбираем Ubuntu и нажимаем кнопку Оплатить.

3. Подключаемся к серверу по SSH, используя его публичный IP-адрес и пароль из панели управления.

ssh root@


Установка игрового сервера


Игровой сервер распространяется бесплатно на официальном сайте игры, но headless-версия есть только для Linux.

1. Скачиваем и распаковываем игровой сервер:

wget https://factorio.com/get-download/stable/headless/linux64 -O factorio.tar.xz
unxz factorio.tar.xz
tar xvf factorio.tar


В каталоге игрового сервера есть следующие точки интереса:

  • bin/x64/factorio — исполняемый файл игрового сервера,
  • mods/ — каталог для модов,
  • data/server-settings.example.json — конфигурационный файл сервера,
  • factorio-current.log и factorio-previous.log — логи последнего и предпоследнего запуска,
  • saves/ — каталог для промежуточных автосохранений.


Конфигурационный файл снабжен комментариями, однако я акцентирую внимание на некоторых параметрах.

  • Параметр game_password — пароль для входа на сервер.
  • Параметр auto_pause — булево значение. Если auto_pause=true, то при отсутствии игроков время на сервере останавливается. Обратите внимание, что через 19 840 часов (примерно 2,26 года) произойдет переполнение внутреннего счетчика времени и сохранение поломается.


2. Запускаем игровой сервер с помощью следующей команды:

./bin/x64/factorio --start-server /путь/до/карты.zip --server-settings server-settings.json


Может возникнуть вопрос, где взять карту игры. Но на деле все просто: ее нужно сгенерировать. Самый оптимальный вариант — сделать это в одиночной игре через интерфейс.

a04959010eed0a1af6970d060f36fec5.png


Интерфейс генерации карты.

Сохранения можно найти по одному из путей:

  • Windows: %APPDATA%\Factorio\saves;
  • macOS: ~/Library/Application Support/factorio/saves;
  • Linux: ~/.factorio/saves.


Загружаем сохранение на сервер, запускаем — и готово!

Сервер можно запустить в tmux/screen или написать systemd-юнит. Также можно использовать скрипты Linux Game Server Manager (LinuxGSM).


Как запустить кластер


Зачем нужен кластер


Мощный выделенный сервер может справиться даже с тяжелыми модами. Но однажды его ресурсов может не хватить.

Для сравнения производственных линий в игре используется метрика «наука в секунду» (Science Per Minute, SPM). «Наука» — это предметы в виде колб, которые изготавливаются из множества различных ресурсов и тратятся на изучение новых технологий.

Недавно был поставлен рекорд в миллион науки за минуту. Для сравнения: компьютер с процессором Intel i3–10500 лагает, когда на карте миллион сущностей. А тут миллион — это производимый ресурс без учета фабрик, манипуляторов и конвейеров. Как такое можно сделать на одном сервере? Никак — нужен кластер.

Для постановки рекорда энтузиасты использовали 175 игровых инстансов, расположенных на 53 серверах. Самая большая локация, ферма солнечных батарей, занимает сохранение размером в 1,5 ГБ и использует 70 ГБ оперативной памяти. Посмотреть на безумные цифры вы можете в мониторинге проекта.

Я заглянул на один из крупнейших серверов кластера. Энтузиазм авторов впечатляет. Маленькие познавательные тексты и рассуждения по темам будущих статей — в моем Telegram-канале.


Модификации для создания кластеров


Вроде все понятно: для увеличения мощности нужно создать несколько сервер, которые будут общими усилиями поддерживать большой мир Factorio. Но как объединить их в кластер и научить общаться между собой? Так, чтобы часть мира, расположенная на сервере A могла отправить ресурсы на фабрики сервера B?

Объединением игровых серверов в один мир занимается проект Clusterio. У него есть две версии.

  • Устаревшая «альфа» 1.2. Это внутриигровой мод, который реализует «телепортирующие сундуки». Они «поглощают» ресурсы на одном сервере и «материализуют» на другом.
  • Актуальная «альфа» 2.0. Это целый комбайн. Далее мы рассмотрим именно эту версию.


Создание кластера, или начало работы с Clusterio 2.0


Терминология оркестратора

  • Controller — управляющее звено. На нем находится веб-интерфейс.
  • Instance — игровой сервер Factorio.
  • Host — физический или облачный сервер, на котором запускаются игровые серверы.


1. Для работы Clusterio нужен пакетный менеджер Node.js (NPM) — устанавливаем его с помощью нескольких команд:

mkdir clusterio
cd clusterio
npm init "@clusterio"


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

2. Если вы устанавливаете хост отдельно, то необходимо указать URL контроллера:

npx clusteriohost config set host.controller_url http://192.168.1.1:1234/


Скрипт установки выведет в конце токен для входа в контроллер — его нужно сохранить. По готовности можно запустить контроллер и хост.

В текущем каталоге появится каталог systemd — внутри него лежат сгенерированные юниты, которые можно положить в /etc/systemd/system и запускать в качестве демонов. Кроме того, в этой же директрии есть скрипты run-controller.sh и run-host.sh. С помощью них можно запустить хост или контроллер в текущей сессии.

df34372d6c2dc4fa24f70ed1308a6064.png


Если все сделано верно, то после входа по токену вы увидите все хосты и информацию о сервере с контроллером.

3. Далее заходим на вкладку Mods и в разделе Stored Mods загружаем zip-архивы модов Subspace Storage и Clusterio Library. Архивы можно скачать с сайта или через главное меню игры. Во втором случае архивы модов будут лежать в каталоге mods, рядом с saves.

03d88c77ab89376108140d35f03aa341.png


4. Затем создаем набор модов (Mod Pack). Назвать его можно как угодно, главное — прописать версию игры. Далее в списке модов нужно включить загруженные модификации и сохранить получившийся набор. Без него по умолчанию ни один игровой сервер запустить не получится.

c56bbce35986b5f3f1da49d085b1ab2d.png


5. Теперь можно создать игровой сервер во вкладке Instances. В карточке игрового сервера нужно назначить игровой сервер на хост и загрузить мир (сохранение). Если последнего не сделать, сервер при первом запуске сгенерирует случайный мир.

Готово — игровой сервер можно запускать.

Запуск игрового сервера


В Factorio можно заходить по адресу любого инстанса из кластера. Если вы устанавливали Server Select, то в левом верхнем углу игры будет кнопка, вызывающая список всех серверов кластера. Плагин Inventory Sync сохранит ваш инвентарь, а Research Sync — синхронизирует научный прогресс между всеми серверами.

a12957d9dca0131064ad4800282c5d3e.png


Плагин Subspace Storage и одноименный мод добавляют в игру три пары объектов:

  • Item Injector + Item Extractor,
  • Fluid Injector + Fluid Extractor,
  • Electricity Injector + Electricity Extractor.


Объекты Injector — это «черные дыры», которые потребляют ресурсы, жидкости и электричество. Объекты Extractor — это «волшебные сундуки», которые извлекают запрошенные ресурсы и пробрасывают между серверами в кластере.

eae6a8c42941976c218d6b502c64e39c.png


Вкладка Storages, «съеденные» объекты.

Заключение


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

Habrahabr.ru прочитано 2705 раз