Commit Graph
1774 Commits
Author SHA1 Message Date
Mario MoharandGitHub da51dfd598 fix(site): unsubscribe live metrics that resolve after leaving 1m (#2599)
pb.realtime.subscribe() resolves only once the server has confirmed the
subscription. When the chart time changed away from 1m before that, the
effect cleanup ran with the initial no-op, the subscription stayed active,
and its 1m points kept overwriting the 1h history. Track cancellation,
unsubscribe as soon as the late subscription resolves, and ignore messages
that arrive after cleanup. Fixes #2598.
2026-10-12 09:14:31 -04:00
Mario MoharandGitHub 596f96442e fix(hub): keep the updater running when the system record lookup fails (#2588)
getRecord removed the system from the manager on any error, so a query that
timed out while the hub was stalled stopped the updater for good. The system
stayed 'up' in the database and was never polled again until a restart.
Only a record that is really gone removes the system now. (#2544)
2026-10-11 13:39:00 -04:00
Sven van GinkelandGitHub 4da7d867f2 systemd: include user journals in service logs (#2553) 2026-10-11 13:02:38 -04:00
d324ccc097 feat(agent): support custom WebSocket headers with HUB_HEADERS (#2585)
Co-authored-by: henrygd <hank@henrygd.me>
2026-10-11 11:22:37 -04:00
henrygd 7f2eb90f24 perf(agent): reuse buffer when reading intel_gpu_top samples 2026-10-11 10:44:18 -04:00
yi111andGitHub 7f63e65f22 fix(agent): parse intel_gpu_top -J arrays that omit commas between samples (#2589) 2026-10-11 10:35:56 -04:00
henrygd f8d3fe1817 fix: use omitzero for scalar JSON fields under json v2
PocketBase now marshals record JSON fields with encoding/json/v2, where
omitempty no longer omits zero numbers or false. This roughly doubled the
size of stored system_stats rows with zero-value keys. Switch scalar
fields to omitzero to restore the v1 output shape, and add a test that
compares v1 and v2 output for zero-heavy values.
2026-10-11 09:47:30 -04:00
Bharat KauravandGitHub 383e9c7072 fix(agent): widen NVMe unsafe_shutdowns to uint (#2583)
unsafe_shutdowns was uint16, so drives reporting more than 65535 unsafe
shutdowns made json.Unmarshal fail and the entire NVMe SMART record was
discarded with only "no valid SMART data found" in the logs. Widen it
to uint, matching power_cycles (#2484), and log the unmarshal error at
debug level so similar failures are diagnosable.

Fixes #2582
2026-10-11 09:17:17 -04:00
spatiumstasandhank 13bdd05934 fix: handle cached NVMe failures and empty SMART responses 2026-10-09 14:40:55 -04:00
Fuwuwuwuandhank d8b4191975 fix(agent): reset host CPU baseline after counter rollback 2026-10-09 14:16:35 -04:00
017ebb091a feat: surface zpool status messages in pool health (#2509)
Co-authored-by: henrygd <hank@henrygd.me>
2026-10-09 13:57:40 -04:00
b11e361799 fix(agent): prevent network counter underflow on interface removal and container restart (#2574)
Co-authored-by: hank <hank@henrygd.me>
2026-10-09 12:58:05 -04:00
Sven van GinkelandGitHub 5714643ff9 fix(site): keep last known update count in systems table when host is down (#2559) 2026-10-09 12:10:46 -04:00
Sven van GinkelandGitHub 5529d2e15e fix(agent): verify systemd on dbus before starting service monitoring (#2573) 2026-10-09 11:39:09 -04:00
henrygd e30e980854 deps: update npm / bun lockfiles 2026-10-09 11:19:45 -04:00
Sven van GinkelandGitHub 195afc10b8 deps(site): bump npm packages with security alerts (#2575) 2026-10-09 11:17:25 -04:00
henrygd d91f06f3c5 fix(hub): stop keepalive pings after prolonged agent silence
The keepalive ping on a failed fetch re-arms the read deadline without needing
a reply, so a dead peer (power loss, partition) kept its connection until TCP
gave up. Track when the agent last sent a message and only ping while that is
under maxAgentSilence (3m). A live agent always answers within interval + its
own 120s deadline, so slow agents are unaffected; a dead one is now released
by the read deadline and falls back through the normal down/SSH path.
2026-10-09 11:09:43 -04:00
Mario MoharandGitHub 7305eda972 fix(hub): ping a slow agent so its connection survives between polls (#2435) 2026-10-09 10:51:42 -04:00
bc2278e7e9 feat(agent): Handle update package check for xbps package manager (#2522)
Co-authored-by: hank <hank@henrygd.me>
2026-10-06 12:10:12 -04:00
henrygd 4fe1a0a7a4 refactor(agent): share cgroup path vars and v2 mount lookup
Drop the cpu prefix from the cgroup path vars now that memory
accounting uses them too, and extract cgroupV2Dir() for the v2 mount
lookup previously repeated in CPU, memory and the root cgroup check.
2026-10-05 14:54:29 -04:00
ef840e0e6d feat(agent): support opt-in cgroup CPU and memory accounting (#2505)
Co-authored-by: hank <hank@henrygd.me>
2026-10-05 14:52:40 -04:00
Sven van GinkelandGitHub 965518e63c fix(site): restore latency tolerance in 1m realtime charts (#2521) 2026-10-05 12:48:46 -04:00
Sven van GinkelandGitHub ca40b5b38f fix(charts): show isolated points and stop endless spinner on empty values (#2514) 2026-10-05 12:39:14 -04:00
Sven van GinkelandGitHub d89f844a2a feat(monitors): add option to ignore TLS errors for HTTPS monitors (#2500) 2026-10-05 12:01:51 -04:00
Sven van GinkelandGitHub 74c952b879 fix(agent): don't detect zypper-aptitude's apt-get wrapper as apt (#2523) 2026-10-05 11:49:05 -04:00
MarrrrrrrrryandGitHub 36c14e903d fix(agent): stop sending legacy hubs a duplicate stats payload (#2529) 2026-10-05 11:38:33 -04:00
Julio LinsandGitHub dcae7682cd fix(hub): add missing testing build tag to hub tests (#2525) 2026-10-05 10:54:21 -04:00
henrygd 7748651f5c ci: build each docker image once and push to both registries
Previously the matrix had separate entries for Docker Hub and GHCR, so
every image was built twice. Each entry now pushes to both registries
from a single build. Docker Hub is skipped when DOCKERHUB_TOKEN is
unset (e.g. forks).

Also drops the explicit latest tag on the GHCR agent image so latest
comes only from latest=auto, and lowers max-parallel to 3.
2026-10-05 10:53:02 -04:00
hankGitHubgithub-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
4a40d1772c chore(helm): update app version to 0.21.0 (#2498)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-10-05 10:51:53 -04:00
henrygd ec96c13466 release 0.21.0 v0.21.0 2026-10-02 13:13:54 -04:00
henrygd e597dd94db wifi: add SKIP_WIFI env var to disable signal monitoring 2026-10-02 12:54:22 -04:00
henrygd b115e2aa6a wifi(linux): skip nl80211 when no wireless devices are registered
Check /sys/class/ieee80211 before opening netlink sockets. Looking up
the
nl80211 family while cfg80211 is not loaded makes the kernel run
modprobe,
which loads the module on hosts without wireless hardware, or fails
again
on every poll when the module is unavailable.
2026-10-02 12:47:57 -04:00
henrygd 0cca9d0602 chore: update changelog 2026-10-02 12:31:52 -04:00
henrygd 49f4f652e1 i18n: update translations 2026-10-02 12:20:06 -04:00
henrygd 25132b73ff ui: paginate the package updates table 2026-10-02 11:37:18 -04:00
hankandGitHub 49ad3fe533 New Crowdin updates (#2485) 2026-10-02 10:34:35 -04:00
henrygd da742a70ab ui: bump default layout width to 1600 2026-10-02 10:25:23 -04:00
01d91728f0 fix(agent): report LXC guest CPU usage from cgroup accounting (#2341)
Inside an LXC guest, lxcfs serves /proc/stat with the counters of the
host cores in the guest's cpuset, so an idle guest sharing a core with a
busy neighbor reported near-100% CPU.

When the agent detects it is running in an LXC guest (lxcfs mounted on
/proc/stat, container=lxc, or /run/systemd/container), derive CPU usage
from the guest's own cgroup instead: cpu.stat on cgroup v2, cpuacct on
v1, read at the cgroup mount root so it covers every process in the
guest. Usage is normalized by the usable cores (the smallest of the
affinity mask, cpuset and CPU quota).

Per-core usage is omitted in this mode, since the per-core /proc/stat
counters describe shared host cores and would contradict the total.
Iowait and steal are not available from cgroup accounting and report as
zero.

Hosts and Docker/Podman agents are unaffected and keep reading
/proc/stat, as does an LXC guest whose cgroup accounting is unreadable.

---------

Co-authored-by: hank <hank@henrygd.me>
2026-10-01 19:33:42 -04:00
Santhi PrakashandGitHub c394a6b5b1 fix(agent): resolve device symlinks so LVM volumes map to disk I/O (#2486) 2026-10-01 18:44:29 -04:00
spatiumstasandhenrygd 4ffd83677d fix(agent): improve WebSocket and SSH fallback handling (#2441)
Make WebSocket reconnect and SSH fallback transitions reliable across asynchronous disconnects, stale callbacks, and overlapping connections. Keep the SSH listener available while disconnected and allow a verified WebSocket connection to take precedence when it recovers.

Co-authored-by: henrygd <hank@henrygd.me>
2026-10-01 13:37:57 -04:00
henrygd d8c2b1f310 deps(agent): upgrade gopsutil 2026-10-01 11:30:38 -04:00
8a173e2643 feat(hub): add DISABLE_SSH option to skip SSH fallback (#2469)
Co-authored-by: hank <hank@henrygd.me>
2026-10-01 11:20:00 -04:00
0b101cc6be fix(agent): use nvethernet MAC counters (#2090)
Co-authored-by: hank <hank@henrygd.me>
2026-10-01 10:58:21 -04:00
henrygd 5b0952ffcf ui: persist log timestamp toggle and add tooltips to log buttons 2026-09-30 21:26:28 -04:00
Jeroen De WildeandGitHub 2502dd9626 feat: add toggle for log timestamps (#2471) 2026-09-30 21:14:13 -04:00
hankandGitHub 8a91a0b5ab New Crowdin updates (#2412) 2026-09-30 21:12:07 -04:00
henrygd 6ff9b4cfea feat(ui): add MB/s and GB/s unit select to bandwidth alert
Raises the bandwidth threshold max to 5 GB/s without making the MB/s
slider less precise. Values are still stored in MB/s, and the unit is
inferred from the stored value when the alert sheet opens.
2026-09-30 20:24:04 -04:00
Santhi PrakashandGitHub 65e3e2e768 fix(agent): count ZFS snapshot reads in pool I/O stats (#2474) 2026-09-30 18:22:51 -04:00
Sven van GinkelandGitHub 87f1efdfd9 fix(ui): reject IP targets for DNS monitors (#2483) 2026-09-30 18:12:14 -04:00
Bartu ÖzenandGitHub dd3a769d18 Widen NVMe power-cycle SMART fields to uint (#2484) 2026-09-30 17:50:12 -04:00