Server browser - Official servers (the backend's "official_servers") sort first and are drawn in ReSkate blue - Servers Steam friends are skating in sort next, drawn in green with the friends' names; searching a friend's name finds their server - A player in a session they joined can join another server straight from the list; hosts still end their session first, and a Steam friend's join offer never replaces a session - Joining a dedicated server from the list records it as the player's public session, so friends see it and the row shows HERE - Blocked servers (the backend's "blocked_servers") are hidden and cannot be joined, by code either - When the backend sets "server_tokens_required", dedicated servers that signed in without a login token are hidden, except on the player's own network - A search that gets no internet list from Steam keeps the last list for two minutes, and waits six seconds before treating it as empty Roles - New Staff tag from the backend's "staff" list: green name, badge and item animation, ranked after Dev - Staff can pick a rainbow for their items on the Special page; it is sent as a solid colour older builds can show, so the protocol is unchanged Dedicated server - steam_token: sign in with a Steam game server login token and keep the same Steam ID every start; empty signs in anonymously as before - A listed server without a token says so at startup, and when the token rule starts or stops hiding it - Linux servers update themselves from the release's "server_linux" tarball, with the machine's curl and tar, pinned by SHA-256, and carry on in the same process Launcher - Only create the MiniDumpWriteDump API-set shim under Wine/Proton
6.7 KiB
ReSkate dedicated server on Linux
Native x86_64 build. Same lobby protocol as ReSkateServer.exe; needs no game install.
A release build updates itself, like the Windows server: see Updating.
Requirements
- 64-bit Linux (tested: CachyOS/Arch, Ubuntu 22.04+ should work).
cmake >= 3.24,g++ >= 12(C++20),libssl-dev(OpenSSL),libcurlheaders optional (not needed for V1).curlon the machine that runs the server: it is how the server reads the ReSkate team's global ban list (api.reskate.dev) and how it downloads its own updates. Without it the server says so in its log, enforces only its own bans and stays on its version.tar(with gzip) on that machine too, to unpack an update.- Steam shared libs beside the binary:
libsteam_api.so+steamclient.so(Valve proprietary, not in git — but bundled in the CI/release assets, like the Windows zip bundles its DLLs; otherwise fetch them, see below).
Where the Steam .so files come from
Same split as Windows (steam_api64.dll + steamclient64.dll/tier0_s64.dll/vstdlib_s64.dll):
the release ZIP is expected to ship them; this repo never vendors Valve binaries
(see External/README.md, External/manifest.json).
libsteam_api.so: from the Steamworks SDKredistributable_bin/linux64/(official download viapartner.steamgames.com; any recent 1.x works — the server triesSteamGameServerNetworkingSockets_SteamAPI_v013thenv012, and uses stable flat exportsSteamGameServer015/SteamNetworkingUtils004). It is generic; the app is selected at runtime viaSteamAppId=3354750.steamclient.so(+tier0/vstdlibif present): not in the SDK. Get it from SteamCMD or a Steam client install, e.g.:or copy/symlink an existing client copy (steamcmd +@sSteamCmdForcePlatformType linux +login anonymous +app_update 1007 +quit # then copy steamapps/common/Steamworks\ SDK\ Redist/linux64/steamclient.so # next to ReSkateServer (same folder as libsteam_api.so)~/.steam/steam/linux64/steamclient.so, Valve also documents~/.steam/sdk64/steamclient.so— the server looks there, soln -s <folder>/steamclient.so ~/.steam/sdk64/steamclient.soworks). The serverdlopenslibsteam_api.so, which in turn loadssteamclient.so; either adjacent orLD_LIBRARY_PATHworks.
Arch/CachyOS:
sudo pacman -S base-devel cmake openssl
Ubuntu/Debian:
sudo apt install build-essential cmake libssl-dev
Build
cmake --preset linux-x64
cmake --build --preset linux-release -j$(nproc)
./build/linux/ReSkateServer
Binary: build/linux/ReSkateServer (ELF, OUTPUT_NAME ReSkateServer).
Portable tests:
cmake --preset linux-x64 -DDINGOSDK_BUILD_MULTIPLAYER_TESTS=ON
cmake --build --preset linux-release -j$(nproc)
ctest --test-dir build/linux --output-on-failure
Expected: 9 passed (multiplayer_parties, server_activity, server_speed_check,
server_config, server_global_bans, word_filter, multiplayer_bandwidth, multiplayer_lanes,
multiplayer_prediction). Windows-only tests (voice, lobbies, UI) stay WIN32-gated.
Run
- Put
ReSkateServerin its own folder, then fetch the Steam libs (shipped assetup-linux-server-libs.shbeside the binary):Or do it by hand, see below../setup-linux-server-libs.sh # uses the folder it sits in; or --server-dir DIR - First run writes
ReSkateServer.json; editname+admins, restart. - Optional:
world-layers.jsonfor time-of-day / world layers. Normal server runs only read this file (world_layer_scan::read, JSON only) and work on Linux — verified. Get it by either:- Windows export once:
ReSkateServer.exe --export-world-layers "<Skate folder>" world-layers.json, then copy to the Linux folder; or - copy from a Windows player's cache
%LOCALAPPDATA%\ReSkate\cache\<build>\world-layers.json(same game build; the server tells admins this path inlayer-syncerrors). Without it every player keeps their own layers; with it +world_layer_syncthe server forces them.
- Windows export once:
- No ports need opening (Steam relay). Optional UDP
27015-27016(port,query_port) for browser ping + faster joins.
Without libsteam_api.so the server exits 1 with:
Cannot load .../libsteam_api.so. Put libsteam_api.so (Steamworks SDK) next to the server.
Full command list: Server/README.txt (same on Linux; binary name differs).
systemd
See contrib/reskate-server.service. Install:
sudo cp contrib/reskate-server.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now reskate-server
The server writes its own ReSkateServer.log next to the binary; the console
output goes to the journal (journalctl -u reskate-server -f).
Updating
A server from a release tarball updates itself the way the Windows one does: at startup and
every half hour it asks GitHub for the latest release, and when that holds a newer Linux
server it installs it once nobody is on, then carries on as the new version. update in
the console does it straight away. "auto_update": false in ReSkateServer.json, or
--no-update, turns it off. A server you built yourself never replaces itself.
- The release's
launcher.jsonpins the tarball and theReSkateServerinside it by SHA-256; nothing else is installed. The download iscurlover HTTPS and the unpacking istar, so both must be on the machine. - Everything in the tarball is replaced in the server's folder (the server, the Steam
libraries, the readmes,
world-layers.json). Your own files are not in it and are kept:ReSkateServer.json,Mods, the logs. - The user the server runs as must be able to write to the server's folder. With the
systemd unit below that is
reskateand/opt/reskate-server:sudo chown -R reskate: /opt/reskate-server. - The updated server takes over the same process, so systemd (or your terminal) keeps the server it started; nothing restarts the service.
- A release made before this (1.1.3 and older) has no Linux entry in
launcher.json: the server logs that the latest release has no Linux server and stays as it is. To get onto a self-updating version from one of those, replace the files once by hand.
Notes / limits (V1)
--export-world-layerson Linux: the reader works, the scanner needs the Windows game (Data/layout.toc+ CAS) andoo2core_9_win64.dll(Oodle). Oodle blocks throwOodle CAS data is only supported on Windows(caught, exit 1, no crash). Export on Windows, copy the JSON over — no game needed on the server itself.content_cachedir:%LOCALAPPDATA%on Windows,$XDG_CACHE_HOME/~/.cacheon Linux.- Crypto interop verified: OpenSSL
PKCS5_PBKDF2_HMAC(SHA256, 100k)+HMAC-SHA256matches WindowsBCrypt(checked against Pythonhashlib).