|
All checks were successful
secrets-guard / encrypted (push) Successful in 5s
shell-lint / shellcheck (push) Successful in 6s
PR build (required check) / changes (pull_request) Successful in 6s
secrets-guard / encrypted (pull_request) Successful in 6s
PR build (required check) / build-backend (pull_request) Has been skipped
PR build (required check) / build-frontend (pull_request) Has been skipped
shell-lint / shellcheck (pull_request) Successful in 9s
PR build (required check) / validate-observability (pull_request) Has been skipped
PR build (required check) / gate (pull_request) Successful in 2s
|
||
|---|---|---|
| .. | ||
| .claude/skills/key-gaps | ||
| deploy | ||
| lake-iceberg | ||
| ops | ||
| terraform | ||
| .env.example | ||
| .gitignore | ||
| .sops.yaml | ||
| ACCESS.md | ||
| CLAUDE.md | ||
| DEPLOY-DEV.md | ||
| DEPLOY.md | ||
| docker-compose.dev.yml | ||
| docker-compose.openmeteo.yml | ||
| docker-compose.yml | ||
| Makefile | ||
| README.md | ||
infra/
Infrastructure for Thermograph: Terraform host
provisioning, the SOPS+age secrets vault, WireGuard/Swarm networking, Forgejo,
Caddy, mail, and the deploy scripts that run the already-built app images on each
host. This is a domain of the emi/thermograph monorepo — hosts' /opt/thermograph
is a checkout of the whole monorepo, and infra/ never builds app source; it only
runs published images.
terraform/— provisions/configures hosts (SSH-driven by default; an optional GCP-creating module is scaffolded, no live resources yet). Seeterraform/README.md. No tfstate is persisted anywhere — treatapplyas executable documentation, not a routine operation.deploy/secrets/— the git-native SOPS+age secrets vault (every app secret, encrypted at rest, rendered at deploy time). Seedeploy/secrets/README.md.deploy/swarm/,deploy/forgejo/— the WireGuard/Swarm cluster hosting Forgejo (git + CI + registry). SeeACCESS.md.deploy/deploy.sh— the single deploy entry point for beta and prod. TakesSERVICE=backend|frontend|allplusBACKEND_IMAGE_TAG/FRONTEND_IMAGE_TAG, resets the host checkout, renders secrets, and routes to the right orchestrator.deploy/stack/— the Swarm path, live on prod:thermograph-stack.yml(db, web, worker, lake, daemon, frontend, autoscaler, autoscaler-lake),deploy-stack.sh,autoscale.sh, and the LB. Rolling updates are start-first, health-gated, with auto-rollback.STACK_TEST=1rehearses the whole stack on throwaway volumes and ports.docker-compose*.yml— the compose path, live on beta and LAN dev (db, backend, lake, daemon, frontend).docker-compose.dev.ymlis the LAN overlay;docker-compose.openmeteo.ymlis the self-hosted Open-Meteo overlay.
Which path a host takes is decided by /etc/thermograph/deploy-mode: the string
stack makes deploy.sh exec deploy/stack/deploy-stack.sh; anything else is
compose. The workflows never need to know which mode a host runs.
Branches & how changes reach each environment
main— what prod and beta run.infra-sync.ymlfires on a push tomaintouchinginfra/**, fast-forwards each host's/opt/thermographcheckout and re-renders/etc/thermograph.envfrom the vault. It deliberately does not roll any service: image tags are the app domains' axis, not infra's. A compose or stack change that must recreate containers takes effect on the next app deploy, or a by-handSERVICE=all … deploy/deploy.sh.dev— what LAN dev would run viadeploy/deploy-dev.sh. The CI trigger for this is currently inert (the LAN box still holds a split-era checkout); usemake dev-uplocally.release— consumed by app deploys only. Both hosts track infra viamain; prod's app images are staged byrelease, but its checkout followsmain.
Note the asymmetry with the app domains: app code IS environment-staged
(dev→main→release maps to LAN→beta→prod via image tags); infra is not.