Установим конкретную версию Factorio, создадим фабрику без DLC и настроим запуск через systemd. Исполняемые файлы будут в /opt/factorio, а сохранения, моды и настройки — в /srv/factorio: обновление игры не должно подменять рабочую фабрику.
Нужен свежий VPS с Ubuntu 24.04 x86_64, публичным IPv4, SSH и sudo. Если Factorio уже установлен, сначала найдите его данные и сделайте резервную копию.
Сначала выберите версию#
Сверьте полный номер версии в клиентах всех игроков. На сервере нужна та же версия. Бесплатная headless-сборка для Linux включает Space Age; для мира без дополнения его компоненты отключим явно.
Выполните из обычного SSH-аккаунта:
sudo apt update
sudo apt install -y curl xz-utils python3 ufw nano
sudo useradd --system --user-group --home-dir /srv/factorio \
--shell /usr/sbin/nologin factorio
sudo install -d -o factorio -g factorio -m 750 \
/srv/factorio /srv/factorio/saves /srv/factorio/mods
read -r -p "Factorio version, for example 2.0.77: " factorio_release
curl --fail --location \
"https://factorio.com/get-download/${factorio_release}/headless/linux64" \
--output /tmp/factorio-headless.tar.xz
sudo tar --no-same-owner -xJf /tmp/factorio-headless.tar.xz -C /opt
/opt/factorio/bin/x64/factorio --version
В запросе введите выбранную версию, а не обязательно номер из примера. Проверьте вывод --version. Сохраните установочный архив и его SHA256 рядом с заметками об установке: загрузка stable при каждом старте может обновить сервер раньше клиентов.
Отделите данные фабрики от игры#
/opt/factorio; фабрика хранится в /srv/factorio, а резервная копия — за пределами VPS.Создайте конфигурацию, которую будут использовать все команды ниже:
sudo tee /srv/factorio/config.ini >/dev/null <<'EOF'
[path]
read-data=/opt/factorio/data
write-data=/srv/factorio
EOF
sudo chown factorio:factorio /srv/factorio/config.ini
sudo chmod 640 /srv/factorio/config.ini
read-data указывает на данные дистрибутива, write-data — на рабочие файлы сервера. Эти каталоги разделены в справочнике Factorio.
Отключите три компонента дополнения до создания обычной карты:
sudo tee /srv/factorio/mods/mod-list.json >/dev/null <<'EOF'
{"mods":[
{"name":"base","enabled":true},
{"name":"space-age","enabled":false},
{"name":"quality","enabled":false},
{"name":"elevated-rails","enabled":false}
]}
EOF
sudo chown factorio:factorio /srv/factorio/mods/mod-list.json
sudo -u factorio /opt/factorio/bin/x64/factorio \
--config /srv/factorio/config.ini \
--mod-directory /srv/factorio/mods \
--create /srv/factorio/saves/factory.zip
Для Space Age включите его компоненты перед генерацией мира и проверьте наличие DLC у каждого игрока. Для совместной игры оно требуется всем участникам.
Если нужны собственные настройки ресурсов, создайте карту в клиенте и перенесите ZIP в saves при остановленном сервисе. Владельцем файла должен остаться factorio:factorio. Замена ZIP на диске не переключает карту, уже загруженную в память.
Ограничьте доступ#
Скопируйте шаблон из установленной сборки и откройте настройки:
sudo install -o factorio -g factorio -m 600 \
/opt/factorio/data/server-settings.example.json \
/srv/factorio/server-settings.json
sudo nano /srv/factorio/server-settings.json
Задайте name, выставьте visibility.public и visibility.lan в false, выберите непустой game_password, оставьте require_user_verification: true. Для этого варианта оставьте username, password и token пустыми. Проверьте JSON:
sudo -u factorio python3 -m json.tool \
/srv/factorio/server-settings.json >/dev/null
В шаблоне Wube game_password отвечает за вход в игру, а password — за аккаунт. Публичный список требует авторизации аккаунта. Скрытый сервер доступен по адресу, поэтому пароль игры всё равно нужен.
Разрешите UDP-порт игры#
Стандартный порт Factorio — UDP 34197. Разрешите его и в firewall провайдера, и на Ubuntu.
Не потеряйте SSH. Замените
22на свой SSH-порт до включения UFW. Учтите остальные сервисы, не закрывайте текущую сессию и проверьте вход во второй.
sudo ufw allow 22/tcp
sudo ufw allow 34197/udp
sudo ufw enable
sudo ufw status verbose
Правило для TCP 34197 не разрешает UDP. Синтаксис UFW описан в руководстве Ubuntu.
Запустите сервис и проверьте сохранение#
Откройте /etc/systemd/system/factorio.service:
sudo nano /etc/systemd/system/factorio.service
Вставьте:
[Unit]
Description=Factorio dedicated server
Wants=network-online.target
After=network-online.target
[Service]
User=factorio
Group=factorio
WorkingDirectory=/srv/factorio
ExecStart=/opt/factorio/bin/x64/factorio --config /srv/factorio/config.ini --mod-directory /srv/factorio/mods --start-server-load-latest --server-settings /srv/factorio/server-settings.json --port 34197
Restart=on-failure
RestartSec=5
KillSignal=SIGINT
TimeoutStopSec=300
UMask=0077
NoNewPrivileges=true
[Install]
WantedBy=multi-user.target
--start-server-load-latest выбирает последнее доступное сохранение после перезапуска; параметр описан в справочнике команд. Другие карты и архивы держите вне saves, чтобы сервис не принял их за рабочую фабрику.
sudo systemctl daemon-reload
sudo systemctl enable --now factorio
sudo systemctl status factorio --no-pager
sudo journalctl -u factorio -n 80 --no-pager
sudo ss -lunp 'sport = :34197'
Проверьте загруженное сохранение в журнале и локальный UDP-сокет. Подключитесь из клиента той же версии к PUBLIC_IP:34197, поставьте узнаваемый объект и дождитесь автосохранения. Выполните sudo systemctl restart factorio, зайдите снова и найдите объект. Один открытый сокет эту проверку не заменяет.
Сделайте копию перед обновлением#
Остановите сервис штатно и проверьте завершение сохранения в журнале перед архивацией:
sudo systemctl stop factorio
sudo journalctl -u factorio -n 80 --no-pager
sudo install -d -o root -g root -m 700 /var/backups/factorio
sudo tar -czf /var/backups/factorio/factorio-backup.tar.gz -C /srv factorio
sudo chmod 600 /var/backups/factorio/factorio-backup.tar.gz
sudo systemctl start factorio
sudo install -o "$(id -un)" -g "$(id -gn)" -m 600 \
/var/backups/factorio/factorio-backup.tar.gz "$HOME/factorio-download.tar.gz"
При ошибке или таймауте остановки разберитесь с сохранением, прежде чем считать архив актуальным. Скачайте его со своего компьютера, указав SSH-логин и адрес VPS:
scp SSH_USER@VPS_IP:factorio-download.tar.gz .
ssh SSH_USER@VPS_IP 'rm "$HOME/factorio-download.tar.gz"'
Для нестандартного SSH-порта используйте -P PORT у scp и -p PORT у ssh. Архив может содержать данные аккаунта: храните копию приватно и отдельно от VPS. Рядом запишите версию исполняемого файла.
Для нескольких поддерживаемых игровых инстансов можно использовать панель для собственного VPS. Подключение машины и создание управляемых инстансов выполняются отдельно от этой ручной установки.
Если после обновления игроки не могут войти, начните с восстановления модов и сохранений, прежде чем менять рабочую фабрику.




