docs(runbook): the .env template no longer implies edits that compose overrides

The template said `EXPORT_PATH=/exports  # NOT pinned by compose`, which has
been false for as long as the pin has existed — and it sits three lines under
MEDIA_PATH, which is correctly described as pinned, so the contrast reads as
deliberate. An operator moving exports to a separate volume (the remedy §13
now recommends for a full disk) would edit `.env`, see nothing change, and
have no reason to suspect the compose file.

All four pinned vars are now listed together with what the pin means: change
it there, not here. DATABASE_MAX_CONNECTIONS carries the extra note that its
value is boot-fatal when unparseable, which is why it is pinned at all.
This commit is contained in:
fabi
2026-08-12 22:23:33 +02:00
parent b5a1580368
commit 137b892480

View File

@@ -189,14 +189,22 @@ DATABASE_URL=postgres://eventsnap:<SAME PASSWORD>@db:5432/eventsnap
ADMIN_PASSWORD_HASH='<docker run --rm caddy:2-alpine caddy hash-password --plaintext "pw">' ADMIN_PASSWORD_HASH='<docker run --rm caddy:2-alpine caddy hash-password --plaintext "pw">'
# ── Paths — must match the volume mounts ────────────────────────────────── # ── Paths — must match the volume mounts ──────────────────────────────────
MEDIA_PATH=/media # pinned by compose anyway, but keep consistent # All four of these are PINNED in docker-compose.yml under `app.environment`, which overrides
EXPORT_PATH=/exports # NOT pinned by compose — see the trap in §7.3 # `env_file`. Keep them consistent here for readability, but understand that editing them in
# `.env` changes nothing — the pin is what the container gets. Change the pin.
MEDIA_PATH=/media
EXPORT_PATH=/exports
APP_PORT=3000
# ── Sizing (see the two corrections below) ──────────────────────────────── # ── Sizing (see the two corrections below) ────────────────────────────────
# 15, matching .env.example, the `db` sizing comment in docker-compose.yml and the code # 15, matching .env.example, the `db` sizing comment in docker-compose.yml and the code
# default. An earlier draft of this runbook said 30: that does not fit the 1G memory limit # default. An earlier draft of this runbook said 30: that does not fit the 1G memory limit
# compose allots `db`, and 30 simultaneous queries cannot run on 2 vCPU anyway — they queue # compose allots `db`, and 30 simultaneous queries cannot run on 2 vCPU anyway — they queue
# on the CPU instead of on the pool. Raise it only alongside more cores AND a bigger limit. # on the CPU instead of on the pool. Raise it only alongside more cores AND a bigger limit.
#
# ALSO PINNED IN COMPOSE (see above), and pinned for a sharper reason than the paths: an
# unparseable value here is boot-FATAL rather than falling back to the default, so a stray
# quote or a trailing inline comment in `.env` would crash-loop the app behind a live Caddy.
DATABASE_MAX_CONNECTIONS=15 DATABASE_MAX_CONNECTIONS=15
COMPRESSION_WORKER_CONCURRENCY=2 COMPRESSION_WORKER_CONCURRENCY=2