feat(dashboard): list the obsidian service in the Services tab#78
Merged
Conversation
The obsidian memory-vault GUI (PR #76) was missing from the dashboard's Services tab. Add it following the established SSO-routed-service pattern (the same shape used for codebase-memory-ui): - dashboard/services_catalog.py: add an `obsidian` entry to SERVICES with health check http://obsidian:3000/obsidian/ (SUBFOLDER-aware, returns 200 on the subpath). No `url` key — the clean same-origin Open link is built from SSO_ROUTES via serviceOpenHref. - dashboard/static/index.html: add `obsidian -> /obsidian/` to SSO_ROUTES so the frontend renders the /obsidian/ Open link. - v2/docker/ops-api/main.py: add `obsidian` to ALLOWED_SERVICES so the row's start/stop/restart/logs controls work. Dashboard id == compose service name, so no OPS_SERVICE_MAP entry is needed (mirrors codebase-memory-ui). Validated live on ordo-v2 (only dashboard + ops-api rebuilt/recreated): /api/services returns obsidian ok=true; ops-api accepts obsidian on the read-only logs route; hardware widget still reports disk + both GPUs; obsidian/llamacpp/agent container IDs unchanged. Root ruff + dashboard tests green; v2 substrate suite unchanged. Co-Authored-By: Claude Opus 4.8 <[email protected]>
AlienWalker1995
added a commit
that referenced
this pull request
Jul 10, 2026
…obsidian :3000) (#79) The operator saw the obsidian Services card showing a raw `:3000` instead of the clean `/obsidian/` SSO link, even though PR #78 shipped correctly: /api/services returns the obsidian entry with NO `url`/`check` echoed (only id/name/port/hint/ok), and serviceOpenHref takes the `APP_PREFIX && SSO_ROUTES['obsidian']` branch -> `/obsidian/`. The card never renders `port` as text. So current code cannot produce `:3000` — the browser was serving a CACHED pre-#78 index.html. Root cause: Starlette's StaticFiles sends ETag + Last-Modified but NO Cache-Control on index.html, so browsers apply heuristic freshness and serve the stale app shell without revalidating. Every dashboard rebuild (new SSO routes / service cards) can therefore keep showing the old shell until a hard refresh — a recurring drift, not a one-off. Fixing per-incident ("tell the operator to hard-refresh") would repeat forever; the real fix is upstream. Fix: subclass StaticFiles to add `Cache-Control: no-cache` to HTML responses only. The shell stays cached but MUST revalidate its ETag every load, so new builds appear immediately; hashed static assets keep long-cache behavior. Tests: index.html sends Cache-Control: no-cache (+ retains ETag); obsidian entry has the SSO-routed shape (no `url`, port for probe only, hint uses the same-origin `/obsidian/` path, never `:3000`) — regression-locking the shape against codebase-memory-ui. Validated live on ordo-v2 (only dashboard rebuilt/recreated): served shell now carries `cache-control: no-cache` + the obsidian SSO route; /api/services obsidian entry unchanged & clean; /api/hardware still reports disk (1999.8GB) + both GPUs (1070+5090); dashboard healthy; obsidian/llamacpp/agent container IDs unchanged. Root ruff (dashboard/) + tests green (118 passed). Co-authored-by: Hermes Bot <[email protected]> Co-authored-by: Claude Opus 4.8 <[email protected]>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
The
obsidianmemory-vault GUI service (added in PR #76) was missing from the dashboard's Services tab. This adds it, following the stack's established SSO-routed-service pattern (identical shape tocodebase-memory-ui).Changes
dashboard/services_catalog.pyobsidianentry toSERVICES— health checkhttp://obsidian:3000/obsidian/(SUBFOLDER-aware), nourlkey (SSO-routed)dashboard/static/index.htmlobsidian: '/obsidian/'toSSO_ROUTESsoserviceOpenHrefbuilds the clean same-origin Open linkv2/docker/ops-api/main.pyobsidiantoALLOWED_SERVICESso the row's start/stop/restart/logs controls workDashboard id (
obsidian) == compose service name (obsidian), so noOPS_SERVICE_MAPentry is needed — matching howcodebase-memory-uiis wired.Validation (live on ordo-v2 — only
dashboard+ops-apirebuilt & recreated)GET /api/servicesreturns theobsidianentry with"ok":true, "error":nullurlkey +SSO_ROUTES['obsidian'] = '/obsidian/'→ frontend Open link resolves to/obsidian/(same-origin)obsidian:GET /api/ops/services/obsidian/logs?tail=3returns real obsidian container logs (read-only check — obsidian was not restarted)/api/hardwarestill reports disk (1171/1999 GB) + both GPUs (GTX 1070 @ index 0, RTX 5090) — no env-override regressiona23f5cc89dee, llamacppc8ba78363863, agentac79a12620ef. Onlydashboardandops-apirecreated.Tests
ruff check dashboard tests …clean;pytest tests/test_services_and_throughput.py tests/test_dashboard_health.py→ 12 passed🤖 Generated with Claude Code