Shared tools — zip packaging & tmux▶
Packaging uses 7z, not zip
Ubuntu's zip fails on any single file at/over ~4GiB (hit this on Cyberpunk 2077's GOG installer parts, which sit right at that edge). 7z -tzip still outputs a plain .zip file — nothing about how it's opened changes, GameVault and browsers need no extra software — it just handles large files correctly. -mx=0 means "store only, don't compress," since installer data is already compressed and re-compressing it just burns CPU for no size benefit.
One-time install if not already done:
sudo apt update && sudo apt install p7zip-fullRun long jobs inside tmux
For anything likely to take more than a minute or two — which is most titles once you're past small indie games — run it inside tmux so it survives an SSH disconnect (wifi hiccup, laptop sleep, closed terminal):
tmux new -s <name> # start a named session
# ...run the long command inside it...
# Ctrl+b, release, then d # detach — job keeps running in background
tmux attach -t <name> # reattach later, from any SSH connection
tmux ls # list all sessions (run outside tmux): in any zip filename — GameVault silently skips files containing / < > : " \ | ? *. Use - instead, e.g. Batman - Arkham Knight (2015).zip. Naming convention throughout: Title (ReleaseYear).zip, parentheses literal.Steam — quick commands▶
docker start -ai steamcmdAt Steam> (exact order — force_install_dir must be set before login, and the container auto-logs-in on start, so log out first):
logout
force_install_dir /data/<short-name>
login naterladderOnly if the store page has no native Linux build:
@sSteamCmdForcePlatformType windowsDownload:
app_update <APPID> validateExit (quit), then on the server:
ls -la /srv/storage/games/steam-backups/<short-name>/
tmux new -s gamepackage
cd /srv/storage/games/steam-backups
7z a -tzip -mx=0 "Title (Year).zip" <short-name>/
mv "Title (Year).zip" /srv/storage/games/gamevault/files/GOG — quick commands▶
lgogdownloader --list
lgogdownloader --download --game <id> --platform linux --directory /srv/storage/games/gogNo Linux build → retry with --platform windows.
ls -la /srv/storage/games/gog/<id>/- Single
.shor single.exe→ usable as-is, move straight togamevault/files/, skip zipping. .exe+ one or more.binfiles → zip together first:
tmux new -s gamepackage
cd /srv/storage/games/gog/<id>
7z a -tzip -mx=0 "Title (Year).zip" ./*
mv "Title (Year).zip" /srv/storage/games/gamevault/files/Playing — Lutris, on desktop▶
- Download the
.zipfrom GameVault in browser, extract. - Find the real executable — usually in a
system/folder, notlauncher/. - Lutris →
+→ "Add locally installed game" → Runner: Wine → browse to the executable → Save → Launch. - First-ever Lutris launch can look frozen for a few minutes (silent GE-Proton download, no progress bar) — normal, only happens once.
Step-by-step with explanations. Open the chapter you need.
Steam — full walkthrough▶
One-time setup (already done, for reference only)
sudo mkdir -p /srv/storage/games/steam-backups
sudo chown mof:mof /srv/storage/games/steam-backups
docker run -it --name steamcmd -e PUID=1000 -e PGID=1000 \
-v /srv/storage/games/steam-backups:/data \
gameservermanagers/steamcmd:latest +login naterladderSteam Guard 2FA was required once. Won't happen again unless the steamcmd container is deleted and recreated. Not a 24/7 service — no compose file, no restart policy, same pattern as sandboxlab-vm1.
Part 1 — Download a game (on the server)
1. Reconnect: docker start -ai steamcmd → drops you at Steam>, already logged in.
2. Find the App ID from the game's Steam store URL: store.steampowered.com/app/<APPID>/...
3. Check for a native Linux build on the store page. If listed, skip step 4 — you want the Linux files (see "Platform choice" below for why).
4. Only if no Linux build exists:
@sSteamCmdForcePlatformType windows5. Set the install folder:
force_install_dir /data/<short-game-name>6. Download and verify:
app_update <APPID> validate7. Confirm on disk (normal terminal, not Steam>):
ls -la /srv/storage/games/steam-backups/<short-game-name>/
du -sh /srv/storage/games/steam-backups/<short-game-name>/Part 2 — Package it for gam'r (on the server)
SteamCMD's output is a folder, not a single archive, so it doesn't fit GameVault's model on its own. Rather than set up a separate network share or scp workflow just for these titles, the simpler and more family-friendly answer is to zip it and drop it into GameVault's own library — same browser download experience as everything else, no second interface for anyone in the household to learn.
tmux new -s gamepackage
cd /srv/storage/games/steam-backups
7z a -tzip -mx=0 "Gothic 1 Classic (2001).zip" gothic-1-classic/Detach (Ctrl+b, release, d) if it'll take a while, reattach later with tmux attach -t gamepackage. Then:
mv "Gothic 1 Classic (2001).zip" /srv/storage/games/gamevault/files/Once GameVault re-scans (usually automatic), it'll show up in the browser library like any other title.
steam-backups/ to avoid keeping two copies — the zip in gamevault/files/ becomes the canonical copy from that point on.Platform choice — native Linux vs. forced Windows
Default: use the native Linux build when the store page lists one; force Windows only when no Linux build exists. Reasoning: native Linux titles use Lutris's plain "Linux" runner — no Wine/Proton layer at all, genuinely less to configure and less that can break. Lutris's community install scripts don't apply to either case here regardless, since SteamCMD hands over already-installed files rather than a fresh installer for a script to run — so there's no downside to preferring native Linux where it exists.
GOG — full walkthrough▶
GOG sells everything DRM-free, so there's no per-title verification step like Steam needs — but unlike Steam, GOG's download shape (single file vs. multiple parts) varies title to title, and you won't know which case you're in until you look. Don't assume a zip step is needed or skip it without checking.
Part 1 — Download a game (on the server)
1. List what you own:
lgogdownloader --list2. Download, Linux build first:
lgogdownloader --download --game <id> --platform linux --directory /srv/storage/games/gogNo Linux build for that title → retry with --platform windows.
3. Check what you actually got — always do this before assuming which packaging case applies:
ls -la /srv/storage/games/gog/<id>/GOG's output falls into three shapes:
- Single .sh (a Mojo Setup installer) — Linux-native title. Usable as-is, no zip needed. Move straight into
gamevault/files/. - Single .exe — small Windows title that fit in one file. Also usable as-is, no zip needed.
- One .exe plus one or more numbered .bin files — larger Windows titles split their data across several .bin parts that the .exe needs alongside it at install time. GameVault needs one file per game, not scattered parts, so these must be zipped together before moving in.
Part 2 — Package it for gam'r (on the server, only if split into parts)
tmux new -s gamepackage
cd /srv/storage/games/gog/<id>
7z a -tzip -mx=0 "Title (Year).zip" ./*Detach/reattach as needed for long jobs (see Quick reference above). Then:
mv "Title (Year).zip" /srv/storage/games/gamevault/files/If it was a single .sh or .exe instead, skip straight to the mv — no zip step:
mv <file> /srv/storage/games/gamevault/files/Play — Lutris, full walkthrough▶
1. Download the .zip (or single file) from gam'r in your browser, like any other GameVault title.
2. Extract it (right-click → Extract, or unzip) into your games folder, e.g. ~/Games/<Title>/. Single .sh/.exe titles from GOG can be run directly without extraction.
3. Find the real game executable — not the launcher folder. Both SteamCMD and GOG downloads often include extra tools (Workshop uploaders, crash handlers, GOG Galaxy integration) in a launcher/ folder that Lutris won't recognize as a game. The actual executable is typically in a system/ folder. For Gothic-engine games specifically: use system/GOTHIC.EXE (or the equivalent numbered title), not GothicStarter.exe or anything under launcher/ — confirmed against a real community Lutris install script for this exact game.
4. In Lutris: + → "Add locally installed game" → Runner: Wine (skip this for native Linux .sh installers — run those directly, or use Lutris's plain "Linux" runner) → Game options tab → browse to the real executable found in step 3 → Save.
5. Launch it, and be patient on the very first game you ever launch through Lutris. GE-Proton (Lutris's Windows compatibility layer, managed automatically via a tool called umu since Lutris 0.5.20 — no manual Proton-GE download needed) downloads itself silently on first use, with no progress bar and no log output — it can look exactly like a hang for several minutes even though it's working correctly. This only happens once, ever, system-wide (every future game reuses the same download).
How to tell a real hang from silent-but-working, if in doubt:
ps aux | grep -i -E "wine|umu"Run it twice, a minute apart. If the CPU-time column (the 0:14-style field) is increasing, it's working — wait longer. If it's frozen at the same number both times, it's actually stuck; kill the PIDs shown and retry.
6. Some games open a launcher/config window first (resolution, etc.) even when pointed straight at the main executable — that's the game's own behavior, not a sign anything's wrong. Configure and hit "Play."
Troubleshooting▶
"Fatal Error: Steamcmd needs to be online to update" + libcurl.so: cannot open shared object file, despite fine network
Stale Docker image (sigboe/steamcmd, 9+ years unmaintained), not a real connectivity issue. Use gameservermanagers/steamcmd instead. Full writeup: GOTCHAS.md 2026-08-10.
"ERROR! Failed to install app '...' (Invalid platform)"
No build for SteamCMD's default platform (Linux). Add @sSteamCmdForcePlatformType windows before force_install_dir.
zip error: Entry too big to split, read, or write (... try -fz)
Don't try -fz — it isn't a real fix, just a stale hint baked into old zip source. Cause: a single file in the folder is at/over ~4GiB and Ubuntu's zip (Info-ZIP 3.0) has unreliable Zip64 support. Use 7z a -tzip -mx=0 instead — this is now the default, not a fallback. Full writeup: GOTCHAS.md 2026-08-12.
GOG download comes back as multiple .bin parts, not one file
Expected for larger Windows titles — see GOG Part 1, step 3 above. Always ls the download folder before assuming which packaging case you're in.
Lutris "hangs" on first-ever game launch, nothing in the log
Not actually broken — likely silent first-time GE-Proton download via umu. See Play, step 5 for how to confirm vs. a genuine stuck process. Full writeup: GOTCHAS.md 2026-08-10 (v2).
Steam Guard asks for 2FA again
Only if the steamcmd container was deleted and recreated. Keep reconnecting via docker start -ai steamcmd.