532 Commits
Author SHA1 Message Date
henrygd 37c0547b02 feat: collect memory and swap in bytes for low memory systems (#2359, #2360)
Memory and swap were rounded to two decimal GB places before being sent
to the hub, which is inaccurate on low memory systems.

- agent: add MemBytes [total, used, buff/cache, zfs arc] and SwapBytes
[total, used]
- hub: migrate GB fields from older agents to the byte fields
- records: average byte fields, converting GB values from older records
- site: chart memory and swap from bytes, with fallback for older
records

Deprecated GB fields are still populated in agent payloads and stored
records for older hubs and third-party integrations.
2026-10-21 12:47:48 -04:00
henrygd aa431c5b21 i18n: add catalan and remove untranslated languages 2026-10-21 10:52:09 -04:00
hankandGitHub bb8815a008 New Crowdin updates (#2677) 2026-10-21 10:47:35 -04:00
Sven van GinkelandGitHub b535734355 feat(agent): add IRQ, SoftIRQ and Nice to CPU breakdown (#2647) 2026-10-20 15:23:38 -04:00
henrygd 0fb738defe i18n: fix pt 2026-10-20 14:10:48 -04:00
henrygd 9b27c79c73 i18n: fix pt-BR crowdin link 2026-10-20 13:55:11 -04:00
Matheus EduardoandGitHub cb608ab5df feat(site): add Brazilian Portuguese (pt-BR) translation (#2635) 2026-10-20 13:22:53 -04:00
hankandGitHub 87b4bc5a1d New Crowdin updates (#2666) 2026-10-20 13:20:32 -04:00
Vincent FranstyoandGitHub 827157906e feat: show CPU socket count on the system page (#2646) 2026-10-20 12:59:20 -04:00
Sven van GinkelandGitHub c84f517ab9 chore(site): make view options buttons icon-only and consistent (#2665) 2026-10-20 12:47:16 -04:00
ErnestoMunizandGitHub ac40ac027e feat(agent): add CONTAINER_NAME_LABEL to name containers from labels (#2644) 2026-10-20 11:34:57 -04:00
sveng93andhank 7179bf8b8a chore: remove commented-out LoadAvg1/5/15 fields
The load average fields were replaced by the `la` array and are already
commented out. Replace them with a note about the reserved cbor keys.
2026-10-19 12:54:20 -04:00
henrygdandhank 226590b2df refactor(hub): simplify universal token request parsing and use ApiScenario tests 2026-10-19 12:47:42 -04:00
daniyyellandhank 7b6d995533 Keep dashboard universal tokens out of request URLs 2026-10-19 12:47:42 -04:00
Sven van GinkelandGitHub 2ba1fc0061 test(hub): re-enable /update route test (#2651)
Authenticate the request and expect 404 so the test checks that the
route is not registered without CHECK_UPDATES. Tests run with the
no_ui tag, so the status is stable.
2026-10-19 12:19:19 -04:00
15859c1eb7 refactor: stop sending deprecated DiskReadPs/DiskWritePs fields (#2653)
Disk I/O has been sent in bytes since 0.13.0 (DiskIO for the system,
DiskReadBytes/DiskWriteBytes per filesystem). The agent no longer
populates the old MB-based DiskReadPs/DiskWritePs fields.

The fields are kept on Stats and FsStats only so agents < 0.13.0 still
decode. The hub migrates them on ingest: system-level to DiskIO and
per-filesystem to DiskReadBytes/DiskWriteBytes, so stored records and
the UI only use the byte fields.

Remove the MaxDiskReadPs/MaxDiskWritePs fields, their records averaging,
the UI MB fallbacks and the related TS types.

---------

Co-authored-by: hank <hank@henrygd.me>
2026-10-19 12:17:54 -04:00
e233d663c3 refactor(agent): simplify SMART collection with per-device smartctl attempts (#2620)
Rebuild the SMART device list on every refresh instead of keeping
per-device type and parser state across rescans. Each device gets a
short ordered list of smartctl queries, and the three parsers are merged
into one that rejects output without health data so the next query runs.

- scsi devices try auto-detect, then -d sat (#2295)
- NVMe controllers fall back to their n1 namespace
- disks in standby reuse their last reading; a disk not yet collected
  is woken once per agent run
- the last good reading survives temporary read failures
- failed or empty rescans keep the previous device list
- a missing SMART status is UNKNOWN instead of FAILED
- the reported disk type is the type that worked (e.g. sat)
- disks seen through two paths are reported once

---------

Co-authored-by: hank <hank@henrygd.me>
2026-10-19 10:57:25 -04:00
Mike BogdanandGitHub e984ee1208 feat(alerts): add TLS certificate expiry alert for network monitors (#2627)
Adds a NetworkMonitorCert alert with a threshold in days, evaluated on the hub from the certInfo stored by #2401. Follows the NetworkMonitorLoss alert: per-monitor incidents, alert history, recovery notifications.

Refs #391
2026-10-17 13:40:19 -04:00
c479c3e79c fix: prevent ownership reassignment through record updates (#2632)
Co-authored-by: henrygd <hank@henrygd.me>
2026-10-17 13:38:17 -04:00
Sven van GinkelandGitHub 2e9f4ef4a7 fix(docker): build arm/v6 images with GOARM=6 (#2637) 2026-10-17 12:53:30 -04:00
henrygd cc98299a72 refactor(ui): match token mask length and place copy buttons beside values 2026-10-17 10:09:18 -04:00
Daniel JeremiahandGitHub 74b02cbe0d Mask agent tokens until explicitly revealed (#2625) 2026-10-17 10:06:32 -04:00
henrygd e8970e4679 fix(site): show spinner in systems table until systems are loaded 2026-10-15 09:53:58 -04:00
4aee1668fe fix(agent): bind connection lifecycle to a cancellable context (#2464)
Agent.Start and ConnectionManager.Start now take a context.Context. The
manager runs until that context is cancelled or the process receives
SIGINT/SIGTERM. On shutdown it waits for in-flight reconnect attempts
before closing connections.

The reconnect delay, WebSocket dial and pending handshake now stop when
the context is cancelled. A context-aware dialer keeps proxy selection
from the environment. WebSocket callbacks no longer block on eventChan
after the event loop exits. A late reconnect can no longer restart the
SSH server once shutdown begins.

BREAKING CHANGE: agent.Agent.Start now requires a context.Context.

---------

Co-authored-by: hank <hank@henrygd.me>
2026-10-13 12:32:26 -04:00
032c03b0f7 fix(ui): sort monitor targets without URL scheme, show HTTPS in badge (#2501)
Co-authored-by: hank <hank@henrygd.me>
2026-10-13 09:38:26 -04:00
henrygd d5f50fa461 feat(users): warn on invalid OAUTH_DEFAULT_USER_ROLE values 2026-10-13 08:39:37 -04:00
Sven van GinkelandGitHub 13ea8106eb users: add OAUTH_DEFAULT_USER_ROLE and make USER_EMAIL user admin (#2516) 2026-10-13 08:37:04 -04:00
spatiumstasandGitHub 17dcd96efc fix(site): improve accessibility and preserve login translation (#2604) 2026-10-13 07:52:23 -04:00
henrygd 2fea95b3f1 chore(hub): update bun + npm lockfiles 2026-10-13 07:33:25 -04:00
spatiumstasandGitHub 9e60049248 fix(site): support Tailwind directives in Biome (#2603) 2026-10-13 07:31:01 -04:00
spatiumstasandGitHub 4886479cd4 fix(site): preserve lazy loading of the systemd table (#2602) 2026-10-13 07:20:45 -04:00
spatiumstasandGitHub 9cf75cca7a fix(site): stabilize system dialog layout across tabs (#2571) 2026-10-12 12:53:11 -04:00
MarrrrrrrrryandGitHub a1d86d120f refactor(ui): measure y-axis labels via textContent instead of innerHTML (#2536) 2026-10-12 11:41:10 -04:00
Rajeev GadgilandGitHub a1cbdc980e fix(hub): omit zero GPU package power from stored stats (#2551) 2026-10-12 11:08:53 -04:00
Sven van GinkelandGitHub 665bcb3e53 refactor(agent): consolidate smartctl JSON types and SMART parsers (#2584) 2026-10-12 10:34:37 -04:00
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
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
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
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
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
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