Сервер BeamMP - это небольшая самостоятельная программа, а не копия BeamNG.drive. Она передаёт состояние машин между клиентами, раздаёт моды при подключении и запускает плагины на Lua. Ни одного колеса она не симулирует. Этот единственный факт объясняет большую часть дальнейшего: сервер дёшев по CPU и памяти, дорог по трафику, а число игроков ограничивает то, что способны симулировать компьютеры самих игроков, а не то, что вы арендуете.
Для старта нужны три вещи: бинарный файл сервера, один порт (30814 по умолчанию, и по TCP, и по UDP) и ключ авторизации из BeamMP Keymaster. Ключ не опционален, и хостер не может его вам выдать - он привязан к вашему собственному аккаунту BeamMP. Всё остальное - один ServerConfig.toml.
Что такое BeamMP и что делает сервер#
В BeamNG.drive нет официального мультиплеера. BeamMP - проект сообщества, который его добавляет: клиентский мод и лаунчер для игроков и этот сервер, где все встречаются.
Архитектуру стоит усвоить до того, как вы начнёте подбирать тариф или винить хостера за лаги:
- Каждый клиент авторитетно симулирует свою машину. Ваша физика считается на вашем компьютере.
- Чужие машины тоже симулируются локально, с поправками по обновлениям состояния, приходящим через сервер. Поэтому удалённая машина, теряющая пакеты, будет дёргаться, подпрыгивать или проезжать сквозь стену на вашем экране и выглядеть нормально у её владельца.
- Сервер не хранит физического состояния. Он авторизует игроков, следит за тем, кому принадлежит какая машина, передаёт обновления и запускает ваш Lua.
Следствия очевидны сразу. Сервер на десять игроков по четыре машины у каждого - это сорок машин, которые симулируются на каждом ПК, так что MaxCars - это настройка производительности клиента, которая по случайности задаётся на сервере. А игрок, жалующийся на «лаги сервера», обычно описывает потерю пакетов или собственный CPU, а не перегруженный хост. Правильный словарь для такого разговора - в статье задержка, джиттер и потеря пакетов.
Требования и потребление ресурсов#
По меркам игровых серверов этот крошечный. Его работа - копировать пакеты и при входе рассылать архивы модов.
| Игроки | RAM | vCPU | Примечания |
|---|---|---|---|
| До 8, без модов | 2 ГБ | 1 | С запасом. Основной случай |
| 10-16, несколько модов | 3 ГБ | 1.5 | Передача модов - единственный пик |
| 20-30, большая сборка модов | 4-6 ГБ | 2 | Реальным ограничением становится трафик |
- CPU: низкая нагрузка, в основном в один поток. Если сервер упёрся в 100% при десяти игроках, сначала посмотрите, не делает ли плагин на Lua что-нибудь глупое на каждом кадре, и только потом смотрите на тариф.
- Диск: сам сервер занимает несколько десятков мегабайт. Растёт ваша папка
Resources/Client- серьёзная сборка модов легко занимает несколько гигабайт, и каждый из этих байтов отправляется каждому входящему игроку. - Трафик: вот о чём стоит подумать. Состояние каждой машины уходит каждому клиенту, поэтому трафик растёт как число игроков, умноженное на число машин, а загрузки модов приходят всплесками, когда кто-то заходит. Ждите заметно больше исходящего трафика, чем у сервера Minecraft или Valheim с тем же числом игроков. Безлимитный не значит неограниченный; разницу объясняет статья пропускная способность и добросовестное использование.
Практический совет - ограничить MaxCars двумя-тремя для публичного сервера и повышать только для группы, о чьём железе вы знаете. Ничто другое из того, что вы настроите, не повлияет на ощущения от сервера так сильно.
Получение ключа авторизации#
Каждому серверу BeamMP нужен ключ авторизации, включая приватный. Ключ идентифицирует сервер для бэкенда BeamMP, который и авторизует входящих игроков. Без него сервер отказывается запускаться.
- Откройте BeamMP Keymaster по адресу
keymaster.beammp.comи войдите через Discord. - Создайте ключ, дайте ему имя, которое вы потом узнаете, и скопируйте строку.
- Вставьте её в
AuthKeyвServerConfig.toml.
Ключ принадлежит вашему аккаунту, а не вашему хостинг-провайдеру. Никто не может выдать его от вашего имени, и относиться к нему нужно как к паролю: один ключ на сервер, никогда не вставлять в публичный канал, перевыпустить при утечке. Те же соображения относятся к любым учётным данным на сервере - см. переменные окружения и секреты.
В RE:NODE это одна из игр, которой нужны ваши собственные учётные данные. Сервер создаётся сразу после подтверждения оплаты, а установка ждёт на вкладке Setup, пока вы вставите ключ; туда же вы приходите, если понадобится его заменить.
Установка и первый запуск#
Скачайте сборку сервера для своей платформы из проекта BeamMP, положите в отдельный каталог и запустите один раз. Рядом с собой она запишет ServerConfig.toml по умолчанию, выведет жалобу на отсутствующий ключ и завершится. Так и должно быть - впишите ключ и запустите снова.
BeamMP-ServerServerConfig.tomlResources/ Client/ Server/На хостинге с панелью бинарный файл и структура папок уже на месте; вы правите ServerConfig.toml в браузере и кладёте моды в Resources/Client по SFTP или через файловый менеджер. Данные для подключения приведены в статье SFTP и файловый менеджер, и это разумный способ загрузить сборку модов на несколько гигабайт.
Держите версию сервера актуальной. BeamMP обновляется вместе с релизами BeamNG, и сервер со старым протоколом обновлённые клиенты отклоняют - та же ловушка, что и у любой игры с модами. Общая привычка, которую стоит завести, описана в статье что делать, когда обновление мода всё ломает: знать рабочую версию, хранить копию конфига и не обновляться в вечер, когда вас ждут люди.
Состояния мира, которое можно потерять, здесь нет, поэтому резервное копирование необычно простое и необычно легко им пренебречь. Стоит хранить ServerConfig.toml, всё в Resources/Server и список того, что лежит в Resources/Client. Конфиг восстанавливается за пять минут работы; набор плагинов Lua, настраивавшийся год, - нет, как и точная комбинация версий модов, которые сейчас работают вместе. Делайте копию перед каждым изменением модов и перед каждым обновлением сервера и храните её не на сервере - лучше, чем маркированный список, это доказывает статья резервные копии, которые действительно восстанавливаются.
ServerConfig.toml построчно#
Файл - это TOML, так что строки нужно брать в кавычки, а булевы значения - нет. Синтаксическая ошибка останавливает сервер, а не игнорируется, и это любезность.
[General]Port = 30814AuthKey = "paste-your-keymaster-key-here"Name = "Sunday Night Cruise"Description = "Slow driving. No ramming. Italy."Tags = "Freeroam,Cruise,Europe"Map = "/levels/italy/info.json"MaxPlayers = 10MaxCars = 2Private = falseAllowGuests = falseLogChat = trueDebug = falseIP = "::"InformationPacket = trueResourceFolder = "Resources"| Ключ | Что делает |
|---|---|
Port | Порт, к которому подключаются игроки. Должен быть открыт и по TCP, и по UDP |
AuthKey | Ваш ключ из Keymaster. Без него сервер не запустится |
Name | Название в списке серверов. Коды форматирования поддерживаются |
Description | Две строки текста, показываемые при выборе сервера |
Tags | Категории через запятую, используемые внутриигровыми фильтрами |
Map | Путь к info.json уровня, см. ниже |
MaxPlayers | Слоты |
MaxCars | Машин на игрока. Самая важная настройка производительности |
Private | true убирает сервер из публичного списка |
AllowGuests | Могут ли заходить игроки без аккаунта BeamMP |
LogChat | Пишет чат в лог сервера. Полезно для модерации |
Debug | Подробное логирование. Оставьте выключенным, лог быстро растёт |
IP | К какому адресу привязаться. :: или 0.0.0.0 означает все |
InformationPacket | Позволяет неавторизованным клиентам запрашивать сведения о сервере |
ResourceFolder | Где лежат папки модов и плагинов |
В новых версиях сервера появляются разделы помимо [General], обычно блок [Misc] с переключателями напоминаний об обновлении вроде ImScaredOfUpdates и UpdateReminderTime и блок HTTP для необязательной встроенной веб-точки. Авторитетный источник того, что есть в вашей сборке, - файл, который создал сервер; чего он не записал, то ваша сборка, вероятно, не читает.
Карты и клиентские моды#
Значение Map - это путь внутри структуры уровней, а не понятное имя. По умолчанию это /levels/gridmap_v2/info.json, а у официальных уровней такие имена папок:
| Уровень | Папка |
|---|---|
| Gridmap v2 | gridmap_v2 |
| Small grid | smallgrid |
| East Coast USA | east_coast_usa |
| West Coast USA | west_coast_usa |
| Italy | italy |
| Utah | utah |
| Johnson Valley | johnson_valley |
| Jungle Rock Island | jungle_rock_island |
| Small Island | small_island |
| Hirochi Raceway | hirochi_raceway |
| Automation Test Track | automation_test_track |
| Driver Training | driver_training |
| Industrial Site | industrial |
| Derby Arena | derby |
Моды работают через загрузку, а не через workshop. Положите .zip мода прямо в Resources/Client, и он будет отправлен каждому игроку при входе и загружен автоматически. Для машин больше ничего не нужно. Для карты нужен zip в том же месте плюс строка Map, изменённая так, чтобы указывать на папку уровня внутри этого zip - откройте архив и посмотрите на имя папки в levels/, потому что оно редко совпадает с названием на странице загрузки.
Здесь предсказуемо ломается три вещи:
- Путь к карте неверен, поэтому сервер запускается на уровне по умолчанию или не может загрузить никакой. Прочитайте zip, не гадайте.
- Сборка модов огромна, поэтому впервые зашедшие сидят через многоминутную загрузку, и половина из них сдаётся. Держите сборку настолько малой, насколько позволяет идея сервера, и называйте размер у себя в Discord.
- Мод несовместим с текущей версией игры. Обновления BeamNG регулярно ломают моды на машины. Когда выходит патч, самая быстрая диагностика - убрать папку с модами в сторону и запуститься начисто.
Серверные плагины на Lua лежат в Resources/Server и клиентам никогда не отправляются.
Плагины на Lua#
Плагин - это папка в Resources/Server, содержащая main.lua. Сервер загружает её при запуске, а вы подписываетесь на нужные события:
local function onInit() print("Welcome plugin loaded") MP.RegisterEvent("onPlayerJoin", "greet") MP.RegisterEvent("onChatMessage", "filter")endfunction greet(playerID) local name = MP.GetPlayerName(playerID) MP.SendChatMessage(-1, name .. " joined. Rules are in the Discord.")endfunction filter(playerID, name, message) if string.find(message, "badword") then MP.SendChatMessage(playerID, "That word is not welcome here.") return 1 endendonInit()Чаще всего вам понадобятся события onInit, onPlayerAuth, onPlayerConnecting, onPlayerJoining, onPlayerJoin, onPlayerDisconnect, onChatMessage, onVehicleSpawn, onVehicleEdited и onVehicleDeleted. Возврат 1 из обработчика, который можно отменить, такого как onChatMessage или onVehicleSpawn, блокирует действие. Функции, к которым вы будете обращаться, - MP.SendChatMessage (с -1 для всех), MP.DropPlayer, MP.GetPlayerName, MP.GetPlayers, MP.GetPlayerIdentifiers и MP.CreateEventTimer для всего периодического.
Сигнатуры менялись между крупными версиями сервера, поэтому сверяйте скачанный плагин с документацией той версии, которую запускаете, а не считайте, что трёхлетний скрипт всё ещё работает. Отсюда же берутся белые списки, чёрные списки машин, правила против таранов и мосты с Discord - в BeamMP нет встроенной системы администрирования, заслуживающей такого названия, и любой хорошо управляемый сервер хорошо управляется потому, что кто-то написал или установил Lua.
Контроль доступа держится на onPlayerAuth, который срабатывает до допуска игрока и получает его идентификаторы - имя аккаунта и числовой идентификатор BeamMP, за который поручился бэкенд. Белый список - это таблица таких идентификаторов, проверяемая в этом обработчике, с MP.DropPlayer для всех, кого в ней нет. Причина ориентироваться на идентификатор, а не на отображаемое имя, очевидна: имена меняются, а идентификаторы - нет. Записывайте оба, когда кто-то нарушает правила, потому что к тому моменту, когда вы соберётесь его банить, имя на вашем скриншоте может уже никому не принадлежать.
Будьте осторожны с тем, что устанавливаете. Серверный плагин работает с правами сервера и видит каждое сообщение чата и каждое подключение, так что плагин из анонимного поста на форуме стоит прочитать, прежде чем класть его в папку, которая загружается автоматически при запуске. Тот же инстинкт применим к клиентским модам, которые вы отправляете на чужие машины; именно такой гигиене посвящена статья как держать сервер с модами в чистоте.
Храните плагины в системе контроля версий или хотя бы держите копии вне сервера. Это та часть настройки, которую нельзя скачать заново.
Порты, подключение и файрволы#
| Порт | Протокол | Назначение |
|---|---|---|
30814 | TCP | Установление соединения, передача модов |
30814 | UDP | Состояние машин |
Один номер порта, оба протокола, оба направления. Открытый только TCP даёт классический симптом: игроки подключаются, видят загрузку карты, а потом никто не двигается, потому что поток состояния не приходит. Почему игры разделяют трафик таким образом, объяснено в статье порты игровых серверов.
Игроки находят сервер в списке BeamMP в игре при Private = false или подключаются напрямую по адресу и порту. Прямое подключение работает независимо от списка, так что это правильная проверка, когда вы не уверены, сломан ли сервер или просто не попал в список. Если хотите раздавать имя вместо адреса, запись A работает нормально - подробности в статье как привязать домен к игровому серверу, а никаких хитростей с SRV для BeamMP не нужно.
Устранение неполадок#
Сервер сразу завершается при запуске. Почти всегда дело в ключе авторизации: отсутствует, опечатка или по-прежнему шаблон. Строка в логе об этом говорит, но быстро прокручивается.
Сервер работает, но его нет в списке. Проверьте Private, затем убедитесь, что машина может обращаться к бэкенду BeamMP наружу, затем подождите пару минут. Пока проверяйте прямым подключением.
Игроки подключаются, затем получают таймаут на «loading». Обычно дело в передаче модов. Большая Resources/Client на медленном канале упирается в таймаут на стороне клиента. Урежьте сборку или смиритесь с тем, что первые входы медленные.
У всех рядом друг с другом фризы. Слишком много машин. Уменьшите MaxCars, затем MaxPlayers. Помните, что симуляция идёт на их ПК, так что это клиентская нагрузка, которой вы управляете с сервера.
Один игрок не может играть, а остальные в порядке. Это его соединение или его CPU. Пусть проверит потерю пакетов до адреса сервера, прежде чем вы что-либо меняете централизованно.
Несовпадение версий при входе. Сборка сервера старее клиентского мода. Обновите сервер. Это происходит после каждого релиза BeamNG, так что планируйте это, а не удивляйтесь.
Плагин Lua ничего не делает. Проверьте, что имена функций, переданные в MP.RegisterEvent, глобальные, что main.lua лежит в собственной папке внутри Resources/Server и что в логе сервера нет синтаксической ошибки при загрузке.
FAQ#
Нужен ли BeamNG.drive, установленный на сервере?
Нет. Сервер BeamMP - самостоятельная программа, передающая состояние и раздающая моды. Игра нужна только игрокам, плюс клиентский мод BeamMP.
Может ли хостер выдать мне ключ авторизации?
Нет. Ключ приходит из BeamMP Keymaster и привязан к вашему собственному аккаунту BeamMP. Любой хостер попросит вас вставить свой, потому что законного способа создать его за вас не существует.
Сколько игроков выдерживает сервер BeamMP?
Десять - комфортное значение по умолчанию, а загруженные публичные серверы вмещают больше, но настоящий предел - производительность клиентов: каждый игрок симулирует каждую присутствующую машину. Уменьшение MaxCars поднимает практический потолок числа игроков гораздо сильнее, чем более крупный тариф.
Куда класть моды на машины и карты?
В Resources/Client в виде файлов .zip. Они отправляются игрокам при входе. Для мода на карту нужно ещё задать Map на папку уровня внутри архива, которая часто отличается от имени файла.
Поддерживает ли BeamMP пароли?
Как параметр конфига - нет. Private = true лишь убирает сервер из публичного списка. Настоящий контроль доступа - это плагин Lua, проверяющий идентификаторы игроков при авторизации.
Почему другие машины дёргаются или телепортируются?
Потому что чужие машины симулируются локально и корректируются по сетевым обновлениям. Потеря пакетов между игроком и сервером проявляется именно так, и это проблема соединения, а не нехватка мощности хоста.




Комментарии
Полностью анонимно: без аккаунта, без почты, без cookie. Мы храним имя, которое вы ввели, текст и время - больше ничего. Количество ссылок ограничено, разметка не отображается.