Частина 1: Міграція сервера на Linux (Покроковий алгоритм)
Більшість розробників створюють і тестують свої ігрові моди на локальних комп'ютерах під керуванням ОС Windows. Однак запуск сервера в режимі продакшену (для реальних гравців) вимагає стабільності, безпеки та високої продуктивності, які може забезпечити тільки операційна система сімейства Linux (Ubuntu, Debian, CentOS), встановлена на потужностях ігрового хостингу.
Процес міграції сервера з Windows на Linux, а також подальший пошук причин падіння ігрового рушія часто викликають труднощі у адміністраторів-початківців. У цьому посібнику ми розберемо, як правильно перенести сервер без втрати даних і як локалізувати будь-які краші коду.
Головні архітектурні відмінності
Головна архітектурна відмінність між Windows і Linux, яка порушує роботу сервера SA:MP/CRMP — це чутливість до регістру символів (Case Sensitivity) у назвах файлів та шляхах, а також використання різних форматів динамічних бібліотек (плагінів).
Крок 1: Заміна плагінів (.dll на .so)
Операційна система Linux не вміє працювати з файлами динамічних бібліотек формату .dll. Для неї потрібні файли спільного об'єкта з розширенням .so.
- Скачайте Linux-версії всіх плагінів, які використовує ваш мод (наприклад:
Crashdetect,MySQL,Streamer,DC_CMD,Pawn.RakNet). Їх можна знайти на офіційних сторінках розробників на GitHub. - Завантажте файли з розширенням
.soв папкуplugins/на вашому хостингу через SFTP. - Відкрийте конфігураційний файл
server.cfgв текстовому редакторі панелі керування і знайдіть рядокplugins. Замініть назви файлів.
Приклад для Windows: plugins sscanf.dll mysql.dll streamer.dll
Правильний варіант для Linux: plugins sscanf.so mysql.so streamer.so (у деяких сучасних версіях SA:MP допускається вказувати плагіни взагалі без розширення, система підставить потрібне автоматично).
Крок 2: Виправлення регістру літер (Case Sensitivity)
Якщо у Windows файли Scriptfiles/Users/Player.ini і scriptfiles/users/player.ini — це один і той же файл, то для Linux це два абсолютно різних шляхи. Якщо ваш скрипт звертається до папки з маленької літери, а на диску вона створена з великої, сервер видасть помилку або не зможе зберегти дані гравця.
- Приведіть назви всіх ключових папок (
gamemodes,filterscripts,scriptfiles,plugins) до нижнього регістру. - Перевірте внутрішній код мода (Pawn): шляхи у функціях
fopen(),fexist(),db_open()повинні строго відповідати реальному написанню папок на сервері хостингу.
Частина 2: Налагодження крашів сервера за допомогою Crashdetect
Якщо сервер SA:MP запускається, але раптово закривається («падає») під час ігрового процесу, стандартний лог server_log.txt рідко буває інформативним — зазвичай він просто обривається. Щоб зрозуміти, який саме рядок у Pawn-скрипті викликав критичну помилку, необхідно використовувати плагін Crashdetect.
Крок 1: Компіляція мода з відлагоджувальними символами
За замовчуванням компілятор Pawn (pawncc.exe) стискає код і видаляє з готового файлу .amx інформацію про рядки коду. Щоб Crashdetect міг вказати точне місце помилки, мод потрібно перекомпілювати зі спеціальним прапорцем.
- Відкрийте ваш редактор коду (Pawno, Visual Studio Code або Sublime Text).
- У параметрах компілятора додайте прапорець
-d3. - Перекомпілюйте ваш ігровий мод. Розмір результуючого файлу
.amxзбільшиться — це нормально, оскільки всередину запишуться відлагоджувальні символи. Завантажте новий.amxна хостинг.
Важливо: Використання прапорця -d3 не знижує продуктивність сервера в реальних умовах, але дозволяє отримати детальний стек викликів при падінні.
Крок 2: Аналіз логів Crashdetect
Після встановлення плагіна та компіляції з прапорцем -d3, у разі крашу сервера, у лог-файл запишеться детальний звіт (Backtrace). Розглянемо приклад типової помилки:
[14:22:10] [crashdetect] Crash detected while executing mygamemode.amx
[14:22:10] [crashdetect] AMX backtrace:
[14:22:10] [crashdetect] #0 native PlayerPlaySound () from samp-server
[14:22:10] [crashdetect] #1 in public OnPlayerDisconnect (playerid=5, reason=1) at gamemodes/mygamemode.pwn:1432
[14:22:10] [crashdetect] Run time error 4: "Array index out of bounds" (Array size 50, index 55)
Як прочитати цей лог:
| Елемент логу | Що це означає |
|---|---|
Run time error 4... |
Тип помилки. У цьому випадку: Вихід за межі масиву. Скрипт спробував записати або прочитати комірку під номером 55 у масиві, розмір якого всього 50 комірок. |
at mygamemode.pwn:1432 |
Вказує на точний рядок (1432) у вашому вихідному коді, де стався збій. |
in public OnPlayerDisconnect |
Автовикликана функція (колбек), всередині якої виконувався код у момент падіння сервера. |
Часті причини крашів на хостингу
- Нескінченні цикли (Server freezing): Якщо ви некоректно налаштували цикл
whileабоfor, який не має умов виходу, потік сервера зациклиться. Хостинг зафіксує 100% навантаження на процесор, сервер перестане відповідати на мережеві запити ("зависне") і буде примусово перезапущений сторожовим таймером панелі хостингу. - Витоки пам'яті в MySQL: Активне використання функції
cache_get_row_count()або створення важких неоптимізованих SQL-запитів у циклі без подальшого очищення пам'яті (cache_deleteу старих версіях плагина) поступово забиває виділену RAM. Коли ліміт оперативної пам'яті контейнера на хостингу вичерпується, процес сервера моментально знищується операційною системою (помилка Out Of Memory / OOM Killer).
Порада: Завжди тримайте плагін Crashdetect увімкненим навіть на готовому ігровому сервері. Він споживає мізерно мало ресурсів, але економить години роботи при пошуку багів після випуску чергового оновлення ігрового мода.