Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
103 commits
Select commit Hold shift + click to select a range
52972b2
chore(deps): bump @angular-eslint/schematics in /webapp/frontend
dependabot[bot] May 18, 2026
c461109
chore(deps): bump ng-apexcharts from 2.3.0 to 2.4.0 in /webapp/frontend
dependabot[bot] May 18, 2026
d3cb84a
chore(deps): bump eslint-plugin-prettier in /webapp/frontend
dependabot[bot] May 18, 2026
999fe72
chore(deps): bump github.com/go-gormigrate/gormigrate/v2
dependabot[bot] Jun 4, 2026
2bd67aa
chore(deps): bump github.com/nicholas-fedor/shoutrrr
dependabot[bot] Jun 8, 2026
0de62db
chore(deps): bump the dev-dependencies group across 1 directory with …
dependabot[bot] Jun 8, 2026
6432a2c
feat(notify): add heartbeat_enabled field to notify_urls
Starosdev Jun 8, 2026
51d8662
feat(notify): LoadHeartbeatDatabaseUrls filters by heartbeat_enabled
Starosdev Jun 8, 2026
24f359a
feat(heartbeat): filter notify URLs by heartbeat_enabled
Starosdev Jun 8, 2026
99bb242
feat(api): expose and update heartbeat_enabled on notify URLs
Starosdev Jun 8, 2026
e6bbfea
feat(ui): add heartbeat toggle per notification URL
Starosdev Jun 8, 2026
8c375c2
fix(api): return 404 when heartbeat toggle targets non-existent notif…
Starosdev Jun 8, 2026
8f59d18
Merge pull request #601 from Starosdev/feature/SCR-521-heartbeat-url-…
Starosdev Jun 9, 2026
6e1f66e
Merge remote-tracking branch 'origin/master' into develop
github-actions[bot] Jun 9, 2026
8ceb12b
feat(ui): add contextual help links for settings docs (#492)
Starosdev Jun 9, 2026
7b484a0
feat(ui): add contextual help links pointing to docs folder (#492)
Starosdev Jun 9, 2026
fca1ae3
feat(ui): add navigation visibility settings for ZFS, MDADM, Btrfs, W…
Starosdev Jun 9, 2026
ba5b6c3
fix(ui): style learn more link in Consumer Drive Profiles hint (#492)
Starosdev Jun 9, 2026
3e3aa73
feat(ui): group MDADM and Workload pages by host (#579)
Starosdev Jun 9, 2026
e05f438
Merge pull request #584 from Starosdev/dependabot/go_modules/develop/…
Starosdev Jun 10, 2026
4fded14
Merge pull request #597 from Starosdev/dependabot/go_modules/develop/…
Starosdev Jun 10, 2026
ea5281d
Merge pull request #525 from Starosdev/dependabot/npm_and_yarn/webapp…
Starosdev Jun 10, 2026
b078941
Merge pull request #526 from Starosdev/dependabot/npm_and_yarn/webapp…
Starosdev Jun 10, 2026
080b0e2
Merge pull request #527 from Starosdev/dependabot/npm_and_yarn/webapp…
Starosdev Jun 10, 2026
2684685
Merge pull request #598 from Starosdev/dependabot/npm_and_yarn/webapp…
Starosdev Jun 10, 2026
be1dd65
chore(ui): fix prettier formatting in mobile-tab-bar
Starosdev Jun 11, 2026
2755d9c
test(ui): provide ScrutinyConfigService mock in mobile-tab-bar spec
Starosdev Jun 11, 2026
8158a34
fix(db): simplify migration func to satisfy unlambda linter
Starosdev Jun 11, 2026
231aef3
Merge remote-tracking branch 'origin/master' into develop
github-actions[bot] Jun 11, 2026
7e26ccb
Merge remote-tracking branch 'origin/master' into develop
github-actions[bot] Jun 11, 2026
87c825b
[SCR-491] v1.0.0 — Persist ATA SMART self-test history
Starosdev Jun 17, 2026
91ac8f3
[SCR-491] v1.1.0 — Add SMART self-test history endpoint
Starosdev Jun 17, 2026
5f1f391
[SCR-491] v1.2.0 — Show SMART self-test history in device details
Starosdev Jun 17, 2026
770b5e5
[SCR-491] v1.3.0 — Document ATA self-test history API and UI
Starosdev Jun 17, 2026
2f9a205
[SCR-471] v1.0.0 — Add dashboard column and density controls
Starosdev Jun 17, 2026
be05416
fix(backend): satisfy gocritic hugeParam and govet fieldalignment lint
Starosdev Jun 18, 2026
e027c33
fix(backend): pass SmartInfo by pointer to syncDeviceSelfTests (hugeP…
Starosdev Jun 18, 2026
5bb85be
Merge remote-tracking branch 'origin/master' into beta
Starosdev Jun 18, 2026
ff703c7
Merge remote-tracking branch 'origin/master' into develop
Starosdev Jun 18, 2026
7fa38cc
Merge remote-tracking branch 'origin/master' into beta
github-actions[bot] Jun 18, 2026
7f38124
Merge remote-tracking branch 'origin/master' into develop
github-actions[bot] Jun 18, 2026
35f46e1
ci(sync): open PR on conflict instead of failing branch sync
Starosdev Jun 18, 2026
10d0a1c
Merge remote-tracking branch 'origin/master' into beta
github-actions[bot] Jun 18, 2026
9a27bcc
Merge remote-tracking branch 'origin/master' into develop
github-actions[bot] Jun 18, 2026
b82e0f5
refactor(measurements): reduce cognitive complexity in smart.go (#616)
Starosdev Jun 18, 2026
dedf386
refactor(collector): reduce cognitive complexity in collector command…
Starosdev Jun 18, 2026
249d836
refactor(notify): reduce cognitive complexity in notification senders…
Starosdev Jun 18, 2026
b2e5a9d
refactor(collector): reduce cognitive complexity in device detection …
Starosdev Jun 18, 2026
278cd44
refactor(frontend): reduce cognitive complexity in components (#620)
Starosdev Jun 18, 2026
4990d88
refactor(database): reduce cognitive complexity in repository (#621)
Starosdev Jun 18, 2026
900e4c3
refactor(models): reduce cognitive complexity in measurement models (…
Starosdev Jun 18, 2026
8695dc8
refactor(web): reduce cognitive complexity in middleware and monitors…
Starosdev Jun 19, 2026
037c82d
refactor(database): reduce cognitive complexity in the migration runn…
Starosdev Jun 19, 2026
0f4f987
Merge remote-tracking branch 'origin/develop' into beta
Starosdev Jun 19, 2026
390de8b
feat(thresholds): detect Power-On Hours 16-bit counter rollover (#595…
Starosdev Jun 19, 2026
9224eff
chore(release): 1.65.0-beta.1
semantic-release-bot Jun 20, 2026
367c44f
Merge remote-tracking branch 'origin/master' into develop
github-actions[bot] Jun 29, 2026
9f0e4c2
Merge remote-tracking branch 'origin/master' into develop
github-actions[bot] Jun 29, 2026
8975cd5
Merge remote-tracking branch 'origin/master' into develop
github-actions[bot] Jun 29, 2026
0dc8048
fix(ui): dark mode tokens for settings dialog and dropdowns
Starosdev Jun 29, 2026
b70bc93
Merge remote-tracking branch 'origin/master' into beta
github-actions[bot] Jun 29, 2026
0e3b584
Merge remote-tracking branch 'origin/master' into develop
github-actions[bot] Jun 29, 2026
09bdb93
feat: enhance ATA consumer-drive profile pipeline, matching, and obse…
Starosdev Jul 1, 2026
8d5b6e5
chore: gitignore local architecture knowledge base (#641)
Starosdev Jul 2, 2026
f108e63
Merge remote-tracking branch 'origin/develop' into beta
Starosdev Jul 2, 2026
d179c06
chore(deps): bump golang.org/x/sync from 0.20.0 to 0.21.0 (#604)
dependabot[bot] Jul 2, 2026
f08a731
chore(deps): bump github.com/nicholas-fedor/shoutrrr from 0.16.0 to 0…
dependabot[bot] Jul 2, 2026
dfd4fb8
chore(deps): bump the dev-dependencies group across 1 directory with …
dependabot[bot] Jul 2, 2026
739f420
Merge remote-tracking branch 'origin/master' into beta
github-actions[bot] Jul 2, 2026
c28195d
Merge remote-tracking branch 'origin/master' into beta
github-actions[bot] Jul 2, 2026
f5990f5
Merge remote-tracking branch 'origin/master' into develop
github-actions[bot] Jul 2, 2026
7d5e3e2
Merge remote-tracking branch 'origin/master' into beta
github-actions[bot] Jul 2, 2026
4bc5d73
Merge remote-tracking branch 'origin/master' into beta
github-actions[bot] Jul 2, 2026
d75d746
Merge remote-tracking branch 'origin/master' into develop
github-actions[bot] Jul 2, 2026
9bcfb3c
Merge remote-tracking branch 'origin/master' into develop
github-actions[bot] Jul 2, 2026
25117ba
chore(deps): bump gorm.io/gorm from 1.31.1 to 1.31.2 (#635)
dependabot[bot] Jul 2, 2026
040bae2
chore(deps): bump @angular/cli from 21.2.10 to 22.0.5 in /webapp/fron…
dependabot[bot] Jul 2, 2026
d99c56d
chore(deps): bump @angular-eslint/template-parser from 21.3.1 to 22.0…
dependabot[bot] Jul 2, 2026
b4ecc4f
chore(ci): bump actions/checkout from 6 to 7 (#627)
dependabot[bot] Jul 2, 2026
640dcd0
Merge remote-tracking branch 'origin/develop' into codex/sync-beta-fr…
Starosdev Jul 2, 2026
0616c3f
Merge remote-tracking branch 'origin/master' into beta
github-actions[bot] Jul 3, 2026
50e1860
Merge remote-tracking branch 'origin/master' into develop
github-actions[bot] Jul 3, 2026
0ba5567
Merge remote-tracking branch 'origin/master' into beta
github-actions[bot] Jul 4, 2026
450b2e7
Merge remote-tracking branch 'origin/master' into develop
github-actions[bot] Jul 4, 2026
10ac295
Merge remote-tracking branch 'origin/master' into beta
github-actions[bot] Jul 4, 2026
76c17ad
Merge remote-tracking branch 'origin/master' into develop
github-actions[bot] Jul 4, 2026
5a3b6fc
[SCR-587] v1.65.1 — Prevent false ATA SSD SMART failures
Starosdev Jul 6, 2026
3d3c7ff
Merge remote-tracking branch 'origin/develop' into codex/merge-develo…
Starosdev Jul 7, 2026
07de6a5
fix(ci): pass ATA metadata helper by pointer
Starosdev Jul 7, 2026
7392ff1
Merge remote-tracking branch 'origin/master' into beta
github-actions[bot] Jul 7, 2026
89bb1a4
Merge remote-tracking branch 'origin/master' into beta
github-actions[bot] Jul 8, 2026
341c880
fix(logging): honor startup log level and suppress banner
Starosdev Jul 8, 2026
976c8ea
feat(docker): add collector omnibus spoke image
Starosdev Jul 8, 2026
23ea370
fix(mdadm): persist host_id on array re-registration (#640)
Starosdev Jul 8, 2026
231985f
fix(logging): structure startup service logs
Starosdev Jul 9, 2026
f4d2267
docs(logging): clarify startup banner behavior
Starosdev Jul 9, 2026
410c22c
fix(mdadm): handle missing array devices (#653)
Starosdev Jul 10, 2026
9963b59
docs(deploy): update develop env mapping
Starosdev Jul 11, 2026
1599e60
fix(deps): update influxdb version to 2.9 (#655)
deenle Jul 15, 2026
3328426
chore(sync): reconcile develop and beta
Starosdev Jul 15, 2026
cf5cb57
Merge pull request #659 from Starosdev/codex/sync-beta-from-develop-2…
Starosdev Jul 15, 2026
2123d7a
docs(deploy): document Zeus rebuild preflight
Starosdev Jul 15, 2026
dd6fc27
Merge pull request #660 from Starosdev/codex/docs-zeus-rebuild-preflight
Starosdev Jul 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,15 @@ jobs:
# Service containers to run with `build` (Required for end-to-end testing)
services:
influxdb:
image: influxdb:2.2
image: influxdb:2.9
env:
DOCKER_INFLUXDB_INIT_MODE: setup
DOCKER_INFLUXDB_INIT_USERNAME: admin
DOCKER_INFLUXDB_INIT_PASSWORD: password12345
DOCKER_INFLUXDB_INIT_ORG: scrutiny
DOCKER_INFLUXDB_INIT_BUCKET: metrics
DOCKER_INFLUXDB_INIT_ADMIN_TOKEN: my-super-secret-auth-token
INFLUXD_USE_HASHED_TOKENS: "false"
ports:
- 8086:8086
env:
Expand Down
60 changes: 60 additions & 0 deletions .github/workflows/docker-build.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,66 @@ jobs:
cache-from: type=gha,scope=docker-collector
cache-to: type=gha,mode=max,scope=docker-collector

collector-omnibus:
runs-on: ubuntu-latest
timeout-minutes: 30
permissions:
contents: read
packages: write

steps:
- name: Checkout repository
uses: actions/checkout@v7
with:
fetch-depth: 0

- name: Set up QEMU
uses: docker/setup-qemu-action@v4
with:
platforms: 'arm64,arm'

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v4

- name: Log into registry ${{ env.REGISTRY }}
if: github.event_name != 'pull_request'
uses: docker/login-action@v4
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Extract Docker metadata
id: meta
uses: docker/metadata-action@v6
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
flavor: |
latest=false
tags: |
# Manual trigger
type=raw,value=${{ inputs.tag_suffix }}-collector-omnibus,enable=${{ github.event_name == 'workflow_dispatch' }}
# Branch builds
type=raw,value=latest-collector-omnibus,enable=${{ (github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags/v')) && github.event_name != 'workflow_dispatch' }}
type=raw,value=beta-collector-omnibus,enable=${{ github.ref == 'refs/heads/beta' && github.event_name != 'workflow_dispatch' }}
type=raw,value=develop-collector-omnibus,enable=${{ github.ref == 'refs/heads/develop' && github.event_name != 'workflow_dispatch' }}
# Version tags
type=semver,pattern={{version}}-collector-omnibus
type=semver,pattern={{major}}.{{minor}}-collector-omnibus
type=semver,pattern={{major}}-collector-omnibus,enable=${{ !startsWith(github.ref, 'refs/tags/v0.') }}

- name: Build and push Docker image
uses: docker/build-push-action@v7
with:
platforms: linux/amd64,linux/arm64
context: .
file: docker/Dockerfile.collector-omnibus
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha,scope=docker-collector-omnibus
cache-to: type=gha,mode=max,scope=docker-collector-omnibus

collector-zfs:
runs-on: ubuntu-latest
timeout-minutes: 30
Expand Down
3 changes: 2 additions & 1 deletion .github/workflows/sonarqube.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,15 @@ jobs:
runs-on: ubuntu-latest
services:
influxdb:
image: influxdb:2.2
image: influxdb:2.9
env:
DOCKER_INFLUXDB_INIT_MODE: setup
DOCKER_INFLUXDB_INIT_USERNAME: admin
DOCKER_INFLUXDB_INIT_PASSWORD: password12345
DOCKER_INFLUXDB_INIT_ORG: scrutiny
DOCKER_INFLUXDB_INIT_BUCKET: metrics
DOCKER_INFLUXDB_INIT_ADMIN_TOKEN: my-super-secret-auth-token
INFLUXD_USE_HASHED_TOKENS: "false"
ports:
- 8086:8086
env:
Expand Down
9 changes: 5 additions & 4 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ unless the task specifically requires host-level device access from Zeus.
```
4. if you need a Dockerized InfluxDB dependency, start it on Zeus rather than on this Mac.
```bash
docker run -p 8086:8086 --rm influxdb:2.2
docker run -p 8086:8086 -e INFLUXD_USE_HASHED_TOKENS=false --rm influxdb:2.9
```
5. start the scrutiny web server
```bash
Expand Down Expand Up @@ -151,7 +151,7 @@ you'll need to follow the steps below:
```
4. start a InfluxDB docker container.
```bash
docker run -p 8086:8086 --rm influxdb:2.2
docker run -p 8086:8086 -e INFLUXD_USE_HASHED_TOKENS=false --rm influxdb:2.9
```
5. build the Angular Frontend Application
```bash
Expand All @@ -175,7 +175,7 @@ If you'd like to populate the database with some test data, you can run the fol
> This is done automatically by the `webapp/backend/pkg/models/testdata/helper.go` script

```
docker run -p 8086:8086 --rm influxdb:2.2
docker run -p 8086:8086 -e INFLUXD_USE_HASHED_TOKENS=false --rm influxdb:2.9


# curl -X POST -H "Content-Type: application/json" -d @webapp/backend/pkg/web/testdata/register-devices-req.json localhost:8080/api/devices/register
Expand Down Expand Up @@ -249,7 +249,8 @@ docker run -p 8086:8086 -d --rm \
-e DOCKER_INFLUXDB_INIT_ORG=scrutiny \
-e DOCKER_INFLUXDB_INIT_BUCKET=metrics \
-e DOCKER_INFLUXDB_INIT_ADMIN_TOKEN=my-super-secret-auth-token \
influxdb:2.2
-e INFLUXD_USE_HASHED_TOKENS=false \
influxdb:2.9

go test ./... # Run all tests
go test -v ./webapp/backend/pkg/web/... # Run tests in specific package
Expand Down
5 changes: 5 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -212,6 +212,11 @@ docker-collector:
@echo "building collector docker image"
docker build $(DOCKER_TARGETARCH_BUILD_ARG) -f docker/Dockerfile.collector -t ghcr.io/starosdev/scrutiny-dev:collector .

.PHONY: docker-collector-omnibus
docker-collector-omnibus:
@echo "building collector omnibus docker image"
docker build $(DOCKER_TARGETARCH_BUILD_ARG) -f docker/Dockerfile.collector-omnibus -t ghcr.io/starosdev/scrutiny-dev:collector-omnibus .

.PHONY: docker-collector-zfs
docker-collector-zfs:
@echo "building ZFS collector docker image"
Expand Down
39 changes: 31 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -77,12 +77,13 @@ This repository also owns the testing and production deployment definitions for
- Beta images publish from the `beta` branch through [`Publish Beta Image`](./.github/workflows/deploy-beta.yml)
- Production deploys from the `master` branch through [`Automated Release and Deploy`](./.github/workflows/release-and-deploy.yml)
- `beta` is an optional pre-release channel for features that need validation before going to `master`
- Zeus production and testing are separate host appdata trees:
- Zeus currently runs separate develop, beta, and production host appdata trees:
- develop: `/mnt/user/appdata/scrutiny-develop`
- beta: `/mnt/user/appdata/scrutiny-beta`
- production: `/mnt/user/appdata/scrutiny`
- testing: `/mnt/user/appdata/scrutiny-dev`
- Zeus host-side deploy helpers target the live appdata-root compose files, not the repo `deploy/*` example compose files:
- develop helper: `/mnt/user/appdata/scrutiny-develop/docker-compose.yml`
- production helper: `/mnt/user/appdata/scrutiny/docker-compose.yml`
- testing helper: `/mnt/user/appdata/scrutiny-dev/docker-compose.yml`
- Host smoke checks require `/api/health` to return `200`, while the root path may legitimately redirect depending on auth or proxy behavior.
- Deployment compose files, env templates, and host expectations live in [docs/DEPLOYMENTS.md](./docs/DEPLOYMENTS.md)

Expand Down Expand Up @@ -247,6 +248,9 @@ the following Docker images:

- `ghcr.io/starosdev/scrutiny:latest-collector` - Contains the Scrutiny data collector, `smartctl` binary and cron-like
scheduler. You can run one collector on each server.
- `ghcr.io/starosdev/scrutiny:latest-collector-omnibus` - Recommended single-spoke image for hub/spoke deployments.
Bundles the SMART, ZFS, MDADM, Btrfs, filesystem, and performance collectors in one container while keeping each
optional collector disabled until you enable its existing schedule or run-on-startup env vars.
- `ghcr.io/starosdev/scrutiny:latest-collector-zfs` - ZFS pool collector for monitoring ZFS health.
Run alongside or instead of the standard collector if you use ZFS. See [docs/ZFS_POOL_MONITORING.md](./docs/ZFS_POOL_MONITORING.md) for setup instructions.
- `ghcr.io/starosdev/scrutiny:latest-collector-mdadm` - MDADM collector for Linux software RAID monitoring.
Expand All @@ -256,7 +260,7 @@ the following Docker images:
- `ghcr.io/starosdev/scrutiny:latest-collector-performance` - Performance benchmark collector using fio.
Runs periodic benchmarks and tracks throughput, IOPS, and latency over time. See [Performance Benchmarking](#performance-benchmarking) for details.
- `ghcr.io/starosdev/scrutiny:latest-web` - Contains the Web UI and API. Only one container necessary
- `influxdb:2.2` - InfluxDB image, used by the Web container to persist SMART data. Only one container necessary.
- `influxdb:2.9` - InfluxDB image, used by the Web container to persist SMART data. Only one container necessary.
See [docs/TROUBLESHOOTING_INFLUXDB.md](./docs/TROUBLESHOOTING_INFLUXDB.md)

Branch channel tags follow the same pattern across images:
Expand All @@ -268,15 +272,16 @@ Branch channel tags follow the same pattern across images:
Default CI image publishing currently builds:

- `collector` for `linux/amd64`, `linux/arm64`, and `linux/arm/v7`
- `web`, `collector-zfs`, `collector-mdadm`, `collector-btrfs`, and `collector-performance` for `linux/amd64` and `linux/arm64`
- `collector-omnibus`, `web`, `collector-zfs`, `collector-mdadm`, `collector-btrfs`, and `collector-performance` for `linux/amd64` and `linux/arm64`

> See [docker/example.hubspoke.docker-compose.yml](docker/example.hubspoke.docker-compose.yml) for a docker-compose file.

```bash
docker run -p 8086:8086 --restart unless-stopped \
-v `pwd`/influxdb2:/var/lib/influxdb2 \
-e INFLUXD_USE_HASHED_TOKENS=false \
--name scrutiny-influxdb \
influxdb:2.2
influxdb:2.9

docker run -p 8080:8080 --restart unless-stopped \
-v `pwd`/scrutiny:/opt/scrutiny/config \
Expand All @@ -286,13 +291,17 @@ docker run -p 8080:8080 --restart unless-stopped \
docker run --restart unless-stopped \
-v /run/udev:/run/udev:ro \
--cap-add SYS_RAWIO \
--cap-add SYS_ADMIN \
--device=/dev/sda \
--device=/dev/sdb \
-e COLLECTOR_API_ENDPOINT=http://SCRUTINY_WEB_IPADDRESS:8080 \
--name scrutiny-collector \
ghcr.io/starosdev/scrutiny:latest-collector
ghcr.io/starosdev/scrutiny:latest-collector-omnibus
```

Use `ghcr.io/starosdev/scrutiny:latest-collector` instead if you only want the SMART collector in that spoke and do not
need the extra host tooling for ZFS, MDADM, Btrfs, filesystem, or fio workloads.

## Manual Installation (without-Docker)

While the easiest way to get started with Scrutiny is using Docker (see above),
Expand Down Expand Up @@ -335,7 +344,8 @@ None of these files are required, however if provided, they allow you to configu

## Cron Schedule
Unfortunately the Cron schedule cannot be configured via the `collector.yaml` (as the collector binary needs to be triggered by a scheduler/cron).
However, if you are using the official `ghcr.io/starosdev/scrutiny:latest-collector` or `ghcr.io/starosdev/scrutiny:latest-omnibus` docker images,
However, if you are using the official `ghcr.io/starosdev/scrutiny:latest-collector`, `ghcr.io/starosdev/scrutiny:latest-collector-omnibus`,
or `ghcr.io/starosdev/scrutiny:latest-omnibus` docker images,
you can use the `COLLECTOR_CRON_SCHEDULE` environmental variable to override the default cron schedule (daily @ midnight - `0 0 * * *`).

`docker run -e COLLECTOR_CRON_SCHEDULE="0 0 * * *" ...`
Expand Down Expand Up @@ -695,6 +705,12 @@ The test route sends through the same configured targets as normal notifications
Scrutiny provides various methods to change the log level and generate log files.
The web server and collector have **independent** log configurations and can be set separately.

## Shared Startup Banner Suppression

Set `SCRUTINY_NO_LOGO=true` to suppress the ASCII startup banner in the web binary and all container-facing collector binaries.

By default, the banner is still printed during startup. This env var is evaluated at process startup, so it works alongside `SCRUTINY_LOG_LEVEL` and `COLLECTOR_LOG_LEVEL` when you want quiet `WARN` or `ERROR` startup behavior without changing the default banner behavior for other runs.

## Valid Log Levels

The following log levels are supported (case-insensitive), listed from highest to lowest severity:
Expand All @@ -718,6 +734,7 @@ You can use environmental variables to enable debug logging and/or log files for

```bash
DEBUG=true
SCRUTINY_NO_LOGO=true
SCRUTINY_LOG_FILE=/tmp/web.log
```

Expand Down Expand Up @@ -799,6 +816,7 @@ Example:
```bash
docker run -e SCRUTINY_WEB_LISTEN_PORT=9090 \
-e SCRUTINY_WEB_INFLUXDB_HOST=influxdb.local \
-e SCRUTINY_NO_LOGO=true \
-e SCRUTINY_LOG_LEVEL=DEBUG \
ghcr.io/starosdev/scrutiny:latest-web
```
Expand All @@ -809,6 +827,7 @@ You can use environmental variables to enable debug logging and/or log files for

```bash
DEBUG=true
SCRUTINY_NO_LOGO=true
COLLECTOR_LOG_FILE=/tmp/collector.log
```

Expand Down Expand Up @@ -846,6 +865,7 @@ Example:
```bash
docker run -e COLLECTOR_COMMANDS_METRICS_SMART_ARGS="--xall --json -T permissive" \
-e COLLECTOR_API_ENDPOINT=http://scrutiny-web:8080 \
-e SCRUTINY_NO_LOGO=true \
ghcr.io/starosdev/scrutiny:latest-collector
```

Expand All @@ -865,6 +885,7 @@ The performance collector is a separate binary (`scrutiny-collector-performance`

```bash
DEBUG=true
SCRUTINY_NO_LOGO=true
COLLECTOR_PERF_LOG_FILE=/tmp/performance.log
```

Expand Down Expand Up @@ -937,6 +958,8 @@ The MDADM collector prefers its own config file, `collector-mdadm.yaml`, and fal

For mounts, capabilities, compose examples, and troubleshooting, see [docs/MDADM_MONITORING.md](docs/MDADM_MONITORING.md).

If you upgrade from a build that registered MDADM arrays before `host_id` was persisted on re-registration, run one fresh MDADM collection on each affected host so grouped host headings can backfill correctly in the UI.

# Supported Architectures

| Architecture Name | Binaries | Docker |
Expand Down
29 changes: 23 additions & 6 deletions TESTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ main repository.

```bash
# Run all backend tests
docker run -p 8086:8086 -d --rm influxdb:2.2 # InfluxDB required
docker run -p 8086:8086 -d -e INFLUXD_USE_HASHED_TOKENS=false --rm influxdb:2.9 # InfluxDB required
go test ./...

# Run all frontend tests
Expand Down Expand Up @@ -96,7 +96,8 @@ docker run -p 8086:8086 -d --rm \
-e DOCKER_INFLUXDB_INIT_ORG=scrutiny \
-e DOCKER_INFLUXDB_INIT_BUCKET=metrics \
-e DOCKER_INFLUXDB_INIT_ADMIN_TOKEN=my-super-secret-auth-token \
influxdb:2.2
-e INFLUXD_USE_HASHED_TOKENS=false \
influxdb:2.9
```

Then run tests:
Expand Down Expand Up @@ -189,7 +190,7 @@ npm run lint:fix # Auto-fix what it can

## 3. Building Docker Images Locally

The project produces five Docker images. Build whichever you need to test:
Build whichever image matches the path you changed:

```bash
# Omnibus (web + all collectors + InfluxDB, all-in-one)
Expand All @@ -204,10 +205,22 @@ make docker-web
make docker-collector
# -> ghcr.io/starosdev/scrutiny-dev:collector

# Single-container hub/spoke collector bundle
make docker-collector-omnibus
# -> ghcr.io/starosdev/scrutiny-dev:collector-omnibus

# ZFS collector only
make docker-collector-zfs
# -> ghcr.io/starosdev/scrutiny-dev:collector-zfs

# MDADM collector only
make docker-collector-mdadm
# -> ghcr.io/starosdev/scrutiny-dev:collector-mdadm

# Btrfs collector only
make docker-collector-btrfs
# -> ghcr.io/starosdev/scrutiny-dev:collector-btrfs

# Performance collector only
make docker-collector-performance
# -> ghcr.io/starosdev/scrutiny-dev:collector-performance
Expand Down Expand Up @@ -272,7 +285,8 @@ For testing changes to individual components in isolation:
# 1. Start InfluxDB
docker run -d --name influxdb \
-p 8086:8086 \
influxdb:2.2
-e INFLUXD_USE_HASHED_TOKENS=false \
influxdb:2.9

# 2. Build and start the web server
docker build -f docker/Dockerfile.web -t scrutiny-web:local .
Expand Down Expand Up @@ -307,9 +321,11 @@ For a more production-like test, use the provided compose files:
cat > docker-compose.test.yaml << 'EOF'
services:
influxdb:
image: influxdb:2.2
image: influxdb:2.9
ports:
- '8086:8086'
environment:
INFLUXD_USE_HASHED_TOKENS: "false"
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8086/health"]
interval: 5s
Expand Down Expand Up @@ -759,7 +775,8 @@ docker run -p 8086:8086 -d --rm \
-e DOCKER_INFLUXDB_INIT_ORG=scrutiny \
-e DOCKER_INFLUXDB_INIT_BUCKET=metrics \
-e DOCKER_INFLUXDB_INIT_ADMIN_TOKEN=my-super-secret-auth-token \
influxdb:2.2
-e INFLUXD_USE_HASHED_TOKENS=false \
influxdb:2.9

go mod vendor
go test ./...
Expand Down
Loading
Loading