c9c72be0b6
PR 4a of the runtime service registry change. - Remove addon pages (/addons/:addonId, AddonPage, addons/*) superseded by service pages. - Remove grafana_url/prometheus_url from backend config, compose, .env.example, and README (URLs now live on service records; VITE_ frontend deep-link vars retained). - Add Services page (/services) with create/list/delete + sidebar nav, so services are configurable in the tool itself and service pages are reachable. - Update docs/REQUIREMENTS.md service-registry section; add CHANGELOG.md with the breaking-upgrade note (MANAGE_ENCRYPTION_KEY required; grafana/prometheus env vars removed; default widget seeding removed). Verification: backend ruff clean, pytest 222 passed; frontend lint 0 errors, build success, 70 tests passed.
2.9 KiB
2.9 KiB
Apply Progress: Runtime Service Registry
Change: service-registry
Apply run: PRs #7–#10 (Slices 1–4a)
Date: 2026-06-19
Slices 1–3 (MERGED)
- Slice 1 (#7): backend service foundation — encryption, integrations registry,
services + service_task_runs tables,
/api/services*CRUD. - Slice 2 (#8): backend widget rebind — service_id + widget_kind, ServiceRecord adapters, built-ins, SSH run logging, retired old widget registry.
- Slice 3 (#9): frontend services runtime — types/API/hooks, frontend registry, ServicePage, route swap, reconciled widget components + config dialog.
Slice 4a — Cleanup + services admin UI + docs (this PR)
Completed tasks
- Removed addon pages (
/addons/:addonId,AddonPage.tsx,addons/*) — superseded by service pages. - Removed
grafana_url/prometheus_urlfromconfig.py, both compose files,.env.example, and README. (FrontendVITE_GRAFANA_URL/VITE_PROMETHEUS_URLdeep-link vars retained.) - Added a Services page (
/services) with create/list/delete and a nav entry, so service pages are reachable and services are configurable in the tool itself. - Registered
/servicesroute in both route trees + sidebar nav. - Updated
docs/REQUIREMENTS.md(service registry section) and addedCHANGELOG.mdwith the breaking-upgrade note.
Decision resolved mid-slice
"Full machine migration" was scoped into 4a (cleanup) + 4b (Jellyfin/Jellyseerr
migration) because removing machine-level Jellyfin/Jellyseerr fields is deeply
coupled to the Media/Users/Files pages (load-bearing) and there is no
jellyseerr service definition yet. 4a ships the safe cleanup + the services
admin UI; 4b does the machine-app-field migration as its own reviewable change.
Files changed (Slice 4a)
- Backend:
config.py(removed grafana_url/prometheus_url). - Compose/env/docs:
docker-compose.yml,docker-compose.dev.yml,.env.example,README.md,docs/REQUIREMENTS.md,CHANGELOG.md(new). - Frontend: new
pages/ServicesPage.tsx;App.tsx(routes + nav); removedpages/AddonPage.tsx,addons/*.
Verification (Slice 4a)
cd backend
.venv/bin/ruff check . # clean
PYTHONPATH=src .venv/bin/python -m pytest # 222 passed
cd ../frontend
npm run lint # 0 errors
npm run build # success
npm run test # 70 passed
Remaining work
- Slice 4b: add
jellyseerrservice definition; rewiredependencies.pyJellyfin/Jellyseerr resolution to the service registry; migrate the Media/Users/Files/Dashboard selector from machine_id to service instance; remove machine-level Jellyfin/Jellyseerr fields fromsettings_store.py,routers/settings.py, and the Settings UI.