Skip to content

Reports

What this is

Reports (/reports) is PiHerder’s own history: how backups, OS patches, the LAN census, Docker deploys, Move jobs, and the web console actually went over the last 7 / 30 / 90 days.

Grafana will never know this. It never sees rsync dest size, backup success/fail, apt apply counts, nmap hosts_up, compose deploys, Move dest hosts, or console session time.

It is not a second status dashboard and not a set of jump-chips. Open Dashboard for “what needs care right now.” Open Reports for “how did this week / month go?”

Why it exists

Question Where
Host CPU, disk, container graphs Grafana chips on the host
Who needs patches or has a service down today Dashboard
Backups succeeded vs failed? Is dest growing? Reports → Backups
OS patches applied per host per week / month / year? Reports → OS patches
How many LAN devices were live each day? Reports → LAN live
Docker deploys / image patches ok vs fail? Reports → Docker
How many Moves succeeded vs failed? Where did the last stack land? Reports → Move jobs
How much web console was used (sessions, privileged, duration)? Reports → Console

Sources: Jobs (and the JSON each job stored), nmap scan runs (hosts_up), and Audit (ssh_console_open / close). No SSH and no du on page load.

Where

Header Reports (after Catalog). Phone: hamburger. Viewer+. History tables are read-only.

Layout (v1.5): each card has pin (★, moves to top), ↑ / ↓, and Hide. Hidden cards sit in a Hidden: row — click the name to show again. Reset layout in the hero restores the default order (Backups → OS patches → LAN live → Docker → Console → Move jobs). The choice is remembered in your browser (ph_reports_layout) — not a fleet setting. Old cookies pick up Move jobs at the end.

Cards (v1.10): the Cards: row above the grid is the whole catalog. It is the same six cards. Click a name to hide it, or click a hidden name to show it again. Pin and ↑ / ↓ stay on the card. There is no extra chart, no Grafana panel, and no way to drop a card onto Home.

Reports cards

Cards row. Backups reads hidden. OS patches stays open, with pin, up, down, and Hide. Host names in the table are masked.

Windows: 7 / 30 / 90 days in the app timezone. Some averages still scan up to 365 days of leftover rows.

Reports

Reports — 7 / 30 / 90 day windows, history cards, and v1.5 pin / hide / reorder chrome.

Tables keep numeric columns right-aligned. On a phone, the Day / host column is not clipped — swipe the table sideways to see dates and dest sizes.

Backups

Figure Meaning
Runs / success % Finished backup jobs in the window
Dest after last run Sum of each host’s last successful dest tree size (rsync destination after the run — not bytes transferred; unchanged files still count)
Dest occupancy by day Same dest sizes, carried forward so a quiet day does not drop to zero — that is the growth sparkline
Dest on disk now Last Settings → Status tree/du if one exists
Per host Ok / fail / last dest → host Backups

OS patches

Figure Meaning
Applies Successful os_patch apply jobs (not update-checks)
Packages Parsed from apt N upgraded, M newly installed when that line is in the job payload. Missing on HAOS and many older jobs
Average per host Successful applies (and packages when known) ÷ hosts with OS patch enabled, for week (7d) / month (30d) / year (365d)

LAN live

Figure Meaning
Live (last scan day) hosts_up from the last successful nmap scan run that day (all LAN integrations summed)
By day Same count carried forward when no scan ran
Average live Mean / min / max of that daily occupancy for week / month / year
Catalog now Current devices: live (new/known/linked) vs offline (stale) vs ignored — a snapshot, not history
First seen Devices whose first_seen_at falls in the window

Quiet days keep yesterday’s census. Overlapping CIDRs on two nmap integrations can double-count.

Docker

Figure Meaning
Stack deploys docker_stack_deploy plus stop/start/restart and template deploy/redeploy
Image patches container_patch apply jobs
Running now Last Docker inventory snapshot (running / total / stacks) — not a daily census; we do not store container counts per day
Per day / host Ok vs fail for deploys and patches

Move jobs

Figure Meaning
Moves Finished service_migrate jobs in the window
Success / failed Ok vs fail (copy, dest-up, worker recycle, preflight)
Last dest Destination host of the last successful Move in the window (or last finished if none succeeded)
Per day / source Ok / fail; last dest is project → dest-host

Job history only — no live two-host probe on page load. Move a service is the wizard; this card is how the week went.

Console

Figure Meaning
Sessions ssh_console_open audit rows (works even when command audit is off)
Privileged Opens whose identity is privileged:…
Duration Sum of duration_sec on ssh_console_close
Denied ssh_console_denied
Commands logged ConsoleTranscript.command_count — only when Settings → Console audit is on

Limits

  • Job retention (Settings → Cleanup) deletes old Jobs. Default off; if you purge at 30 days, year averages only see 30 days.
  • Audit purge (same Cleanup card) trims console session history.
  • nmap run purge is a separate Cleanup switch (default off). LAN live uses NmapScanRun, not Jobs.
  • No time-series database. This is a scan of existing rows.
  • Not Grafana: no PromQL, no host CPU/RAM, no custom SQL, no export this freeze.