Files
EscapistsReintroduced/docs/dedicated-preparation.md

35 lines
6.1 KiB
Markdown

# Private dedicated-server preparation
`tools/dedicated_preflight.py` inspects files and prepares a reviewable configuration/evidence plan. It never installs software, executes the server, starts a listener, authenticates a player or changes Steam/Wine state. A zero exit status means inspection succeeded, not that runtime or multiplayer acceptance passed. Every plan explicitly keeps `launch_allowed` and `multiplayer_passed` false.
The intended runtime is stable native Linux Arma Reforger Server, Steam app **1874900**, in `/tmp/erri-dedicated-runtime/server`. Stable client/Tools apps 1874880/1874910 are already installed separately. Experimental apps and server 1890870 are not substitutes: the official [hosting guide](https://community.bistudio.com/wiki/Arma_Reforger:Server_Hosting) distinguishes the branches and documents anonymous SteamCMD installation of the Linux server. Server and client Steam build IDs belong to different apps and need not equal; compare actual engine versions before native tests.
The private preparation downloaded Valve's SteamCMD bootstrap from `https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz`, the installer address used by the official [SteamCMD documentation](https://developer.valvesoftware.com/wiki/SteamCMD). The direct documentation fetch returned HTTP403 during this audit; the Bohemia hosting guide was available. Runtime provenance is in `runtime-origin.json`, and raw SteamCMD app-info/install logs stay outside Git alongside the runtime.
SteamCMD ran anonymously inside a bubblewrap filesystem sandbox: original home was masked by `private-home`, `/tmp` and `/run` were private, the host root was read-only and only the private runtime was writable. Its displayed `/home/jakub/Steam/logs` path referred to that masked private home, not the user's Steam data. No environment HOME value, installed Steam app, shared Wine prefix, original mission or global package was changed. SteamCMD can update its own private installation. The payload remains outside the successor repository and should not be committed. `/tmp` is tmpfs on this host; inspect both free space and available RAM before allocating another copy.
To inspect without writing:
```sh
python3 tools/dedicated_preflight.py --source /home/jakub/devel/escapistsrereintroduced --runtime /tmp/erri-dedicated-runtime --project core
```
To write a new review bundle, add `--write-plan /tmp/erri-dedicated-runtime/review-core`. It must be a new direct child of the marked private runtime; existing evidence is never overwritten. The bundle contains:
- `preflight.json`: exact selected addon/header/world/systems, binary/app manifest metadata, limitations and required evidence.
- `server-config.review.json`: loopback-only game bind/public address, two-player capacity, no public listing, unchanged native fast validation/BattlEye, crash reporting disabled; no configured RCON or A2S.
- `source-manifest.json`: exact authored source/resource hashes, with its file SHA-256 bound in the preflight report.
- `REVIEW.txt`: explicit no-launch status and remaining prerequisites.
The configuration is a review draft, not a ready launcher. The official [server configuration](https://community.bistudio.com/wiki/Arma_Reforger:Server_Config) uses `game.scenarioId`; unpublished local-addon selection/authenticated configuration compatibility still needs verification. The documented local-mod `-server` route and `-config` route must not be combined blindly: the installed startup code reports `-config cannot be used together with addons!`. The plan records the local addon directory and selected GUID separately and leaves `game.mods` empty rather than inventing Workshop revisions. It does not publish addons or trigger Workshop downloads. Native header/MissionSystems loading must be verified for whichever reviewed route is chosen.
A real multiplayer run needs two genuine accepted player identities and two native client controllers. Two copied profiles, two actor entities, two fake connection IDs or two clients sharing one account do not establish this. The current ordinary runner deliberately refuses any existing game process; a separate multi-process supervisor would need explicit ownership of all its children and separate prefixes, profiles, headless displays and audio routing while continuing to protect unrelated games. A second licensed/authenticated client on another machine avoids local account/runtime contention. Loopback-only preparation cannot serve that second machine until an explicitly reviewed LAN configuration exists.
Eight synthetic-file regressions cover missing/wrong/linked runtime binaries, stable-app selection, actual ELF architecture, strict loopback configuration, header/source bindings, immutable evidence outputs and no process execution. Native library compatibility, engine startup, player authentication, replication and FPS remain separate tests.
## Installation observed on 2026-09-19
Anonymous installation completed with SteamCMD exit 0 and its successful-install marker. App 1874900 is fully installed (`StateFlags=4`), public build **24870635**, with shared depot 1874901 manifest 8361215099969594635 and Linux depot 1874902 manifest 3259094621086219309. Installed payload is **10,278,170,614 bytes**. The server is an executable x86-64 ELF; its exact NUL-terminated version strings include **1.8.0.13**. Passive `readelf` inspection found the interpreter and all seven declared native libraries in the host library cache. This is file-level compatibility evidence, not executed-server validation.
`/tmp/erri-dedicated-runtime/installation-inspection.json` binds the bootstrap, app-info log, installation log, app manifest and server binary with SHA-256. The completed Core review bundle is `/tmp/erri-dedicated-runtime/review-core`; its source snapshot is the repository state at bundle creation, and must be recaptured after later source changes. No server/listener was launched during that preparation step. Subsequent [isolated native diagnostics](dedicated-native-diagnostic.md) established regular-server header loading and empty-server preparation; authentication and multiplayer behavior remain untested.