RE:NODE

Руководства15 мин чтения

Factorio headless server: установка, настройки и админы

Как правильно запустить Factorio headless server: загрузка, создание карты, все ключи server-settings.json, порты, админы, RCON, автосохранения и типичные ошибки.

1 прочтений

Factorio headless server - это отдельная загрузка с factorio.com, а не Steam-копия игры с отключённой графикой. Он весит около 57 МБ в архиве и меньше 300 МБ после установки, ему не нужны ни графический драйвер, ни аккаунт Steam, и карта на четверых спокойно уместится в 1 ГБ памяти. Настраивается он одним JSON-файлом и горсткой аргументов командной строки. В этом руководстве есть всё: установка, создание карты, каждый ключ server-settings.json, порт, файлы админов, RCON и поведение автосохранений, от которого зависит, сколько прогресса вам стоит сбой.

Что такое Factorio headless server#

Мультиплеер в Factorio построен на детерминированной пошаговой синхронизации (lockstep). Сервер не присылает вам состояние мира: он собирает ввод всех игроков, помечает его номером тика и рассылает обратно. Каждая машина - и сервер, и клиенты - затем прогоняет одну и ту же симуляцию и приходит к одному и тому же результату. Это единственное проектное решение объясняет почти всё дальнейшее:

  • Трафик на одного игрока крошечный. Вы передаёте нажатия клавиш, а не координаты объектов. Оживлённая игра на восьмерых - это несколько десятков килобайт в секунду в каждую сторону.
  • Подключение обходится дорого. Новому игроку нужно отдать всю карту, прежде чем он сможет её симулировать. Это один всплеск размером с весь файл сохранения, поэтому в файле настроек есть ограничения на отдачу.
  • У всех одни и те же моды одних и тех же версий, иначе никто не подключится. Клиентских модов в Factorio не существует. Мод по определению меняет симуляцию.
  • Сервер должен справляться сам. Если сервер не выдаёт 60 обновлений в секунду, замедляется игра у всех. Клиенты, которые отстали слишком сильно, отключаются и должны заново скачать карту.

В headless-сборке нет ни рендерера, ни звука, ни атласа спрайтов, поэтому расход памяти у неё заметно ниже, чем у настольной игры на том же сохранении. Она не умеет делать скриншоты, не запускает редактор карт и не покажет окно настроек мода с графическим интерфейсом - практические последствия описаны в разделе про моды ниже.

Требования и расход ресурсов#

Factorio - одна из самых нетребовательных игр для хостинга, пока вдруг не перестаёт ею быть. Свежая карта на четверых - ерунда. Та же карта через триста часов, с тысячей поездов и сорока тысячами ботов, загрузит одно ядро целиком.

СтадияRAMCPUПримечания
Новая карта, 1-4 игрока1 ГБ1 ядроХватает для первого прохождения
Середина игры, 4-8 игроков2 ГБ1,5 ядраПоезда ходят, первая ракета уже видна
Большая база, 8-16 игроков3-4 ГБ2 ядраСохранения больше 40 МБ
Space Age или большой пакет модов4-6 ГБ2+ ядра, быстрыхНесколько поверхностей всё умножают
Мегабаза6-8 ГБСамое быстрое одно ядро, какое можно купитьПомогает только тактовая частота
  • CPU: цикл обновления фактически однопоточный. Число ядер после двух почти ничего не даёт; всё решают тактовая частота и кэш. Сервер, упавший до 45 обновлений в секунду, добавлением ядер не вылечить.
  • Диск: установка занимает меньше 300 МБ. Сохранения начинаются с 2-5 МБ и растут вместе с исследованной территорией - 20-40 МБ для середины игры обычное дело, а мегабазы переваливают за 100 МБ. Умножьте это на число слотов автосохранения, потому что все они лежат на диске одновременно.
  • Сеть: низкая и ровная, со всплеском при каждом подключении нового игрока. Если карта у игрока скачивается медленно, это max_upload_in_kilobytes_per_second делает ровно то, что вы ему велели.

Память - то, что удивляет людей сильнее всего, потому что Factorio держит всю карту в RAM и никогда её не отпускает. Разведка радаром, вторая поверхность или мод, генерирующий местность, - всё это поднимает потребление навсегда. Если контейнер останавливается на лимите памяти посреди игры, вы теряете всё после последнего автосохранения, поэтому рассчитывайте на то, чем база станет, а не на то, какая она сейчас. Общая мысль из статьи CPU или RAM для игровых серверов здесь применима прямо: сначала выясните, чего именно вам не хватает, и только потом докупайте другое.

Установка и создание карты#

Headless-пакета нет в Steam, и для него нет app id в SteamCMD. Скачивать его нужно прямо с factorio.com. stable даёт текущую стабильную сборку; если ваша группа сидит на экспериментальной ветке, подставьте latest.

bash
$ curl -L -o factorio-headless.tar.xz \    https://factorio.com/get-download/stable/headless/linux64$ tar -xJf factorio-headless.tar.xz -C /opt$ /opt/factorio/bin/x64/factorio --version

Пакет самодостаточен. Его config-path.cfg поставляется с use-system-read-write-data-directories=false, а значит, сохранения, моды, конфигурация и логи лежат в /opt/factorio, а не в ~/.factorio. Это стоит знать, прежде чем искать файл сохранения не там.

code
/opt/factorio/  bin/x64/factorio          the server binary  config/config.ini         generated on first run  data/                     base game data and the example JSON files  mods/                     mods go here  saves/                    save files and autosaves  factorio-current.log      the log, with factorio-previous.log beside it

В data/ лежат четыре файла-примера: server-settings.example.json, map-gen-settings.example.json, map-settings.example.json и server-whitelist.example.json. Копируйте нужные, а не правьте примеры на месте, потому что обновление игры их перезапишет.

Headless-сервер не умеет генерировать карту при запуске, как сервер Minecraft. Сохранение сначала создаётся отдельной командой:

bash
$ cd /opt/factorio$ cp data/server-settings.example.json data/server-settings.json$ cp data/map-gen-settings.example.json data/map-gen-settings.json$ ./bin/x64/factorio --create ./saves/world.zip \    --map-gen-settings ./data/map-gen-settings.json \    --map-settings ./data/map-settings.json

map-gen-settings.json хранит то, что вы выбираете на экране новой игры: местность и частоту руд, размер и богатство, воду, стартовую область, настройки скал и параметры вражеских баз. map-settings.json хранит то, что меняется по ходу игры: распространение загрязнения, эволюцию и экспансию врагов, бюджеты поиска пути и рулёжку. Оба файла необязательны - без них вы получите настройки по умолчанию, - но генерацию карты можно задать только при создании, так что минуты на это потратить стоит.

Затем запустите сервер:

bash
$ ./bin/x64/factorio --start-server ./saves/world.zip \    --server-settings ./data/server-settings.json \    --server-adminlist ./data/server-adminlist.json \    --port 34197 --console-log ./logs/console.log

На хостинге вам на самом деле нужен аргумент --start-server-load-latest, потому что он загружает самый новый файл в saves/, включая автосохранения. Это значит, что после сбоя перезапуск подхватит последнее автосохранение, а не то сохранение, которое вы называли три недели назад.

На хостинге с панелью вам ничего из этого вводить не нужно. Установка сделана за вас, а те же аргументы представлены полями на вкладке Startup: на RE:NODE карта генерируется при первом запуске, а файл настроек уже лежит на месте с паролем игры, сгенерированным для сервера.

server-settings.json строка за строкой#

Это вся конфигурация. Файл-пример обильно снабжён ключами _comment_, которые сервер игнорирует, так что их можно удалить или оставить.

КлючПо умолчаниюЧто делает
name-Имя в публичном списке серверов
description-Вторая строка в списке
tags[]Теги для поиска в списке, массив строк
max_players00 - без ограничения. Админы заходят и на полный сервер
visibility.publictrueПубликует сервер на официальном сервере подбора
visibility.lantrueРассылает объявление в локальной сети
username / password-Ваш логин на factorio.com, нужен для public
token-Вместо password, берётся из профиля на factorio.com
game_password-Что игроки вводят, чтобы зайти
require_user_verificationtrueТолько клиенты с действующим аккаунтом factorio.com
max_upload_in_kilobytes_per_second00 - без ограничения. Ограничивает передачу карты входящим игрокам
max_upload_slots5Сколько игроков могут одновременно скачивать карту
minimum_latency_in_ticks0Искусственный минимум задержки. Один тик - около 16 мс
max_heartbeats_per_second60Частота сетевых тиков, минимум 6, максимум 240
ignore_player_limit_for_returning_playersfalseСтарожилы проходят сверх max_players
allow_commandsadmins-onlytrue, false или admins-only
autosave_interval10Минут между автосохранениями
autosave_slots5Автосохранения по кругу пишутся в столько файлов
afk_autokick_interval0Минут бездействия до кика. 0 - не кикать
auto_pausetrueСтавить игру на паузу, когда никого нет
auto_pause_when_players_connectfalseПауза, пока кто-то скачивает карту
only_admins_can_pause_the_gametrueНе даёт любому ставить публичную игру на паузу
autosave_only_on_servertrueКлиенты не пишут автосохранения сами
non_blocking_savingfalseФоркается для сохранения без заморозки игры. Экспериментально

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

Четыре из этих ключей определяют, хорошо ли ведёт себя ваш сервер:

`visibility.public` вместе с `username` и `token`. Публичный сервер должен пройти аутентификацию на factorio.com. Возьмите токен на странице профиля на factorio.com и вставьте его в token, а не пароль от аккаунта. Если данные неверны, сервер всё равно запускается и работает для прямых подключений - просто пишет в лог ошибку сервера подбора и никогда не появляется в списке. Люди тратят час на правила файрвола там, где дело в опечатке в токене.

`auto_pause`. Включён по умолчанию и правилен почти для любой приватной группы: пока никого нет, игра не идёт, поэтому кусаки не эволюционируют, а загрязнение не расползается, пока вы спите. Отключайте только если хотите, чтобы завод работал без присмотра, и помните, что сервер на паузе всё равно занимает свою память.

`allow_commands`. Разумное значение по умолчанию - admins-only. Любое использование /c навсегда помечает сохранение как использовавшее команды, из-за чего у всех, кто на нём играет, отключаются достижения. /silent-command и /measured-command тоже считаются.

`autosave_interval`. Десять минут - значение по умолчанию, и это разумный компромисс. Сохранение большой карты на мгновение блокирует игру - на мегабазе это заметная заморозка, - поэтому возникает соблазн увеличить интервал. Не поддавайтесь: интервал - это ровно тот прогресс, который стоит вам аварийная остановка.

Порты, подключение и публичный список#

ПортПротоколНазначение
34197UDPИгровой трафик. Единственный порт, нужный самой игре
27015TCPRCON, если включите. Подойдёт любой порт

Factorio использует один UDP-порт и больше ничего. Отдельного порта запросов нет, поэтому её проще всего закрыть файрволом - и это же означает, что правило только для TCP молча даст сервер, который работает, но недоступен. Почему эта ошибка так распространена, объясняется в статье порты игрового сервера.

список публичных иградрес и тегинапрямую по UDPавтосохранение каждые 10 минпередача картыФайл сохраненияотдаётся при входеКлиент Factorio2.0.xfactorio.comсервер подбораHeadless serverUDP 34197
Как игрок находит сервер Factorio и заходит на него

Войти можно тремя способами:

  1. Прямое подключение. Multiplayer, затем Connect to address, затем 203.0.113.10:34197. Работает всегда, не требует логина factorio.com на сервере и является первым, что нужно проверить.
  2. Публичный список. Нужны visibility.public, действующие учётные данные и включённый require_user_verification. Новые серверы появляются в течение минуты-двух.
  3. LAN. visibility.lan рассылает объявление только по локальной сети. На хостинге это не имеет значения.

Подключение происходит не мгновенно. Клиент скачивает всё сохранение, которое на зрелой карте занимает десятки мегабайт, а затем догоняет текущий тик. Если это догоняние затягивается, подключение обрывается и повторяется. Если понизить max_upload_slots до 2 или 3 на загруженном сервере, каждое отдельное подключение пройдёт быстрее ценой очереди из остальных.

Админы, белый список и баны#

Три JSON-файла, все - простые массивы имён пользователей factorio.com, все передаются аргументами:

server-adminlist.json
["kovarex", "Rseding91"]
bash
$ ./bin/x64/factorio --start-server ./saves/world.zip \    --server-settings ./data/server-settings.json \    --server-adminlist ./data/server-adminlist.json \    --server-banlist ./data/server-banlist.json \    --server-whitelist ./data/server-whitelist.json \    --use-server-whitelist

Белый список применяется, только если указан --use-server-whitelist; один лишь файл ничего не делает. Список банов принимает либо просто имена пользователей, либо объекты с username и reason. Сервер сам записывает все три файла, когда вы пользуетесь соответствующими командами консоли, поэтому не правьте их вручную на работающем сервере, иначе ваша правка будет перезаписана при следующем /ban.

Здесь имена - это названия аккаунтов factorio.com, поэтому require_user_verification важен: при выключенной проверке любой может назваться любым именем, и список админов становится декоративным.

Команды консоли и RCON#

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

КомандаЧто делает
/playersСписок игроков, с аргументом online или count
/adminsПоказывает список админов
/promote <name>Делает игрока админом на эту сессию и в файле
/demote <name>Снимает права админа
/kick <name> <reason>Кикает
/ban <name> <reason>Банит и записывает список банов
/unban <name>Разбанивает
/banlistВыводит или редактирует список банов
/whitelist add|remove|get|clearУправляет белым списком
/mute <name>Запрещает игроку писать в чат
/server-saveСохраняет немедленно, не дожидаясь автосохранения
/config get <key>Читает действующую настройку
/config set <key> <value>Меняет одну без перезапуска
/timeСколько времени работает карта
/evolutionТекущий фактор эволюции врагов и что его двигает
/seedСид карты
/versionНомер сборки

/config стоит запомнить, потому что она меняет значения из server-settings.json на работающей игре. Ключи пишутся через дефис, а не через подчёркивания, как в JSON: allow-commands, autosave-interval, autosave-only-on-server, afk-auto-kick, game-password, ignore-player-limit-for-returning-players, max-players, max-upload-slots, max-upload-speed, non-blocking-saving, only-admins-can-pause, require-user-verification, visibility-lan, visibility-public. Так что /config set max-players 12 вступает в силу сразу, а /config get game-password подскажет, какой на самом деле пароль, когда никто не помнит.

RCON включается двумя аргументами и говорит по стандартному протоколу Source RCON поверх TCP, так что с ним работают rcon-cli, mcrcon и любой Discord-мост с поддержкой Minecraft:

bash
$ ./bin/x64/factorio --start-server ./saves/world.zip \    --server-settings ./data/server-settings.json \    --rcon-port 27015 --rcon-password "a-long-random-string"

У RCON нет ни ограничения частоты запросов, ни второго фактора, а всё, что через него отправлено, выполняется с правами админа. Никогда не выставляйте его в интернет с угадываемым паролем - в статье RCON без рисков сценарии сбоев разобраны как следует.

Сохранения, автосохранения и обновления#

Factorio пишет _autosave1.zip по _autosave5.zip в saves/, ходя по слотам по кругу. На загруженной карте само сохранение - заметный рывок для каждого игрока, и это цена надёжности.

  • Чистая остановка сохраняет. Отправка процессу сигнала прерывания или нажатие Stop на панели записывает карту перед выходом. Прежде чем считать дело сделанным, дождитесь в логе строки о сохранении.
  • Kill не сохраняет. Убийство контейнера, нехватка памяти или сбой хоста стоят вам до целого интервала автосохранения.
  • `--start-server-load-latest` - страховочная сетка. Без него перезапуск загружает файл, названный по имени, и молча игнорирует три часа автосохранений.
  • Автосохранения - не бэкапы. Они лежат на том же диске, что и сохранение, которое защищают, а по кругу слотов незамеченная порча перезаписывается в течение часа. Делайте настоящие копии в другом месте и время от времени восстанавливайте одну, чтобы убедиться, что это работает, - именно об этом статья бэкапы, которые действительно восстанавливаются.

Обновление - это ручная загрузка нового headless-пакета и распаковка поверх старого; в headless-сборке нет автообновления, а клиент и сервер должны быть строго одной версии, чтобы соединиться. На RE:NODE слоты бэкапов, входящие в каждый тариф Factorio, покрывают копию «перед обновлением», а вкладка Schedules умеет по выражению cron запускать ежедневный бэкап и еженедельный перезапуск без вашего участия.

Моды лежат в mods/ как файлы .zip с именами вида ModName_1.2.3.zip, а какие из них включены, решает mods/mod-list.json. Когда клиент заходит на сервер с модами, игра предлагает автоматически скачать и включить нужные моды, так что игрокам не приходится ставить ничего вручную, если моды есть на официальном портале. Подробности, включая то, как моды влияют на частоту обновлений, - в статье моды Factorio и UPS на сервере.

Диагностика проблем#

Сервера нет в публичном списке. Почти всегда дело в учётных данных factorio.com. Найдите в логе ошибку сервера подбора, убедитесь, что visibility.public равен true, и используйте токен из профиля, а не пароль. Сначала проверьте прямое подключение: если оно работает, с сервером всё в порядке.

«Map version is not compatible» или прямое несовпадение версий. Клиент обновился, а сервер нет. Сборка должна быть в точности одна и та же. Если у вас есть моды, обновляйте их до сервера, а не после.

Игроки отваливаются по таймауту при входе на большую карту. Увеличьте max_upload_in_kilobytes_per_second, если вы его задавали, или уменьшите max_upload_slots, чтобы канал делили меньше передач. Игрок, который уже заходил, скачивает только разницу, так что первое подключение всегда самое тяжёлое.

У всех 45 обновлений в секунду. Сервер не успевает симулировать карту. Сеть тут ничем не поможет. Этому целиком посвящена статья моды и UPS.

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

Карта сбросилась на новую. Причина - --create, оставленный в команде запуска, или команда, указывающая на несуществующий путь сохранения. Старый файл обычно так и лежит в saves/.

Команды ничего не делают. allow_commands равен admins-only, а вас нет в списке админов, либо вы вводите команду в консоли без слэша.

FAQ#

Нужно ли владеть Factorio, чтобы запустить headless-сервер?

Нет. Headless-пакет скачивается бесплатно, а лицензия серверу не нужна. Аккаунт factorio.com нужен только чтобы опубликовать сервер в публичном списке, а каждому игроку, разумеется, нужна своя копия игры.

Можно ли запустить headless-сервер из Steam-установки?

Нет. В Steam поставляется полная игра - это другая сборка, с графикой. Хостить можно и изнутри игры, но тогда карта привязана к компьютеру одного человека и встаёт на паузу, когда он уходит. Headless-пакет - отдельная и правильная загрузка.

Сколько игроков вмещает сервер Factorio?

max_players по умолчанию не ограничен, а практический потолок задаёт симуляция, а не число игроков. Двадцать человек на скромной базе - нормально. Те же двадцать на мегабазе - уже нет, потому что каждому клиенту нужно успевать за одной и той же частотой обновлений.

Где узнать пароль для входа?

/config get game-password в консоли выводит его, а game_password в server-settings.json задаёт. Смена через /config set game-password вступает в силу сразу, без перезапуска.

Почему мы потеряли пятнадцать минут после сбоя?

Карта записывается по таймеру автосохранения, а не непрерывно. Всё после последнего автосохранения существовало только в памяти. Уменьшите autosave_interval, используйте --start-server-load-latest, чтобы перезапуск брал самый новый файл, и по возможности останавливайте сервер чисто.

Нужны ли серверу те же моды, что у клиентов?

Да, в точности те же моды в точности тех же версий. Клиентских модов в Factorio нет, потому что каждый мод меняет симуляцию. Клиент сам предложит синхронизироваться со всем, что опубликовано на портале модов.


Комментарии

Полностью анонимно: без аккаунта, без почты, без cookie. Мы храним имя, которое вы ввели, текст и время - больше ничего. Количество ссылок ограничено, разметка не отображается.

0/2000