From ec1c482bd53e560ed9056b68c32697da5058f6b0 Mon Sep 17 00:00:00 2001 From: Vuong Hoang Date: Mon, 17 Aug 2026 22:21:09 -0700 Subject: [PATCH] deploy(park): stonehenge-park v1.0.0-beta.2 on ana-docker Operator-directed request from park-dev. Rebuilt from tag v1.0.0-beta.2 (commit 2c258f7) and redeployed; park-data volume preserved (28 items, 9 comments verified present after the recreate). Build source is now exported per-tag to ~/deploy-src/stonehenge-park-v1.0.0-beta.2 rather than overwriting the single mirror, so the previous tag's tree stays on the host as a rollback. The mirror was never a git checkout, so the source comes from `git archive ` against a box that has the repo -- which also leaves park-dev's working tree untouched. Verification, and two things worth writing down: - HEAD 401s on EVERY route, including /healthz and /. So park-dev's suggested check `curl -sI .../ui/assets/favicon.svg` reports a false failure. GET is 200 with content-type image/svg+xml; the packaging is fine and all nine assets are in the wheel. App-wide and pre-existing, not a beta.2 regression -- /healthz predates this release. - /park/due-count returning 0 is not a data-loss signal; it counts what is due now, and /park/due is empty across overdue/today/stale. Items survived: GET /park returns all 28. README now says to check that instead of the due counters. Also corrected the stack README, which still told the reader to build on nh3-docker and verify against 10.100.50.40 -- the host decommissioned for this stack on 2026-08-13 and the one park-dev explicitly asked us not to deploy to. --- stacks/park/README.md | 37 +++++++++++++++++++++++++++++-------- stacks/park/compose.yaml | 9 ++++++--- 2 files changed, 35 insertions(+), 11 deletions(-) diff --git a/stacks/park/README.md b/stacks/park/README.md index 9110691..80fd5f1 100644 --- a/stacks/park/README.md +++ b/stacks/park/README.md @@ -2,7 +2,7 @@ Self-contained needs-attention tracker: FastAPI + SQLite (FTS5) + an in-process scheduler, one container. Source: `gitea.phasefinal.com/vh/stonehenge-park`, -deployed at tag **v1.0.0-beta.1**. Owned by `park-dev`. +deployed at tag **v1.0.0-beta.2** (commit `2c258f7`). Owned by `park-dev`. - **Host:** ana-docker (`10.250.50.70`), compose home `/opt/docker/compose/park/`. Permanent home since 2026-08-13 (migrated off nh3-docker before the v1.0.0 final cut). @@ -20,12 +20,22 @@ deployed at tag **v1.0.0-beta.1**. Owned by `park-dev`. ## Image is built locally (no registry yet) ```bash -# on nh3-docker: -cd ~/deploy-src/stonehenge-park # rsync'd from the tag -sudo docker build -t park:v1.0.0-beta.1 . -cd /opt/docker/compose/park && sudo docker compose up -d +# ⚠ on ana-docker (10.250.50.70) — NOT nh3-docker, decommissioned for this stack 2026-08-13. +# The source is exported per-tag from a checkout that has the tag, so the previous +# tag's tree stays on the host as a rollback. From a box with the repo: +git -C ~/development/stonehenge-park archive --format=tar v1.0.0-beta.2 | \ + ssh infra-ops@10.250.50.70 'mkdir -p ~/deploy-src/stonehenge-park-v1.0.0-beta.2 && + tar xf - -C ~/deploy-src/stonehenge-park-v1.0.0-beta.2' + +# then on ana-docker (infra-ops is in the docker group — no sudo needed): +cd ~/deploy-src/stonehenge-park-v1.0.0-beta.2 +docker build -t park:v1.0.0-beta.2 . +cd /opt/docker/compose/park && docker compose up -d park ``` +⚠ **Never `docker compose down -v`** — that removes `park_park-data` and every parked +idea with it. `up -d` and plain `down` both preserve it. + Swap `image:` for a registry ref once one exists (park-dev left the door open). ## althing wiring (TODO) @@ -40,8 +50,19 @@ host-run), set `PARK_ALTHING_CHANNEL=henge-crow`, recreate. ## Verify ```bash -curl -s http://10.100.50.40:8420/healthz # {"status":"ok"} -curl -s http://10.100.50.40:8420/ # UI shell +curl -s http://park.phasefinal.com:8420/healthz # {"status":"ok"} +curl -s http://park.phasefinal.com:8420/ # UI shell +curl -s http://park.phasefinal.com:8420/ui/assets/favicon.svg # brand assets (public GET) curl -s -H "Authorization: Bearer $KEY" \ - http://10.100.50.40:8420/park/due-count # {"count": N} + "http://park.phasefinal.com:8420/park?limit=100" # the parked items themselves ``` + +⚠ **Use GET, never `curl -I`.** Every route on this app 401s on **HEAD** — including +`/healthz` and `/`, so it is app-wide and not an asset or auth-scope problem. `curl -sI` +therefore reports a false failure on a perfectly healthy deploy. Verified 2026-08-18: +`HEAD /healthz -> 401` while `GET /healthz -> 200`. Reported upstream to park-dev. + +⚠ **`/park/due-count` returning 0 is not a data-loss signal.** It counts what is *due +now*; a henge holding 28 items can legitimately report `{"count":0}` with `/park/due` +empty across overdue/today/stale. To check items actually survived a redeploy, hit +`GET /park` (or count rows in `/data/park.db`), not the due counters. diff --git a/stacks/park/compose.yaml b/stacks/park/compose.yaml index 8b37b0b..a0f94cd 100644 --- a/stacks/park/compose.yaml +++ b/stacks/park/compose.yaml @@ -1,10 +1,13 @@ # stonehenge-park — ana-docker (10.250.50.70), permanent home (migrated off nh3-docker 2026-08-13). # Stable name: park.phasefinal.com -> 10.250.50.70 (Cloudflare, DNS-only/internal). LAN/WG-internal only -# (port 8420); NOT internet-exposed. Image built from vh/stonehenge-park v1.0.0-beta.1; build source at -# ~/deploy-src/stonehenge-park on ana-docker. .env (chmod 600) holds PARK_API_KEY (vault nh3-dev/park-api-key). +# (port 8420); NOT internet-exposed. Image built from vh/stonehenge-park v1.0.0-beta.2 (commit 2c258f7); +# build source at ~/deploy-src/stonehenge-park-v1.0.0-beta.2 on ana-docker (per-tag dir, so the previous +# tag's source stays put as a rollback). .env (chmod 600) holds PARK_API_KEY (vault nh3-dev/park-api-key). +# NOTE: upstream's deploy/compose.yaml builds from source (context: ..). This host copy deliberately does +# not — it pins a locally-built image tag so a rebuild is an explicit, reviewable step. services: park: - image: park:v1.0.0-beta.1 + image: park:v1.0.0-beta.2 container_name: park restart: unless-stopped ports: