thermograph/infra/Makefile
Emi Griffith 4dcd6775c4
All checks were successful
secrets-guard / encrypted (pull_request) Successful in 5s
shell-lint / shellcheck (pull_request) Successful in 7s
PR build (required check) / changes (pull_request) Successful in 19s
PR build (required check) / build-backend (pull_request) Has been skipped
PR build (required check) / build-frontend (pull_request) Has been skipped
PR build (required check) / validate-observability (pull_request) Has been skipped
PR build (required check) / gate (pull_request) Successful in 1s
Sync infra to hosts / sync-beta (push) Has been skipped
Sync infra to hosts / sync-prod (push) Has been skipped
Sync infra to hosts / sync-centralis (push) Has been skipped
secrets-guard / encrypted (push) Successful in 6s
Sync infra to hosts / sync-dev (push) Successful in 12s
shell-lint / shellcheck (push) Successful in 8s
make: add root install/up/down for the local stack
A fresh checkout had no working path to the stack locally. Neither compose
file carries a `build:` for backend or frontend -- each ships as its own
registry image -- so with no image present `make dev-up` fell through to
pulling the `:local` tag, which nothing publishes, and failed with 403
against a registry a laptop has no login for.

`install` builds both images from backend/Dockerfile and frontend/Dockerfile
under exactly the tag the compose files default to; `up` verifies they exist
and says what to run instead of retrying the pull. Image names are read back
from `docker compose config --images` rather than restated here, so an org
rename cannot leave this file building a tag nothing runs.

infra's dev-up/dev-down now set COMPOSE_PROJECT_NAME=thermograph-dev, which
matches deploy/deploy-dev.sh and what the root CLAUDE.md already described;
a local run previously landed in the prod-shaped `thermograph` project. Drop
dev-up's `--build`, a no-op since the Dockerfiles moved out of infra, and
correct the comment claiming a 0.0.0.0 default -- the overlay has published
on loopback since dev moved to a public VPS.
2026-08-01 13:14:32 -07:00

77 lines
3.7 KiB
Makefile
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# docker-compose orchestration only. The app-level targets that used to live
# here (run, lan-run, stop, migrate, migrate-cache, test, shots, indexnow,
# venv, clean) moved to the backend/frontend app repos along with the code
# they operate on.
.PHONY: up down db-up db-down dev-up dev-down om-up om-down om-backfill
# --- docker-compose stack (backend + frontend + PostgreSQL) ---------------------
# Requires a POSTGRES_PASSWORD (copy .env.example -> .env). See docker-compose.yml.
# Pull each service's published image and start the whole stack (backend +
# frontend + db) in the background. docker-compose.yml no longer has a
# top-level `build:` for backend/frontend -- each ships as its OWN image
# (BACKEND_IMAGE_TAG / FRONTEND_IMAGE_TAG), built in its own app repo (a plain
# `docker build` there, or that repo's own build-push.yml in CI) -- so `up`
# here only pulls + runs; it can no longer build in place.
up:
docker compose pull
docker compose up -d
# Stop and remove the stack's containers (named volumes persist).
down:
docker compose down
# Start just the Postgres service (e.g. to run the app against it from a venv).
db-up:
docker compose up -d db
# Stop the Postgres service.
db-down:
docker compose stop db
# The dev overlay: uncapped (no CPU limits), backend published on
# ${DEV_BIND_ADDR}, which docker-compose.dev.yml defaults to loopback. Set
# DEV_BIND_ADDR=0.0.0.0 for a laptop-local rehearsal reachable from phones on
# the same Wi-Fi. This is also the *fleet* dev environment's own overlay, but
# that environment runs on vps1 (a public VPS, not a LAN box) and deploys via
# deploy/deploy-dev.sh, which pins the bind address to the WireGuard mesh IP
# (see deploy/env-topology.sh) -- never invoke `make dev-up` directly on a
# fleet host. (The base file is prod/beta's shape: capped + loopback, fronted
# by their own Caddy LB.)
#
# COMPOSE_PROJECT_NAME matches deploy/deploy-dev.sh, so a laptop's dev stack
# keeps its volumes off the `thermograph` project that docker-compose.yml pins
# by default. No `--build`: neither compose file carries a `build:` for backend
# or frontend, so the images must exist first -- the root Makefile's `install`
# builds them under the `:local` tag these files default to.
DEV_COMPOSE = docker compose -f docker-compose.yml -f docker-compose.dev.yml
dev-up:
COMPOSE_PROJECT_NAME=$${COMPOSE_PROJECT_NAME:-thermograph-dev} \
POSTGRES_PASSWORD=$${POSTGRES_PASSWORD:-thermograph-dev} \
THERMOGRAPH_INTERNAL_TOKEN=$${THERMOGRAPH_INTERNAL_TOKEN:-dev-token} \
$(DEV_COMPOSE) up -d
dev-down:
COMPOSE_PROJECT_NAME=$${COMPOSE_PROJECT_NAME:-thermograph-dev} $(DEV_COMPOSE) down
# Self-hosted Open-Meteo (prod-only overlay). Serves the ERA5 archive from object
# storage so the app is off the public archive API. See deploy/openmeteo/README.md
# for the object-storage bucket + rclone mount this expects on the host.
OM_COMPOSE = docker compose -f docker-compose.yml -f docker-compose.openmeteo.yml
om-up:
$(OM_COMPOSE) up -d --build
om-down:
$(OM_COMPOSE) down
# One-time historical backfill: write the full 1980→present archive (~11.5 TB of
# .om) to object storage. Runs each dataset once (no --repeat-interval), independent
# of the app/db, so it can run before the stack is flipped over. Hours-long.
OM_LAND_VARS = temperature_2m,dew_point_2m,precipitation,shortwave_radiation,wind_u_component_10m,wind_v_component_10m
OM_ERA5_VARS = wind_gusts_10m,temperature_2m,dew_point_2m,precipitation,shortwave_radiation,wind_u_component_10m,wind_v_component_10m
om-backfill:
$(OM_COMPOSE) run --rm --no-deps open-meteo-sync-land \
sync copernicus_era5_land $(OM_LAND_VARS) --past-days $${OM_BACKFILL_DAYS:-17000}
$(OM_COMPOSE) run --rm --no-deps open-meteo-sync-era5 \
sync copernicus_era5 $(OM_ERA5_VARS) --past-days $${OM_BACKFILL_DAYS:-17000}