Factorio headless server - это отдельная загрузка с factorio.com, а не Steam-копия игры с отключённой графикой. Он весит около 57 МБ в архиве и меньше 300 МБ после установки, ему не нужны ни графический драйвер, ни аккаунт Steam, и карта на четверых спокойно уместится в 1 ГБ памяти. Настраивается он одним JSON-файлом и горсткой аргументов командной строки. В этом руководстве есть всё: установка, создание карты, каждый ключ server-settings.json, порт, файлы админов, RCON и поведение автосохранений, от которого зависит, сколько прогресса вам стоит сбой.
Что такое Factorio headless server#
Мультиплеер в Factorio построен на детерминированной пошаговой синхронизации (lockstep). Сервер не присылает вам состояние мира: он собирает ввод всех игроков, помечает его номером тика и рассылает обратно. Каждая машина - и сервер, и клиенты - затем прогоняет одну и ту же симуляцию и приходит к одному и тому же результату. Это единственное проектное решение объясняет почти всё дальнейшее:
- Трафик на одного игрока крошечный. Вы передаёте нажатия клавиш, а не координаты объектов. Оживлённая игра на восьмерых - это несколько десятков килобайт в секунду в каждую сторону.
- Подключение обходится дорого. Новому игроку нужно отдать всю карту, прежде чем он сможет её симулировать. Это один всплеск размером с весь файл сохранения, поэтому в файле настроек есть ограничения на отдачу.
- У всех одни и те же моды одних и тех же версий, иначе никто не подключится. Клиентских модов в Factorio не существует. Мод по определению меняет симуляцию.
- Сервер должен справляться сам. Если сервер не выдаёт 60 обновлений в секунду, замедляется игра у всех. Клиенты, которые отстали слишком сильно, отключаются и должны заново скачать карту.
В headless-сборке нет ни рендерера, ни звука, ни атласа спрайтов, поэтому расход памяти у неё заметно ниже, чем у настольной игры на том же сохранении. Она не умеет делать скриншоты, не запускает редактор карт и не покажет окно настроек мода с графическим интерфейсом - практические последствия описаны в разделе про моды ниже.
Требования и расход ресурсов#
Factorio - одна из самых нетребовательных игр для хостинга, пока вдруг не перестаёт ею быть. Свежая карта на четверых - ерунда. Та же карта через триста часов, с тысячей поездов и сорока тысячами ботов, загрузит одно ядро целиком.
| Стадия | RAM | CPU | Примечания |
|---|---|---|---|
| Новая карта, 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.
$ 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. Это стоит знать, прежде чем искать файл сохранения не там.
/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. Сохранение сначала создаётся отдельной командой:
$ 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.jsonmap-gen-settings.json хранит то, что вы выбираете на экране новой игры: местность и частоту руд, размер и богатство, воду, стартовую область, настройки скал и параметры вражеских баз. map-settings.json хранит то, что меняется по ходу игры: распространение загрязнения, эволюцию и экспансию врагов, бюджеты поиска пути и рулёжку. Оба файла необязательны - без них вы получите настройки по умолчанию, - но генерацию карты можно задать только при создании, так что минуты на это потратить стоит.
Затем запустите сервер:
$ ./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_players | 0 | 0 - без ограничения. Админы заходят и на полный сервер |
visibility.public | true | Публикует сервер на официальном сервере подбора |
visibility.lan | true | Рассылает объявление в локальной сети |
username / password | - | Ваш логин на factorio.com, нужен для public |
token | - | Вместо password, берётся из профиля на factorio.com |
game_password | - | Что игроки вводят, чтобы зайти |
require_user_verification | true | Только клиенты с действующим аккаунтом factorio.com |
max_upload_in_kilobytes_per_second | 0 | 0 - без ограничения. Ограничивает передачу карты входящим игрокам |
max_upload_slots | 5 | Сколько игроков могут одновременно скачивать карту |
minimum_latency_in_ticks | 0 | Искусственный минимум задержки. Один тик - около 16 мс |
max_heartbeats_per_second | 60 | Частота сетевых тиков, минимум 6, максимум 240 |
ignore_player_limit_for_returning_players | false | Старожилы проходят сверх max_players |
allow_commands | admins-only | true, false или admins-only |
autosave_interval | 10 | Минут между автосохранениями |
autosave_slots | 5 | Автосохранения по кругу пишутся в столько файлов |
afk_autokick_interval | 0 | Минут бездействия до кика. 0 - не кикать |
auto_pause | true | Ставить игру на паузу, когда никого нет |
auto_pause_when_players_connect | false | Пауза, пока кто-то скачивает карту |
only_admins_can_pause_the_game | true | Не даёт любому ставить публичную игру на паузу |
autosave_only_on_server | true | Клиенты не пишут автосохранения сами |
non_blocking_saving | false | Форкается для сохранения без заморозки игры. Экспериментально |
Четыре ключа segment_size внизу управляют тем, на какие части делятся сетевые сообщения при изменении числа игроков. Не трогайте их, пока не отлаживаете обрывы соединений на большом публичном сервере: увеличение повышает требования к исходящему каналу сервера и может ухудшить жизнь игрокам с плохим соединением.
Четыре из этих ключей определяют, хорошо ли ведёт себя ваш сервер:
`visibility.public` вместе с `username` и `token`. Публичный сервер должен пройти аутентификацию на factorio.com. Возьмите токен на странице профиля на factorio.com и вставьте его в token, а не пароль от аккаунта. Если данные неверны, сервер всё равно запускается и работает для прямых подключений - просто пишет в лог ошибку сервера подбора и никогда не появляется в списке. Люди тратят час на правила файрвола там, где дело в опечатке в токене.
`auto_pause`. Включён по умолчанию и правилен почти для любой приватной группы: пока никого нет, игра не идёт, поэтому кусаки не эволюционируют, а загрязнение не расползается, пока вы спите. Отключайте только если хотите, чтобы завод работал без присмотра, и помните, что сервер на паузе всё равно занимает свою память.
`allow_commands`. Разумное значение по умолчанию - admins-only. Любое использование /c навсегда помечает сохранение как использовавшее команды, из-за чего у всех, кто на нём играет, отключаются достижения. /silent-command и /measured-command тоже считаются.
`autosave_interval`. Десять минут - значение по умолчанию, и это разумный компромисс. Сохранение большой карты на мгновение блокирует игру - на мегабазе это заметная заморозка, - поэтому возникает соблазн увеличить интервал. Не поддавайтесь: интервал - это ровно тот прогресс, который стоит вам аварийная остановка.
Порты, подключение и публичный список#
| Порт | Протокол | Назначение |
|---|---|---|
34197 | UDP | Игровой трафик. Единственный порт, нужный самой игре |
27015 | TCP | RCON, если включите. Подойдёт любой порт |
Factorio использует один UDP-порт и больше ничего. Отдельного порта запросов нет, поэтому её проще всего закрыть файрволом - и это же означает, что правило только для TCP молча даст сервер, который работает, но недоступен. Почему эта ошибка так распространена, объясняется в статье порты игрового сервера.
Войти можно тремя способами:
- Прямое подключение. Multiplayer, затем Connect to address, затем
203.0.113.10:34197. Работает всегда, не требует логина factorio.com на сервере и является первым, что нужно проверить. - Публичный список. Нужны
visibility.public, действующие учётные данные и включённыйrequire_user_verification. Новые серверы появляются в течение минуты-двух. - LAN.
visibility.lanрассылает объявление только по локальной сети. На хостинге это не имеет значения.
Подключение происходит не мгновенно. Клиент скачивает всё сохранение, которое на зрелой карте занимает десятки мегабайт, а затем догоняет текущий тик. Если это догоняние затягивается, подключение обрывается и повторяется. Если понизить max_upload_slots до 2 или 3 на загруженном сервере, каждое отдельное подключение пройдёт быстрее ценой очереди из остальных.
Админы, белый список и баны#
Три JSON-файла, все - простые массивы имён пользователей factorio.com, все передаются аргументами:
["kovarex", "Rseding91"]$ ./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:
$ ./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. Мы храним имя, которое вы ввели, текст и время - больше ничего. Количество ссылок ограничено, разметка не отображается.