serv'r — Game Backup Guide

Backing up owned, DRM-free titles onto serv'r via SteamCMD or GOG, publishing them to GameVault, and playing them via Lutris.

Quick reference

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-full

Run 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)
Filename rule: no : 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 steamcmd

At 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 naterladder

Only if the store page has no native Linux build:

@sSteamCmdForcePlatformType windows

Download:

app_update <APPID> validate

Exit (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/gog

No Linux build → retry with --platform windows.

ls -la /srv/storage/games/gog/<id>/
  • Single .sh or single .exe → usable as-is, move straight to gamevault/files/, skip zipping.
  • .exe + one or more .bin files → 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
  1. Download the .zip from GameVault in browser, extract.
  2. Find the real executable — usually in a system/ folder, not launcher/.
  3. Lutris → + → "Add locally installed game" → Runner: Wine → browse to the executable → Save → Launch.
  4. First-ever Lutris launch can look frozen for a few minutes (silent GE-Proton download, no progress bar) — normal, only happens once.
Full walkthroughs

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 naterladder

Steam 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 windows

5. Set the install folder:

force_install_dir /data/<short-game-name>

6. Download and verify:

app_update <APPID> validate

7. 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.

Optional cleanup: once the zip is confirmed working, you can delete the raw folder under 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 --list

2. Download, Linux build first:

lgogdownloader --download --game <id> --platform linux --directory /srv/storage/games/gog

No 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.