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

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

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

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

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


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

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


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

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

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

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

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



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


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


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

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

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



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


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

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


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

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

ssh root@<ip-adr>

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


Игровой сервер распространяется бесплатно на официальном сайте игры, но 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

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


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

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

  • 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. С помощью них можно запустить хост или контроллер в текущей сессии.


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

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


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


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

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

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


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


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

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

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


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

Заключение


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

Комментарии (29)


  1. NickDoom
    27.03.2024 11:17
    +2

    Мне одному глаз царапает подход к проектированию с КДПВ?


    1. Firemoon Автор
      27.03.2024 11:17
      +1

      Мне тоже. Но это КДПВ, она должна привлекать внимание.

      Если вам хочется продолжить царапать глаз дальше, то карту я скачал отсюда: https://factoriomaps.com/beta/user/Xarovin/Osira/index.html

      В своей игре я использую что-то вроде City Block:

      Очень общий скриншот на тысячу часов, модпак Seablock


      1. micronull
        27.03.2024 11:17
        +2

        С готовыми ситиблоками от Nilaus потерял интерес( А иначе игру уже не представляешь, так как они идеальны.

        Как будто заюзал чит.


        1. FreeNickname
          27.03.2024 11:17
          +1

          По этой причине не трогаю ни city-блоки, ни шину. Спагетти – наше всё)) Но я ещё очень мало наиграл по меркам Factorio, часов 150-200.


          1. Tufed
            27.03.2024 11:17

            Играл с AnonyMods, жаль что заброшен теперь.


          1. micronull
            27.03.2024 11:17

            ни city-блоки, ни шину.

            Это как не трогать паттерны программирования, SOLID, DDD и т.п.
            Зато есть простор для велосипедостроения.


            1. FreeNickname
              27.03.2024 11:17
              +1

              Естественно, именно так) SOLID, DDD и прочих KISS-ов мне на работе хватает)


          1. Lev3250
            27.03.2024 11:17
            +1

            Шина это круто! Но я принципиально не использую чужие чертежи (вру, использую один на развилку ЖД). Потому что если ты выжил в первые 20 часов, то потом навтыкать чужих чертежей не составляет труда, дроны сами всё поставят. Я строил базу на около 100 блоков сам и потратил 300 часов. С чужими чертежами сделал бы за 100. Но зачем?


            1. FreeNickname
              27.03.2024 11:17
              +1

              Солидарен)


              1. Lev3250
                27.03.2024 11:17
                +1

                В том году прошёл krastorio2 за 100 часов без чертежей, но с jetpack. Очень понравилось, хотя окончание немного затянуто. Очень жду дополнения 2.0. Уж очень там всё круто будет. Другие планеты, двухуровневое ЖД, установка настроек и рецептов на призраках, приоритеты остановок в зависимости от условий, автоотправка на заправку и т.д. и т.п.


      1. FreeNickname
        27.03.2024 11:17

        Ещё немного странно, что Вы эту же картинку, по сути, использовали ещё два раза в статье)

        А за статью спасибо! :)


    1. alexxisr
      27.03.2024 11:17

      Это как писать на ассемблере, оптимизируя каждый байт и такт. Получается лапша кода, но работает на 2 мс быстрее чем у соседа.


      1. Miheev2
        27.03.2024 11:17

        2 мс это очень много, весь кадр иногда это 2 мс. Если 360 fps.
        А если 2 нс, то логично.


      1. NickDoom
        27.03.2024 11:17
        +2

        Так «макароны» же не особо-то и быстрые. Во-первых, маяки или не влезают, или стоя́т неэффективно. Во-вторых, часто производительность упирается в темпы добычи, то есть ускорять её на этом конкретном месторождении синими модулями уже некуда — нужно сочетать рыжие и синие, иначе просто заводы будут тупо ждать, пока копалка накопает. В-третьих, чтобы ничего не отвлекало от застройки новых месторождений — лучше копать не «на скорость», а «на эффективность». Плюс логистика. Всё это приводит нас к системе агломерированного («от руды до автомобиля в одной точке») производства — возле меди производятся все три типа плат плюс модули и RCU (надо привезти немножко железа и серы и «множко» пластика), возле железа производятся рельсы, движки и т. д. (тоже не особо много надо привозить) и так далее. У каждой «агломерахи» есть сбалансированная постройка, которая рядами чередуется с маяками и даёт экстремум по скорости (с учётом потерь времени на добычу ресурсов для постройки самих производств).

        Дальше будут очень большие спойлеры.

        Hidden text
        Макароны. Годятся на разогрев, для затравки, не более.
        Макароны. Годятся на разогрев, для затравки, не более.
        Красные платы. Обратите внимание, как переплетены конвейеры, чтобы сэкономить на логистике дронами. Маяки работают максимально эффективно — маяк на 8 сборщиков, сборщик под 8 маяками.
        Красные платы. Обратите внимание, как переплетены конвейеры, чтобы сэкономить на логистике дронами. Маяки работают максимально эффективно — маяк на 8 сборщиков, сборщик под 8 маяками.
        Синие платы. Чуть менее сбалансированные (некоторые сборщики друг друга ждут), но при учёте прочих факторов это тоже таки оптимум.
        Синие платы. Чуть менее сбалансированные (некоторые сборщики друг друга ждут), но при учёте прочих факторов это тоже таки оптимум.

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

        Естественно, в один поезд влезает намного больше, скажем, синих плат, чем можно было бы сделать из такого же поезда руды. Поэтому — раскидываем по месторождениям «агломерахи», а к космодрому везём всё готовенькое, чтобы ракеты стартовали пошустрее :)


        1. FreeNickname
          27.03.2024 11:17

          Так то, что Вы показали на скриншотах, вполне может быть и в "паста-базе". Глобально у Вас тут никакого другого паттерна не навязывается. Ничто не мешает свить спагетти так, чтобы модули стояли "хорошо". Другое дело, что экстремально легко свить спагетти так, чтобы всё, включая модули, стояло "плохо") Но это другой разговор. Спагетти, на мой взгляд – просто отсутствие какого-либо иного структурного паттерна. "Как хочу, так и леплю". Ну и при этом любой структурный паттерн так или иначе имеет какой-то оверхед. Это как писать на ассемблере. Получится ли быстрее, чем на C / C++ / C#? Вообще не факт. Можно ли сделать быстрее? Да.

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


    1. zabanen2
      27.03.2024 11:17

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


  1. polearnik
    27.03.2024 11:17
    +1

    На планете встречаются противники научно-технического прогресса: плеваки и кусаки.

    я бы назвал их коренными жителями которые против засирания планеты. Они нападают только когда загрязнение доходит до их гнезд.

    Игра выглядит как аллюзия на американцев что довольно самоиронично


    1. Prototik
      27.03.2024 11:17
      +6

      А в каком виде аллюзия на американцев от чешской студии выглядит самоироничной?


      1. NickDoom
        27.03.2024 11:17

        Блин, а я думал — польской О_О


    1. NickDoom
      27.03.2024 11:17

      Вообще выглядит как некоторая пародия на экологические трагедьки, потому что «бедные коренные жители» (вполне официально в игре «Natives») от выхлопов не чахнут и дохнут, а жиреют и злятся всё сильнее :)


      1. polearnik
        27.03.2024 11:17
        +1

        их гнезда уничтожаются потому чтоони мешают добывать ископаемые или мешают строительству. И они нападают только когда загрязнение доходит до их гнезд ну или в ответ на нападение. Не очень вяжется с экологическими обиженками. Насчет жиреть это както громко сказано они эволюционируют но довольно медленно.


  1. lgorSL
    27.03.2024 11:17
    +4

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

    Нет, не потребуется. Достаточно в меню игры выбрать "multiplayer -> host saved game" и позвать друзей.

    Спустя 900 часов игры мой компьютер уже тормозит от количества объектов
    на карте, а выделенный сервер пока справляется и выдает стабильные 60
    тактов в секунду.

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

    Единственный плюс сервера - он работает всё время.

    Из всей статьи полезной можно назвать только информацию про кластер, но там одним сервером не отделаться.


    1. Firemoon Автор
      27.03.2024 11:17
      +1

      Достаточно в меню игры выбрать "multiplayer -> host saved game" и позвать друзей.

      Единственный плюс сервера - он работает всё время.

      Ну так да, если вы собираетесь играть асихнронно, то поможет только выделенный сервер. Это помимо параметра auto_pause , который позволяет серверу продолжать играть и без вас.

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


      1. Prototik
        27.03.2024 11:17
        +1

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

        А выключать автопаузу в мире с кусаками - это стрелять себе в ногу, могут и сожрать ненароком.


        1. Lev3250
          27.03.2024 11:17

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


  1. NutsUnderline
    27.03.2024 11:17

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

    У меня вопрос: а можно ли сделать кластер на каком нить кубернетисе, чтобы был большой сервер и один общий мир, или однопоточность не даст? И какой вообще можно в принципе создать сервер что с одним-двумя ядрами но на максимуме и толпой памяти?


    1. 1dNDN
      27.03.2024 11:17
      +1

      а можно ли сделать кластер на каком нить кубернетисе, чтобы был большой сервер и один общий мир, или однопоточность не даст?

      https://factoriobox.1au.us/results/cpus?map=4c5f65003d84370f16d6950f639be1d6f92984f24c0240de6335d3e161705504&vl=1.0.0&vh=


      1. NutsUnderline
        27.03.2024 11:17

        Тут вроде обычные "бытовые" процы, 8-16 ядер и памяти не 128 гиг даже...


        1. 1dNDN
          27.03.2024 11:17
          +1

          Ну да, потому что даже 5600x3d за 200 баксов в factorio показывает себя на полпорядка лучше, чем всякие там Xeon Gold с тележкой ядер, не говоря уже о топовых x3d камнях