Factorio: сервер не запускается — диагностика
Запускаете factorio --start-server, а вместо привычного "Hosting game" в консоли — либо тишина, либо процесс падает через долю секунды с непонятной строкой. Знакомая ситуация: headless-бинарник Factorio капризен к мелочам — библиотекам, правам, занятым портам — и без системного разбора можно час потерять на угадайку. Разберём причины по порядку, от самой частой к самой редкой, с конкретными командами для каждой.
Содержание
Читаем лог запуска: где искать причину
Первым делом — не гадать, а смотреть, что реально написал сервер перед падением. Если запускали вручную в терминале, вывод уже перед глазами, но он часто улетает за пределы буфера прокрутки. Надёжнее сразу писать консоль в файл:
./bin/x64/factorio --start-server saves/base.zip \
--server-settings data/server-settings.json \
--console-log console.log
Если сервер поднят через systemd-юнит (как в статье про автозапуск и systemd), лог смотрите через journalctl:
sudo journalctl -u factorio -n 100 --no-pager
Типичные строки и что они значат:
Error CommandLineArgs.cpp:... Data path does not exist— путь кdata/указан неверно или папка не распаковалась. Проверьте, что запускаете бинарник из корня распакованного архива, а не откуда-то ещё.Error Util.cpp:... Failed to load mod...— проблема не в самом сервере, а в моде: несовместимая версия или битый архив вmods/. Временно переименуйте папкуmodsвmods.bakи попробуйте запустить без модов — если стартует, ищите виновника среди модов по одному.Segmentation faultбез внятного сообщения Factorio — почти всегда либо несовместимость версии сейва с версией сервера, либо нехватка памяти (см. ниже про OOM).- Полная тишина, процесс просто исчезает — первый подозреваемый: убийство процесса ядром из-за нехватки RAM. Проверьте сразу после падения:
dmesg -T | grep -i "killed process"
Если видите строку про factorio рядом с Out of memory, значит, дело не в конфиге, а в ресурсах VPS — на 2 ГБ RAM (минимум для Factorio) сервер должен помещаться на старте карты, но с ростом базы, автосейвами и, тем более, тяжёлыми модами вроде Krastorio 2 или Space Exploration память может закончиться уже на этапе загрузки сейва.
Общие принципы разбора логов и краш-репортов подробнее разобраны в статье про логи и краш-репорты игровых серверов — тот же подход применим и к Factorio.
Не хватает системных библиотек
Headless-сборка Factorio — нативный Linux-бинарник, собранный под конкретный набор системных библиотек. На минимальных образах VPS (особенно "голый" Debian или Ubuntu Server без десктоп-пакетов) части этих библиотек может не быть, и тогда сервер падает сразу при запуске с ошибкой вида error while loading shared libraries.
Проверить, каких библиотек не хватает, можно через ldd:
ldd ./bin/x64/factorio | grep "not found"
Если список не пуст — доустановите нужные пакеты. Для актуальных версий headless-сборки на Debian/Ubuntu чаще всего достаточно базового набора:
sudo apt update
sudo apt install -y libc6 libstdc++6 zlib1g
На CentOS/AlmaLinux аналог:
sudo dnf install -y glibc libstdc++ zlib
Отдельно стоит проверить архитектуру: headless-сервер Factorio собирается только под x86_64. Если по ошибке арендован ARM-инстанс (бывает у дешёвых облачных тарифов) — бинарник не запустится в принципе, никакие библиотеки не помогут, единственное решение — переехать на VPS с x86_64.
Ещё одна частая причина именно "тихого" падения без внятной ошибки — не хватает свободных файловых дескрипторов или лимит ulimit слишком низкий на некоторых захостингованных контейнерных VPS. Проверить текущий лимит:
ulimit -n
Значения ниже 1024 иногда режут игровые серверы с активным сетевым обменом. Поднять лимит можно в /etc/security/limits.conf или прямо в systemd-юните строкой LimitNOFILE=65536 в секции [Service].
Поднять сервер Factorio за пару минут
Готовый образ MAATRIX GAMES: NVMe, AMD EPYC, DDoS-защита, панель управления. Локации UK, US, RU. Оплата картой РФ, СБП или криптой.
Создать серверПовреждённая установка: переустановка и проверка через SteamCMD
Если сервер ставили не с прямой закачки с factorio.com, а через SteamCMD (некоторые администраторы предпочитают этот способ, потому что тот же инструмент уже используется для десятка других игр — Rust, CS2, ARK), стоит проверить целостность файлов отдельно. Общая логика работы со SteamCMD для игровых серверов разобрана в статье про установку и обновление серверов через SteamCMD; для Factorio команда обновления с проверкой файлов выглядит так:
./steamcmd.sh +force_install_dir ~/factorio-server \
+login <ваш_steam_логин> \
+app_update 427520 validate \
+quit
Флаг validate — ключевой: он сверяет контрольные суммы всех файлов игры с манифестом Steam и перекачивает битые или недостающие. Именно так обычно лечится ситуация, когда сервер стартовал раньше, а после обрыва интернета при обновлении или внезапной перезагрузки VPS во время распаковки перестал запускаться без внятной причины — часть файлов в data/ или bin/ могла остаться недокачанной.
Если ставили официальным способом — прямой закачкой headless-архива — переустановка делается проще, без Steam-аккаунта вообще:
cd ~/factorio-server
sudo systemctl stop factorio
mv factorio factorio.old
wget https://factorio.com/get-download/stable/headless/linux64 -O factorio-headless.tar.xz
tar -xJf factorio-headless.tar.xz
cp factorio.old/saves/*.zip factorio/saves/
cp factorio.old/data/server-settings.json factorio/data/
sudo systemctl start factorio
Так вы получаете гарантированно целый архив с нуля, а сейвы и конфиг переносите вручную — они не портятся при повреждении бинарника, если сама файловая система на VPS в порядке. После переустановки полезно на всякий случай прогнать проверку диска (fsck в safe mode при следующей перезагрузке или smartctl -a /dev/sda на выделенных серверах), если повреждения файлов повторяются регулярно — это симптом проблем с диском, а не с самой игрой.
Занят порт: конфликт по UDP 34197
Отдельная категория "не запускается" — когда сам процесс Factorio стартует и даже пишет что-то в лог, но игроки не могут подключиться, либо сервер сразу падает с ошибкой биндинга сокета вроде Failed to bind... Address already in use.
Проверить, что порт 34197 (или тот, что указан флагом --port) реально свободен и слушается именно Factorio:
ss -uln | grep 34197
Если строка есть, но занята другим процессом — узнать, кем:
sudo lsof -i :34197
Частая причина конфликта — второй экземпляр сервера, который не завершился корректно после предыдущего краша и продолжает висеть, занимая порт под старым PID. Найдите и добейте его:
pkill -f "factorio --start-server"
и только после этого запускайте заново. Если конфликта процессов нет, а порт всё равно "занят" — иногда виноват сам systemd, который пытается перезапустить сервис слишком быстро после падения (параметр RestartSec в юните), и новый процесс стартует раньше, чем старый успел освободить сокет; в таком случае увеличьте RestartSec до 10-15 секунд.
Если же процесс запущен и слушает порт, а игроки жалуются, что не видят сервер — это уже не проблема запуска, а проброса порта на уровне файрвола или облачных Security Groups, и это отдельная тема, не про сам процесс запуска.
Права доступа к бинарнику и рабочей директории
Ошибка Permission denied при запуске — почти всегда одна из двух причин: либо у файла bin/x64/factorio не выставлен флаг исполняемости, либо пользователь, от которого крутится процесс (особенно если это systemd-юнит с явным User=), не имеет прав на директорию сервера.
Проверка и починка бита исполняемости:
ls -l bin/x64/factorio
chmod +x bin/x64/factorio
Если сервер запускается вручную от одного пользователя, а через systemd — от другого (частая ошибка при копировании конфигов с чужого гайда, где в примере стоит User=factorio, а реальный пользователь на VPS другой), процесс не сможет читать сейвы и писать автосейвы, даже если сам бинарник запустится. Проверьте владельца директории:
ls -la ~/factorio-server/factorio
sudo chown -R youruser:youruser ~/factorio-server/factorio
Отдельно стоит проверить права на конкретно папку saves/ — если автосейвы не могут записаться из-за прав, сервер иногда не падает сразу, а зависает на попытке сохранения и выглядит как "не отвечает", хотя формально процесс жив. Смотрите за такими зависаниями в логе — сообщение Saving finished должно появляться регулярно, если autosave_interval настроен в конфиге.
Битый сейв или конфиг server-settings.json
Если бинарник запускается и библиотеки на месте, а падение происходит именно на загрузке — проверьте сам сейв и JSON-конфиг отдельно.
Сейв Factorio — это zip-архив определённой структуры. Проверить, что архив не битый физически, можно простой распаковкой:
unzip -t saves/base.zip
Если unzip ругается на CRC-ошибку или "unexpected end of file" — сейв повреждён (частая причина — обрыв при копировании по сети или нехватка места на диске в момент автосейва) и не восстановится обычными средствами; остаётся откатываться на бэкап или предыдущий автосейв-слот из autosave_slots.
Конфиг server-settings.json — обычный JSON, и одна лишняя запятая или незакрытая скобка ломает парсинг целиком, при этом сообщение об ошибке у Factorio не всегда явно указывает на строку. Быстрая проверка синтаксиса без запуска игры:
python3 -m json.tool data/server-settings.json > /dev/null && echo "JSON valid"
Если команда ругается — она покажет строку и позицию ошибки, и почти всегда причина в ручном редактировании конфига текстовым редактором с автозаменой кавычек на "красивые" (типографские) — используйте nano или vim в терминале, а не копипаст из Word или заметок с телефона.
Поднять сервер Factorio за пару минут
Готовый образ MAATRIX GAMES: NVMe, AMD EPYC, DDoS-защита, панель управления. Локации UK, US, RU. Оплата картой РФ, СБП или криптой.
Создать серверЧастые вопросы
Сервер запускается локально, но не как systemd-сервис — в чём разница?
Обычно дело в путях: при ручном запуске вы уже находитесь в нужной директории, а systemd стартует из WorkingDirectory, указанного в юните. Если пути в ExecStart относительные или WorkingDirectory указана неверно, сервис не находит data/ или сейв. Проверьте юнит через systemctl cat factorio и сверьте все пути на абсолютность.
Помогает ли переустановка ОС на VPS, если ничего не помогает?
Как крайняя мера — да, но перед этим убедитесь, что дело не в диске: команда df -h покажет, не кончилось ли место (частая скрытая причина странных падений — автосейвы и логи забивают весь диск, и любая запись начинает падать с ошибками, похожими на баг самой игры).
Версия сервера точно совпадает с версией клиентов, а подключиться всё равно нельзя — это тоже про запуск?
Нет, если сервер в логе пишет Hosting game и висит в списке процессов — он запущен нормально, а проблема с подключением уже сетевая. См. статью про диагностику непроброшенного порта.
Можно ли держать несколько версий headless-сервера на одной VPS для разных сейвов?
Да, просто распакуйте каждую версию в отдельную папку (factorio-2.0.44, factorio-2.0.45) и указывайте нужный бинарник и свой systemd-юнит с уникальным именем для каждого сейва — конфликтов не будет, если у каждого экземпляра свой порт.
Как понять, что дело именно в нехватке RAM, а не в чём-то ещё?
Кроме dmesg | grep -i "killed process", полезно последить за потреблением памяти во время запуска в реальном времени: watch -n1 free -h в соседнем терминале, пока стартует сервер — если свободная память резко падает до нуля прямо перед падением процесса, это она.