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
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.
77 lines
3.7 KiB
Makefile
77 lines
3.7 KiB
Makefile
# 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 (~1–1.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}
|