Контейнер Factorio должен быть заменяемым, а данные — лежать в одном явно заданном постоянном месте. Перед обновлением нужно точно знать, какое сохранение загружается, где находятся все моды и конфигурация и какой образ последним успешно запускал эту фабрику.
Ниже используется Linux-хост x86-64 с Docker Compose и образ сообщества factoriotools/factorio. Это не официальный образ Wube. У других образов отличаются пути, пользователи и логика запуска. Пример переносит существующую фабрику; установку Docker и создание новой карты он не рассматривает.
Запишите образ и расположение данных вместе#
Работающий контейнер ещё не определяет, какая именно фабрика в нём находится. До изменений запишите Compose-проект, ссылку на образ, каталог данных хоста, имя сохранения и версии включённых модов. Для существующего контейнера проверьте реальные монтирования, а не только Compose-файл на диске:
docker inspect factorio-factory --format '{{json .Mounts}}'
Замените factorio-factory настоящим именем контейнера. У bind mount должны быть ожидаемый исходный путь на хосте и назначение /factorio. Если прежняя установка использовала named volume, сохраните его точное имя. Подключение пустого bind-каталога содержимое старого тома не переносит.
Docker отделяет записываемый слой контейнера от постоянных монтирований. Digest точнее фиксирует содержимое образа, чем подвижный тег. Выберите проверенный релиз, совместимый с сохранением и клиентами, изучите его Dockerfile и entrypoint. Зафиксируйте версионный тег, а лучше соответствующий digest. latest и stable не закрепляют версию навсегда.
Подготовьте отдельный каталог данных#
Для выбранного образа сохраняйте целиком /factorio. В нём находятся saves, mods и config; вашей установке также могут быть нужны сценарии и script output. Копия одного ZIP-файла мира не сохраняет настройки сервера и полную конфигурацию модов.
Структура описана в документации сопровождающих образа. Выделите отдельный каталог, например /srv/factorio-factory, а не общий родительский путь с другими приложениями. Для обычного образа документированы UID/GID 845; rootless-варианты отличаются. Проверьте выбранный образ до назначения владельца и дайте запись только в данные этого сервера.
Штатно остановите процесс, который пишет исходные данные, и скопируйте их в новый каталог. Оригинал оставьте для отката. Нужное сохранение разместите в /srv/factorio-factory/saves/factory.zip, сохраните соответствующие файлы модов и их настройки, а конфигурацию сервера — в config. Ограничьте доступ к конфигурации и архивам: в них могут быть учётные данные.
Перед первым запуском проверьте, что нужный архив действительно скопирован:
test -s /srv/factorio-factory/saves/factory.zip
Успех подтверждает только наличие непустого файла. Сравните его с оригиналом и сохраните исходную копию. Важная особенность текущего entrypoint: при отсутствии сохранений он может сгенерировать новый мир даже с GENERATE_NEW_SAVE=false. Пустое монтирование или опечатку в пути выясняют до запуска.
Явно задайте монтирование и сохранение в Compose#
В .env этого проекта задайте FACTORIO_IMAGE: проверенный версионный тег либо factoriotools/factorio@sha256:… с настоящим полным digest. Заглушка digest не является рабочим значением.
Также явно задайте в .env FACTORIO_DLC_SPACE_AGE по исходному миру и скопированному mods/mod-list.json: false без модов дополнения, true для всех трёх либо список через пробел, например quality elevated-rails, если именно эта комбинация была включена раньше. Проверьте DLC-обёртку выбранного релиза: значение образа по умолчанию — true, и при запуске он может изменить включённые DLC-записи. Отсутствие настройки прежний выбор не сохраняет. Оставьте копию исходного списка и проверьте, что нужные моды дополнения в нём представлены правильно. Затем сохраните compose.yaml:
services:
factorio:
image: "${FACTORIO_IMAGE:?Set a reviewed Factorio image reference}"
restart: unless-stopped
stop_grace_period: 2m
ports:
- "34197:34197/udp"
environment:
LOAD_LATEST_SAVE: "false"
SAVE_NAME: "/factorio/saves/factory.zip"
GENERATE_NEW_SAVE: "false"
UPDATE_MODS_ON_START: "false"
DLC_SPACE_AGE: "${FACTORIO_DLC_SPACE_AGE:?Set the original expansion mod selection}"
volumes:
- type: bind
source: /srv/factorio-factory
target: /factorio
bind:
create_host_path: false
Такая форма монтирования не создаёт отсутствующий исходный каталог автоматически. SAVE_NAME содержит абсолютный путь внутри контейнера: обёртка передаёт его аргументу загрузки сохранения Factorio. Сохраните прежний выбор базовой игры или Space Age в настройках выбранного образа и списке модов; изменение хранения данных не должно заодно включать DLC. RCON здесь не публикуется.
Из каталога Compose-проекта проверьте модель, запустите сервис и прочитайте журнал:
docker compose config --quiet
docker compose up -d factorio
docker compose logs --tail=100 factorio
Сверьте фактический образ, монтирование, загруженный архив и моды. Сравните включённые DLC-записи с сохранённым исходным списком. При неожиданном изменении остановите эту копию, исправьте явную DLC-настройку и перед повтором подготовьте новую копию из сохранённого оригинала. Подключитесь совместимым клиентом и проверьте фабрику и состояние игрока. Публикация UDP-порта в Compose не настраивает firewall хоста или провайдера. Работающий контейнер ещё не доказывает успешное подключение.
Проверьте пересоздание до обновления#
Сделайте в игре узнаваемое безвредное изменение и дождитесь сохранения. Затем штатно остановите сервис:
docker compose stop -t 120 factorio
Просмотрите последние сообщения журнала. По истечении таймаута Docker может принудительно завершить процесс, поэтому само ожидание не доказывает завершённую запись. После остановки заархивируйте весь выделенный каталог за его пределами вместе с Compose-файлом и точной ссылкой на образ. Одну копию храните вне этого хоста.
Пересоздайте контейнер с тем же закреплённым образом и тем же монтированием. Проверьте, сохранилось ли игровое изменение. Только затем испытывайте новый образ на отдельной копии данных. Два процесса Factorio не должны одновременно писать в один каталог.
Восстанавливайте данные вместе с версией программы#
При неудачном обновлении сохраните проблемные данные для диагностики. Разверните копию до обновления в другом выделенном каталоге и выберите прежний образ. Новая программа могла уже преобразовать мир; простая смена образа такое преобразование не отменяет. Перед возвращением игроков проверьте загрузку восстановленной копии, вход, сохранение и повторный запуск.
При ошибке прав проверьте пользователя выбранного образа и точный исходный путь монтирования; chmod 777 проблему владения не решает. Если открылась новая фабрика, сначала проверьте источник данных и выбранный архив. Named volumes тоже переживают контейнер, но docker compose down -v может удалить объявленные тома. Постоянное хранение не заменяет резервные копии.
Если выбираете общий интерфейс управления собственной инфраструктурой, посмотрите возможности Nexardo. Для любого способа запуска всё равно нужно зафиксировать образ, владельца данных и порядок восстановления.




