Деякі ігри в Steam постачаються лише з виділеним сервером під Windows. У депо немає Linux-бінарника, тож зазвичай радять "запускай на Windows-машині". Але це не обов'язково. За допомогою Wine можна запустити Windows-сервер на звичайній Linux-машині, і він підключиться до Steam та прийматиме реальних гравців. Це точний рецепт, який спрацював у нас на прикладі Alien Swarm: Reactive Drop (безкоштовна кооперативна гра на Source). Той самий підхід повинен підійти й для інших виділених серверів на Source, які існують лише під Windows.
Спочатку перевір, чи справді немає Linux-версії сервера
Не здогадуйся — запитай напряму в Steam, перш ніж братися за Wine. Наведи steamcmd на потрібний app і подивись список платформ:
steamcmd +login anonymous +app_info_print <appid> +quit \
| grep -iE "oslist|name"Якщо в застосунку виділеного сервера "oslist" вказано лише windows, нативної Linux-збірки, на яку можна перейти, просто не існує. Можна спробувати примусово встановити Linux-версію; якщо Linux-депо справді немає, це одразу завершиться помилкою:
steamcmd +@sSteamCmdForcePlatformType linux \
+login anonymous +app_update <appid> validate +quit
# ERROR! Failed to install app '<appid>' (Missing configuration)Ця помилка, а також відсутність будь-яких ELF-файлів, підтверджує це. Отже, шлях — через Wine. Встанови сервер ТА app 1007 (Steamworks Common Redistributables) в одну й ту саму папку, з типом платформи windows. App 1007 постачає DLL Steam, які потрібні серверу, і чому саме — побачиш у Кроці 2:
steamcmd +@sSteamCmdForcePlatformType windows +login anonymous \
+force_install_dir /path/to/server \
+app_update <appid> validate \
+app_update 1007 validate \
+quitЧому наївна спроба через Wine не спрацьовує
Запуск сервера напряму через Wine одразу впирається у дві перешкоди:
- Немає консолі: сервер очікує справжній термінал. Якщо перенаправити вхід із /dev/null, з'явиться CTextConsoleWin32::GetLine: !GetNumberOfConsoleInputEvents і сервер так і не запуститься.
- Не вдається завантажити бібліотеку Steam: навіть після запуску сервер виводить "Unable to load Steam support library" і так і не реєструється в Steam, тому його ніхто не може знайти чи приєднатися.
Обидві можна вирішити. Ось повний рецепт.
Крок 1: дай серверу справжній термінал (PTY)
На безголовій (headless) машині немає терміналу, а консольний Windows-сервер відмовляється запускатися без нього. Обгорни запуск командою script, яка виділяє псевдотермінал, і використай Xvfb для фейкового дисплея:
Xvfb :99 -screen 0 1024x768x24 &
export DISPLAY=:99 WINEPREFIX=/wine
script -qfc "wine srcds_console.exe -console -condebug \
-game <gamedir> +map <map> -port 27015" /tmp/server.logСамого цього вже достатньо, щоб сервер завантажив карту й зайняв ігровий порт. Але спілкуватися зі Steam він усе ще не може.
Крок 2: дві DLL Steam з двох різних джерел
Движку Source потрібні ОБИДВІ бібліотеки — і steamclient.dll, і steam.dll — поруч з exe-файлом сервера, і ось та пастка, яка коштувала нам цілого додаткового раунду налагодження: вони йдуть з РІЗНИХ джерел, а app 1007 дає лише ОДНУ з них.
- steamclient.dll: надходить з app 1007 (Steamworks Common Redistributables), який ти встановив на кроці 1. Офіційний, з відповідною версією, підтримується Valve.
- steam.dll: НЕ входить до app 1007. Це частина Steam CLIENT, і єдиний коректний спосіб його отримати — один раз запустити Windows-версію steamcmd.exe під Wine: вона сама оновиться і покладе steam.dll (та steamclient.dll) у свою папку.
Тож підготуй steam.dll через steamcmd.exe під Wine, а потім скопіюй обидва DLL поруч із виконуваним файлом сервера:
# steam.dll: run Windows steamcmd once under Wine (needs Xvfb for a display)
cd "$WINEPREFIX/drive_c/steamcmd"
curl -fsSLO https://steamcdn-a.akamaihd.net/client/installer/steamcmd.zip
unzip -o steamcmd.zip
DISPLAY=:99 wine steamcmd.exe +quit # lays down steam.dll + steamclient.dll
# place both next to the server exe
cd /path/to/server
cp "$WINEPREFIX/drive_c/steamcmd/steam.dll" .
[ -f steamclient.dll ] || cp "$WINEPREFIX/drive_c/steamcmd/steamclient.dll" .Крок 3: чому steam.dll — це та сама важлива деталь
Це та частина, яку майже ніхто не описує. Помилка звучить як "Unable to load Steam support library", і йдеться зовсім не про steamclient.dll, а про steam.dll. Движок Source шукає steam.dll поруч зі своїм виконуваним файлом, щоб запустити весь ланцюжок підключення до Steam. Якщо є лише steamclient.dll (а саме це і дає app 1007), сервер усе одно падає; але щойно steam.dll опиняється поруч з .exe, лог одразу переходить від помилки до успіху:
Connection to Steam servers successful.
VAC secure mode is activated.VAC не активується, якщо сервер не увійшов у систему як повноцінний gameserver, тож цей рядок і є доказом успішної реєстрації. Більшість серверів на Source входять анонімно і не потребують Game Server Login Token (GSLT). Лише кілька ігор (наприклад, Counter-Strike 2) вимагають його.
Пастка: A2S мовчить, хоча сервер працює нормально
Ось та пастка, яка забрала в нас найбільше часу і мало не змусила все кинути. Під Wine сервер НЕ відповідає на A2S_INFO — UDP-запит, яким інструменти дізнаються назву сервера, карту та кількість гравців. Спробуй його опитати — і кожен порт відповість тайм-аутом, навіть з тієї самої машини. Якщо ти перевіряєш стан сервера через A2S, він виглядатиме повністю мертвим.
Але сервер не мертвий. Мовчання A2S під Wine ніяк не заважає реальним гравцям підключатися. Внутрішньоігровий браузер серверів бере список з майстер-листа Steam (куди сервер сам себе публікує), а пряме підключення використовує ігровий протокол, а не A2S. Тож справжня перевірка — це підключення клієнта, а не відповідь на запит. Коли ми нарешті спробували, реальний гравець підключився і зіграв з першої спроби:
Client "player" connected (10.0.0.5:27005).
1/ 8 on map <mapname>Практичний висновок: для сервера на Wine не перевіряй стан через A2S. Перевіряй щось, що дійсно відображає його живучість — наприклад, рядок "VAC secure mode is activated" у логах, рядок з кількістю гравців або просту перевірку, що ігровий UDP-порт зайнятий.
Чи спрацює це для будь-якої Windows-гри?
Чесно про межі цього рецепта. Ми перевірили його на сервері на движку Source, і той самий підхід (PTY, середовище, зібране через steamcmd, steam.dll поруч з exe) повинен спрацювати і для інших виділених серверів на Source, які існують лише під Windows. Ігри на інших движках інтегрують Steam по-іншому, тож став до них як до окремих експериментів. У будь-якому разі варто чекати двох речей: запуск буде повільнішим, ніж на нативному Linux (через Wine, крок steamcmd і вхід у Steam), і мовчання A2S, описане вище, ймовірно, повторюватиметься і тут.
Або пропусти все це
Це саме той тип возні, що з'їдає цілий вечір. Якщо тобі просто потрібен сервер, ми самі керуємо парком Linux-машин і всією обв'язкою Wine — почасово, з публічною IP-адресою з першої хвилини. Подивись, що ми хостимо на 2hours.gg.