A modern web interface for SnapRAID.
Run sync and scrub, schedule jobs and keep an eye on disk health, all from your browser.
- Array health at a glance: last sync and scrub, scrub coverage, next scheduled job
- One-click commands: sync (optionally with pre-hash), scrub, status, diff, check (files only or with parity, per disk), fix, touch and dup to find duplicate files, with live output over WebSocket
- Scheduler: cron-based jobs, no crontab editing; a sync can run touch before and scrub after it as one nightly routine
- Notifications via ntfy push, e-mail or webhook (Discord, Slack, Home Assistant …) when a job fails, scrub finds damaged data, a scheduled sync is skipped or a disk shows SMART problems
- Disk replacement wizard: restores a failed data or parity disk step by step (
fix -d,check -a,sync) and pauses scheduled jobs meanwhile - Disk overview: usage, file counts, fragmentation and parity headroom per disk
- SMART monitoring: health, temperature, failure probability and SSD wear per disk; flags reallocated/pending sectors, read and CRC errors, highlights the affected attributes and tells you what to do (replace the disk, check the cable, improve cooling)
- Logs: history of every run with full output, searchable and filterable; old logs are rotated automatically (100 files / 30 days by default) or on demand
- Config management: add existing or create new
snapraid.conffiles, rename, enable/disable, and edit disks, content files, excludes, pool and options visually or as text - Login via environment variables, no database needed
- Multilingual: follows the browser language, switchable in the header
- Light and dark theme: follows the system, switchable in the header
The image ships with SnapRAID 14.10, so nothing needs to be installed on the host.
Important
Use the bundled SnapRAID, not the one from your distribution. The UI reads SnapRAID's structured log, which exists only since SnapRAID 14.0, and current distributions still ship older versions (Debian 13: 12.4, Ubuntu 24.04 LTS: 12.3). The bundled binary is built from an official, pinned SnapRAID release that the UI is tested against.
If cron jobs on the host run SnapRAID for the same array, move them to the UI's scheduler, so that one SnapRAID version maintains the array.
docker run -d --name snapraid-ui \
--privileged \
-p 3000:80 \
-e SNAPRAID_UI_USERNAME=admin \
-e SNAPRAID_UI_PASSWORD=change-me \
-v ./snapraid:/app/snapraid \
-v /mnt/disk1:/mnt/disk1 \
-v /mnt/disk2:/mnt/disk2 \
-v /mnt/parity:/mnt/parity \
tristanteu/snapraid-ui:latestOpen http://localhost:3000 and add your snapraid.conf in Manage Configurations.
Mount your disks at the same paths as on the host, so the paths in snapraid.conf stay valid. Parity and content locations must be writable. --privileged is only needed for SMART data and the disk power state.
curl -O https://raw.githubusercontent.com/firsttris/snapraid-ui/master/docker/docker-compose.yml
# add your disks under volumes:, then
docker compose up -dFor Podman with systemd, use the Quadlet files in docker/.
| Variable | Default | Purpose |
|---|---|---|
SNAPRAID_BASE_PATH |
/app/snapraid |
Holds config.json, schedules.json, logs and your SnapRAID configs. Mount it as a volume. |
SNAPRAID_BIN |
/usr/local/bin/snapraid |
SnapRAID binary. The bundled one is used unless you point this elsewhere. |
SNAPRAID_EXTRA_ARGS |
(empty) | Extra arguments for every SnapRAID call |
SNAPRAID_UI_USERNAME |
(empty) | Username for the login. The login is active once username and password are both set. |
SNAPRAID_UI_PASSWORD |
(empty) | Password for the login |
SNAPRAID_UI_SESSION_HOURS |
168 |
How long a login lasts (7 days by default) |
Set SNAPRAID_UI_USERNAME and SNAPRAID_UI_PASSWORD to protect the UI. No database is involved: the credentials come from the environment, and a login is a signed, HTTP-only session cookie. Without both variables the UI stays open as before, e.g. if you already run it behind an auth proxy; the backend logs a warning then.
- The key that signs sessions is stored in
SNAPRAID_BASE_PATH/.session-secret, so logins survive restarts. Delete the file to log everyone out. - Changing the password also ends all existing logins.
- After 5 failed attempts a client has to wait 15 minutes.
- The cookie is marked
Securewhen the request came in over HTTPS (X-Forwarded-Proto: httpsfrom your reverse proxy). Use HTTPS if the UI is reachable from outside your LAN.
Using your own SnapRAID binary: only needed for special builds, the bundled one is the recommended choice. Mount the binary and point SNAPRAID_BIN at it. It has to be version 14.0 or newer (snapraid --version), otherwise status, reports and notifications stay empty, because the UI parses SnapRAID's structured log output.
-v /usr/bin/snapraid:/usr/bin/snapraid:ro \
-e SNAPRAID_BIN=/usr/bin/snapraid \| Tag | Content |
|---|---|
latest |
Latest release |
1.2.3, 1.2 |
Specific release |
Requires Node.js 22+ and Deno 2.5+.
git clone https://github.com/firsttris/snapraid-ui
cd snapraid-ui
./install.sh
./start.sh # uses ./snapraid and the snapraid binary on your PATH
./start.sh --demo # sandbox with fake disks, no real array or SnapRAID install neededFrontend runs on http://localhost:3000, backend API on http://localhost:8080. Ctrl+C stops both.
--demo runs dev/setup.sh, which builds a pinned SnapRAID into dev/bin/ (needs curl, gcc, make) and creates dev/sandbox/ with three data disks, a parity disk and a few pending changes. Since the sandbox disks have no SMART data, SNAPRAID_DEMO=1 makes the backend report made-up SMART values and power states for them (see backend/src/demo.ts). dev/setup.sh --reset starts over.
Stopping leftover processes
pgrep -af "src/main.ts" # show running backends
pkill -f "deno task dev"; pkill -f "deno run.*src/main.ts"
pkill -f "vite dev"docker build -f docker/Dockerfile -t snapraid-ui .Pushing a v* tag publishes a multi-arch image to Docker Hub via GitHub Actions.
- Backend: Deno + Hono, WebSocket for live output, file-based storage
- Frontend: React 19, TanStack Start/Router/Query, Tailwind CSS, Paraglide i18n
- Container: Nginx reverse proxy, Supervisor, bundled SnapRAID
Issues and pull requests are welcome. Please run npx biome check, npm run typecheck and the tests (deno test in backend/, npm test in frontend/) before opening a PR.
MIT