Alcuni giochi Steam distribuiscono solo un server dedicato per Windows. Non c'è nessun binario Linux nel depot, quindi il consiglio classico è "fallo girare su una macchina Windows." Non è obbligatorio. Con Wine puoi far girare il server Windows su una normale macchina Linux, e questo si connetterà a Steam e accetterà giocatori reali. Questa è la ricetta esatta che ha funzionato per noi, usando Alien Swarm: Reactive Drop (un gioco co-op gratuito su motore Source) come esempio. Lo stesso approccio dovrebbe funzionare anche per altri server dedicati Source disponibili solo per Windows.
Prima di tutto, verifica che non esista davvero un server Linux
Non dare nulla per scontato. Chiedi direttamente a Steam prima di ricorrere a Wine. Punta steamcmd sull'app e leggi l'elenco delle piattaforme supportate:
steamcmd +login anonymous +app_info_print <appid> +quit \
| grep -iE "oslist|name"Se l'app del server dedicato è solo "oslist windows", non esiste una build Linux nativa a cui appoggiarsi. Puoi anche provare a forzare un'installazione Linux; quando davvero non esiste un depot Linux, fallisce subito:
steamcmd +@sSteamCmdForcePlatformType linux \
+login anonymous +app_update <appid> validate +quit
# ERROR! Failed to install app '<appid>' (Missing configuration)Quell'errore, unito al fatto che non arriva nessun file ELF, lo conferma. A questo punto Wine è la strada da seguire. Installa il server E l'app 1007 (le Steamworks Common Redistributables) nella stessa cartella, con il tipo di piattaforma windows. L'app 1007 fornisce le DLL di Steam di cui il server ha bisogno, e vedrai perché nel Passo 2:
steamcmd +@sSteamCmdForcePlatformType windows +login anonymous \
+force_install_dir /path/to/server \
+app_update <appid> validate \
+app_update 1007 validate \
+quitPerché il primo tentativo ingenuo con Wine fallisce
Avviare il server direttamente da Wine fa scontrare subito con due ostacoli, uno dopo l'altro:
- Nessuna console: il server richiede un vero terminale. Fare il piping da /dev/null restituisce CTextConsoleWin32::GetLine: !GetNumberOfConsoleInputEvents e non parte mai.
- Impossibile caricare la libreria Steam: anche una volta avviato, stampa "Unable to load Steam support library" e non si registra mai con Steam, quindi nessuno riesce a trovarlo o unirsi.
Entrambi si possono risolvere. Ecco la ricetta completa.
Passo 1: dagli un vero terminale (PTY)
Una macchina headless non ha un terminale, e il server console per Windows si rifiuta di partire senza uno. Avvolgi l'avvio con script, che alloca uno pseudo-terminale, e usa Xvfb per un display fittizio:
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.logQuesto da solo basta a far caricare una mappa al server e a far aprire la sua porta di gioco. Ma il server ancora non riesce a parlare con Steam.
Passo 2: due DLL di Steam, due fonti diverse
Il motore Source ha bisogno SIA di steamclient.dll SIA di steam.dll accanto all'exe del server, ed ecco la trappola che ci è costata un intero giro extra di debug: le due DLL arrivano da fonti DIVERSE, e l'app 1007 te ne dà solo UNA.
- steamclient.dll: viene dall'app 1007 (Steamworks Common Redistributables), che hai installato al passaggio 1. Ufficiale, con la versione corretta, mantenuta da Valve.
- steam.dll: NON fa parte dell'app 1007. È parte del CLIENT Steam, e l'unico modo pulito per ottenerlo è eseguire una volta lo steamcmd.exe per Windows sotto Wine, che si autoaggiorna e crea steam.dll (oltre a steamclient.dll) nella sua cartella.
Quindi genera steam.dll con steamcmd.exe sotto Wine, poi copia entrambe le DLL accanto all'eseguibile del server:
# 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" .Passo 3: perché steam.dll è il pezzo che conta davvero
Questa è la parte che quasi nessuno scrive da nessuna parte. L'errore dice "Unable to load Steam support library," e la libreria di supporto in questione non è steamclient.dll, è steam.dll. Il motore Source cerca steam.dll accanto al proprio eseguibile per avviare l'intera catena Steam. Con la sola steamclient.dll presente (che è tutto ciò che ti dà l'app 1007) continua a fallire; nel momento in cui steam.dll è accanto al .exe, il log passa dal fallimento al successo:
Connection to Steam servers successful.
VAC secure mode is activated.VAC non si attiva a meno che il server non abbia effettuato un login corretto come gameserver, quindi quella riga è la prova che si è registrato. La maggior parte dei server Source qui accede in modo anonimo e non ha bisogno di un Game Server Login Token (GSLT). Solo pochi giochi (come CS2) ne richiedono uno.
La trappola: A2S ammutolisce ma il server sta bene
Ecco l'inghippo che ci è costato più tempo, e il motivo per cui abbiamo quasi mollato. Sotto Wine il server NON risponde ad A2S_INFO, la query UDP che gli strumenti usano per leggere nome, mappa e numero di giocatori di un server. Interrogalo e ogni porta va in timeout, anche dalla stessa macchina. Se usi A2S come health check, il server sembra completamente morto.
Non è morto. Il silenzio di A2S sotto Wine non impedisce ai giocatori reali di connettersi. Il server browser in-game elenca i server a partire dalla master list di Steam (a cui il server si registra da solo), e una connessione diretta usa il protocollo di gioco, non A2S. Il vero test quindi è un client che si connette, non una query che riceve risposta. Quando alla fine l'abbiamo provato, un giocatore reale si è connesso e ha giocato al primo tentativo:
Client "player" connected (10.0.0.5:27005).
1/ 8 on map <mapname>La lezione pratica: per un server ospitato con Wine, non fare l'health check con A2S. Controlla qualcosa che rifletta davvero se il server è vivo, come la riga "VAC secure mode is activated" nel log, la riga del numero di giocatori, oppure un semplice controllo che la porta UDP del gioco sia in ascolto.
Funziona con ogni gioco per Windows?
Bisogna essere onesti sui limiti. Abbiamo provato questa procedura su un server con motore Source, e la stessa ricetta (PTY, un runtime costruito con steamcmd, steam.dll accanto all'exe) dovrebbe funzionare anche per altri server dedicati Source disponibili solo per Windows. I giochi su altri motori integrano Steam in modo diverso, quindi vanno trattati come esperimenti a sé. Due cose da aspettarsi comunque: gli avvii sono più lenti rispetto a Linux nativo (Wine più il passaggio steamcmd più il login Steam), e il comportamento di A2S silenzioso descritto sopra probabilmente si applica a tutti loro.
Oppure salta tutto questo
Questo è il classico lavoro infinito che ti mangia un pomeriggio intero. Se vuoi solo il server, gestiamo noi la flotta Linux e tutta l'impostazione di Wine per te, a ore, con un IP pubblico fin dal primo minuto. Guarda cosa ospitiamo su 2hours.gg.