refactor: each observability service's config sits in a root folder named after it, out of backend/

Merged
HA
6d ago
+100-53

Summary

backend/ held the config of six other containers. None of it goes into the backend image, but CI's backend/** filter counted a dashboard edit as a backend change: #431 changed one datasource line and ran 13 jobs, image builds and all E2E included.

Changes

Each config moves with git mv to a root folder named after its compose service (grafana/, host-metrics/, loki/, opensearch/, otel-collector/, victoria-metrics/), and .trivyignore to the root, since it covers both images. Mounts, the deploy's restart paths, the labeler and the docs follow. The contract test gets its own CI job, so a dashboard edit runs only that and the docs build.

The first release recreates the six services and then restarts them once more. OpenSearch misses lines during both gaps; Loki keeps them.

Type of Change

  • Bug fix (non-breaking change that fixes an issue)
  • New feature (non-breaking change that adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)
  • Documentation update
  • Refactoring (no functional changes)
  • CI/CD or tooling changes

Test Plan

  • Backend unit tests pass (cd backend && uv run pytest tests/unit)
  • Frontend unit tests pass (cd frontend && npm run test)
  • Backend E2E tests pass (docker compose exec -T backend sh -c 'uv sync --group test --no-dev --frozen --no-install-project --no-build && pytest tests/e2e')
  • Frontend E2E tests pass (cd frontend && npm run test:e2e)
  • API spec and client regenerated if routes or schemas changed (./deploy.sh openapi, then ./deploy.sh types), never edited by hand
  • Manual testing performed

Validation: the contract tests read all 13 dashboards, the alert rules and the collector config from the new paths and pass, mkdocs build --strict passes, and actionlint finds nothing new. The services started from the branch loaded their configs: 13 dashboards, 13 alert rules and 4 datasources in Grafana, OpenSearch's template and policy, Loki's 30-day retention, the VictoriaMetrics scrape job and 8 host series.

Checklist

  • My code follows the project's style guidelines
  • I have run pre-commit run --all-files and all checks pass
  • I have added tests that prove my fix/feature works
  • I have updated documentation if needed
  • My changes don't introduce new warnings

Summary by cubic

Moves each observability service's config out of backend/ into a root folder named after its compose service (grafana/, host-metrics/, loki/, opensearch/, otel-collector/, victoria-metrics/). A dashboard edit under backend/ previously counted as a backend change and ran every CI job, from image builds to all E2E; now it triggers only the docs build and the contract tests.

  • Grafana contract tests get their own CI job, run only when backend/ or a service config folder changes.
  • .trivyignore moves to the repo root, since it covers both images.
  • Compose mounts, the deploy restart paths, the labeler and the docs follow the new locations.

Deployment

  • The first release recreates the six services and then restarts them once more; OpenSearch misses lines during both gaps while Loki keeps them.