2026-07-23 00:40:13 +00:00
|
|
|
# Boot-smoke harness: run the backend's OWN image against a throwaway TimescaleDB and
|
|
|
|
|
# assert it actually boots + serves its contract (build alone doesn't prove boot). Used
|
|
|
|
|
# by scripts/smoke.sh; not a deploy file. DB data is tmpfs (ephemeral) — no volume, no
|
|
|
|
|
# residue. See Makefile `smoke` and README.
|
|
|
|
|
services:
|
|
|
|
|
db:
|
|
|
|
|
image: timescale/timescaledb:${TIMESCALEDB_TAG:-latest-pg18}
|
|
|
|
|
environment:
|
|
|
|
|
POSTGRES_USER: thermograph
|
|
|
|
|
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-smoke}
|
|
|
|
|
POSTGRES_DB: thermograph
|
|
|
|
|
tmpfs:
|
|
|
|
|
# pg18 images place PGDATA in a major-version subdir under the mount, so mount at
|
|
|
|
|
# /var/lib/postgresql (matches the infra compose), not /var/lib/postgresql/data.
|
|
|
|
|
- /var/lib/postgresql
|
|
|
|
|
healthcheck:
|
|
|
|
|
test: ["CMD-SHELL", "pg_isready -U thermograph -d thermograph"]
|
|
|
|
|
interval: 3s
|
|
|
|
|
timeout: 5s
|
|
|
|
|
retries: 20
|
|
|
|
|
|
|
|
|
|
backend:
|
|
|
|
|
# Defaults to a locally-built `:local` image (scripts/smoke.sh builds it). In CI,
|
|
|
|
|
# set BACKEND_IMAGE_TAG=sha-<12hex> to smoke the exact published image.
|
frontend: fix the three inconsistencies the onboarding guide found
1. CLAUDE.md and README.md described the superseded Python service. Both now
describe server/ (Go), say plainly that the Python files at that level are
the original the port was made from, and drop CLAUDE.md's claim that
`make test-unit` is "the tier CI runs" — CI's only frontend check is the
Dockerfile builder stage's gofmt + vet + go test.
2. static/units.js's F_REGIONS was guarded by nothing, despite three source
comments claiming "a test asserts all three stay identical": the only check
compared the Go set against the backend's Python. TestFCountriesMatchesUnitsJS
now diffs the browser copy both directions.
That backend cross-check also skips in CI — the image build context is
frontend/, so backend/ is unreachable from the builder stage, which is the
only place CI runs these tests. static/ IS in the context, so the Dockerfile
copies units.js into the builder and the new assertion runs during the image
build. Verified by mutating units.js and confirming the build fails.
3. Both docker-compose.test.yml files defaulted to the retired
emi/thermograph-backend/app path, and the frontend harness pinned the
split-era v0.0.2-split-ci tag. Path corrected in both. Rather than swap one
hardcoded pin for another, backend-for-tests.sh now derives the tag from the
checkout — sha-<12hex of `git log -1 -- backend/`>, the same domain-keyed
rule build-push.yml and deploy.yml use — and compose requires the variable
so a stale pin cannot creep back in.
Verified: backend 429 passed/8 skipped; frontend go vet clean and all packages
ok; frontend image builds; `make backend-up` pulls and serves on the derived
tag; shellcheck zero findings across the tree.
Unrelated pre-existing issue noted in the docs, not fixed here:
`make test-integration` fails 7/16 with 503 against a cold throwaway backend
(empty database, nothing warm). Reproduced identically on the old image, so it
predates this change.
Claude-Session: https://claude.ai/code/session_01AfXqHrxCJLs2D7hpQkiUiJ
2026-07-25 18:42:16 +00:00
|
|
|
# The path must match what build-push.yml publishes -- emi/thermograph/backend.
|
|
|
|
|
# It read emi/thermograph-backend/app (the retired split-era path) until this
|
|
|
|
|
# was corrected; harmless for the default `:local` build, wrong the moment
|
|
|
|
|
# BACKEND_IMAGE_TAG names a real published tag.
|
|
|
|
|
image: ${REGISTRY_HOST:-git.thermograph.org}/${BACKEND_IMAGE_PATH:-emi/thermograph/backend}:${BACKEND_IMAGE_TAG:-local}
|
2026-07-23 00:40:13 +00:00
|
|
|
depends_on:
|
|
|
|
|
db:
|
|
|
|
|
condition: service_healthy
|
|
|
|
|
environment:
|
|
|
|
|
THERMOGRAPH_DATABASE_URL: postgresql+asyncpg://thermograph:${POSTGRES_PASSWORD:-smoke}@db:5432/thermograph
|
|
|
|
|
# Required at import (web/app.py). The smoke never exercises a proxied page, so an
|
|
|
|
|
# unreachable placeholder is fine — it only hits /healthz and {BASE}/api/version.
|
|
|
|
|
THERMOGRAPH_FRONTEND_BASE_INTERNAL: http://127.0.0.1:1
|
|
|
|
|
THERMOGRAPH_BASE: "/"
|
|
|
|
|
THERMOGRAPH_ENABLE_NOTIFIER: "0"
|
2026-07-25 04:13:47 +00:00
|
|
|
THERMOGRAPH_ENABLE_HEARTBEAT: "0"
|
2026-07-23 00:40:13 +00:00
|
|
|
PORT: "8137"
|
|
|
|
|
WORKERS: "1"
|
|
|
|
|
ports:
|
|
|
|
|
# Host port defaults to 18137 to avoid colliding with a running dev server on 8137.
|
|
|
|
|
- "127.0.0.1:${SMOKE_HOST_PORT:-18137}:8137"
|