- CONTEXT.md glossary - README reduced to intro, quickstart and doc index - new architecture.md, gateway.md (from proxy-key-onboarding.md), operations.md; network-access.md rewritten - coding-cli-setup: stale OMNIROUTE_PORT:-4000 endpoint, terms and duplicated per-slot/classifier explanations fixed - research/README.md index; proxy-request-priority.md moved there as superseded Every doc names keys instead of restating values and links its source. Refs #55 (#56, #57, #59, #60) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
3.3 KiB
Operations
Source of truth:
scripts/update.shand.env.example. This page explains what the script does and why; the steps and defaults live in the source. If they disagree, the source wins.
The stack runs on the server. After any change to the repo, run ./scripts/update.sh there: it is the one command that brings the running stack in sync. It's safe to re-run at any time, and it only recreates what changed.
Self-update
git pull runs before anything else. A script that updates itself isn't atomic against its own file changing mid-run. Pulling later once executed a mix of old and new script and compose content in a single pass. Keep the pull first.
Env sync
.env is created from .env.example if it's missing. After that:
-
Keys with a real default in
.env.exampleare tracked config, synced every run. A key missing from.envis added. A key whose value matches is left alone. A key whose value differs is a conflict:- Interactively, all conflicts appear on one screen (gum). Selected keys take the new value, and unselected keys keep the server's value.
- Without a TTY (cron, CI, a pipe), any conflict is an error unless
--forceis passed, which accepts every new value.
To change a default for good, change
.env.example, not the server's.env. -
Keys left blank in
.env.example(secrets and host-resolved values) are never synced. They're only filled when blank. -
Keys removed from
.env.examplestay in the server's.env: the script adds keys and never prunes them. They're harmless, and you can delete them by hand.
There's no rollback. If a bad config lands, git revert and re-run the script.
Secrets
Random secrets are generated with openssl when blank and never overwritten after that. OMNIROUTE_STORAGE_ENCRYPTION_KEY must never change after the first run: it encrypts OmniRoute's whole database, and changing it makes the existing data unreadable. OMNIROUTE_WS_BRIDGE_SECRET is required by OmniRoute in production (its docs/reference/ENVIRONMENT.md). The per-workload API keys aren't here at all: see gateway → API keys.
Host-resolved values
These are resolved on the server itself. Set them by hand only if resolution fails:
SEARXNG_LAN_IP, fromsearch.home: see gateway → Web search.HOST_VIDEO_GID/HOST_RENDER_GID, from the host'svideo/rendergroups: see architecture → GPU access.
Gum
The conflict screen uses gum, a single static binary. It's vendored as a release tarball under scripts/vendor/, because the server has no outbound internet access. Other architectures fall back to downloading it, and if that fails, to a plain-bash prompt. The extracted binary is cached under .cache/gum/ (gitignored).
Model downloads
Each model file has its own one-off downloader service in the tools compose profile. update.sh runs them every time. A test -f guard skips files that already exist, so re-runs don't re-download. Files live in the named models volume, not a host bind-mount. The downloaders run as root because the named volume is created root-owned. There's one service per model, so the small model's job never re-checks the large one.