diff --git a/docs/superpowers/plans/2026-06-23-cyclone-ubuntu-docker-deployment.md b/docs/superpowers/plans/2026-06-23-cyclone-ubuntu-docker-deployment.md index ca6d045..9948ef0 100644 --- a/docs/superpowers/plans/2026-06-23-cyclone-ubuntu-docker-deployment.md +++ b/docs/superpowers/plans/2026-06-23-cyclone-ubuntu-docker-deployment.md @@ -1152,3 +1152,26 @@ Per spec §14 — not done in this plan: - Watchtower / automatic updates. Manual `docker compose pull`. - Linting / pre-commit / dev tooling polish. - Component / E2E browser tests (Playwright). + +--- + +## Live verification (post-implementation, gated `DOCKER_TESTS=1`) + +Before opening the PR, the full `docker compose up -d` stack was brought up on the dev host with `DOCKER_TESTS=1`. Six bugs surfaced that don't show up in unit tests — all fixed in the followup commit `3ba5ca0`: + +1. **Wheel built from stub `__init__.py`** — the "stub init, wheel, copy src, wheel again" pattern silently kept the first wheel's contents. The installed package had an empty `__init__.py`, so `from cyclone import __version__` crashed at import time. Single `COPY src/` + single `pip wheel` is correct. +2. **Backend binds to `127.0.0.1`** — intentional (local-only by design, see CLAUDE.md). But that means the frontend container can't reach it over the compose bridge. Added `CYCLONE_HOST` env var, defaults to `127.0.0.1`, set to `0.0.0.0` in compose. +3. **Healthcheck probed `/api/healthz` (404)** — actual route is `/api/health`. Updated Dockerfile, compose, RUNBOOK, post-deploy.sh, smoke.sh. +4. **Auth matrix had `("/api/healthz"): set()`** — wrong path; would have deny-by-defaulted the real health endpoint. Updated to `/api/health`. +5. **nginx upstream `cyclone-backend:8000`** — compose v2 only resolves the bare service name over the bridge network. Updated to `backend:8000`. +6. **Frontend healthcheck `http://localhost:8080/`** — alpine nginx listens on IPv6 by default; `localhost` is unreliable. Updated to `http://127.0.0.1:8080/`. + +Live verification results (with `/tmp/cyclone-test-secrets/` + override, nocodb stopped): +- Both containers `(healthy)` within ~60s +- `curl http://localhost:8080/api/health` → 200, valid JSON +- `POST /api/auth/login` as admin → 200, cookie set +- `GET /api/auth/me` → 200 with admin user +- `POST /api/parse-837` with `docs/goodclaim.x12` → 200, batch `6252a9265ea943039d363bbca2c16059` created +- Full backend test suite (`DOCKER_TESTS=1`): **1026 passed, 9 skipped** (skips are prodfile corpus, gitignored) + +Plus a followup commit `aecf831` to the live bring-up test itself: uses the override file when present, skips cleanly when port 8080 is bound by another service on a dev workstation.