investigatarr
Docker app from P1zzm1ssiles' Repository
Overview
Readme
View on GitHub![]()
Investigatarr
A small container that audits an Unraid server and gives it a security score out of 100 (grade A–F), with a fix for every finding. It is read-only unless you turn on deleting: it mounts the host filesystem :ro and needs no Docker socket and no privileged mode.
What it checks
| Area | Checks |
|---|---|
| OS | Unraid version still supported |
| Users | Root with no password, weak (MD5) root hash, share users with no password (system accounts like named are ignored) |
| Management access | Telnet, HTTP-only web UI, UPnP, SSH password logins, SSH on 22 + UPnP, FTP |
| Shares | Public SMB shares (worse for appdata/system/domains/isos), "Secure" guest-read shares, public NFS, SMBv1/NetBIOS |
| Docker | Privileged containers, risky capabilities, Docker socket mounts, writable host-system mounts, host networking, running as root, default passwords in env vars |
| Password reuse | Same secret in several containers, root password reused in a container env var, Samba users sharing a password (values are never written to the report) |
| VMs | VNC consoles with no password |
| UPnP | Unraid's UPnP setting, torrent and sync apps that open router ports themselves (qBittorrent, Deluge, Transmission, Syncthing), and the port forwards your router actually has pointing at the server (asked over UPnP). A forwarded web UI or SSH port is flagged as critical / high |
| Network | Risky services listening on all interfaces (Telnet, FTP, Docker API 2375, databases, Redis, VNC…) |
| Plugins | Large plugin count |
Scoring
Start at 100. Each finding subtracts: critical 25, high 12, medium 6, low 2. Repeats of the same check count half (and stop counting after the third) so one habit across many containers doesn't drown everything else. Any critical finding caps the grade at C. Grades: A ≥ 90, B ≥ 80, C ≥ 70, D ≥ 60, F below.
Dismissing findings
Each finding has a Dismiss button. A dismissed finding moves to a Dismissed section, stops counting against your score and stays dismissed on later scans; Restore brings it back. Dismissals are saved in /output/dismissed.json.
Cleanup
The report also lists clutter, without scoring it:
- containers stopped for more than
CLEANUP_STOPPED_DAYSdays (default 30) - appdata folders no container maps any more, with their size
- empty shares
- empty files and folders inside shares (appdata, system, domains and isos are skipped; the walk stops after
CLEANUP_MAX_FILESentries, default 500000)
By default Investigatarr only lists these.
Deleting (optional)
To get Delete buttons, edit the container and:
- set Allow delete (
ALLOW_DELETE) toyes - set Shares (for delete) to
/mnt/user(mapped to/rw/mnt/userin the container) - to remove old containers too, set Docker socket (for delete) to
/var/run/docker.sock
Every delete asks you to confirm first. Files and folders go to a hidden .investigatarr-recycle folder in the same share, and a Recycle bin section on the report lets you Restore them or Delete now. Anything left in the bin is removed for good after RECYCLE_DAYS (default 30). Removed containers keep their appdata and can be reinstalled from Apps > Previous Apps. Empty folders and shares are removed and recreated on restore. Every action is logged to /output/deleted.log.
Deleting only works on items in the current cleanup list, only inside /mnt/user, and never on a running container or an appdata folder a container still maps.
Output
/output/index.html— report page (example), also served onWEBUI_PORT(default 8088)/output/report.json,report.csv,report.md— the findings in other formats. The report page has Export buttons for each, plus Print / PDF- Summary in the container log
Install on Unraid
Copy the template to your flash drive, then add it from Docker > Add Container and pick Investigatarr from the template list:
wget -O /boot/config/plugins/dockerMan/templates-user/my-Investigatarr.xml \
https://raw.githubusercontent.com/p1zzm1ssile/unraid-templates/main/templates/investigatarr.xml
Open the web UI from the container's icon (port 8088).
Run it by hand
docker run -d --name investigatarr --net=host \
-v /:/host:ro,rslave \
-v /mnt/user/appdata/investigatarr:/output \
ghcr.io/p1zzm1ssile/investigatarr:latest
Set ROUTER_UPNP=0 to skip asking the router for its port forwards. Set SCAN_INTERVAL_HOURS=0 for a one-shot scan (FAIL_BELOW=70 makes it exit non-zero under that score, handy for User Scripts).
--net=host is only used so the scanner sees the host's listening ports; everything else is read-only.
Building
Every push to main builds and publishes ghcr.io/p1zzm1ssile/investigatarr:latest via GitHub Actions. To build locally: docker build -t investigatarr .
Categories
Related apps
Explore more like this
Explore allDetails
ghcr.io/p1zzm1ssile/investigatarr:latestRuntime arguments
- Web UI
http://[IP]:[PORT:8088]/- Network
host- Shell
sh- Privileged
- false
Template configuration
Your server's filesystem, mounted read-only so Investigatarr can read its settings. Do not make this writable.
- Target
- /host
- Default
- /
- Value
- /
Where the report page and report.json are saved
- Target
- /output
- Default
- /mnt/user/appdata/investigatarr
- Value
- /mnt/user/appdata/investigatarr
Rescan every N hours. 0 runs once and stops.
- Target
- SCAN_INTERVAL_HOURS
- Default
- 24
- Value
- 24
Port for the report page (host networking, so pick a free port)
- Target
- WEBUI_PORT
- Default
- 8088
- Value
- 8088
yes shows Delete buttons in the Cleanup list. Deleted files go to a recycle bin first. Also needs the two mappings below.
- Target
- ALLOW_DELETE
- Default
- no|yes
- Value
- no
Days deleted files stay in the recycle bin before they are removed for good
- Target
- RECYCLE_DAYS
- Default
- 30
- Value
- 30
Only needed for deleting. Set to /mnt/user to let Investigatarr move clutter to its recycle bin. Leave empty to stay read-only.
- Target
- /rw/mnt/user
Only needed to remove old containers. Set to /var/run/docker.sock. Leave empty otherwise.
- Target
- /var/run/docker.sock