d4f95b64d4
Manage now connects to existing Grafana/Prometheus/Alertmanager instances and never deploys its own stack. - docker-compose.yml / docker-compose.dev.yml: removed prometheus, loki, alloy, grafana, alertmanager, node-exporter services, the monitoring network, and observability named volumes; they now ship only backend + frontend. Dev frontend now joins the web network so the Vite dev proxy can reach the backend. - backend: alertmanager_url default is now empty; /api/monitoring/alerts and /alertmanager-status return graceful "not configured" responses when ALERTMANAGER_URL is unset. Added not-configured tests. - docker-compose.observability.yml: kept as the optional standalone example; header clarifies Manage does not deploy it. - Removed orphaned combined monitoring/prometheus/prometheus.yml (standalone stack uses prometheus.standalone.yml). - Docs (README, REQUIREMENTS decision log, monitoring-logging-design, observability-runbooks, context.md, MIGRATION_PLAN, frontend/README, CHANGELOG) updated to the connect-to-existing model. VITE_GRAFANA_URL / VITE_PROMETHEUS_URL remain as optional frontend deep-link overrides. .env.example still needs a manual update (safety policy blocks assistant edits): set ALERTMANAGER_URL empty/optional and move standalone-only vars out of the root file.
92 lines
4.5 KiB
Markdown
92 lines
4.5 KiB
Markdown
# Changelog
|
|
|
|
All notable changes to Manage. Breaking changes are marked with **BREAKING**.
|
|
|
|
## [Unreleased]
|
|
|
|
### Changed — Observability is now external only
|
|
|
|
- **Removed** all observability services from `docker-compose.yml` and
|
|
`docker-compose.dev.yml`. They now deploy **only** the backend and frontend.
|
|
The `monitoring` network and the `prometheus`/`loki`/`alloy`/`grafana`/
|
|
`alertmanager`/`node-exporter` services and their named volumes were deleted,
|
|
and the `GRAFANA_APP_HOST` Traefik rule was removed.
|
|
- Manage now connects to **existing** Grafana/Prometheus/Alertmanager instances
|
|
and never ships its own stack. The previous in-compose stack is preserved as
|
|
an optional, deploy-it-yourself example in `docker-compose.observability.yml`
|
|
(config under `monitoring/`, documented in `docs/observability-runbooks.md`).
|
|
- The backend `alertmanager_url` default is now empty. The
|
|
`/api/monitoring/alerts` and `/alertmanager-status` endpoints return a
|
|
graceful "not configured" response when `ALERTMANAGER_URL` is unset.
|
|
- Removed the now-orphaned combined `monitoring/prometheus/prometheus.yml`; the
|
|
standalone stack uses `monitoring/prometheus/prometheus.standalone.yml`.
|
|
- `VITE_GRAFANA_URL`/`VITE_PROMETHEUS_URL` remain as optional frontend deep-link
|
|
overrides. `ALERTMANAGER_URL`/`ALERTMANAGER_WEBHOOK_URL` are optional.
|
|
|
|
### Added — Service registry
|
|
|
|
- Runtime **service registry** persisted in the backend SQLite database. External
|
|
services (Grafana, Prometheus, Jellyfin, Nextcloud, SSH task runner) are now
|
|
configured in the app instead of via environment variables.
|
|
- Services page (`/services`) to create, list, and delete service instances.
|
|
- Service detail pages (`/services/:serviceType/:serviceId`) to edit name/enabled
|
|
state, rotate secrets, and view the widgets a service provides.
|
|
- Service definitions live as Pydantic modules in `backend/.../integrations/`,
|
|
each declaring its config schema, secret fields, and widget kinds.
|
|
- Multi-instance support: multiple Grafana/Jellyfin/etc. instances per type.
|
|
- SSH task runner service records run history in a new `service_task_runs`
|
|
table, shown on the runner's service page.
|
|
|
|
### Changed
|
|
|
|
- Dashboard widgets are now **service-bound** (reference a service instance +
|
|
widget kind) or **built-in** (backups, static text). The "Add widget" flow is
|
|
pick-service → pick-widget-kind → configure.
|
|
- Deleting a service cascade-deletes widgets that reference it.
|
|
|
|
### Security
|
|
|
|
- Service secrets (API keys, tokens, passphrases) are **encrypted at rest** with
|
|
Fernet.
|
|
|
|
### **BREAKING**
|
|
|
|
- Saved Actions (server tasks) now target `ssh_tasks` service instances instead
|
|
of monitoring machines. The `default_machine_id` field on saved tasks was
|
|
replaced with `default_service_id`; the legacy `saved_task_runs` table was
|
|
dropped and run history now lives in `service_task_runs`. Re-create SSH task
|
|
runner services on the Services page and re-link saved actions after
|
|
upgrading.
|
|
- **`MANAGE_ENCRYPTION_KEY` is now required** to start the backend. Generate one
|
|
with:
|
|
|
|
```bash
|
|
python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"
|
|
```
|
|
|
|
- The `GRAFANA_URL` and `PROMETHEUS_URL` backend environment variables were
|
|
removed; Grafana/Prometheus URLs now live on service records configured in the
|
|
UI. Re-create them on the Services page after upgrading.
|
|
- The legacy widget/addon-pages model (`/addons/:addonId`,
|
|
`/api/widgets/types`, `/api/widgets/sources`) was removed in favor of the
|
|
service registry.
|
|
- Default dashboard widget seeding was removed; a fresh install starts with an
|
|
empty dashboard. Add widgets from the dashboard's edit dialog after
|
|
configuring services.
|
|
|
|
### Notes / follow-ups
|
|
|
|
- Machine-level Jellyfin/Jellyseerr app config still powers the Media/Users/Files
|
|
pages. Migrating those onto the service registry is a separate follow-up change
|
|
(see `openspec/changes/service-registry/design.md` §12.5).
|
|
|
|
## Follow-up #1 — remove dead machine Jellyfin/Jellyseerr fields
|
|
|
|
With Jellyfin/Jellyseerr now resolved from the service registry, the machine-level
|
|
Jellyfin/Jellyseerr fields are dead config. Removed from `dependencies.py` (dead
|
|
`_jellyseerr_client_for`; `_resolve_machine` simplified to SSH-only),
|
|
`services/settings_store.py`, `routers/settings.py` (`MachineInput`), frontend
|
|
types, the `Settings.tsx` form, and frontend test fixtures. Existing DB rows may
|
|
still carry these keys in `config_json`; they are inert and get dropped on the
|
|
next machine save. No data migration required.
|