How to Monitor Drive Health with Scrutiny (SMART Data on a Dashboard, with Real Failure Odds)

Every drive's health on one page: Scrutiny grades SMART attributes against real failure statistics and tells you when to order a replacement.

smartctl (tutorial 56) shows the numbers; smartd emails on thresholds. Scrutiny adds the judgement: it collects SMART data from every drive, graphs each attribute over months, and grades them against Backblaze's published statistics from hundreds of thousands of drives — so a rising reallocated-sector count shows as "this attribute correlates with a 30% annual failure rate", not just a number. With mergerfs or ZFS pools of mismatched drives (tutorials 97–99), it's the page to glance at monthly.

Quick reference

TaskWhat
Folder~/docker/scrutiny/compose.yaml (web + collector)
Webhttp://server-ip:8086
Collector on another machinethe scrutiny-collector container pointing at this API
Schedulecollector runs every 15 min by default (COLLECTOR_CRON_SCHEDULE)
Alerts./config/scrutiny.yaml → notify urls (ntfy, Telegram, email)
USB drives-d sat device entries in the collector config

1. The compose file

mkdir -p ~/docker/scrutiny/{config,influxdb} && cd ~/docker/scrutiny
nano compose.yaml

services:
scrutiny:
image: ghcr.io/analogj/scrutiny:master-omnibus
container_name: scrutiny
ports:
- "8086:8080"
cap_add:
- SYS_RAWIO
- SYS_ADMIN
volumes:
- /run/udev:/run/udev:ro
- ./config:/opt/scrutiny/config
- ./influxdb:/opt/scrutiny/influxdb
devices:
- /dev/sda
- /dev/sdb
- /dev/sdc
- /dev/nvme0
restart: unless-stopped

The omnibus image bundles the web UI, the database and a collector. List every drive under devices (lsblk -d for the names; NVMe as /dev/nvme0, not nvme0n1).

docker compose up -d
sudo ufw allow from 192.168.1.0/24 to any port 8086

Open http://192.168.1.50:8086. The first collection runs on start; drives appear with a status, temperature and a summary of their attributes.

2. Reading the dashboard

Each drive card: Passed / Failed per SMART's own verdict and per Scrutiny's thresholds, power-on hours, temperature. Click a drive for every attribute with a history graph, and the Backblaze-derived failure rate column — the number that tells you which warning matters. A drive with "Failed (Scrutiny)" but "Passed (SMART)" is the point of the tool: SMART only says failed when it's nearly dead.

Settings (cog, top right): choose metric thresholds (Scrutiny, SMART, or both), temperature units, and how long to keep history.

3. Collect from other machines

On the Pi (or any box with drives):

docker run -d --name scrutiny-collector --restart unless-stopped \
--cap-add SYS_RAWIO --cap-add SYS_ADMIN -v /run/udev:/run/udev:ro \
--device /dev/sda --device /dev/sdb \
-e COLLECTOR_API_ENDPOINT=http://192.168.1.50:8086 \
-e COLLECTOR_HOST_ID=pi \
ghcr.io/analogj/scrutiny:master-collector

Its drives join the same dashboard under the host name pi. Every machine with a disk, one page.

4. USB drives and odd controllers

If a drive shows no data, the collector needs a hint. ./config/collector.yaml:

devices:
- device: /dev/sdb
type: sat

(sat for most USB adapters; megaraid,N for RAID cards.) Restart the container.

5. Notifications

nano config/scrutiny.yaml

notify:
urls:
- "ntfy://:TOKEN@ntfy.example.com/server"
- "telegram://TOKEN@telegram?chats=CHATID"

Shoutrrr format, same as Watchtower (tutorial 50). Settings → Send test notification proves it. From then on a drive crossing a threshold — or a change in a critical attribute — reaches your phone, with the drive's name and the attribute.

Scrutiny and smartd

Both can run. smartd still runs the scheduled self-tests (short nightly, long weekly, tutorial 56); Scrutiny reads the results and the attributes and does the graphing and grading. Set -n standby in smartd and the default 15-minute collector interval so sleeping drives (tutorial 119) aren't woken constantly — Scrutiny's collector respects standby by default.

Troubleshooting

No drives on the dashboard. The devices list is missing them, or the capabilities. docker compose logs scrutiny | grep -i error.

A drive shows but with no attributes. USB adapter: add the sat type; some cheap adapters simply don't pass SMART.

Temperature history flat. Drives asleep and the collector honouring standby — correct. Wake them by using them.

Everything shows "Failed" after an update. Threshold mode changed to the strict Scrutiny set; review the attributes — often one drive with an old pending-sector count; adjust per drive in its settings if it's known and stable.

Wrapping up

One omnibus container with the drives passed through, collectors on the other boxes, ntfy in the config. The SMART numbers you'd otherwise read once a month become graphs with failure odds beside them, and the message "order a replacement for sdb" arrives weeks before the drive makes the decision for you.

Call us