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

Как выбрать сохранение на headless-сервере Factorio

Найдите каталог данных Factorio, выберите явный ZIP или latest-save и проверьте, какую фабрику сервер загружает после рестарта.

Как выбрать сохранение на headless-сервере Factorio

Загрузка ZIP на VPS не переключает фабрику, уже работающую в памяти. При следующем старте Factorio выполнит аргументы службы: загрузит один указанный файл либо выберет последнее доступное сохранение. Прежде чем что-либо заменять, выясните, какой вариант настроен у вас.

Примеры продолжают установку на Ubuntu: пользователь и служба factorio, программа /opt/factorio/bin/x64/factorio, write-data=/srv/factorio. Нужны Factorio 2.x, Bash, sudo, Python 3 и работающий сервер. Если процесс запускает контейнер или панель, меняйте постоянную конфигурацию именно там: правка посторонней службы на хосте на него не повлияет.

Сначала выясните политику запуска#

В справочнике аргументов есть два разных варианта: --start-server FILE и --start-server-load-latest. Первый подходит для осознанного переключения мира. Второй — для продолжения одной фабрики, когда в каталоге сохранений экземпляра нет посторонних миров.

bash
sudo systemctl cat factorio
sudo systemctl show factorio -p User -p WorkingDirectory -p ExecStart
sudo journalctl -u factorio -n 100 --no-pager
sudo cat /srv/factorio/config.ini

Следуйте фактическим путям --config, --mod-directory и настройкам сервера. Документация каталогов указывает на write-data как на расположение пользовательских данных. У служебного пользователя оно может отличаться от данных клиента вашей SSH-учётной записи. ZIP в домашнем каталоге не поможет, если служба туда не обращается.

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

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

Просмотрите файлы, не перемещая рабочее сохранение#

bash
sudo find /srv/factorio/saves -maxdepth 1 -type f -name '*.zip' \
  -printf '%TY-%Tm-%Td %TH:%TM:%TS %s %f\n' | sort

Команда показывает даты файловой системы и размеры, а не игровое время. Передача, распаковка и touch могут изменить дату. Восстановленный ZIP не обязательно становится правильным кандидатом для автоматической загрузки только потому, что его недавно загрузили. Фактически прочитанный путь ищите в журнале запуска.

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

Для мира с другого компьютера сохраните оригинал и сверьте версию игры, содержимое дополнения и нужные моды. Проверка целостности ZIP выявит повреждение при передаче, но не докажет, что установленная игра сможет его открыть. Не исправляйте отсутствие мода пересохранением единственной фабрики без него; используйте инструкцию совместимости.

Добавьте выбранный мир под новым именем#

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

bash
sudo systemctl stop factorio
sudo systemctl show factorio -p ActiveState -p SubState -p Result
sudo journalctl -u factorio -n 100 --no-pager

Исходный ZIP должен быть уже загружен в каталог вашей SSH-учётной записи. Пример установит его как selected-world.zip; если имя занято, выберите другое новое. Выполняйте команды последовательно и остановитесь при любой ошибке:

bash
(
set -e
read -r -p "Absolute source save path: " source_save
sudo test -f "$source_save"
sudo python3 - "$source_save" <<'PYZIP'
import sys
import zipfile
with zipfile.ZipFile(sys.argv[1]) as archive:
    if archive.testzip() is not None:
        raise SystemExit('ZIP integrity check failed')
PYZIP
sudo test ! -e /srv/factorio/saves/selected-world.zip
sudo install -o factorio -g factorio -m 600 \
  "$source_save" /srv/factorio/saves/selected-world.zip
sudo -u factorio test -r /srv/factorio/saves/selected-world.zip
)

Проверка занятого имени намеренная: отдельные имена помогают отличить новый мир от прежнего. Исходный файл остаётся нетронутым. Оставьте сохранение ZIP-архивом; не распаковывайте рядом каталог с таким же именем мира.

Закрепите выбор в systemd#

Для службы из нашей инструкции создайте отдельное переопределение:

bash
sudo install -d -m 755 /etc/systemd/system/factorio.service.d
sudo nano /etc/systemd/system/factorio.service.d/selected-save.conf

Следующий вариант подходит только при совпадении проверенных путей. Дополнительные аргументы, необходимые вашему серверу, сохраните:

ini
[Service]
ExecStart=
ExecStart=/opt/factorio/bin/x64/factorio --config /srv/factorio/config.ini --mod-directory /srv/factorio/mods --start-server /srv/factorio/saves/selected-world.zip --server-settings /srv/factorio/server-settings.json --port 34197

Пустой ExecStart= сбрасывает унаследованную команду, следующая строка задаёт новую. Просмотрите остальные drop-in файлы: более позднее переопределение может изменить итоговую команду. Если служба использует другие пути, параметры или пользователя, адаптируйте пример к ним.

bash
sudo systemctl daemon-reload
sudo systemctl show factorio -p ExecStart
sudo systemctl start factorio
sudo journalctl -u factorio -n 100 --no-pager

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

Учтите следующее аварийное завершение#

Явно заданный файл делает выбор пути предсказуемым. После аварии он сам не переключится на более свежее автосохранение. Документация headless описывает запись при выходе, но принудительное завершение может помешать последней записи. Сохраняйте ротацию автосохранений и при восстановлении осознанно выбирайте подходящий файл.

Если удобнее автоматически продолжать последнее сохранение, сначала вынесите посторонние миры из saves. В этом же собственном переопределении замените --start-server /srv/factorio/saves/selected-world.zip на --start-server-load-latest, перечитайте конфигурацию systemd и проверьте итоговую команду до перезапуска. Не совмещайте оба селектора. После изменения проверьте фактически загруженный путь, не полагаясь на недокументированные правила выбора при одинаковых датах.

НаблюдениеЧто проверить перед следующей правкой
Запускается старая фабрикаИтоговый ExecStart, активную конфигурацию и путь в журнале
Permission deniedПользователя службы и право прохода по родительским каталогам
Мир читается, но моды не загружаютсяСохранённые версии модов и их настройки
Клиент не подключаетсяВыбор мира и доступность по UDP — отдельные проверки
Новый файл исчезает после перезагрузкиПостоянный volume или настройки supervisor, а не повторную загрузку

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