-
Notifications
You must be signed in to change notification settings - Fork 2
Home
A lightweight NAS management UI written in Go — built for Linux and FreeBSD, designed to stay out of the way of a vanilla system.
No container runtime, no database, no Node.js. Just a single compiled binary, some Ansible playbooks, and a handful of static files.
- System info — hostname, OS, kernel, CPU, uptime, load averages, process stats; the Installed Software card distinguishes required tools (ZFS, Ansible, Python) from optional ones, names the feature each optional tool unlocks, and flags a missing required tool with a red badge; platform warnings surface common misconfigurations (e.g. FreeBSD: ZFS kernel module not loaded)
- Pool overview — health badges, usage bars, fragmentation, deduplication ratio, vdev tree
-
Pool scrub management — trigger scrubs, cancel running scrubs, view last scrub time/status/progress per pool; configure periodic scrub schedules (Linux:
zfsutils-linux; FreeBSD:periodic.conf) - I/O statistics — live read/write IOPS and bandwidth per pool
- Disk health — S.M.A.R.T. data per drive (temperature, power-on hours, reallocated sectors, pending sectors, uncorrectable errors)
- Dataset browser — per-pool sections with pool health and capacity on the header row, depth-indented collapsible tree, per-row usage bars and status chips, quick actions on hover
- Dataset detail drawer — slide-in panel per dataset: inline property editing (set or inherit), sharing (NFS/SMB/iSCSI), permissions (ACL/chown), snapshots, danger zone (rename/delete)
- Dataset creation — create filesystems and volumes with any combination of ZFS properties
- Dataset editing — update properties in place (set or inherit)
- Dataset deletion — destroy datasets and volumes with recursive option and confirm-by-typing dialog
- Snapshot management — grouped by dataset into collapsible sections with count/size/age summaries; relative ages, per-group bulk select, batch delete; create (recursive) and delete
- Dataset rename — rename a dataset or volume in place
- Snapshot clone — create a new writable dataset from an existing snapshot
-
Snapshot send/receive — replicate a snapshot to another local pool or to a remote host over SSH; runs as a background job tracked in the Jobs tab; optional incremental and
--raw -
Scheduled replication — cron-scheduled
zfs send→zfs recvtasks for local and remote-over-SSH targets; per-run snapshot + hold + incremental selection + dispatch via the jobs runner + destination pruning; manual "Run now"; orphaned holds reclaimed at startup - Background jobs — long-running operations run outside Ansible via the jobs manager; cancel, runtime, output tails, durable status across restarts
-
Auto-snapshot scheduling (native) — dumpstore executes
com.sun:auto-snapshot:*snapshots itself via the built-in scheduler; property inheritance honoured correctly on both Linux and FreeBSD; one-click takeover from / release back to the OS daemon (zfs-auto-snapshot/zfstools); no external dependency required after takeover - User management — list, create, edit (shell, password, groups, home directory, SSH authorized keys, Samba password sync), and delete local users; system users (uid < 1000) hidden by default
- Group management — list, create, edit, and delete local groups; system groups hidden by default
-
NFS share management — enable, configure, and disable NFS sharing per dataset via the ZFS
sharenfsproperty; cross-platform -
SMB share management — create and remove Samba usershares; manage Samba users; dumpstore owns
smb.confentirely (rendered from template on every write); all sub-features gated behind one-time initialisation; init status badge shows last-applied timestamp -
SMB home shares — enable/configure the Samba
[homes]section for automatic per-user home directory shares; configurable base path, browseable, read only, create/directory masks -
Time Machine shares — create Samba shares configured as macOS Time Machine backup targets using
vfs_fruit; multiple named shares each backed by a different ZFS dataset; configurable max size quota and valid users -
iSCSI target management — expose ZFS volumes as iSCSI targets via
targetcli/LIO on Linux orctldon FreeBSD; per-zvol dialog with IQN, portal IP/port, auth mode (None/CHAP), and initiator ACL list - ACL management — POSIX ACL and NFSv4 ACL entries per dataset; recursive apply supported
- Live updates — Server-Sent Events push changes every 10 s; falls back to 30 s REST polling
-
Prometheus metrics — Go runtime, HTTP request counters/latency, Ansible playbook metrics at
GET /metrics -
OpenTelemetry export — set
OTEL_EXPORTER_OTLP_ENDPOINTand dumpstore pushes traces (per-request spans, Ansible/ops child spans, background job/replication/autosnap spans), logs (the journald stream withtrace_idcorrelation), and Go runtime metrics to any OTLP collector; every OTEL code path is a no-op without the env var -
Request ID correlation — every request gets a unique
req_idon all log lines; readsX-Request-IDfrom upstream proxies (nginx, Traefik) and echoes it back on the response -
Authentication — session-based login with bcrypt password stored in
/etc/dumpstore/dumpstore.conf(Linux) //usr/local/etc/dumpstore/dumpstore.conf(FreeBSD);--set-passwordCLI; per-IP rate limiting; reverse proxy delegation viaX-Remote-Userfrom configured trusted CIDRs; logout button and username badge in the header -
Network interface overview — read-only view of all interfaces: state badge, MAC, MTU, IPv4/IPv6 addresses, link speed, and RX/TX byte counters; Linux via
/sys/class/net, FreeBSD viaifconfig -a - Service management — start/stop/restart/enable/disable Samba, NFS, and iSCSI from the Services tab; live status via SSE; systemd on Linux, rc.d on FreeBSD; op-log for all mutations
-
TLS / HTTPS —
--tlsflag; self-signed ECDSA-P256 cert generation via the UI (openssl, Ansible); load existing cert from disk (Let's Encrypt, Certbot, acme.sh); ACME issuance/renewal vialego; HTTP→HTTPS redirect; cert status card with CN, SANs, and expiry countdown
- ZFS native encryption — load/unload keys, encryption status per dataset, keyformat/keylocation support
- Pool import/export — import available pools from attached devices; export pools safely
- Drive replacement — replace faulted disks, monitor resilver progress, offline/online devices
git clone https://github.com/langerma/dumpstore.git
cd dumpstore
sudo ./install.shThe service starts automatically and listens on http://localhost:8080.
See Installation for detailed instructions, requirements, and configuration.
dumpstore has built-in session-based authentication. Set a password during install (the script prompts automatically) or at any time with --set-password. If no password is configured the service binds to 127.0.0.1 only.
dumpstore runs as root (required for ZFS). See SECURITY.md for notes on TLS and the recommended deployment topology.
Contributions are welcome. See CONTRIBUTING.md for the workflow, conventions, and docs update requirements. This project follows a Code of Conduct.
- Installation — requirements, install script, make, manual build, service configuration
- API Reference — full REST API documentation with request/response examples
- Architecture — design overview, read/write split, SSE stream, request flow