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 <tag>` 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.
This commit is contained in:
2026-08-17 22:21:09 -07:00
parent c4b2278e7d
commit ec1c482bd5
2 changed files with 35 additions and 11 deletions
+29 -8
View File
@@ -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.
+6 -3
View File
@@ -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: