Skip to content

Requirements & permissions

The install script asks for a root shell, so this page spells out what that root shell does and what privileges the collector is left with afterward. The short version: an unprivileged system user, no open ports, a read-only view of the OS, and disk capabilities only when physical drives exist. The script itself is plain POSIX shell, readable at get-mon.ok9k.com/install.sh — you can read every line before running it.

Requirement Detail
OS Linux on x86_64 (amd64) or arm64. Bare metal, VMs, and LXC containers are all supported. The collector is Linux-only.
Init system systemd — the collector runs as the monitorable-collector.service unit.
Tools curl, used to fetch the script, binary, and configuration.
Network Outbound HTTPS (port 443). No inbound ports, no firewall changes.

The collector is a single binary, about 47 MB on disk. On the small server these docs are verified against, it holds 12–16 MB of resident memory and has averaged under 0.1% of one CPU core.

Destination When What
get-mon.ok9k.com Install and upgrade The install script, collector binary, base configuration, and service files.
ingest-mon.ok9k.com Runtime, every 60 seconds Metrics as gzip-compressed OTLP over HTTPS, authenticated with the server’s API key.

The collector binds no listening ports — ss -ltnp on a monitored server shows nothing owned by it. There is no remote-control channel: the only connection is the one the collector opens to post metrics.

Root installs it, an unprivileged user runs it

Section titled “Root installs it, an unprivileged user runs it”

Root is needed once, for setup. The install script creates:

  • The monitorable system user and group. The user has no login shell (/sbin/nologin) and no password; its home is /var/lib/monitorable, the collector’s only writable directory.
  • /opt/monitorable/ — the binary and its launcher, owned by root so the collector can’t replace its own executable.
  • /etc/monitorable/collector-config.yaml — the collector configuration, mode 640, readable only by root and the monitorable group.
  • /etc/systemd/system/monitorable-collector.service — the service unit. The server’s API key and the ingest endpoint live here as environment variables.

The service runs as the monitorable user, and the unit sandboxes it further. From the installed unit file:

NoNewPrivileges=yes
ProtectSystem=strict
ProtectHome=tmpfs
ReadWritePaths=/var/lib/monitorable
PrivateTmp=yes
ProtectKernelTunables=yes
ProtectKernelModules=yes
ProtectControlGroups=yes

In practice: the collector can’t gain privileges it wasn’t started with, sees the whole OS read-only except /var/lib/monitorable, gets a private /tmp, and can’t touch kernel tunables, kernel modules, or cgroups. /root and users’ session directories are masked out entirely; /home is re-exposed read-only so the disk-usage panel can measure how full it is, with normal file permissions still applying on top.

Disk (SMART) capabilities are probed, not blanket

Section titled “Disk (SMART) capabilities are probed, not blanket”

Reading SMART health data from drives needs kernel capabilities that most of the collector never uses, so the install script checks /sys/block and grants only what the detected hardware requires:

Detected Granted to the service
NVMe drive CAP_SYS_RAWIO + CAP_SYS_ADMIN, membership of the disk group, and a udev rule (/etc/udev/rules.d/99-monitorable-nvme-smart.rules) that lets the disk group open the NVMe controller node read-only.
SATA/SAS drives, no NVMe CAP_SYS_RAWIO and membership of the disk group.
No physical drive (typical VPS or VM) Nothing. The unit’s capability set is empty.

NVMe needs the broader grant because SMART reads on NVMe are admin ioctls on Linux. The unit sets CapabilityBoundingSet to the same list as the grant, so the table above is also the ceiling — the collector can’t acquire anything beyond it. Re-running the install command re-probes the hardware, which is how you extend the grant after adding a drive.

SMART data itself appears only for bare-metal servers: virtual disks don’t expose drive health, so on a VM the probe finds nothing and no capability is granted.

If a docker group exists when the script runs, the monitorable user joins it — the standard way to grant read access to the Docker socket — and the collector reports container metrics. It probes the socket on each collection cycle, so containers show up without any configuration.

If you install Docker after the collector, the group membership is missing. Re-run the install command, or grant it directly:

Terminal window
usermod -aG docker monitorable
systemctl restart monitorable-collector

Missing privileges never break monitoring — the affected feature is skipped and reported. The Permission Limitations card at the bottom of the server’s page lists each skipped check and the privilege it would need:

Permission Limitations card listing a feature that requires elevated permissions: zfs status requires root

The example above is from a server with ZFS present: querying pool status needs root, and the collector never runs as root, so that check is skipped. If a card entry names something the install script can grant — SMART capabilities or the docker group — re-run the install command; it re-probes the server and grants what the hardware calls for.