The lake was prod-stack-only; beta and LAN fell straight to NASA. Now the
compose stack gets the same service (backend image, THERMOGRAPH_ROLE=lake,
never host-published) and the backend points at it via THERMOGRAPH_LAKE_URL:
- deploy.sh rolls lake with every backend deploy (same image, different
role); deploy-stack.sh's backend leg updates it too, tolerating stacks
that predate the service.
- Creds: beta via the vault (added to beta.yaml); LAN via the Actions S3
secrets injected by backend-deploy-dev.yml (dev renders no vault). Without
creds the service stays healthy and answers 503 — reads fall through to
NASA, so a credential gap can never take a page down.
- Dev overlay lifts the CPU caps like every other service.
The cutover moved the host checkout's deploy tree to /opt/thermograph/infra/deploy/,
but the stack file's absolute bind sources (db init, env-entrypoint.sh, autoscale.sh)
still pointed at the old /opt/thermograph/deploy/ -- a service update kept the stale
mounts and new tasks failed with 'bind source path does not exist'.
/opt/thermograph becomes a monorepo checkout: deploy.sh gains INFRA_DIR (git
ops at the root, compose work cd'd into infra/), lock/tags/render paths move
under infra/deploy/, image-path defaults become emi/thermograph/backend|
frontend across compose, stack, and the tag-prune. docker-compose.yml pins
name: thermograph -- without it compose run from .../infra derives project
"infra" and recreates the whole stack beside the running one;
deploy-dev.sh pins COMPOSE_PROJECT_NAME=thermograph-dev (env wins over the
file key) to keep LAN dev's separate project.