The ~7,600-line app.py monolith is now a proper backend/ module tree — behavior unchanged, backed by a 71-snapshot test suite and a CI gate that fails the build on a silent except: pass. Separately, container/service start-stop-restart controls (plus self-update) flip from opt-in to on by default — worth a glance at your compose file before you upgrade.
Changed
- Container/service start-stop-restart controls, and self-update, are now on by default. Previously both needed explicit opt-in (
ENABLE_CONTROLS=1,ALLOW_SELF_UPDATE=1). The shippeddocker-compose.ymlnow mounts the Docker and D-Bus sockets read-write by default so both write paths work out of the box. Want the old fully read-only posture back? Bring the stack up with the newdocker-compose.readonly.ymloverride, or set either flag to0. Containers: local host only for now. Services: local systemd, remote Linux/Unix (SSH + systemctl), remote Windows (SSH + PowerShell). Buttons stay disabled with an explanation when the underlying sockets aren't present; a real failure (permission denied, non-admin Windows session) surfaces the actual error, never a generic one. (#229)
Added / Internal
app.pyextracted into abackend/module tree. All 54 routes, every collector, probe and notify path, and all DB access now live inbackend/api/,backend/collectors/,backend/probes/,backend/notify/andbackend/db/(thread-local connections, a versioned migration runner, repo shims instead of raw SQL scattered everywhere) — HTTP responses byte-identical (71-snapshot suite). New rollup tables (samples_1h/net_samples_1h) make long-range Costs/heatmap queries cheap. Alert edge-state (_NOTIFIED, uptime down-since) now persists to the DB, so a restart no longer risks a duplicate or missed alert. Each background worker runs in its own thread with a watchdog that logs a stall instead of hanging silently. (backend architecture refactor by @pehota, #230)
Full changelog: https://github.com/SikamikanikoBG/homelab-monitor/blob/main/CHANGELOG.md