docs(installer): plan the Runic Gateway installer #80
Reference in New Issue
Block a user
No description provided.
Delete Branch "docs/installer-plan"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
What & why
Adds
installer/PLAN.md— the design of record for a deployment tool that takes a stock ServUO install and configures it for Runic Gateway. Planning only; no installer code exists yet.It supersedes an informal overview that described a ServUO integration not matching how
servuo-pluginsactually ships. The corrections are not wording nits — each changes what the installer has to do:RunicGateway.dlland noPlugins/dir. The plugin ships as C# source compiled by ServUO at boot, so the step is a hash-compare sync ofoverlay/(22 bridge files +Bridge.cfg+Scripts.csproj). The sting: a successful copy does not mean a working bridge, becauseScriptCompiler.Compile()ignoresdotnet build's exit code and reloads the staleScripts.dll— a shard boots clean on broken code.patches/. Made an explicit opt-in, skippable tier:git applyagainst a hand-modified shard will fail, and theEventSink.cspatch needs a full core solution rebuild, not the dynamic script build everything else relies on.sidecar.tomlkeeps the sidecar's own schema,install.jsonis the installer's. Service definitions pinUOLINK_CONFIGandUOLINK_DB_PATH, since the sidecar writes relative to CWD and would fail or land in VirtualStore underProgram Files.deploy.ps1cannot be the cross-platform deployer (PowerShell-only; most Linux ServUO hosts have nopwsh). It stays the developer-facing tool; the installer reimplements the sync natively.Release orchestration (§7)
The installer needs CI that reacts when a component publishes a release. That landed in the second commit, folded into version tracking because the bundle is the compat matrix — which closes the "where does the compat matrix live" gap §7 originally left open.
--bundle <tag>pins one. Alinkrelease regenerates ~20 lines of JSON and leaves the installer binary untouched, so operators don't re-download the installer for a sidecar patch. Two compose-time gates: sidecarPROTOCOL_VERSIONmust equal the overlay manifest's declared version, and every asset's SHA256 must match.POSTs to the installer's workflow-dispatch endpoint (link/.gitea/workflows/release.ymlalready declaresworkflow_dispatch: {}and already holds awrite:repositorytoken), plus a nightly cron so a missed dispatch self-heals.repository_dispatchavoided; support is uncertain on this Gitea version.main, so the release normally already exists. If main is ahead with releasable commits (docs:/chore:correctly cut nothing), fire that repo's workflow, compose from what exists now, warn loudly, and let the nightly fold in the result. Dispatching another repo's workflow is fine — it still runs that repo's own gates — but polling it is not, since Gitea's dispatch endpoint returns no run handle.Decisions locked
Public audience; unsigned binaries anchored on
SHA256SUMSwith SmartScreen warnings documented rather than hidden; Rust; release-tarball plugin distribution; bundle-manifest composition; printed token handoff; a newRunicGateway/installerrepo; warn-and-skip on any ServUO other than stock 57.4; and an uninstall that never edits the shard tree — it removes uo-link and its service entry, then prints the overlay files to delete and the patch hunks to revert for the operator to action themselves.Shape
Phases 0–5. Phase 0 gates everything else and is prerequisite work outside the installer:
servuo-pluginshas no release workflow today, so tarball distribution cannot happen until it gets one (the release engine inlink/.gitea/workflows/release.ymlwas written to be retargetable, and its header says so), plus the bundle CI itself, since Phase 1 resolves what to install from the bundle.Two open questions remain in §8, neither blocking Phase 0: whether to hard-assume ServUO/uo-link co-location (the shard dials loopback
127.0.0.1:7788, so today they must share a host), and branch targeting for the Phase 0 workflow while the v3edge → maincutover is mid-flight.How it was tested
Docs-only change — no build or tests to run. Every claim about the repos was verified against the working tree rather than taken from the source overview:
servuo-plugins/overlay/file list,servuo-plugins/deploy.ps1,servuo-plugins/patches/README.md,link/sidecar/src/config.rs,link/sidecar/src/main.rs(PROTOCOL_VERSION),link/.gitea/workflows/release.yml, andlink/SHARD_PREREQS.md.Checklist
AI-assisted contributions (required)
This project requires disclosure of AI tool usage. Please pick one:
Claude Code (Opus 5). I have reviewed and understandevery change, and take responsibility for it. AI-authored commits are
marked with a
Co-Authored-By/Assisted-Bytrailer.License
(GNU GPL v3.0 or later), and I have the right to contribute it.