Commit Graph
1575 Commits
Author SHA1 Message Date
henrygd 7d347cfd6a deps: update go version and go deps 2026-09-02 17:58:51 -04:00
Santhi PrakashandGitHub 5790fbecce fix: GPU Power Draw chart renders full-width instead of half-width (#2269) 2026-09-02 17:09:32 -04:00
hankandGitHub f9309da9f0 i18n: New Crowdin updates (#2283) 2026-09-02 15:37:11 -04:00
henrygd 7d97b0d23a i18n: update locale files and source strings 2026-09-02 14:57:37 -04:00
hankandGitHub f104f31ee3 Merge commit from fork 2026-09-02 13:55:54 -04:00
henrygd a1ca51608a fix: add singleDesc back to container alert 2026-09-02 13:09:27 -04:00
henrygd a4de2e87c4 consolidate migrations and add triggeredDesc for container health alert 2026-09-02 13:02:42 -04:00
5969d36856 feat(alerts): add container health alerts with log excerpt on notifications (#2225)
Add a new "ContainerHealth" alert type that fires when a Docker container's
health check reports unhealthy, and resolves when it recovers. This mirrors
the existing Status (up/down) alert pattern: an alert can be armed per system
and honors the "min minutes" delay before firing.

When the alert fires, the notification (email and any configured webhook,
including Discord via shoutrrr) includes a log excerpt fetched live from the
agent for up to 2 of the unhealthy containers, prioritizing lines containing
"error" or "fatal" (falling back to the log tail if none match), capped to
keep the message well under Discord's size limit.

---------

Co-authored-by: hank <hank@henrygd.me>
2026-09-02 12:46:23 -04:00
henrygd b1895247ba alerts: defer system info unmarshalling for systemd alerts 2026-09-01 21:49:45 -04:00
097180e8d7 feat(alerts): add alert for failed systemd services (#2173)
Adds a user-configurable "Failed Services" alert that notifies when any
tracked systemd service enters the failed state, and again when all services
recover.

---------

Signed-off-by: Martin Stenröse <martin@stenrose.se>
Co-authored-by: henrygd <hank@henrygd.me>
2026-09-01 20:41:48 -04:00
spatiumstasandGitHub ed88e6efae feat(alerts): add CPU state notifications (#2249) 2026-09-01 19:10:31 -04:00
Steven HonsonandGitHub b670224ed8 ui: hide gpu indicator for host without gpu (#2279) 2026-09-01 18:36:09 -04:00
917d069ab3 feat: add ZFS monitoring (#2209)
- track pool capacity, health, I/O, scrub status, and vdev errors
- report dataset usage and correct ZFS filesystem metrics
- add pool charts, detail views, refresh controls, and health alerts
- persist pool details and include ZFS usage in disk alerts
- support configurable detail intervals and legacy agent compatibility

---------

Co-authored-by: hank <hank@henrygd.me>
2026-09-01 12:19:36 -04:00
Sven van GinkelandGitHub b38fb7dafa feat: Add cumulative disk read/write totals to Disk I/O sheet (#2179) 2026-08-30 15:44:18 -04:00
henrygd 8675199e20 fix: preserve battery array encoding with json v2 2026-08-30 14:40:13 -04:00
Aditya Raj SinghandGitHub 3af6512514 fix(hub): don't read the SSH client after it is closed (#2277)
createSessionWithTimeout checked sys.client for nil and then dereferenced
it again inside the goroutine that calls NewSession. update() runs the
SMART fetch in its own goroutine, so closeSSHConnection can clear the
field between those two reads and the goroutine dereferences a nil
client, panicking the whole hub process.

Make client an atomic.Pointer, load it once before starting the
goroutine, and clear it with Swap so a concurrent close cannot be
observed mid-session-creation. NewSession on an already-closed client
returns an error, which the existing retry path already handles.

Closes #2157
2026-08-30 13:34:32 -04:00
Sven van GinkelandGitHub 87620f3251 feat(hub/agent): alphabetical disk ordering and root disk renaming (#2006) 2026-08-30 13:09:04 -04:00
Aditya Raj SinghandGitHub fa9de55433 fix(agent): warn on critical ATA SMART attributes (#2275) 2026-08-30 11:23:52 -04:00
Aditya Raj SinghandGitHub e235c9935c fix(install): generate /etc/machine-id on systems without /proc (#2274)
* fix(install): generate /etc/machine-id on systems without /proc

The install script read the fingerprint UUID from
/proc/sys/kernel/random/uuid, which FreeBSD does not have. On pfSense
the redirect still created /etc/machine-id, cat failed, and the agent
was left with an empty machine-id file. The [ ! -f ] guard then skipped
regeneration on every later run.

Fall back to uuidgen when /proc is unavailable, mirroring how the
script already picks between sha256sum and FreeBSD's sha256, and leave
no file behind when neither source exists.

* fix(install): regenerate empty machine id
2026-08-30 11:12:21 -04:00
Aditya Raj SinghandGitHub 7c60f02802 fix(agent): don't read host CPU and memory totals from a Docker VM (#2272)
refreshSystemDetails() takes NCPU and MemTotal from the Docker daemon's
/info response. That only describes this machine when the daemon shares its
kernel. On macOS and Windows Docker runs inside a Linux VM, so the system
details header shows the VM's memory as the host total, and the VM's CPU
count clamps both cores and threads through the lxc branch below it.

Only consult Docker's host info on platforms where the daemon runs natively.
Everything else already falls back to gopsutil, which reads this host.
2026-08-30 11:09:39 -04:00
Ryan ChouandGitHub 6fe268e463 fix(agent): read TOKEN_FILE like KEY_FILE instead of sending the whole file (#2276) 2026-08-30 10:16:43 -04:00
henrygd 467f176713 i18n: add Greek and update locale files 2026-08-27 15:10:05 -04:00
Erkinjon YusupovandGitHub 4c8e3c69ba feat: add Uzbek (uz) translation (#2034) 2026-08-27 14:58:21 -04:00
hankandGitHub 8dfdacb8f5 i18n: New Crowdin updates (#2234) 2026-08-27 14:49:08 -04:00
henrygd d61b75ffdf deps: upgrade to go 1.27 + upgrade go packages 2026-08-26 14:48:52 -04:00
henrygd d7256c7af7 fix: widen coverage of internal ip space in isInternalIP 2026-08-26 13:42:29 -04:00
henrygd 0ad707288a fix windows sensor mocks and data directory tests 2026-08-26 11:50:19 -04:00
Aditya Raj SinghandGitHub 0bc5470f08 fix(agent): count swap cache as used space (#2267)
SwapCached pages have been read back into memory but still occupy allocated swap slots. Subtracting them from SwapTotal - SwapFree underreported swap usage compared with free, Glances, and gopsutil's canonical SwapMemory metric.
2026-08-26 11:42:40 -04:00
Luke WassandGitHub 4c48fe0c41 fix(agent): carry Intel GPU averages forward between samples (#2256)
Intel GPUs (intel_gpu_top) never report temperature or memory, so the
"suspended card" heuristic in calculateGPUAverage (temp == 0 &&
memoryUsed == 0) fired on every collection that landed between samples.

intel_gpu_top samples every 3.3s (intelGpuStatsInterval) while the hub's
realtime worker collects every 1s, so most realtime collections had no
new sample (delta count 0) and returned an empty GPUData with power
omitted (json "p"/"pp" are omitempty). The frontend derives the GPU
Power Draw series and legend from the latest sample, so the chart and
legend blanked on roughly two of every three or four one-second cycles.

NVIDIA/AMD were unaffected because they report temperature even when
idle, so the heuristic never fired and the last average was already
carried forward.

Gate the zero-return on non-engine (discrete) GPUs so Intel GPUs carry
the last average forward during between-sample gaps, matching the
existing NVIDIA/AMD behavior. Add a regression test.
2026-08-24 10:33:00 -04:00
dependabot[bot]andGitHub 6efe4be648 chore(deps): bump azure/setup-helm from 4 to 5 (#2255) 2026-08-23 12:31:58 -04:00
Aditya Raj SinghandGitHub f1e5797c76 fix(agent): round load average to two decimals (#2245)
Every other metric in getSystemStats is stored through utils.TwoDecimals.
The load averages were assigned straight from gopsutil, so whatever the
platform reported was recorded verbatim.

On Linux that goes unnoticed because /proc/loadavg is already two decimal
places. Everywhere else it is not. macOS and BSD divide a fixed point
value by fscale and produce numbers like 2.55322265625, and the Windows
implementation synthesises the average as a decaying EWMA over the
processor queue length counter, so an idle machine reports values like
1.3667392689044936e-73 instead of 0.

The hub already treats two decimals as the canonical precision for this
field, since records.go rounds the load average when it averages records.
That left the raw agent records as the only place carrying full precision.
2026-08-21 17:30:19 -04:00
henrygd 6f92b9396d fix(hub): user alerts idor
fixes very unlikely scenario where user guesses another user's 15
character random system id and adds alerts for it
2026-08-21 17:25:09 -04:00
MartinandGitHub 946f2e6be1 Report the configured listen address after install (#2243)
The final message always echoed $PORT, which falls back to the default when -p
is not passed. Existing service files are kept as they are, so a plain upgrade
on a host with a custom port reported that the agent runs on 45876 regardless
of the actual configuration.

Read the address from the active service file instead. LISTEN is checked before
PORT to match the agent's own precedence in GetAddress, and the value is read as
text so host:port and unix socket paths are reported as configured.
2026-08-19 11:48:01 -04:00
ba90daf4d6 fix(scripts): update agent env vars on reinstall instead of skipping (#2107)
Co-authored-by: henrygd <hank@henrygd.me>
2026-08-19 11:37:11 -04:00
Toomore ChiangandGitHub aa1d67a122 fix(agent): strip invalid UTF-8 from battery names (#2241)
Battery names come from firmware (sysfs model_name on Linux), which does not
guarantee valid UTF-8. The hub decodes agent payloads using the default
fxamacker/cbor decode mode, which rejects invalid UTF-8, so a single bad byte
in a battery name makes the hub drop the entire payload and mark the system
down until the agent is downgraded.
2026-08-19 11:02:33 -04:00
Alec RubinandGitHub 68a3f8962a fix(agent): read /proc/uptime on linux instead of sysinfo(2) (#2180)
gopsutil's host.Uptime() calls the sysinfo(2) syscall. Inside an LXC
container lxcfs virtualizes /proc/uptime but cannot intercept a
syscall, so every container reported the host's uptime.

Reads /proc/uptime on linux and falls back to host.Uptime() if the file
is missing or unparseable, so other platforms are unchanged.
2026-08-18 15:18:33 -04:00
Ilya MuratovandGitHub 0eb3426619 fix(agent): discover fans on legacy hwmon parent devices (#2238) 2026-08-18 11:32:52 -04:00
Jan DziąsłoandGitHub 96beadc8c9 fix(agent): add fallback for CPU model detection on MIPS architectures (#2138)
gopsutil's cpu.Info() does not parse the 'cpu model' field from
/proc/cpuinfo, which is the only source of CPU model names on MIPS.
Add a fallback that reads /proc/cpuinfo directly and combines
'cpu model' (e.g. 'MIPS 1004Kc V2.15') with 'system type'
(e.g. 'MediaTek MT7621 ver:1 eco:3') for a complete identifier.

The fallback only triggers when gopsutil returns an empty ModelName,
so x86/ARM/other architectures are unaffected.
2026-08-18 10:34:41 -04:00
Sven van GinkelandGitHub 65a6f60304 fix(agent): fix QNAP MD RAID arrays incorrectly reported as FAILED (#2065) 2026-08-18 10:10:12 -04:00
hankandGitHub 54dae08631 chore(helm): update app version to 0.18.8 (#2235) 2026-08-17 17:36:01 -04:00
Pavel ArtsishevskyandGitHub 2df1f722e4 fix(agent): use time-based CPU calc for Podman containers (#2131) v0.18.8 2026-08-17 17:08:57 -04:00
henrygd 2054b276a7 fix(release): avoid duplicate ARM archives (#1884) 2026-08-17 16:49:59 -04:00
henrygd 19f250c7de ci: change release flow actions/setup-go to use go-version: stable 2026-08-17 16:11:00 -04:00
henrygd e07f91b920 release 0.18.8 2026-08-17 16:01:51 -04:00
henrygd 218aa8478a update translations 2026-08-17 15:38:22 -04:00
henrygd 90b789aa72 update changelog 2026-08-17 15:33:32 -04:00
hankandGitHub 2d01d71f46 New Crowdin updates (#1930) 2026-08-17 15:33:16 -04:00
henrygd f894d188cf ci(helm): update chart versions on new beszel release 2026-08-17 14:52:31 -04:00
henrygd 46cc602d37 ci(helm): publish charts to GHCR instead of creating releases 2026-08-17 14:33:40 -04:00
henrygdandDigital 89ad51d4ce fix(agent): distinguish SMART devices sharing the same path
Co-authored-by: Digital <github@crni.xyz>
2026-08-17 13:55:27 -04:00