UnraidDeck

UnraidDeck

Docker app from Zabra9Red's Repository

Overview

UnraidDeck: dashboard all-in-one per Unraid + Docker in un solo container, zero dipendenze esterne. Gestione completa dei container (start/stop/update con clone integrale della configurazione, gestione dipendenti VPN net=container, log live, console exec, check aggiornamenti dai registry), monitoraggio del sistema Unraid (array, parity, dischi con temperatura da fonte passiva, pool ZFS/BTRFS, share, VM, UPS) e controllo alimentazione host. NOTA IMPORTANTE per il path /config: usare un percorso DIRETTO (es. /mnt/cache/appdata/Unraiddeck) e NON /mnt/user/...: il database SQLite in modalità WAL su FUSE/shfs rischia corruzione. In alternativa usare una share con "Exclusive access" attivo. Su Unraid 7.x creare una API key con: Unraid-api apikey --create (oppure Settings → Management Access → API Keys). Su Unraid 6.12 configurare il fallback SSH. Al primo avvio la UI propone un wizard per creare l'utente amministratore. La variabile PASSWORD è solo un bootstrap opzionale: rimuoverla dopo il setup.

UnraidDeck

🇬🇧 English version

Dashboard all-in-one per Unraid + Docker. Un solo container, zero dipendenze esterne.

UnraidDeck unisce in un'unica web UI la gestione completa dei container Docker dell'host Unraid e il monitoraggio/controllo del sistema (array, parity, dischi, pool, share, VM, UPS, alimentazione host).

stack stack stack

Caratteristiche

Docker

  • Lista container con stato, uptime, CPU%, RAM, I/O rete, porte, restart policy, icone (proxate e cacheate: funzionano offline e senza mixed-content dietro HTTPS) e pulsante "Apri WebUI".
  • Azioni: start / stop / restart / pause / kill / remove / update / prune immagini dangling — con lock per-container (le operazioni concorrenti ricevono 409).
  • Update sicuro: pull con progresso, clone integrale di Config+HostConfig (IP statici br0/macvlan preservati), verifica healthcheck-aware, rollback automatico, journal in SQLite con recovery al riavvio, gestione dei dipendenti net=container: (pattern VPN).
  • Self-update tramite helper effimero: UnraidDeck aggiorna sé stesso senza interventi manuali.
  • Check aggiornamenti via Registry HTTP API v2 (HEAD: non consuma i rate limit Docker Hub), credenziali opzionali per registry privati, badge "update/pinned/locale".
  • Log live (demux stdout/stderr, ricerca, download in streaming), console exec (xterm.js), stats real-time con sparkline e grafici.
  • Bulk su selezione multipla (UnraidDeck stesso è sempre escluso).

Unraid

  • Unraid 7.x: API GraphQL unraid-api con capability map via introspection → ogni sezione degrada in autonomia se lo schema non la espone.
  • Unraid 6.12: fallback SSH con parsing di /var/local/emhttp/*.ini.
  • Array e parity (start/stop/pausa/riprendi/annulla + storico da /boot/config/parity-checks.log), dischi con temperatura e spin state da fonte passiva (mai smartctl periodico: i dischi in spin-down non vengono svegliati; SMART completo solo on-demand con -n standby), pool ZFS/BTRFS, share, VM, UPS (apcupsd NIS o NUT via TCP, nessun mount), reboot/shutdown host.
  • Terminale host direttamente nella UI (xterm su SSH, con il fallback SSH configurato) e aggiornamenti automatici dei container opzionali a intervallo configurabile (default 8 ore; stessa procedura sicura dell'update manuale, UnraidDeck escluso).
  • UnraidDeck Cloud: WebDAV nativo (http://IP:8787/dav — sync da qualsiasi OS/client), tab Foto con timeline e thumbnail dalle share, link di condivisione pubblici con scadenza/password/contatore. Tutto interno, zero container aggiuntivi (richiede il mount /mnt → /unraid).
  • File manager delle share (tab File, via SFTP): anteprima di immagini/video/audio/PDF/testo nel browser, download, upload, rinomina, elimina; notifiche a inizio/fine di ogni update container; soglia temperatura dischi con range min–max.
  • Tab Energia — consumo elettrico dall'UPS in tempo quasi reale (poll ogni 10 s, POLL_UPS per cambiare): dashboard stile Grafana con gauge batteria/carico, potenza attuale, tiles consumo/costo per periodo e stima annua; potenza misurata via ups.realpower o stimata da potenza nominale × carico, integrata in kWh con grafico orario e storico per giorno / settimana / mese / anno, costi inclusi. Il costo in € usa il prezzo €/kWh della tua bolletta (preset indicativi dei principali fornitori italiani — Enel, Eni Plenitude, Edison, A2A, Iren, Sorgenia, Octopus — o valore manuale). I dati sono salvati su disco in /config (SQLite): riavvii di container o server non li cancellano; retention 2 anni.

Sicurezza

  • Setup wizard al primo avvio (bcrypt cost 12), sessioni opache in SQLite (revoca reale, "disconnetti ovunque"), TOTP opzionale con recovery codes, audit log completo (incluse le sessioni exec), rate limiting, CSP restrittiva, verifica Origin su REST mutanti e WebSocket, segreti cifrati at-rest (AES-256-GCM).
  • Conferme digitate per le azioni distruttive (remove, kill, stop array, reboot/shutdown host) e rafforzate per stop/remove di UnraidDeck stesso.

Installazione su Unraid

Da Community Applications (consigliata)

  1. Installa il template my-UnraidDeck.xml (o cerca UnraidDeck in CA quando pubblicato).
  2. Path /config: usa un percorso diretto, es. /mnt/cache/appdata/unraiddeck. ⚠️ Non usare /mnt/user/...: il database SQLite in modalità WAL su FUSE/shfs rischia corruzione. In alternativa, usa una share con Exclusive access attivo (in quel caso il path è un bind diretto).
  3. Imposta UNRAID_HOST e, per Unraid 7.x, UNRAID_API_KEY (vedi sotto).
  4. Avvia e apri http://IP:8787: il wizard crea l'utente amministratore.

Manuale (docker run)

docker run -d \
  --name unraiddeck \
  --restart unless-stopped \
  --security-opt no-new-privileges=true \
  -p 8787:8787 \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v /mnt/cache/appdata/unraiddeck:/config \
  -e UNRAID_HOST=192.168.1.10 \
  -e UNRAID_API_KEY=... \
  -e TZ=Europe/Rome \
  ghcr.io/zabra9red/unraiddeck:latest

Oppure con docker-compose.yml (incluso nel repo).

API key per Unraid 7.x

Sul server Unraid:

unraid-api apikey --create

oppure dalla GUI: Settings → Management Access → API Keys. Servono i permessi di lettura su array/docker/info e le mutation che vuoi usare (array, vm, reboot/shutdown).

  • Se il server forza SSL (redirect https con certificato myunraid.net sull'IP locale), imposta UNRAID_URL=https://IP e UNRAID_TLS_INSECURE=true.

Fallback SSH per Unraid 6.12

Imposta SSH_USER (tipicamente root) e SSH_PASSWORD oppure SSH_KEY (percorso di una chiave privata montata in /config, o PEM inline). UnraidDeck legge /var/local/emhttp/*.ini, usa mdcmd per array/parity, virsh per le VM, powerdown per l'host.

VM via libvirt (opzionale)

Mount opzionale della directory /var/run/libvirt (già predisposto nel template). Non montare il file libvirt-sock direttamente: se il container parte prima di libvirtd, Docker crea la source mancante come directory e il sottosistema VM non si avvia più. In assenza del mount le VM sono gestite via GraphQL (7.x) o virsh su SSH (6.12).


Variabili d'ambiente

Var Default Note
PORT 8787
PASSWORD solo bootstrap primo avvio (crea l'utente admin); rimuovere dopo il setup (warning in UI)
UNRAID_HOST IP/host Unraid
UNRAID_URL http://UNRAID_HOST override endpoint GraphQL (https/porta custom)
UNRAID_TLS_INSECURE false accetta cert self-signed sul GraphQL
UNRAID_API_KEY GraphQL 7.x
SSH_USER / SSH_PASSWORD o SSH_KEY fallback 6.12
DOCKER_HOST unix socket opzionale (es. socket-proxy tcp)
DISABLE_AUTH false solo LAN fidata (banner rosso permanente)
TRUST_PROXY true/IP dietro reverse proxy (cookie Secure, IP reali nel rate-limit)
UPDATE_CHECK_INTERVAL 6h check aggiornamenti (con jitter)
UPDATE_VERIFY_TIMEOUT auto override verifica post-update (default healthcheck-aware)
NOTIFY_WEBHOOK_URL webhook notifiche (ntfy nativo auto-rilevato; JSON per Gotify/Discord)
NOTIFY_WEBHOOK_TYPE auto forza ntfy (self-hosted su dominio custom) o json
POLL_UPS 10s frequenza poll UPS/potenza
ONLYOFFICE_URL URL del Document Server OnlyOffice per aprire/modificare i documenti Office (opzionale)
ONLYOFFICE_JWT_SECRET JWT secret del Document Server (se abilitato)
ONLYOFFICE_SELF_URL auto base URL con cui il DS raggiunge UnraidDeck
HTTPS false TLS nativo sulla porta WebUI (cert self-signed autogenerato in /config/certs, sostituibile)
DUCKDNS_DOMAIN + DUCKDNS_TOKEN con HTTPS=true: certificato Let's Encrypt vero per <nome>.duckdns.org via DNS-01 (nessuna porta da aprire, rinnovo automatico) — niente avvisi "Non sicuro"
TZ Europe/Rome

Documenti Office (opzionale, via OnlyOffice)

Il file manager apre e modifica docx/xlsx/pptx (e visualizza doc/odt/rtf/xls/ppt…) come una vera suite Office integrando OnlyOffice Document Server:

  1. Installa OnlyOffice Document Server da Community Applications (container separato).
  2. Su UnraidDeck imposta ONLYOFFICE_URL=http://IP:PORTA e, se il DS ha il JWT attivo (default nelle versioni recenti), ONLYOFFICE_JWT_SECRET con lo stesso secret del DS.
  3. Nella tab File i documenti Office si aprono nell'editor a schermo pieno; il salvataggio riscrive il file sulla share.

Senza OnlyOffice i documenti mostrano comunque il testo estratto (sola lettura).


Notifiche sul telefono (gratis, senza app di terze parti a pagamento)

Tutte le notifiche di UnraidDeck (allarmi consumo, dischi caldi, UPS su batteria, update disponibili…) possono arrivare su iPhone/Android con ntfy — app gratuita e open source sull'App Store / Play Store ufficiali:

  1. Installa ntfy dallo store e iscriviti a un topic con nome impronunciabile (es. unraiddeck-x7k2m9 — il topic è pubblico, il nome fa da password).
  2. Sul container imposta NOTIFY_WEBHOOK_URL=https://ntfy.sh/unraiddeck-x7k2m9 (il formato ntfy viene rilevato da solo).
  3. Nella tab Energia → Allarmi consumo imposta la soglia potenza (W) e/o il limite giornaliero (kWh): al superamento parte la notifica push (potenza con isteresi −10 %, limite giornaliero una volta al giorno).

Sicurezza e reverse proxy

  • Il container richiede root per l'accesso a /var/run/docker.sock: chi controlla il socket controlla l'host. Non esporre mai UnraidDeck direttamente su Internet senza reverse proxy + HTTPS. Mai --privileged; sempre --security-opt no-new-privileges=true. Rootfs read-only opzionale con tmpfs su /tmp.
  • Dietro SWAG / Nginx Proxy Manager: imposta TRUST_PROXY=true. Il cookie di sessione diventa automaticamente Secure e il rate limiting usa l'IP reale del client.
  • I segreti (API key, credenziali SSH e registry) sono cifrati at-rest con AES-256-GCM. La chiave è autogenerata in /config/secret.key: protegge da letture accidentali del database, non da chi ha pieno accesso a /config.
  • DISABLE_AUTH=true mostra un banner rosso permanente: usarlo solo su LAN fidata.

PWA

La UI è installabile come PWA (icona in home, standalone). L'installazione richiede HTTPS → serve un reverse proxy con certificato valido. Su http la UI resta pienamente usabile, semplicemente senza install.

Nota SQLite / FUSE (importante)

Il database usa journal_mode=WAL, che non è affidabile su FUSE/shfs (/mnt/user). All'avvio UnraidDeck rileva il filesystem di /config: se è FUSE mostra un warning nei log e un banner in UI. Soluzioni:

  • path diretto: /mnt/cache/appdata/unraiddeck (o il tuo pool), oppure
  • share appdata con Exclusive access attivo.

Backup e ripristino di /config

  • Backup automatico giornaliero del database con VACUUM INTO /config/backups/ (retention 7 file) + checkpoint WAL periodico e allo shutdown.
  • Per il backup completo: ferma il container e copia la directory /config (contiene database, backup automatici, chiave segreta e cache icone). Il ripristino è la copia inversa.
  • I backup automatici in /config/backups sono database completi: per ripristinarne uno, cp /config/backups/unraiddeck-<data>.db /config/unraiddeck.db a container fermo.

Note operative

  • Stats: campionamento batch one-shot (2s con drawer aperto, 5s con lista), nessuno stream persistente per-container, ring buffer in RAM (niente scritture SQLite per-secondo).
  • Eventi: la lista è pilotata da docker events con auto-reconnect, replay e riconciliazione — nessun polling a regime.
  • Check update: HEAD sui manifest v2 (inclusi i media type single-manifest per i repo single-arch), token anonimi per Docker Hub/ghcr/lscr/quay, backoff su 429. Container avviati per digest → badge "pinned"; immagini build/import locali → badge "locale".
  • docker system df è solo on-demand (endpoint lento su host grandi).
  • I dipendenti net=container: (VPN) vengono mostrati nella conferma di update e ricreati/riavviati automaticamente dopo l'update del target.

Sviluppo

# backend (Node 22)
cd backend && npm install
CONFIG_DIR=./data node src/server.js

# frontend (Vite dev server con proxy verso :8787)
cd frontend && npm install && npm run dev

Build immagine completa:

docker build -t unraiddeck:dev .

Licenza

MIT

Install UnraidDeck on Unraid in a few clicks.

Find UnraidDeck in Community Apps on your Unraid server, review the template, and click Install. Unraid handles the Docker app or plugin setup from the published template.

Open the Apps tab on your Unraid server Search Community Apps for UnraidDeck Review the template variables and paths Click Install

Related apps

Details

Repository
ghcr.io/zabra9red/unraiddeck:latest
Last Updated2026-08-23
First Seen2026-07-06

Runtime arguments

Web UI
http://[IP]:[PORT:8787]
Network
bridge
Shell
sh
Privileged
false
Extra Params
--security-opt no-new-privileges=true --label net.unraid.docker.icon=https://raw.githubusercontent.com/Zabra9Red/unraiddeck/main/frontend/public/icon-192.png --label net.unraid.docker.webui=http://[IP]:[PORT:8787]

Template configuration

Porta WebUIPorttcp

Porta della web UI

Target
8787
Default
8787
Value
8787
Docker socketPathrw

Socket Docker dell'host (rw, necessario per gestire i container)

Target
/var/run/docker.sock
Default
/var/run/docker.sock
Value
/var/run/docker.sock
ConfigPathrw

Dati applicazione (SQLite, backup, cache icone). USARE UN PATH DIRETTO (no /mnt/user): WAL su FUSE rischia corruzione.

Target
/config
Default
/mnt/cache/appdata/unraiddeck
Value
/mnt/cache/appdata/unraiddeck
File manager (/mnt)Pathrw,slave

Share e dischi per il file manager (bind /mnt, propagation slave per gli share FUSE). Facoltativo: senza, il file manager usa SSH/SFTP

Target
/unraid
Default
/mnt
Value
/mnt
libvirt (opzionale)Pathrw

Opzionale: directory libvirt per la gestione VM. Montare la DIRECTORY /var/run/libvirt (non il file socket): se il container parte prima di libvirtd, Docker creerebbe il socket mancante come directory rompendo le VM.

Target
/var/run/libvirt
UNRAID_HOSTVariable

IP/hostname del server Unraid (per GraphQL, UPS e webui [IP])

UNRAID_API_KEYVariable

API key unraid-api (Unraid 7.x): unraid-api apikey --create

UNRAID_URLVariable

Override endpoint GraphQL (default http://UNRAID_HOST), es. https://ip:porta

UNRAID_TLS_INSECUREVariable

Accetta certificati self-signed sul GraphQL (SSL forzato con cert myunraid.net su IP locale)

Default
false
Value
false
ONLYOFFICE_URLVariable

Opzionale: URL del container OnlyOffice Document Server (es. http://IP:8082) per aprire e modificare i documenti Office dal file manager

ONLYOFFICE_JWT_SECRETVariable

Opzionale: JWT secret del Document Server (se abilitato, default nelle versioni recenti)

DUCKDNS_DOMAINVariable

Con HTTPS=true: sottodominio DuckDNS (es. mionome) per un certificato Let'''s Encrypt VERO senza avvisi del browser (DNS-01, nessuna porta da aprire)

DUCKDNS_TOKENVariable

Token del tuo account DuckDNS (duckdns.org)

HTTPSVariable

TLS nativo sulla porta della WebUI (certificato self-signed autogenerato in /config/certs; sostituibile con cert.pem/key.pem propri)

Default
false
Value
false
ONLYOFFICE_SELF_URLVariable

Opzionale: base URL con cui il Document Server raggiunge UnraidDeck (es. http://IP:8787) se l'hostname del browser non e' risolvibile dal DS

PASSWORD (solo bootstrap)Variable

Solo per il primo avvio: crea l'utente admin. RIMUOVERE dopo il setup.

Target
PASSWORD
SSH_USERVariable

Fallback SSH (Unraid 6.12): utente (root)

SSH_PASSWORDVariable

Fallback SSH: password (in alternativa a SSH_KEY)

SSH_KEYVariable

Fallback SSH: percorso chiave privata (es. /config/id_ed25519) o PEM inline

DOCKER_HOSTVariable

Opzionale: endpoint Docker alternativo (es. tcp://socket-proxy:2375)

DISABLE_AUTHVariable

Disabilita l'autenticazione (SOLO LAN fidata: banner rosso permanente in UI)

Default
false
Value
false
UPDATE_CHECK_INTERVALVariable

Intervallo check aggiornamenti immagini (es. 6h, 12h)

Default
6h
Value
6h
UPDATE_VERIFY_TIMEOUTVariable

Override verifica post-update (default: healthcheck-aware automatico)

NOTIFY_WEBHOOK_URLVariable

Webhook notifiche (POST JSON compatibile Gotify/ntfy/Discord)

TZVariable

Timezone

Default
Europe/Rome
Value
Europe/Rome