You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
release: v6.15.0 — production readiness polish (Prometheus + CI hygiene)
Phase 1 of the 3-phase plan to move production readiness from the
v5-era 9.2/10 claim toward a defensible 9.5/10 on current v6.x state.
Added:
- src/services/metrics.js — in-memory counters + gauges rendered as
Prometheus text. No new dependency (plain key=value format).
- New metrics: uptime_seconds, http_requests_total{method,status},
http_request_duration_ms, http_errors_total{status},
ws_connections_active + _total, background_job_runs_total
+ _errors_total. Existing 3 stats gauges kept.
- 17 unit tests covering record/render/edge cases.
Changed:
- Request-tracking middleware at server.js:74 piggybacks
metricsService.recordRequest() on the existing duration hook —
zero new overhead.
- WS server tracks active connections via recordWsConnection(+-1)
on connect/close.
- /api/metrics appends renderPrometheus() output after the
existing stats-derived gauges.
- .github/workflows/ci.yml: test count in GITHUB_STEP_SUMMARY is
now dynamic from Jest output (was hardcoded "384 tests" since
v5).
Documentation:
- README production readiness badge 9.2/10 → 9.5/10 with audit
history row citing what closed the v5 gaps (error-response
sanitization, expanded Prometheus metrics, setInterval fixed,
CI dynamic). Residual deferred: containers.js split (Phase 2),
Docker-in-Docker (v7).
- Test counts 740 → 757 everywhere (README / SECURITY /
CONTRIBUTING / CI summary).
Deferred (explicit, tracked in CHANGELOG):
- containers.js 5774 lines — Phase 2 (v6.16.0) needs deep-spec on
sub-module split (list / detail / compose / files) with
dynamic import().
- Docker-in-Docker integration tests — structural, v7.
- Distributed rate limiter / HA mode — BACKLOG F30, v7.
Tests: 740/50 → 757/51. npm audit: 0.
Targeted at moving the production readiness score from the v5-era 9.2/10 claim toward a defensible **9.5/10** on current v6.x state. Phase 1 of the 3-phase plan captured in `plans/production-readiness-v6.15.md` (Phase 2 = containers.js split, Phase 3 = v7 HA + external audit).
8
+
9
+
### Added — Proper Prometheus metrics service
10
+
11
+
New [src/services/metrics.js](src/services/metrics.js) collects application-level counters + gauges in memory and renders them in standard Prometheus text format. No new dependency — the protocol is just labeled key=value lines. Before this release, `/api/metrics` exposed only 3 gauges (container count, total CPU, total memory). Monitoring score moves from 8 → 9.
12
+
13
+
New metrics (on top of the existing 3 stats-derived gauges):
14
+
15
+
-`docker_dash_uptime_seconds` — process uptime gauge
16
+
-`docker_dash_http_requests_total{method,status}` — counter by method + `2xx`/`3xx`/`4xx`/`5xx` bucket
17
+
-`docker_dash_http_request_duration_ms{method,status}` — summed request duration; divide by the counter above to get average latency per bucket
-`docker_dash_background_job_runs_total{job}` — counter per background job name (reserved for future wiring; not populated yet — see §Roadmap)
22
+
-`docker_dash_background_job_errors_total{job}` — counter per job error
23
+
24
+
Zero overhead: the existing request-tracking middleware at [src/server.js:74](src/server.js) already measured duration for slow-request logging and the `X-Response-Time` header. We just piggyback `metricsService.recordRequest()` on the existing hook. The `/api/metrics` endpoint itself is excluded from self-measurement to avoid skew.
25
+
26
+
**Tests:** 17 new tests in [src/__tests__/metrics.test.js](src/__tests__/metrics.test.js) covering record/render/edge cases (invalid status codes, missing duration, negative values, null job names, Prometheus output format).
27
+
28
+
### Changed — CI summary reports the real test count
29
+
30
+
[.github/workflows/ci.yml](.github/workflows/ci.yml) had `echo "- Tests: ✅ (384 tests — 100% passing)"` hardcoded in the summary step since around v5. The Jest run itself was fine, only the cosmetic step-summary string was stale. Now the test step captures Jest output, extracts `passed` + `skipped` counts, and the summary uses those values via `${{ steps.tests.outputs.passed }}`. Deploy Readiness score moves from 9 → 9.5.
31
+
32
+
### Documentation
33
+
34
+
- README production readiness badge: **9.2/10 → 9.5/10** with an updated Audit History table row citing what closed the v5 gaps.
35
+
- Test counts bumped everywhere: 740 → **757** (17 new metrics tests).
36
+
37
+
### What Phase 1 does NOT cover
38
+
39
+
-**containers.js split** (5774 lines unminified, largest single JS file served) — Performance gap (-2 in v5 audit). Deferred to a v6.16.0 Phase 2 release that needs a deep-spec on how to split (candidate sub-modules: list, detail, compose editor, file browser). Requires dynamic `import()` — works without a build step, but needs the pages refactored to import lazily.
40
+
-**Docker-in-Docker integration tests** — Testing gap (-0.5). Structural: needs Docker available in GHA runners. Defer to v7.
41
+
-**Distributed rate limiter** — Security / HA gap. BACKLOG F30. Material for v7 "HA mode" with an opt-in `DD_MODE=ha` env var.
42
+
-**External third-party security audit** — Out of scope for self-hosted OSS.
43
+
44
+
### Files touched
45
+
46
+
-`src/services/metrics.js` (new, ~150 LOC)
47
+
-`src/__tests__/metrics.test.js` (new, 17 tests)
48
+
-`src/server.js` — 3-line middleware extension (no new layer added)
49
+
-`src/ws/index.js` — 2-line hook on connect/disconnect
50
+
-`src/routes/misc.js` — appended `metricsService.renderPrometheus()` to `/api/metrics` output
## [6.14.3] - 2026-04-22 — "NAS Docker section in the host-connection guide"
6
61
7
62
The "How to Connect Docker Hosts" card on `#/hosts` covered TCP+TLS, SSH Tunnel, Docker Desktop, and Unix Socket — but had nothing about NAS platforms even though we'd shipped detection + per-platform How-Tos for 5 of them in v6.12.0–v6.12.2. Closes that gap.
**Zero dependencies to deploy** — just Docker. No external database, no Redis, no build step. Current version: **v6.14.3**
29
+
**Zero dependencies to deploy** — just Docker. No external database, no Redis, no build step. Current version: **v6.15.0**
30
30
31
31
## Screenshots
32
32
@@ -212,7 +212,7 @@
212
212
-**Self-Reporting Footprint** — Docker Dash memory, uptime, DB size at `/api/footprint`
213
213
-**Let's Encrypt Wizard** — 3-step UI for issuing certs via DNS-01 (Cloudflare, Route53, DigitalOcean, Hetzner, Linode) or HTTP-01. Encrypted credential vault, auto-renewal via Caddy, hash-chained audit trail. Open source — no other Docker UI ships this
214
214
-**Container Remediation Wizard** — 3-step UI that turns Secrets Audit + CIS Benchmark findings into actionable fixes. 20-entry catalog, 4 live-updatable (zero downtime), 16 with compose-recreate + auto-rollback. Git-PR mode for git-backed stacks. No other OSS Docker UI ships this
- CI runs on every push via GitHub Actions (pinned to Node 24 actions as of v6.13.1, clearing the June 2026 deprecation)
508
+
- CI runs on every push via GitHub Actions (pinned to Node 24 actions as of v6.13.1, clearing the June 2026 deprecation; test count reported dynamically in the CI summary as of v6.15.0)
title: 'Production readiness polish — Prometheus metrics + CI hygiene',
16
+
changes: [
17
+
{type: 'feature',text: 'New src/services/metrics.js — real Prometheus metrics collection. Before: /api/metrics exposed 3 gauges (containers, cpu, memory). Now: adds uptime, http_requests_total{method,status}, http_request_duration_ms, http_errors_total{status}, ws_connections_active + _total, background_job_runs_total + _errors_total. Grafana-ready without adding a new dependency.'},
18
+
{type: 'improvement',text: 'Zero-overhead instrumentation: the existing request-tracking middleware at server.js:74 already measured duration for slow-request logging and X-Response-Time header. We piggyback recordRequest() on the existing hook — no new middleware layer added. The /api/metrics endpoint itself is excluded from self-measurement.'},
19
+
{type: 'fix',text: 'CI summary hardcoded "384 tests" since v5. The Jest run was always correct, only the cosmetic $GITHUB_STEP_SUMMARY string was stale. Now captured dynamically from Jest output — passed + skipped counts reported accurately.'},
20
+
{type: 'improvement',text: 'Production readiness badge: 9.2/10 → 9.5/10 with an updated Audit History entry citing what closed the v5-era gaps (error-response sanitization on all 500s from v6.14.1, expanded Prometheus metrics from this release, setInterval leak already fixed, CI test count dynamic). Residual deferred: containers.js split to Phase 2, Docker-in-Docker tests to v7.'},
21
+
{type: 'improvement',text: 'Tests: 740 → 757 (+17 metrics tests covering record/render/edge cases). Still zero external dependencies.'},
0 commit comments