# thermograph-infra — agent instructions How and where the already-built Thermograph app images run. This repo owns Terraform, the SOPS+age secrets vault, compose files, deploy scripts, host provisioning, and the ops cron (DB backup + IndexNow). The app repos (`thermograph-backend`, `thermograph-frontend`) own building and testing the images; this repo never checks out app source. The old monorepo (`emi/thermograph`) is archived — do not point anything at it. ## The four machines Same as ACCESS.md: **dev machine** (operator's box, LAN dev server, CI runner), **prod** (`169.58.46.181`, thermograph.org, `agent` user, passwordless sudo), **beta** (`75.119.132.91`, beta.thermograph.org + Forgejo, `agent` user). Hosts' `/opt/thermograph` (and LAN's `~/thermograph-dev`) are checkouts of THIS repo. ## Deploys - `deploy/deploy.sh` — the one deploy path (prod/beta): resets this repo's checkout, renders secrets from the SOPS vault, pulls the per-service image tags (`BACKEND_IMAGE_TAG`/`FRONTEND_IMAGE_TAG`, persisted in untracked `deploy/.image-tags.env`), rolls the target service, health-checks via container healthchecks. Invoked over SSH by the app repos' deploy workflows. - `deploy/deploy-dev.sh` — thin LAN-dev wrapper around deploy.sh (dev compose overlay, `~/thermograph-dev`, branch `dev`). - Branch model: see README — infra `main` is live on prod+beta, `dev` on LAN; `release` is currently unused. App code is env-staged via image tags; infra is not. ## Rules - **Never run `terraform apply` casually** — no tfstate exists anywhere (never persisted), so an apply would attempt full re-provisioning of live hosts. Terraform here is executable documentation until state is bootstrapped. - Secrets: only via the SOPS vault (`deploy/secrets/*.yaml`, `sops edit` + commit + deploy). Never hand-edit `/etc/thermograph.env` on a SOPS-enabled host — it's a rendered artifact. `secrets-guard` CI rejects plaintext. - The ops cron (`.forgejo/workflows/ops-cron.yml`) is THE prod backup — it uses this repo's `PROD_SSH_*` Actions secrets. If you touch it, verify a dump actually lands in `agent@prod:~/thermograph-backups/`. - Commits/PRs: concise and technical; never mention AI/assistants/automated authorship.