Factorio Руководство

Синхронизация сейвов и планет в Factorio Space Age: мультиплеер и перенос прогресса

Архитектура сохранений в дополнении Factorio Space Age: как работают мульти-поверхности планет (Vulcanus, Gleba, Fulgora, Aquilo), передача сейва на выделенный headless-сервер и устранение рассинхронизации.

Синхронизация сейвов и планет в Factorio Space Age: мультиплеер и перенос прогресса

Выход Factorio 2.0 и масштабного дополнения Space Age коренным образом изменил структуру игрового мира. Вместо одной бесконечной поверхности планеты Наувис фабрика теперь охватывает несколько уникальных планет (Nauvis, Vulcanus, Gleba, Fulgora, Aquilo) и орбитальные космические платформы, путешествующие между ними. Для администраторов выделенных серверов это нововведение потребовало пересмотра регламентов синхронизации сейвов, настройки автосохранений и управления сетевой нагрузкой.

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

Архитектура мульти-поверхностей и формат сохранений Space Age#

В Factorio 2.0 концепция параллельных миров реализована через механизм поверхностей (surfaces). Вся звёздная система генерируется и сохраняется внутри одного общего архивного файла .zip:

bash
ls -lh /opt/factorio/saves/
unzip -l /opt/factorio/saves/space_age_production.zip | head -n 15

Внутри архива сохраняются:

  • level.dat и level.dat0 — сериализованные графы сущностей, технологическое древо, данные логистических сетей и инвентари на всех планетах.
  • script-output/ — данные модов и сценариев.
  • Таблицы чанков для каждой открытой поверхности.

Поскольку фабрика на каждой открытой планете продолжает функционировать в реальном времени даже в отсутствие игроков на её поверхности, размер файла сохранения Space Age стремительно растёт. Обычный мир Nauvis занимал 15–30 МБ, тогда как многопланетная фабрика на поздних стадиях игры достигает 100–250 МБ.

Перенос одиночного сохранения Space Age на headless-сервер#

Для переноса мира с локального компьютера на выделенный Linux-сервер скопируйте архив сохранения в директорию saves/:

bash
scp space_age_production.zip user@server_ip:/opt/factorio/saves/

Файлу сохранения необходим доступ от имени сервисного пользователя factorio:

bash
sudo chown factorio:factorio /opt/factorio/saves/space_age_production.zip
sudo chmod 644 /opt/factorio/saves/space_age_production.zip

Главное условие запуска Space Age на сервере — синхронизация списка активных модов. Дополнение Space Age технически распространяется как официальный набор модов. Проверьте файл /opt/factorio/mods/mod-list.json:

json
{
  "mods": [
    { "name": "base", "enabled": true },
    { "name": "elevated-rails", "enabled": true },
    { "name": "quality", "enabled": true },
    { "name": "space-age", "enabled": true }
  ]
}

Если флаги space-age, quality или elevated-rails имеют значение false или отсутствуют, сервер откажется загружать сохранение с ошибкой несовместимости прототипов.

Настройка non-blocking saving для устранения фризов автосейва#

На больших сохранениях объёмом более 100 МБ стандартный процесс записи автосейва блокирует игровой цикл на 3–8 секунд. В мультиплеере это приводит к сообщению «Сохранение карты...» и остановке симуляции для всех подключённых игроков.

На выделенных серверах под управлением Linux в Factorio встроен механизм неблокирующего сохранения (non_blocking_saving). Он использует системный вызов ядра fork(), создавая изолированную копию процесса в памяти и выполняя сброс на диск в фоновом режиме:

Отредактируйте конфигурационный файл /opt/factorio/config/config.ini:

ini
[server]
non_blocking_saving=true

Для корректной работы этого механизма сервер должен иметь запас оперативной памяти (минимум 2–4 ГБ сверх базового потребления фабрики), чтобы ядро Linux могло обрабатывать страницы по механизму Copy-on-Write (COW).

В современной панели управления серверами мониторинг памяти и оптимизация параметров ядра Linux для неблокирующего сохранения настраиваются автоматически при развёртывании сервера.

Решение проблем с долгой загрузкой карты и рассинхроном клиентов#

Когда новый игрок подключается к серверу Space Age, сервер обязан передать ему актуальный снимок всей звёздной системы. Если размер карты велик, а скорость отдачи ограничена, клиент может отсоединиться по сетевому таймауту.

Настройте параметры сети в /opt/factorio/data/server-settings.json:

json
{
  "autosave_interval": 30,
  "autosave_slots": 5,
  "max_upload_in_kilobytes_per_second": 0,
  "minimum_latency_in_ticks": 0,
  "auto_pause": true
}
  • max_upload_in_kilobytes_per_second: 0 снимает искусственное ограничение пропускной способности при раздаче карты клиентам.
  • auto_pause: true останавливает симуляцию, когда на сервере нет игроков, предотвращая переполнение хранилищ и атаки кусак во время простоя.

Запустите службу сервера и убедитесь в успешной инициализации:

bash
sudo systemctl restart factorio
sudo journalctl -u factorio -n 50 --no-pager | grep -i "loading map"

Управление бэкапами и очистка неиспользуемых платформ#

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

Настройте автоматическое создание снапшотов мира с помощью cron:

bash
BACKUP_PATH="/opt/factorio/backups"
mkdir -p "$BACKUP_PATH"

tar -czf "$BACKUP_PATH/factorio_sa_$(date +%Y%m%d_%H%M%S).tar.gz" -C /opt/factorio saves
find "$BACKUP_PATH" -type f -name "*.tar.gz" -mtime +14 -delete

Регулярная ротация архивов гарантирует защиту фабрики от критических сбоев при сохранении межпланетного прогресса.

Источники#