Pure-AMD and hybrid AMD+NVIDIA hosts now detect correctly — and an AMD box is no longer told to install the NVIDIA runtime. History retention becomes a live setting you change without a restart. The public status page shows the same "In maintenance" badge as the private dashboard. Plus a hardening pass: a Prometheus gauge double-registration crash, a pruning-cycle deadlock, and a controls gate on the remote host-run route.
Added
- History retention is now a setting, changeable live. A new General settings tab exposes
retention_days(1–3650); the pruning cycle reads it each pass, so a change takes effect within ~6 minutes without a restart. (#233) - The "In maintenance" badge now shows on the public status page. Previously only the private dashboard dimmed alerts and showed the blue In maintenance badge during a planned window — the shareable
/publicpage still showed a bare down state. It now computesin_maintenancethrough the same_in_maintenance()helper and surfaces a dedicatedmaintenancestate when nothing is actually down. (#231, follow-up to #217)
Fixed
- AMD GPUs are now detected reliably — including on hosts without nvidia-smi, and alongside an NVIDIA card. Two gaps in the amdgpu back-end (#1): the collector called nvidia-smi unguarded, so on a machine without it the GPU read aborted before the AMD sysfs reader ever ran — a pure-AMD box reported "no GPU" even though the reader worked; and detection was NVIDIA-or-AMD, hiding the AMD card on hybrid machines. nvidia-smi is now read defensively and both back-ends always run, with their cards merged (AMD re-indexed so per-card history stays distinct) and VRAM/util/temp aggregated across all of them; per-process attribution still applies to the NVIDIA cards only. Utilisation also survives the amdgpu
gpu_busy_percentEBUSY quirk — the intermittent "Device or resource busy" race — by retrying once instead of reporting 0%. - GPU diagnostics are now vendor-aware — an AMD host is no longer told to install the NVIDIA runtime. The local requirements panel (and the remote-host probe's GPU check) hard-coded an "NVIDIA GPU" row with nvidia-ctk-only remediation, so a machine with a working AMD Radeon — read via the amdgpu sysfs back-end since v0.21.0 — still showed a confusing "no NVIDIA GPU detected" message. The row now reports the real vendor (GPU (AMD) / GPU (NVIDIA)), and the no-GPU remedy explains that AMD is detected automatically from the kernel (no ROCm needed), with a one-liner to confirm the card's sysfs nodes exist. (#1)
- Prometheus gauges no longer crash on a double import/reload. Gauges are cached in a module-level
_GAUGESdict, preventing theValueError: Duplicated timeserieson the Flask debug-reloader or a double import. (#233) - A pruning-cycle deadlock is fixed.
sample_onceread the retention window while already holdingLOCK, andget_settings()is itself non-reentrant onLOCK— the retention read now happens outside the lock. (#233) - Hardening round (#233): the remote
POST /api/hosts/<name>/runroute is now gated behindENABLE_CONTROLS(returns 403 when controls are off); the docker policy refresh used the wrong TTL constant (_DOCKER_ENRICH_TTL→_DOCKER_POLICY_TTL); container self-ID detection now reads the full cgroups-v1 ID from/proc/self/cgroupand falls back toHOSTNAMEfor v2/non-container; and changing a container's restart policy now asks for confirmation first.
Upgrade: hit Update in the dashboard, or docker compose pull && docker compose up -d. Pinned image: sikamikaniko123/homelab-monitor:v0.25.0.