RAGE MP Server не запускается, закрывается сразу после открытия консоли или выдаёт ошибки JavaScript, C#, базы данных и пакетов? Причина может находиться в повреждённых серверных файлах, неправильном conf.json, отсутствующих зависимостях, несовместимом C# Bridge, занятом порте или ошибке игрового режима.
Иногда сервер успешно работает локально, но игроки не могут подключиться извне. В таком случае необходимо отдельно проверить адрес привязки, брандмауэр, перенаправление портов, внешний IP, CGNAT и HTTP-порт для загрузки клиентских ресурсов.
В этой инструкции разберём запуск RAGE Multiplayer Server на Windows и Linux, настройку конфигурации, ошибки JavaScript и C#, подключение MySQL, загрузку client_packages, открытие портов и диагностику подключения игроков.
Основные ошибки RAGE MP Server
| Ошибка | Как проявляется | Что проверять |
|---|---|---|
| Сервер сразу закрывается | Консоль появляется на секунду и исчезает. | Запуск через терминал, конфигурацию, пакеты и библиотеки. |
| Cannot find module | JavaScript не может загрузить файл или зависимость. | Путь, регистр символов, node_modules и рабочий каталог. |
| SyntaxError | Загрузка пакета останавливается на определённой строке. | Синтаксис JavaScript, JSON, кавычки и скобки. |
| Address already in use | Сервер не может занять игровой или HTTP-порт. | Другой процесс или второй экземпляр сервера. |
| Игроки не подключаются | Локально сервер работает, но извне возникает таймаут. | Firewall, NAT, CGNAT, bind и внешний IP. |
| Ресурсы не скачиваются | Клиент зависает на Downloading Resources. | HTTP-порт, FastDL, client_packages и права чтения. |
| Connection refused к базе | Не удаётся открыть соединение с MySQL или другой СУБД. | Адрес, порт, службу базы и сетевые правила. |
| Access denied | База отклоняет имя пользователя или пароль. | Учётную запись, разрешённый хост и права. |
| C# assembly load error | Не загружается DLL игрового режима. | Bridge, Bootstrapper, .NET и зависимости. |
| Сервер не отображается в списке | Прямое подключение по IP работает. | announce, исходящий доступ и стабильность процесса. |
Создайте резервную копию сервера
Перед изменениями сохраните:
conf.json;packages;client_packages;mapsиplugins;- C#-ресурсы и исходный код;
package.jsonи lock-файл;- конфигурацию и дамп базы данных;
- переменные окружения;
- FastDL-файлы;
- журналы последних запусков;
- конфигурацию systemd, Docker или панели управления.
Резервную копию лучше хранить на другом диске или удалённом хранилище. Архив на том же повреждённом накопителе не защитит данные.
Не публикуйте секреты
Перед отправкой конфигурации или журнала удалите пароли базы данных, API-ключи, токены, секреты авторизации и персональные данные игроков.
Структура серверных файлов
server-files\
├── client_packages\
├── packages\
├── maps\
├── plugins\
├── bridge\
├── conf.json
└── ragemp-server.exe
| Каталог | Назначение |
|---|---|
packages |
Серверные JavaScript-ресурсы. |
client_packages |
Клиентские скрипты, интерфейсы и файлы для игроков. |
maps |
Карты и объекты игрового мира. |
plugins |
Дополнительные серверные библиотеки. |
bridge |
Среда выполнения серверных C#-ресурсов. |
conf.json |
Главная конфигурация сервера. |
Не помещайте серверную логику, SQL-запросы, пароли и API-ключи в client_packages. Содержимое этой папки загружается на компьютеры игроков.
Проверьте чистый запуск
Чтобы отделить ошибку сервера от ошибки игрового режима:
- Остановите процесс.
- Создайте резервную копию.
- Переименуйте
packagesвpackages_backup. - Переименуйте
client_packagesвclient_packages_backup. - Уберите сторонние плагины.
- Создайте минимальный
conf.json. - Запустите сервер из терминала.
| Результат | Вывод |
|---|---|
| Чистый сервер запускается | Ошибка находится в пакете, плагине, зависимости или конфигурации. |
| Чистый сервер не запускается | Проверяйте исполняемые файлы, систему и порты. |
| Работает без C# | Проблема в Bridge, Bootstrapper, DLL или .NET. |
| Работает без JavaScript | Ошибка в пакете Node.js или npm-зависимости. |
| Локально работает, извне нет | Проверяйте сеть, NAT и firewall. |
Запуск RAGE MP Server на Windows
При диагностике не открывайте сервер двойным нажатием. Запустите его из командной строки, чтобы сообщение об ошибке осталось на экране.
- Откройте папку серверных файлов.
- Нажмите в адресной строке Проводника.
- Введите
cmd. - Нажмите Enter.
- Выполните:
ragemp-server.exe
В PowerShell:
.\ragemp-server.exe
BAT-файл для запуска
@echo off
cd /d "%~dp0"
ragemp-server.exe
echo.
echo Сервер завершил работу. Код: %errorlevel%
pause
Файл запускает процесс из правильного рабочего каталога и оставляет консоль открытой после завершения.
Запуск RAGE MP Server на Linux
Перейдите в каталог сервера:
cd /opt/ragemp-srv
Разрешите выполнение файла:
chmod +x ragemp-server
Запустите сервер:
./ragemp-server
Для сохранения вывода:
./ragemp-server > server-start.log 2>&1
Для постоянной работы используйте отдельного системного пользователя и службу systemd. Не запускайте публичный сервер от имени root.
Permission denied
Проверьте флаг выполнения, владельца файлов, права на каталоги и отсутствие параметра noexec у раздела.
GLIBCXX not found
version `GLIBCXX_x.x.xx' not found
Ошибка связана с устаревшей или несовместимой библиотекой C++. Обновите libstdc++ средствами используемого дистрибутива.
Как читать журнал сервера
Ищите первую ошибку, после которой появилась цепочка последующих сообщений. Последняя строка часто показывает только результат сбоя.
Обратите внимание на:
- имя ресурса;
- путь к файлу;
- номер строки;
- название отсутствующего модуля;
- стек вызовов;
- код ошибки базы данных;
- порт и bind;
- название DLL;
- последнее успешно выполненное действие.
[INFO] Loading packages...
[ERROR] Cannot find module './database'
Require stack:
- packages/gamemode/index.js
[ERROR] Resource gamemode failed to load
В этом примере основная проблема — отсутствующий файл или неправильный путь ./database.
Разделяйте журналы
Для рабочего проекта полезно отдельно записывать запуск, ошибки игрового режима, подключения игроков, SQL-ошибки, административные действия и необработанные исключения.
Ошибки файла conf.json
conf.json должен содержать корректный JSON. В нём нельзя использовать комментарии, одинарные кавычки и лишние запятые.
Неправильно
{
"name": "My Server",
"port": 22005,
"announce": false,
}
Правильно
{
"name": "My Server",
"port": 22005,
"announce": false
}
Частые ошибки:
- пропущена запятая;
- лишняя запятая в конце;
- использованы фигурные кавычки;
- ключ не заключён в двойные кавычки;
trueилиfalseзаписаны как текст;- добавлен комментарий через
//; - не закрыта скобка;
- файл сохранён как
conf.json.txt.
Минимальная конфигурация
{
"announce": false,
"bind": "0.0.0.0",
"gamemode": "freeroam",
"name": "My RAGE MP Server",
"maxplayers": 100,
"port": 22005,
"stream-distance": 500.0
}
Сначала проверьте минимальную конфигурацию, а затем возвращайте дополнительные параметры по одному.
Неправильный параметр bind
bind определяет локальный адрес, на котором сервер принимает соединения.
Для доступных сетевых интерфейсов обычно используется:
"bind": "0.0.0.0"
Для локальной проверки только на текущем компьютере:
"bind": "127.0.0.1"
Не указывайте внешний IP провайдера в bind, если он не назначен сетевому интерфейсу операционной системы.
Ошибка Address already in use
Порт уже используется другим процессом или вторым экземпляром сервера.
Windows
netstat -ano | findstr :22005
Посмотреть процесс по PID:
tasklist /FI "PID eq 1234"
Linux
ss -lntup | grep 22005
или:
lsof -i :22005
Не завершайте неизвестный системный процесс. Определите его назначение или выберите другой порт для RAGE MP Server.
Сервер отсутствует в общем списке
Проверьте:
- включён ли
announce; - доступен ли сервер извне;
- открыты ли порты;
- разрешено ли исходящее соединение;
- не завершается ли процесс после запуска;
- работает ли прямое подключение по IP.
"announce": true
Сначала добейтесь стабильной работы по прямому адресу. Master list не исправляет закрытые порты и ошибки игрового режима.
Ошибки серверных пакетов JavaScript
Серверные JavaScript-ресурсы находятся в:
server-files\packages\
Пример структуры:
packages\
└── gamemode\
├── index.js
├── commands.js
├── events.js
├── database.js
└── modules\
Входной файл должен подключить остальные модули:
'use strict';
require('./commands');
require('./events');
require('./database');
console.log('[gamemode] Пакет загружен');
Файл, который не подключён из index.js или другого активного модуля, автоматически не выполнится.
Ошибка Cannot find module
Error: Cannot find module './database'
Проверьте:
- существует ли файл;
- правильно ли указан относительный путь;
- совпадает ли регистр букв;
- не переименован ли каталог;
- установлена ли npm-зависимость;
- выполнялся ли npm в правильной папке.
require('./database');
require('./modules/auth');
require('../shared/config');
Работает на Windows, но не работает на Linux
Linux различает регистр символов. Путь ./Database не найдёт файл database.js.
SyntaxError и Unexpected token
SyntaxError: Unexpected token ')'
at packages/gamemode/events.js:148
Проверьте указанную строку и несколько строк перед ней. Причиной может быть незакрытая скобка, строка, шаблонный литерал, лишняя запятая или случайно вставленный HTML.
Для отдельного файла можно выполнить:
node --check packages/gamemode/events.js
Команда проверяет базовый синтаксис, не запуская игровой режим.
Конфликт CommonJS и ES Modules
CommonJS:
const config = require('./config');
module.exports = config;
ES Modules:
import config from './config.js';
export default config;
Ошибки возникают, когда в одном проекте смешиваются оба формата или в package.json неожиданно добавляется:
{
"type": "module"
}
Ошибка require is not defined означает, что файл обрабатывается как ES Module. Ошибка Cannot use import statement outside a module означает, что файл выполняется как CommonJS.
Используйте единый формат модулей во всём серверном проекте.
Ошибки npm и node_modules
Если игровой режим использует сторонние библиотеки, рядом с проектом обычно находятся:
package.json
package-lock.json
node_modules\
Перейдите в каталог с package.json и выполните:
npm install
Для восстановления точных версий из lock-файла:
npm ci
Не устанавливайте зависимости в случайном каталоге. Сервер должен находить node_modules относительно используемого проекта.
Перенос с Windows на Linux
Не копируйте старые нативные модули без переустановки. Удалите node_modules и выполните установку зависимостей на целевой системе.
После обновления библиотеки появились ошибки
Верните рабочий package-lock.json и установите прежние версии. Обновление всех зависимостей может изменить API, формат модулей и требования к Node.js.
Не работают события и команды JavaScript
Убедитесь, что файл обработчиков подключается:
// packages/gamemode/index.js
require('./events');
require('./commands');
Добавьте контрольные сообщения:
console.log('[events] Начало загрузки');
mp.events.add('playerJoin', (player) => {
console.log(`[events] playerJoin: ${player.name}`);
});
console.log('[events] Обработчики зарегистрированы');
| Результат | Причина |
|---|---|
| Нет первого сообщения | Файл не подключён или неверно указан путь. |
| Есть первое, но нет второго | Ошибка во время регистрации обработчика. |
| Оба сообщения есть, но playerJoin отсутствует | Игрок не дошёл до сервера или используется другое событие. |
| playerJoin есть, но логика не работает | Проверяйте код внутри обработчика. |
Асинхронные ошибки
async function loadAccount(player) {
try {
const account = await findAccount(player.name);
if (!account) {
console.warn(`[account] Не найден: ${player.name}`);
return;
}
console.log(`[account] Загружен: ${player.name}`);
} catch (error) {
console.error('[account] Ошибка загрузки:', error);
}
}
Не используйте пустой catch. Он скрывает причину ошибки и усложняет поиск несохранённых данных.
Как найти проблемный пакет
- Отключите необязательные ресурсы.
- Запустите сервер с базовым пакетом.
- Возвращайте остальные ресурсы небольшими группами.
- После появления ошибки разделите последнюю группу.
- Продолжайте до обнаружения конкретного файла.
Ошибки серверных пакетов C#
C#-ресурсы работают через Bridge и связанную среду выполнения. DLL может не загрузиться из-за несовместимой версии Bootstrapper, .NET или отсутствующей зависимости.
Проверьте:
- включён ли C# в конфигурации;
- присутствует ли каталог
bridge; - не повреждены ли его файлы;
- совпадает ли версия
Bootstrapper.dll; - подходит ли целевая версия .NET;
- скопированы ли зависимости ресурса;
- совпадает ли архитектура;
- не заблокировала ли DLL защита Windows.
{
"csharp": true
}
На JavaScript-сервере без C#-ресурсов этот параметр лучше не включать.
Несовместимый Bootstrapper
Типичные сообщения:
TargetParameterCountException
Parameter count mismatch
Could not load type
Unable to load one or more requested types
Порядок исправления:
- Остановите сервер.
- Обновите серверные файлы одной совместимой сборкой.
- Возьмите Bootstrapper из текущего
bridge\runtime. - Обновите ссылку в C#-проекте.
- Очистите
binиobj. - Пересоберите проект.
- Не возвращайте старый Bridge поверх новой версии.
Ошибка версии .NET
Возможные сообщения:
TypeLoadException;FileLoadException;FileNotFoundException;Could not load assembly;Framework not found.
Игровой режим должен собираться под версию .NET, совместимую с текущим Bridge.
dotnet clean
dotnet build -c Release
Could not load file or assembly
Проверьте наличие библиотеки, её версию, копирование в выходной каталог, архитектуру и нативные зависимости операционной системы.
Если проект работает только на компьютере разработчика, разверните его в пустой тестовой папке. Так обнаружатся DLL, которые случайно брались из старого каталога.
C#-события не вызываются
public class Main : Script
{
public Main()
{
NAPI.Util.ConsoleOutput("[C#] Конструктор запущен");
}
[ServerEvent(Event.ResourceStart)]
public void OnResourceStart()
{
NAPI.Util.ConsoleOutput("[C#] Ресурс запущен");
}
}
Если нет сообщения конструктора, сборка не загружена. Если конструктор работает, но событие не вызывается, проверяйте атрибут, Bootstrapper и исключения регистрации.
RAGE MP Server не подключается к базе данных
Сначала проверьте подключение к СУБД отдельно от игрового режима. Используйте те же данные в официальном клиенте базы или консольной утилите.
Проверьте:
- запущена ли служба MySQL или MariaDB;
- правильно ли указан host;
- правильно ли указан порт;
- существуют ли пользователь и база;
- верен ли пароль;
- разрешено ли подключение с адреса сервера;
- открыт ли порт базы;
- установлен ли драйвер Node.js или .NET;
- применены ли миграции.
Пример подключения MySQL
const mysql = require('mysql');
const connection = mysql.createConnection({
host: process.env.DB_HOST || '127.0.0.1',
port: Number(process.env.DB_PORT || 3306),
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME,
charset: 'utf8mb4'
});
ECONNREFUSED
Соединение не принимается по указанному адресу и порту.
Проверьте:
- работает ли служба базы;
- слушает ли она нужный интерфейс;
- правильно ли указан порт;
- не используется ли localhost внутри другого контейнера;
- разрешён ли трафик firewall;
- доступна ли база по сети.
Если база находится на другом VPS, 127.0.0.1 указывает на сам игровой сервер, а не на удалённую СУБД.
Проверка Windows:
Test-NetConnection DB_HOST -Port 3306
Проверка Linux:
nc -vz DB_HOST 3306
Access denied for user
Проверьте имя пользователя, пароль, разрешённый host и права на выбранную базу.
'game'@'localhost'
и:
'game'@'10.0.0.%'
могут рассматриваться MySQL как разные учётные записи.
Не выдавайте игровому серверу административные права на всю СУБД. Создайте отдельного пользователя с доступом только к необходимой базе.
Connection timeout и Lost connection
Причины:
- недоступный сервер базы;
- сетевой разрыв;
- перегрузка СУБД;
- медленный запрос;
- закрытие неактивного соединения;
- исчерпание пула;
- перезапуск базы.
Не увеличивайте таймаут бесконечно. Сначала определите, зависает подключение или конкретный SQL-запрос.
const startedAt = Date.now();
connection.query('SELECT 1', (error) => {
const duration = Date.now() - startedAt;
if (error) {
console.error(`[db] Ошибка после ${duration} ms`, error);
return;
}
console.log(`[db] Проверка завершена за ${duration} ms`);
});
Too many connections
Ошибка возникает, если соединения создаются для каждого запроса, не закрываются или несколько пакетов создают отдельные пулы.
const pool = mysql.createPool({
connectionLimit: 10,
host: process.env.DB_HOST,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME
});
Не увеличивайте лимит до огромного значения без проверки утечек соединений и памяти.
Table doesn't exist и Unknown column
Сервер подключился к базе, но её структура не соответствует коду. Проверьте выбранную схему, миграции, версию сборки, регистр названий таблиц и полноту импорта дампа.
Перед изменением структуры создайте резервную копию. Случайные ALTER TABLE могут временно убрать ошибку, но повредить данные позже.
Инициализация базы при запуске
async function startApplication() {
try {
await connectDatabase();
await runMigrations();
registerEvents();
console.log('[server] Инициализация завершена');
} catch (error) {
console.error('[server] Ошибка запуска:', error);
process.exitCode = 1;
}
}
startApplication();
Не принимайте игроков до готовности базы и завершения обязательных миграций.
Ошибки client_packages
Клиентские ресурсы находятся в:
server-files\client_packages\
Пример структуры:
client_packages\
├── index.js
└── gamemode\
├── index.js
├── events.js
├── ui\
│ ├── index.html
│ ├── app.js
│ └── style.css
└── assets\
Корневой файл подключает игровой режим:
require('./gamemode/index');
Клиентский файл не выполняется
mp.gui.chat.push('[client] Пакет загружен');
Если сообщения нет:
- файл не подключён;
- неправильно указан путь;
- у игрока старый кэш;
- ресурсы не загрузились;
- в JavaScript есть синтаксическая ошибка;
- HTTP-порт недоступен.
CEF и http://package/
const browser = mp.browsers.new(
'http://package/gamemode/ui/index.html'
);
Проверьте регистр символов, расположение HTML-файла и отсутствие локальных путей разработчика.
Интерфейс может работать у разработчика, но не у игроков, если CSS, шрифты или JavaScript загружаются с localhost либо с локального диска.
Downloading Resources
Если игроки зависают при загрузке:
- проверьте HTTP-порт;
- убедитесь, что он не занят другим процессом;
- проверьте права чтения client_packages;
- проверьте свободное место;
- временно отключите FastDL;
- найдите файл, на котором останавливается загрузка;
- проверьте доступ из другой сети.
Если игровой порт работает, но файлы не загружаются, чаще всего недоступен HTTP-порт или неправильно настроен FastDL.
Ошибки FastDL
Проверьте полный URL, HTTPS-сертификат, структуру каталогов, доступ без авторизации, перенаправления и актуальность файлов.
После обновления сервера очистите CDN-кэш. Старый снимок FastDL может продолжить раздавать несовместимые пакеты.
Оптимизация ресурсов
Не добавляйте в client_packages резервные архивы, дампы базы, логи, исходники изображений, серверный node_modules и старые версии интерфейса.
Какие порты использует RAGE MP Server
При стандартной настройке:
"port": 22005
проверяйте:
22005/TCP— игровой сервер;22005/UDP— игровой трафик;22006/TCP— HTTP-загрузка клиентских ресурсов.
Если игровой порт изменён на 23000, HTTP-порт обычно будет следующим:
23000/TCP
23000/UDP
23001/TCP
Windows Firewall
New-NetFirewallRule `
-DisplayName "RAGE MP Game TCP" `
-Direction Inbound `
-Protocol TCP `
-LocalPort 22005 `
-Action Allow
New-NetFirewallRule `
-DisplayName "RAGE MP Game UDP" `
-Direction Inbound `
-Protocol UDP `
-LocalPort 22005 `
-Action Allow
New-NetFirewallRule `
-DisplayName "RAGE MP Packages HTTP" `
-Direction Inbound `
-Protocol TCP `
-LocalPort 22006 `
-Action Allow
Проверьте, что правила применяются к активному профилю сети. Сторонний антивирус может использовать собственный сетевой экран.
UFW на Linux
sudo ufw allow 22005/tcp
sudo ufw allow 22005/udp
sudo ufw allow 22006/tcp
sudo ufw status
firewalld
sudo firewall-cmd --permanent --add-port=22005/tcp
sudo firewall-cmd --permanent --add-port=22005/udp
sudo firewall-cmd --permanent --add-port=22006/tcp
sudo firewall-cmd --reload
На облачном VPS также проверьте security group, сетевой ACL и firewall панели хостинга.
Игроки не подключаются к домашнему серверу
Настройте перенаправление портов на локальный IP компьютера:
| Внешний порт | Локальный адрес | Внутренний порт | Протокол |
|---|---|---|---|
| 22005 | 192.168.1.100 | 22005 | TCP |
| 22005 | 192.168.1.100 | 22005 | UDP |
| 22006 | 192.168.1.100 | 22006 | TCP |
Закрепите локальный IP через резервирование DHCP. Если адрес компьютера изменится, правила роутера будут направлять трафик на другое устройство.
Проверка внешнего адреса
Проверяйте сервер через мобильный интернет или другую внешнюю сеть. Не каждый роутер поддерживает подключение к собственному внешнему IP из локальной сети.
CGNAT и отсутствие публичного IP
Если WAN-адрес роутера отличается от внешнего IP, провайдер может использовать CGNAT.
Признаки:
- port forwarding настроен, но сервер недоступен;
- WAN-адрес относится к частному диапазону;
- несколько абонентов используют один внешний IP;
- сервер работает только в локальной сети.
Решения:
- заказать публичный IPv4;
- арендовать VPS;
- использовать игровой хостинг;
- настроить туннель с публичным входом;
- уточнить условия у провайдера.
Смена DNS не устраняет CGNAT.
Как проверить доступность портов
Windows
netstat -ano | findstr :22005
netstat -ano | findstr :22006
Linux
ss -lntup | grep -E '22005|22006'
Проверка HTTP-порта с другого компьютера
Test-NetConnection SERVER_IP -Port 22006
или:
nc -vz SERVER_IP 22006
UDP нельзя надёжно проверить обычной TCP-проверкой. Лучший тест — реальное подключение клиента из другой сети.
Порт открыт, но игрок не входит
Проверяйте версию клиента, лимит игроков, авторизацию, бан IP, ошибки базы, клиентские ресурсы и серверные таймауты.
Игрок подключается и сразу отключается
Записывайте этапы подключения:
- сетевое соединение;
playerJoin;- проверку аккаунта;
- загрузку персонажа;
- отправку клиентских событий;
- появление в игровом мире;
- причину отключения.
mp.events.add('playerJoin', (player) => {
console.log(`[join] ${player.name}`);
});
mp.events.add('playerQuit', (player, exitType, reason) => {
console.log(
`[quit] ${player.name}; type=${exitType}; reason=${reason}`
);
});
Ограничьте доступ к журналам и не храните персональные данные дольше необходимого.
Игрок зависает на авторизации
Проверьте ответ базы, обработку отсутствующего аккаунта, внешний API, создание сессии, CEF и клиентское событие открытия интерфейса.
console.time(`[auth] ${player.name}`);
try {
await loadPlayerAccount(player);
await loadCharacter(player);
console.timeEnd(`[auth] ${player.name}`);
} catch (error) {
console.error(`[auth] ${player.name}`, error);
}
Не выполняйте тяжёлые синхронные операции внутри playerJoin.
Сервер зависает под нагрузкой
Признаки:
- команды выполняются с задержкой;
- растёт ping;
- авторизация занимает минуты;
- процесс загружает одно ядро на 100%;
- постоянно растёт память;
- сервер перестаёт отвечать без завершения процесса.
Проверяйте:
- время обработчиков;
- частоту таймеров;
- количество SQL-запросов;
- индексы таблиц;
- объём данных в событиях;
- бесконечные циклы;
- повторную регистрацию обработчиков;
- частоту сохранения игроков.
Не выполняйте SQL-запрос каждый кадр. Часто используемые данные храните в памяти и сохраняйте контролируемыми операциями.
Ошибки передачи данных между клиентом и сервером
Проверяйте имя события, порядок аргументов, размер объекта и допустимость значений.
mp.events.add('shop:buy', async (player, itemId, amount) => {
const safeItemId = Number(itemId);
const safeAmount = Number(amount);
if (!Number.isInteger(safeItemId)) {
return;
}
if (!Number.isInteger(safeAmount) || safeAmount < 1 || safeAmount > 100) {
return;
}
await buyItem(player, safeItemId, safeAmount);
});
Не доверяйте данным от клиента. Проверяйте цену, количество, права, позицию и идентификаторы на серверной стороне.
Сервер постоянно перезапускается в systemd
systemctl status rageserv
journalctl -u rageserv -n 200 --no-pager
Проверьте рабочий каталог, ExecStart, пользователя службы, переменные окружения, права на пакеты и первую ошибку процесса.
На время диагностики остановите автоматические перезапуски и запустите сервер вручную от того же пользователя.
Ошибки RAGE MP Server в Docker
Проверьте публикацию TCP, UDP и HTTP-порта:
docker run \
-p 22005:22005/tcp \
-p 22005:22005/udp \
-p 22006:22006/tcp \
rage-server-image
Внутри контейнера 127.0.0.1 указывает на сам контейнер. Для базы в другом контейнере используйте имя её сервиса.
Убедитесь, что пакеты и данные базы сохраняются на подключённых томах, а пароли не записаны в Dockerfile.
Безопасность публичного сервера
- запускайте процесс от отдельного пользователя;
- не открывайте MySQL всему интернету;
- создайте отдельного пользователя базы;
- не храните секреты в client_packages;
- проверяйте клиентские события;
- ограничивайте административные команды;
- используйте параметризованные SQL-запросы;
- создавайте резервные копии;
- ограничивайте доступ к панели управления;
- следите за ошибками и нагрузкой.
Клиент может подменить цену, количество предметов, координаты, идентификатор транспорта и параметры команды. Все важные проверки должны выполняться на сервере.
Сервер сломался после обновления
Проверьте совместимость серверного файла, JavaScript API, C# Bridge, Bootstrapper, .NET, npm-зависимостей, клиентских скриптов и DLC.
Безопасный порядок обновления
- Создайте резервную копию.
- Разверните новую версию в отдельной папке.
- Перенесите конфигурацию.
- Установите зависимости заново.
- Пересоберите C# под актуальный Bootstrapper.
- Запустите чистый тестовый сервер.
- Добавьте серверные пакеты.
- Проверьте базу и client_packages.
- Выполните тест несколькими клиентами.
- Только затем обновляйте рабочий сервер.
Не заменяйте рабочий каталог без возможности быстрого отката.
Последовательность проверки RAGE MP Server
- Создайте копию файлов и базы.
- Запустите сервер через терминал.
- Сохраните первую ошибку и стек.
- Проверьте conf.json.
- Запустите сервер без пакетов.
- Проверьте bind и занятые порты.
- Верните один JavaScript-ресурс.
- Исправьте Cannot find module и SyntaxError.
- Проверьте CommonJS и ES Modules.
- Переустановите npm-зависимости.
- Проверьте события и асинхронные ошибки.
- Обновите Bridge и Bootstrapper одной версии.
- Пересоберите C#.
- Проверьте базу отдельно.
- Исправьте права пользователя базы.
- Проверьте миграции и таблицы.
- Проверьте client_packages и CEF.
- Откройте игровой TCP- и UDP-порт.
- Откройте HTTP-порт.
- Проверьте port forwarding и CGNAT.
- Проверьте подключение из внешней сети.
- Проверьте загрузку ресурсов.
- Добавьте журнал авторизации.
- Проверьте сервер под нагрузкой.
- После успешного теста включите announce.
Частые вопросы
Почему сервер сразу закрывается?
Запустите его через CMD или терминал. Причиной обычно является ошибка конфигурации, занятый порт, отсутствующая зависимость или сбой первого пакета.
Где находятся JavaScript-пакеты?
Серверные ресурсы находятся в packages, клиентские — в client_packages.
Что означает Cannot find module?
Node.js не нашёл файл или библиотеку. Проверьте путь, регистр и node_modules.
Почему код работает на Windows, но не на Linux?
Linux различает регистр символов. Также отличаются права, системные библиотеки и нативные npm-модули.
Что означает Unexpected token в conf.json?
В JSON присутствует лишняя запятая, неправильная кавычка, комментарий или незакрытая скобка.
Почему import не работает?
Проект выполняется как CommonJS. Используйте require либо настройте весь проект на совместимый формат ES Modules.
Почему не загружается C#-ресурс?
Проверьте Bridge, Bootstrapper, .NET, архитектуру и отсутствующие DLL.
Почему C#-события перестали работать после обновления?
Проект может ссылаться на старый Bootstrapper. Обновите ссылку, очистите bin и obj и пересоберите DLL.
Почему сервер не подключается к MySQL?
Проверьте службу базы, адрес, порт, пользователя, пароль, разрешённый host и firewall.
Что означает Access denied?
База отклонила пользователя с указанного хоста. Проверьте права учётной записи и пароль.
Что означает Too many connections?
Достигнут лимит подключений. Ищите утечки соединений и лишние пулы.
Почему игроки не скачивают client_packages?
Проверьте HTTP-порт, FastDL, права на файлы и доступность сервера ресурсов.
Какие порты использует сервер?
По умолчанию 22005 TCP/UDP для игры и 22006 TCP для загрузки пакетов.
Почему локально сервер работает, а друзья не подключаются?
Проверьте bind, firewall, port forwarding, внешний IP и CGNAT.
Почему сервер есть по IP, но отсутствует в списке?
Проверьте announce, исходящий доступ и стабильность процесса.
Нужно ли запускать сервер от root?
Нет. Для постоянной работы используйте отдельного пользователя с минимальными правами.
Как быстрее найти проблемный пакет?
Запустите чистый сервер и возвращайте ресурсы небольшими группами, разделяя проблемную группу пополам.
Заключение
Если RAGE MP Server не запускается, откройте его через терминал и найдите первую ошибку. Затем проверьте conf.json, bind, занятые порты и чистый запуск без игрового режима.
При ошибках JavaScript проверяйте структуру packages, пути require, npm-зависимости и единый формат модулей. Для C# необходимо обеспечить совместимость Server, Bridge, Bootstrapper и версии .NET.
Если игроки не могут загрузить ресурсы, проверьте HTTP-порт, client_packages и FastDL. При полной недоступности извне проверьте TCP и UDP игрового порта, firewall, port forwarding, публичный IP и CGNAT.
Проблемы клиента разобраны в статье о запуске RAGE MP и определении GTA 5. Ошибки соединения находятся в руководстве о Connection Closed и таймаутах, а загрузка пакетов — в статье об очистке client_resources.