RE:NODE

Сервер BeamMP на Linux: установка, systemd и ufw

Автор Команда RE:NODE
16 мин чтения


BeamMP-Server на Linux - это один готовый бинарник на каждый дистрибутив: не пакет и не то, что ставится через SteamCMD. Скачайте файл, подходящий вашему релизу и процессору - BeamMP-Server.ubuntu.24.04.x86_64, BeamMP-Server.debian.12.x86_64 и так далее - установите единственную нужную ему библиотеку liblua5.3-0, сделайте файл исполняемым и запустите один раз. Рядом с собой он создаст ServerConfig.toml по умолчанию и остановится, потому что ключ авторизации пуст. Вставьте ключ из BeamMP Keymaster, запустите сервер снова под отдельным пользователем через unit systemd, откройте 30814 и по TCP, и по UDP - и через минуту-две сервер появится в публичном списке. Обновление - это замена одного файла.

Вот и вся работа, на свежей машине она занимает десять минут. Остальная часть статьи - детали, от которых зависит, будет ли всё работать после следующей перезагрузки, следующего патча BeamNG и того дня, когда в настройках придётся разбираться кому-то другому. Что лежит внутри ServerConfig.toml - карты, MaxCars, моды, смысл каждого ключа - описано в руководстве по серверу BeamMP; здесь речь о Linux-стороне запуска.

Что нужно перед началом#

Сервер BeamMP - небольшая нативная программа на C++. Он не считает физику машин, а только пересылает их состояние, поэтому нагрузка на CPU и память невелика, зато исходящий трафик большой. Подойдёт любой современный VDS или VPS; важно лишь, чтобы операционная система была из числа тех, под которые проект собирает релизы.

РесурсМинимумКомфортно
RAM1 GB свободно2 GB свободно для 10-20 игроков
CPU1 ядро2 ядра, если Lua-плагины делают серьёзную работу
Диск100 MB плюс модыРазмер набора модов, умноженный на два
СетьTCP и UDP 30814Хороший исходящий канал, низкая задержка

Строка про диск - не опечатка. Бинарник сервера занимает несколько десятков мегабайт; растёт папка Resources/Client с zip-архивами модов, а копия последнего рабочего набора для отката удваивает её. Реальное ограничение - пропускная способность: каждое обновление машины уходит каждому клиенту, а каждый подключающийся скачивает весь клиентский набор модов.

Вам также понадобятся:

  • Поддерживаемый дистрибутив. На момент написания официальные релизы собираются для Debian 12, Debian 13, Ubuntu 22.04 и Ubuntu 24.04, каждый в вариантах x86_64 и arm64. Всё остальное означает сборку из исходников.
  • sudo на машине - чтобы установить библиотеку, создать пользователя и записать файл unit.
  • Ключ авторизации из BeamMP Keymaster, привязанный к вашему аккаунту BeamMP. Без него сервер не запустится. Как его получить, описано в руководстве по серверу BeamMP.

Если машина совсем новая, сделайте базовую настройку до установки любого игрового сервера: вход не под root, SSH-ключи, обновления. Обо всём этом рассказывают статьи первый час на новом VDS и SSH-ключи и защита доступа. Если вы ещё решаете, стоит ли вообще поднимать собственный Linux-сервер, честное сравнение есть в статье VDS или игровая панель: что выбрать.

Как выбрать нужный бинарник#

BeamMP публикует по одному файлу на каждый дистрибутив, релиз и архитектуру на странице релизов BeamMP-Server на GitHub. Для релизов v3.9 файлы для Linux называются так:

code
BeamMP-Server.debian.12.x86_64BeamMP-Server.debian.12.arm64BeamMP-Server.debian.13.x86_64BeamMP-Server.debian.13.arm64BeamMP-Server.ubuntu.22.04.x86_64BeamMP-Server.ubuntu.22.04.arm64BeamMP-Server.ubuntu.24.04.x86_64BeamMP-Server.ubuntu.24.04.arm64

Рядом лежат одноимённые файлы debuginfo.*. Это отладочные символы для отчётов о падениях, для запуска они не нужны. BeamMP-Server.exe - сборка для Windows.

Какой файл ваш, подскажут две команды:

bash
$ grep -E '^(ID|VERSION_ID)=' /etc/os-releaseID=ubuntuVERSION_ID="24.04"$ uname -mx86_64

ID и VERSION_ID дают дистрибутив и релиз, uname -m - архитектуру. x86_64 - обычное железо Intel и AMD. aarch64 - 64-битная ARM: облачные инстансы Ampere, Raspberry Pi 4 или 5 с 64-битной ОС; ей соответствует файл arm64.

Бинарники собираются под системные библиотеки конкретного релиза, поэтому для каждого дистрибутива свой файл, а не один на весь Linux. Несовпадающий файл обычно падает при старте с жалобой на отсутствующий или слишком старый символ GLIBC или GLIBCXX. На промежуточных релизах вроде Ubuntu 24.10 или 25.04 часто работает сборка для ближайшей старшей LTS, но никто этого не обещает; если не заработало, перейдите на поддерживаемый релиз или соберите из исходников. Fedora, Arch и Alpine - территория сборки из исходников: зависимости перечислены в README, а для ARM-сборки сначала нужно выполнить export VCPKG_FORCE_SYSTEM_BINARIES=1.

Установка зависимости и отдельного пользователя#

Релизный бинарник подключает системную библиотеку Lua 5.3, которой нет в минимальных серверных образах. В Debian и Ubuntu это один пакет:

bash
$ sudo apt update$ sudo apt install liblua5.3-0 ca-certificates curl

ca-certificates и curl нужны, чтобы скачать бинарник и чтобы сервер мог делать собственные HTTPS-запросы к бэкенду BeamMP; на большинстве образов они уже есть. Если пропустить библиотеку Lua, сервер сразу упадёт с ошибкой error while loading shared libraries: liblua5.3.so.0: cannot open shared object file. Команда ldd для бинарника выводит все нужные ему библиотеки и помечает недостающие как not found - это самый быстрый способ проверить это до того, как вы начнёте искать другие причины.

Дальше нужен пользователь, который владеет сервером и больше ничем. Сама документация BeamMP велит не запускать сервер от root, через sudo или под вашим личным аккаунтом, и причина обычная: Lua-плагины выполняются с правами сервера, поэтому вредоносный или небрежный плагин, запущенный от root, отдаёт машину целиком.

bash
$ sudo useradd --system --create-home --home-dir /opt/beammp \    --shell /usr/sbin/nologin beammp

Системная учётная запись без оболочки входа не годится для входа по SSH, а всё, что пишет сервер, оказывается в /opt/beammp. Чтобы работать в этой папке от имени пользователя, ставьте sudo -u beammp перед командами или откройте оболочку через sudo -u beammp -s /bin/bash.

Загрузка и первый запуск#

Скачайте бинарник прямо в каталог сервера. Путь GitHub latest/download всегда ведёт на новейший релиз, поэтому в команде ниже номер версии не нужен - замените только имя файла под свой дистрибутив:

bash
$ cd /opt/beammp$ sudo -u beammp curl -fL -o BeamMP-Server \    https://github.com/BeamMP/BeamMP-Server/releases/latest/download/BeamMP-Server.ubuntu.24.04.x86_64$ sudo -u beammp chmod +x BeamMP-Server$ sudo -u beammp ./BeamMP-Server --version

Файл намеренно сохраняется под простым именем BeamMP-Server, а не под длинным именем релиза. Тогда unit systemd и любой скрипт обновления указывают на один неизменный путь, а обновление сводится к замене файла, а не к правке unit.

--version выводит версию и завершается, этого достаточно, чтобы убедиться, что бинарник и его библиотеки загружаются. Остальные флаги сервера - --help, --config=/path/to/ServerConfig.toml и --working-directory=/path/to/folder. Они не понадобятся, если запускать сервер из его собственного каталога, как это делает unit ниже.

Теперь первый настоящий запуск:

bash
$ cd /opt/beammp$ sudo -u beammp ./BeamMP-Server

Сервер создаёт свои файлы, выводит стартовые строки и жалуется, что ключ авторизации не задан. Остановите его через Ctrl+C, если он не завершился сам. Теперь каталог выглядит так:

code
/opt/beammp/  BeamMP-Server  ServerConfig.toml  Server.log  Resources/    Client/    Server/

Откройте ServerConfig.toml, вставьте ключ в AuthKey, задайте Name и оставьте Port = 30814, если у вас нет причин его менять:

bash
$ sudo -u beammp nano /opt/beammp/ServerConfig.toml
ServerConfig.toml (the lines to touch first)
[General]Port = 30814AuthKey = "paste-your-keymaster-key-here"Name = "Linux test server"Private = trueMaxPlayers = 8MaxCars = 2

Пока вы тестируете, Private = true держит сервер вне публичного списка, а подключаетесь вы напрямую по адресу. Запустите ./BeamMP-Server ещё раз вручную. Нормальный запуск не завершается и не выводит строк [ERROR]; строки [WARN] стоит прочитать, но фатальны они редко. Ctrl+C просит сервер завершиться корректно - он вызывает Lua-событие onShutdown и даёт плагинам несколько секунд закончить работу, - а повторные нажатия принудительно прерывают процесс. Когда всё заработало в интерактивном режиме, передайте сервер systemd.

Файл создаёт сам бинарник, и это важно: ключи, которые записывает данная версия, - это ключи, которые она читает. Если скопировать ServerConfig.toml из старого поста на форуме в новый сервер, раздел [General] будет работать, но разделы вроде [Misc] (напоминания об обновлении) и необязательный блок HTTP зависят от версии. Если есть сомнения, дайте серверу сгенерировать новый файл и перенесите в него свои значения.

Служба systemd для BeamMP#

Сервер, запущенный в SSH-сессии, умирает вместе с сессией, а запущенный в tmux - при перезагрузке. Файл unit решает обе проблемы и отправляет вывод в журнал. Каждую директиву объясняет статья службы systemd для ваших приложений; вот версия для BeamMP:

/etc/systemd/system/beammp.service
[Unit]Description=BeamMP serverWants=network-online.targetAfter=network-online.target[Service]Type=simpleUser=beammpGroup=beammpWorkingDirectory=/opt/beammpExecStart=/opt/beammp/BeamMP-ServerKillSignal=SIGINTTimeoutStopSec=30Restart=on-failureRestartSec=10NoNewPrivileges=trueProtectSystem=fullPrivateTmp=true[Install]WantedBy=multi-user.target

Строки, характерные именно для этого сервера:

  • `WorkingDirectory=/opt/beammp`. Сервер ищет ServerConfig.toml и папку Resources относительно того места, где он запущен. Без этой строки он стартовал бы в /, не нашёл бы конфиг и попытался бы записать новый там, где у него нет прав.
  • `After=network-online.target`. При старте сервер обращается к бэкенду BeamMP, чтобы проверить ключ. Если запустить его до появления сети, при каждой загрузке будет непонятная ошибка авторизации.
  • `KillSignal=SIGINT`. Это тот же сигнал, что и Ctrl+C, - документированный путь завершения сервера. Он позволяет плагинам выполнить обработчики onShutdown. TimeoutStopSec=30 - сколько systemd ждёт, прежде чем сдаться и убить процесс.
  • `Restart=on-failure` перезапускает сервер после сбоя, но не после намеренной остановки. RestartSec=10 не даёт сломанному конфигу перезапускать сервер в тесном цикле: если ключ неверный, сервер падает, ждёт, падает снова и упирается в лимит запусков systemd, чего вы и добиваетесь.

Три строки защиты почти ничего не стоят. NoNewPrivileges не даёт ничему, что порождает сервер, получить новые привилегии, ProtectSystem=full делает для него /usr, /boot и /etc доступными только для чтения, а PrivateTmp даёт ему собственный /tmp. Сервер пишет только в свой рабочий каталог, так что ни одна из них ему не мешает.

Загрузите и запустите службу:

bash
$ sudo systemctl daemon-reload$ sudo systemctl enable --now beammp$ systemctl status beammp

enable --now запускает службу сразу и при каждой загрузке. После любой правки unit снова выполните daemon-reload перед перезапуском, иначе systemd продолжит использовать старую версию.

Один компромисс нужно знать заранее: консоль BeamMP принимает команды - list, kick <name> [reason], say <message>, status, lua, exit, - но только в интерактивном терминале. Под systemd терминал не подключён, поэтому повседневная модерация идёт через Lua-плагины или внутриигровые админ-инструменты. Если консоль нужна изредка, остановите службу и запустите бинарник вручную от пользователя beammp. Если она нужна постоянно, можно запускать сервер внутри tmux из unit, но это возвращает почти всё, от чего unit должен был избавить; большинство владельцев серверов в итоге выбирают плагин. Как делаются чат-команды, показывает статья Lua-плагины BeamMP и гонки.

Открываем порт 30814 в ufw#

BeamMP использует один номер порта по двум протоколам: TCP для установки соединения и загрузки модов, UDP для состояния машин. Если открыть только TCP, игроки подключаются, загружают карту и стоят на месте, а все остальные машины замерли, потому что поток состояния не доходит.

Если ufw ещё не включён, разрешите SSH до включения, иначе вы заблокируете сами себя:

bash
$ sudo ufw allow OpenSSH$ sudo ufw allow 30814/tcp comment 'BeamMP'$ sudo ufw allow 30814/udp comment 'BeamMP'$ sudo ufw enable$ sudo ufw status verbose

Два правила, а не ufw allow 30814 без протокола: это тоже сработало бы, но потом его проще понять неправильно. comment виден в ufw status и избавляет от гаданий, для чего открыт порт, через полгода. Если вы изменили Port в конфиге, используйте новый номер в обоих правилах. Сервер также делает исходящие HTTPS-соединения с бэкендом BeamMP для авторизации и списка серверов; политика ufw по умолчанию разрешает исходящий трафик, так что добавлять ничего не нужно, если вы её не ужесточали. Политики по умолчанию, порядок правил и ловушку с Docker подробно разбирает статья руководство по файрволу UFW.

ufw - это только файрвол на самой машине. У многих облачных провайдеров есть ещё сетевой файрвол или группа безопасности перед инстансом, и в ней нужны те же два правила. Если сервер отвечает с самой машины, но не снаружи, обычно причина в этом внешнем слое. Общую картину даёт статья порты игровых серверов простыми словами.

Чтобы убедиться, что сервер слушает оба протокола:

bash
$ sudo ss -tulpn | grep 30814

Вы должны увидеть одну строку tcp в состоянии LISTEN и одну строку udp, обе принадлежат BeamMP-Server. Если появилась только одна, сервер не слушает второй протокол, и никакое правило файрвола не поможет - проверьте настройку IP в конфиге: для всех адресов там должно быть :: или 0.0.0.0.

30814HTTPS outИгрокиBeamMP launcherufwTCP и UDP 30814beammp.serviceuser beammp/opt/beammpконфиг, ResourcesBeamMP backendавторизация, список
Как выглядит рабочая установка BeamMP на Linux

Логи: journalctl и Server.log#

Логи попадают в два места, и оба полезны.

В журнале хранится всё, что сервер выводит в консоль, с временными метками и событиями службы вроде падений и перезапусков:

bash
$ journalctl -u beammp -f$ journalctl -u beammp --since "1 hour ago"$ journalctl -u beammp -b -p warning

-f следит за выводом в реальном времени, --since сужает окно, -b ограничивает текущей загрузкой. Журнал - ещё и место, где видно, как на всё смотрит systemd: "Main process exited, code=exited, status=1/FAILURE", "Start request repeated too quickly" - этого собственный лог сервера не покажет.

Server.log в рабочем каталоге - собственный файл сервера. При каждом старте сервер переименовывает предыдущий файл в Server.old.log и начинает новый Server.log, так что у вас всегда есть текущий запуск и предыдущий, и не больше. Если сервер упал и перезапустился, следы до падения лежат в Server.old.log. Если он перезапустился дважды, следов уже нет. Это главная причина полагаться на журнал при поиске истории: он хранит все запуски и ротируется по размеру, а не по перезапускам.

LogChat = true в конфиге записывает чат в лог - это самое дешёвое доказательство для модерации. Debug = true делает лог гораздо подробнее; включайте его, чтобы найти проблему, и выключайте после, потому что лог быстро растёт.

Если журнал на небольшом VDS разрастается, ограничьте его в /etc/systemd/journald.conf параметром SystemMaxUse= и перезапустите systemd-journald. Остальной набор инструментов для чтения логов - grep, tail, less - когда вы разбираете Server.log вручную, есть в статье команды Linux для администраторов серверов.

Обновление BeamMP-Server#

Релизы BeamMP следуют за обновлениями BeamNG.drive, а клиент на более новом протоколе может отказаться подключаться к старому серверу. Обновления обычно нужны в течение нескольких дней после патча игры, то есть именно тогда, когда все хотят играть, так что процесс стоит отладить.

Обновление - это остановка, резервная копия, замена бинарника и запуск.

bash
$ sudo systemctl stop beammp$ cd /opt/beammp$ sudo -u beammp cp BeamMP-Server BeamMP-Server.previous$ sudo -u beammp cp ServerConfig.toml ServerConfig.toml.bak$ sudo -u beammp curl -fL -o BeamMP-Server \    https://github.com/BeamMP/BeamMP-Server/releases/latest/download/BeamMP-Server.ubuntu.24.04.x86_64$ sudo -u beammp chmod +x BeamMP-Server$ sudo -u beammp ./BeamMP-Server --version$ sudo systemctl start beammp$ journalctl -u beammp -f

Копия .previous - ваш откат: если новая версия ведёт себя плохо, остановите службу, верните старый бинарник на место и запустите снова. curl -f заставляет неудачную загрузку завершиться ошибкой, а не сохранить страницу ошибки GitHub как бинарник вашего сервера, а --version перед запуском ловит испорченный файл раньше, чем systemd попытается его выполнить.

Перед обновлением через мажорную версию прочитайте заметки к релизу. Сигнатуры Lua API между мажорными версиями уже менялись, и плагин, который работал на старой сборке, может молча сломаться на новой: сервер запускается, а плагин ничего не делает. В разделе [Misc] свежих конфигов есть ключи ImScaredOfUpdates и UpdateReminderTime, которые управляют напоминанием об обновлении, выводимым сервером; они управляют сообщением, а не самим обновлением. BeamMP не обновляется сам, и это хорошо: вы решаете, когда рабочий сервер меняется.

Не поддавайтесь соблазну поставить строку загрузки в cron. Автоматическое обновление, которое прилетает посреди сессии или подтягивает релиз, к которому ваши плагины не готовы, обходится дороже, чем две минуты ручного варианта. Если сервер загружен настолько, что время обновления имеет значение, объявите окно, обновитесь и проверьте прямым подключением, прежде чем открывать сервер снова. Общий подход описан в статье что делать, когда обновление мода всё ломает.

Резервные копии, которые стоит хранить

В BeamMP нет сохранения мира, поэтому резервные копии получаются маленькими, и о них легко забыть. Заново скачать нельзя ServerConfig.toml, всё содержимое Resources/Server (ваши плагины и данные, которые они хранят) и точный набор zip-модов в Resources/Client, которые сейчас работают вместе. Ночной tar каталога /opt/beammp без бинарника, скопированный за пределы машины, покрывает всё это. Почему копия за пределами машины обязательна, объясняет статья резервные копии, из которых действительно можно восстановиться.

Диагностика проблем на Linux#

`error while loading shared libraries: liblua5.3.so.0`. Не хватает библиотеки времени выполнения. Выполните sudo apt install liblua5.3-0 и попробуйте снова. В дистрибутиве не на основе Debian установите Lua 5.3 из его пакетов или соберите из исходников.

Ошибки `version 'GLIBC_2.xx' not found` или `GLIBCXX`. Вы скачали бинарник для более нового дистрибутива, чем тот, что у вас установлен. Проверьте /etc/os-release и возьмите подходящий файл.

`Exec format error`. Несовпадение архитектуры: бинарник arm64 на x86_64 или наоборот. Проверьте uname -m.

`Permission denied` при запуске. Файл не исполняемый, либо каталог принадлежит не тому пользователю, который его запускает. Выполните chmod +x BeamMP-Server и sudo chown -R beammp:beammp /opt/beammp.

Служба падает с "Start request repeated too quickly". Сервер завершается при каждом запуске, и systemd перестал пытаться. Настоящая причина - на несколько строк выше в journalctl -u beammp, почти всегда это ключ авторизации или синтаксическая ошибка TOML. Исправьте её, затем выполните sudo systemctl reset-failed beammp и запустите снова.

Сервер запускается вручную, но не как служба. Обычно WorkingDirectory отсутствует или указан неверно, и служба не находит конфиг, либо файлы были созданы от root при ручном запуске, и пользователь beammp не может в них писать. ls -l /opt/beammp покажет, что именно; второе исправляется через chown.

Сервер работает, но игроки не могут зайти. Проверьте ss -tulpn для обоих протоколов, затем ufw status, затем файрвол провайдера. Проверьте прямым подключением снаружи, прежде чем подозревать список серверов.

Address already in use. Порт 30814 занят чем-то другим - часто копией, которую вы запустили вручную в другом терминале и забыли. ss -tulpn | grep 30814 назовёт процесс.

Сервер завершён без ошибки. На небольшом VDS это часто OOM killer ядра, обычно из-за чего-то другого на машине. Подтвердить можно командой journalctl -k | grep -i oom. Что с этим делать, объясняет статья swap в Linux и OOM killer.

Запуск на RE:NODE#

Всё сказанное выше подходит для любой Linux-машины, которую вы контролируете, в том числе для линейки VDS на i9-9900K: её готовят вручную в течение 24 часов, и она подойдёт, если вы хотите держать BeamMP рядом с другими собственными сервисами.

Если вам нужен только сервер BeamMP, линейка игровых серверов BeamMP берёт Linux-часть на себя: сервер создаётся после подтверждения оплаты, порт выделяется по обоим протоколам, ServerConfig.toml правится в файловом менеджере в браузере, а наборы модов загружаются по SFTP. Это одна из игр, которым нужны ваши собственные учётные данные, поэтому установка ждёт на вкладке Setup, пока вы не вставите ключ Keymaster. При достижении лимита памяти контейнер останавливается и запускается заново с чистого состояния, а не уходит в swap, а сервер, который падает снова и снова, вызывает предупреждение и тикет. По сравнению с VDS вы теряете root-доступ и выбор дистрибутива, а для BeamMP это редко имеет значение.

FAQ#

Какой файл BeamMP-Server скачать для Ubuntu 24.04?

BeamMP-Server.ubuntu.24.04.x86_64 на обычном железе Intel или AMD или BeamMP-Server.ubuntu.24.04.arm64 на ARM. Какой именно, подскажет uname -m; aarch64 означает файл arm64.

Работает ли BeamMP на Linux без Wine?

Да. BeamMP-Server - нативная программа для Linux с официальными сборками для Debian и Ubuntu. BeamNG.drive нужен только игрокам, сам сервер его никогда не запускает.

Почему сервер завершается сразу после первого запуска?

Потому что он только что записал ServerConfig.toml по умолчанию с пустым AuthKey. Добавьте ключ из Keymaster и запустите снова. Если он всё равно завершается, строка в логе скажет, дело в ключе или в синтаксисе TOML.

Можно ли запустить несколько серверов BeamMP на одной машине?

Да. Дайте каждому свой каталог, свой Port в конфиге, свой ключ авторизации, свой файл unit и свою пару правил файрвола. Структуру описывает статья несколько игровых серверов на одном VDS.

Что использовать для админ-команд: консоль или Lua?

Под systemd консоль ни к чему не подключена, поэтому на практике кики, баны и объявления делают Lua-плагины. Консоль оставьте для проверок вручную.

Обновляется ли BeamMP-Server сам?

Нет. Он может напомнить, что есть более новая версия, но заменить бинарник - ваша задача. Это остановка, загрузка и запуск, и делать это стоит вручную.