# 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). Default publish is 0.0.0.0:8137, # right for a laptop-local rehearsal (e.g. phones on the same Wi-Fi) -- this is # also the *fleet* dev environment's own overlay, but that environment now runs # on vps1 (a public VPS, not a LAN box) and deploys via deploy/deploy-dev.sh, # which overrides the bind address to the WireGuard mesh IP only # (DEV_BIND_ADDR, see deploy/env-topology.sh) -- never invoke `make dev-up` # directly on a fleet host, or it publishes on every interface. (The base file # is prod/beta's shape: capped + loopback, fronted by their own Caddy LB.) DEV_COMPOSE = docker compose -f docker-compose.yml -f docker-compose.dev.yml dev-up: POSTGRES_PASSWORD=$${POSTGRES_PASSWORD:-thermograph-dev} $(DEV_COMPOSE) up -d --build dev-down: $(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}