Each promotion pulls a uniquely SHA-tagged image, so without cleanup
old generations accumulate indefinitely. CT111's disk is small (was
5.9GB, just grown to 8.8GB) and filled up mid-pull on the first real
promotion attempt. Prune dangling images after up -d swaps traffic to
the new containers, once their predecessors are no longer referenced.
Dev keeps auto-deploying on every push to main, same as before, but now
also publishes each build to git.jerodrigged.com's container registry
tagged by short commit SHA (best-effort - never blocks the dev deploy
if REGISTRY_TOKEN isn't set yet).
Prod deploys only on an intentional `git push origin main:prod`, and
only ever pulls a pre-built SHA-tagged image - it never rebuilds from
source. This guarantees prod runs the exact artifact dev already
validated, and makes promoting an untested commit fail loudly (pull of
a nonexistent tag) instead of silently rebuilding something new.
Needs new secrets before the prod path works: PROD_SSH_KEY, PROD_HOST,
PROD_USER, REGISTRY_USER, REGISTRY_TOKEN. PROD_SSH_KEY/PROD_HOST/
REGISTRY_USER are already set; PROD_USER and REGISTRY_TOKEN still need
Jerod's input.
git pull fails if untracked files would be overwritten. Switching to
git fetch + reset --hard keeps the dev LXC in sync unconditionally.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>