docs(app-manifest-spec): fix the id rule, the Quadlet claim, and the declarative overstatement
Narrative pass over the manifest spec, plus one correction to the guide I committed inba052736. - **`app.id` allowed `_`.** `is_valid_app_id` accepts lowercase ASCII letters, digits and single hyphens only — no underscores, no leading/trailing hyphen, no `--`. The spec's "alphanumeric + `-`/`_`" would have a developer write an id that fails to parse. - **"Must match the directory name"** is a convention, not a rule. The loader (`prod_orchestrator.rs:1455-1474`) walks `*/manifest.yml` and keys off `app.id`, never comparing it to the folder, so a mismatch silently registers the app under a different id. Said so rather than implying enforcement. - **The Quadlet claim was the same one architecture.md was corrected for** (f55ed6bf): install does NOT compile to a `user.slice` Quadlet unit today. `config.use_quadlet_backends` defaults false, so apps take the legacy `podman create + start` path; Quadlet is opt-in per node and companion UIs are the exception that already use it. - **"no per-app installer code"** — true of installers, but `run_pre_start_hooks` is a hardcoded `match app_id` covering seven first-party apps (bitcoin-ui, filebrowser, lnd, archy-nbxplorer, btcpay-server, fedimint-clientd, grafana). Documented as the caveat it is; anyone reading the source will find it in a minute and the doc should not look like it's hiding it. - `derived_env` now names the full closed allow-list including `{{BITCOIN_HOST}}` and what it resolves to. Correction toba052736: I wrote there that an unknown `derived_env` placeholder passes through verbatim. It doesn't — `validate_derived_template` rejects both unknown names and unbalanced `{{`. Fixed that row in the guide. Verified accurate and left alone: the capability allow-list, network_policy values, `/dev/*` device rule, volume option allow-list, bind-source confinement, the four generated_secret kinds, `hooks.pre_start` being schema-only, and the 30s reconciler interval (`BootReconciler::DEFAULT_INTERVAL`). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
ba052736be
commit
7adc3260a6
@@ -109,7 +109,7 @@ app:
|
||||
| `app.container.pull_policy` | Pull behavior, usually `if-not-present` |
|
||||
| `app.container.network` | Podman network setting such as `archy-net` or `pasta`; dangerous namespace-sharing modes are rejected |
|
||||
| `app.container.entrypoint` / `custom_args` | Entrypoint and command override |
|
||||
| `app.container.derived_env` | Environment values rendered from host facts. The complete placeholder set is `{{HOST_IP}}`, `{{HOST_MDNS}}`, `{{DISK_GB}}`, `{{BITCOIN_HOST}}` — anything else is left in the value verbatim rather than erroring, so a typo ships a literal `{{FOO}}` to your container |
|
||||
| `app.container.derived_env` | Environment values rendered from host facts. The complete placeholder set is `{{HOST_IP}}`, `{{HOST_MDNS}}`, `{{DISK_GB}}`, `{{BITCOIN_HOST}}`; an unknown name or an unbalanced `{{` is a parse error, so typos fail loudly |
|
||||
| `app.container.secret_env` | Environment values read from `/var/lib/archipelago/secrets/<secret_file>`, injected as podman secrets (never visible in `podman inspect` or unit files) |
|
||||
| `app.container.generated_secrets` | Secrets the orchestrator creates on first use (`hex16`/`hex32`/`base64`/`bcrypt`) — self-healing, 0600, no host provisioning |
|
||||
| `app.container.generated_certs` | Self-signed TLS certs materialised before create; CN/SANs rendered from host facts |
|
||||
|
||||
Reference in New Issue
Block a user