From 1ac803d975705c5be970ee6a1f947dd30361bade Mon Sep 17 00:00:00 2001 From: Babissimo Date: Thu, 24 Sep 2026 16:59:04 +0100 Subject: [PATCH] docs: route the console's pages from app.retina.fm's root retina-server moved the console to the app host's root on 18 September (00e5e6e7), folding the map and the data explorer into it as pages, and deleted the standalone map app. architecture.md still placed the live map at `/` and the dashboard under `/dash/`, and pointed the live-map WebSocket client at `frontend/`, which no longer exists. The uptime runbook's "not covered" list named hostnames that are now retired (testmap has no record at all; map, dash and data are Cloudflare redirects) and left out `app`, which carries the pages they used to. Co-Authored-By: Claude Opus 5.5 --- docs/architecture.md | 21 +++++++++++---------- docs/runbooks/uptime-monitoring.md | 5 +++-- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/docs/architecture.md b/docs/architecture.md index 673d380..01f3ee3 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -37,7 +37,7 @@ flowchart TB end subgraph central["Central server — cloud droplet"] - tf["retina-server = the RETINA server
FastAPI: TCP ingest + tracker + geolocator + analytics
nginx + map, dashboard and data-explorer SPAs"] + tf["retina-server = the RETINA server
FastAPI: TCP ingest + tracker + geolocator + analytics
nginx + the console SPA"] tfs[tower-finder-service · site-survey utility] end @@ -57,9 +57,10 @@ flowchart TB - **Central server** — the `retina-server` monorepo (the repo name is historical; it is now the full RETINA server). Ingests detections from all nodes, runs multi-target tracking and multi-node geolocation, and serves the live maps. -- **Web clients** — the live map, user dashboard and data explorer, all on - `app.retina.fm` at `/`, `/dash/` and `/data/`, plus the admin console on - `admin.retina.fm`; served as static SPAs by the central server. +- **Web clients** — the console, one SPA on `app.retina.fm` holding the live map + at `/map` (where `/` lands), the data explorer at `/data` and the node owner's + pages, plus the same bundle with the admin route table on `admin.retina.fm`; + served as static files by the central server. - **Control plane** — `hosted.mender.io` delivers OS and application updates to the fleet over the air; it is deliberately separate from the data plane. @@ -81,7 +82,7 @@ flowchart LR geo --> state[in-memory track state] end - state -->|/ws/aircraft* WebSocket| map[live map SPA] + state -->|/ws/aircraft* WebSocket| map[console map page] ``` **Caveat — the node→central forward is config-gated.** The "forwarded over TCP to @@ -108,8 +109,8 @@ synthetic-node handling. not via a file or tar1090's `aircraft.json`. Geolocation runs in-process (`_run_geolocation()` during frame processing, updating an in-memory geolocated- aircraft store in `backend/core/state.py`), and that state is broadcast over the -`/ws/aircraft*` WebSocket endpoints (`backend/routes/streaming.py`) to the live-map -SPA (`frontend/src/components/map/hooks.ts`). The standalone `retina-geolocator`'s +`/ws/aircraft*` WebSocket endpoints (`backend/routes/streaming.py`) to the console's +map page (`dashboard/src/pages/map/hooks.ts`). The standalone `retina-geolocator`'s JSONL output is the offline/batch path, not the live feed. ## 3. Component catalogue @@ -138,8 +139,8 @@ JSONL output is the offline/batch path, not the live feed. - **retina-server** (Python FastAPI + React/Vite SPAs) — the RETINA central server. One container (nginx + uvicorn) hosting: TCP detection ingest (`:3012`), the multi-target **tracker** (Kalman + GNN) and node associator, the multi-node - **geolocator** (Levenberg-Marquardt), auth/admin/analytics, the live-map SPA, - the dashboard and the data explorer. Exposes REST `/api/*` and `/ws/aircraft*` + **geolocator** (Levenberg-Marquardt), auth/admin/analytics, and the console SPA + (the live map, the node owner's pages and the data explorer). Exposes REST `/api/*` and `/ws/aircraft*` WebSocket feeds behind `app`/`admin`/`api.retina.fm`. The tracking, geolocation, and analytics algorithms are **vendored as git submodules under `libs/`** (`retina-tracker`, `retina-geolocator`, `retina-custody`, @@ -229,7 +230,7 @@ authoritative inventory — deployment topology changes faster than this table. | `radar3.retnode.com`, `sfo1.retnode.com` | Real production radar nodes (detection APIs) | | `api.retina.fm` | Central server REST/API surface | | `towers.retina.fm` | `tower-finder-service` (illuminator site-survey; also queried by `retina-simulation` for TX coords) | -| `app.retina.fm` | Central server SPAs: live map at `/`, dashboard at `/dash/`, data explorer at `/data/` | +| `app.retina.fm` | The console SPA on the central server: live map at `/map` (where `/` lands), data explorer at `/data`, node owner's pages at the root | | `admin.retina.fm` | Admin console on the central server, gated by Cloudflare Access | | `retina.fm` | Deployment / product portal | | `offworldlabs.com` | Marketing site (`landing-page-owl`) | diff --git a/docs/runbooks/uptime-monitoring.md b/docs/runbooks/uptime-monitoring.md index ddf489c..ad1cc97 100644 --- a/docs/runbooks/uptime-monitoring.md +++ b/docs/runbooks/uptime-monitoring.md @@ -142,8 +142,9 @@ refreshes it. ## Not covered, on purpose -Page content (a blank page returns 200; the deploy smoke tests own that), `testmap`, `map`, -`dash`, `data`, `admin` and the `test-*` names (same stacks as the four probed), latency and +Page content (a blank page returns 200; the deploy smoke tests own that), `app`, `admin` and +the `test-*` names (same stacks as the four probed), the retired `map`, `dash` and `data` names +(Cloudflare redirects onto `app`), latency and certificate alerts on the checks (Cloudflare's edge certificate is Cloudflare's to renew, and an expired origin certificate trips the down check as a 526), and any heartbeat service. The Mender auto-accept timer on the Mender droplet has no HTTP surface and is not watched.