diff --git a/docs/DEPLOYMENT.md b/docs/DEPLOYMENT.md index 58d2769e..1bfb49e1 100644 --- a/docs/DEPLOYMENT.md +++ b/docs/DEPLOYMENT.md @@ -256,9 +256,9 @@ docker compose logs --tail=200 - **Spring Actuator health**: `http://localhost:8080/actuator/health` (internal only in prod — port 8081 for Prometheus scraping) - **Prometheus scraping**: management port 8081, path `/actuator/prometheus`. Internal only; Caddy blocks `/actuator/*` externally. -### Future observability +### Observability stack -Phase 7 of the Production v1 milestone adds Prometheus + Loki + Grafana. No monitoring infrastructure is in place yet. +An observability stack (Prometheus + Loki + Grafana) is available via `docker-compose.observability.yml` and configuration lives under `infra/observability/`. It joins the `archiv-net` Docker network to scrape the backend's management port. Full wiring and runbook documentation is tracked in issue #581. --- diff --git a/docs/architecture/c4/l2-containers.puml b/docs/architecture/c4/l2-containers.puml index 367b7d93..f27eda69 100644 --- a/docs/architecture/c4/l2-containers.puml +++ b/docs/architecture/c4/l2-containers.puml @@ -17,6 +17,12 @@ System_Boundary(archiv, "Familienarchiv (Docker Compose)") { Container(mc, "Bucket / Service-Account Init", "MinIO Client (mc)", "One-shot container on startup. Idempotent: creates the archive bucket, the archiv-app service account, and attaches the readwrite policy.") } +System_Boundary(observability, "Observability Stack (docker-compose.observability.yml / archiv-net)") { + Container(prometheus, "Prometheus", "prom/prometheus", "Scrapes metrics from backend management port 8081 (/actuator/prometheus). Retention and alert rules TBD — see issue #581.") + Container(loki, "Loki", "grafana/loki", "Log aggregation. Receives structured logs from the stack. Wiring TBD — see issue #581.") + Container(grafana, "Grafana", "grafana/grafana", "Dashboards and alerting UI. Data sources: Prometheus + Loki. Wiring TBD — see issue #581.") +} + Rel(user, caddy, "HTTPS", "TLS 1.2/1.3") Rel(caddy, frontend, "Reverse proxies non-/api requests", "HTTP / loopback:3000") Rel(caddy, backend, "Reverse proxies /api/*", "HTTP / loopback:8080")