Skip to content

Commit 7ee0f71

Browse files
committed
release: v6.14.3 — NAS Docker section in host-connection guide
Closes a doc gap. v6.12.0-v6.12.2 shipped platform detection + How-Tos for 5 NAS platforms (Synology, Unraid, TrueNAS, QNAP, OMV) but the "How to Connect Docker Hosts" card on #/hosts never mentioned them — users had to discover the platform pages by accident. New full-width section between the 2x2 connection-type grid and the architecture diagram. Two columns: Left — generic SSH-Tunnel setup (any NAS): 1. Enable SSH on the NAS UI 2. Add admin to docker group 3. SSH key auth → links to the canonical How-To 4. Add Host → SSH Tunnel 5. Brand-colored pill links to the 5 platform How-Tos Right — Synology DSM 7.x security hardening (9 items): - SSH key auth + disable PasswordAuthentication - Move SSH off port 22 - DSM 2FA for admin - Auto Block after N failed logins - Firewall: SSH to LAN only - Disable built-in admin user - Read-only docker.sock mount - Weekly Security Advisor scan - HTTPS-only DSM UI Each item has the exact DSM Control Panel path. Closing tip points back to the auto-detected platform badge on Multi-Host page. Bilingual: 19 new i18n keys × EN + RO. Tests: 740/4 (unchanged — pure UI addition).
1 parent 3b181ac commit 7ee0f71

8 files changed

Lines changed: 162 additions & 5 deletions

File tree

CHANGELOG.md

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,51 @@
22

33
All notable changes to Docker Dash are documented here.
44

5+
## [6.14.3] - 2026-04-22 — "NAS Docker section in the host-connection guide"
6+
7+
The "How to Connect Docker Hosts" card on `#/hosts` covered TCP+TLS, SSH Tunnel, Docker Desktop, and Unix Socket — but had nothing about NAS platforms even though we'd shipped detection + per-platform How-Tos for 5 of them in v6.12.0–v6.12.2. Closes that gap.
8+
9+
### Added — NAS Docker connection card
10+
11+
Full-width section between the 2×2 connection-type grid and the architecture diagram. Two columns:
12+
13+
**Left — generic connection setup (any NAS):**
14+
1. Enable SSH on the NAS UI
15+
2. Add admin user to the `docker` group
16+
3. Set up SSH key auth (links to the canonical SSH Key How-To shipped in v6.13.1)
17+
4. Add Host → SSH Tunnel
18+
5. Pill links to the 5 platform-specific How-Tos: Synology DSM, Unraid, TrueNAS SCALE, QNAP, OpenMediaVault — each with the platform's brand color so users can spot their NAS at a glance
19+
20+
**Right — Synology security hardening (DSM 7.x):**
21+
9 actionable items, each with the exact DSM Control Panel path:
22+
- SSH key auth + disable PasswordAuthentication (with the "test the key first" warning)
23+
- Move SSH off port 22 to a non-standard port
24+
- DSM 2-factor authentication for admin
25+
- Auto Block after N failed logins
26+
- Firewall: SSH to LAN only
27+
- Disable the built-in `admin` user
28+
- Mount Docker socket read-only when running Docker Dash on the NAS itself
29+
- Weekly DSM Security Advisor scan
30+
- HTTPS-only DSM UI (with a note about HTTP credential capture even on LAN)
31+
32+
Closing tip points users back to the auto-detected platform badge on the Multi-Host page.
33+
34+
### Bilingual
35+
36+
- `pages.hosts.guideNas*` keys added to both `en.js` and `ro.js` — 19 new strings × 2 languages = 38 entries. Matches the existing bilingual pattern; the Translations tab + DeepL/Google integration shipped in v6.11.0 can fill the other 9 languages with one click when an admin gets to it.
37+
38+
### Tests
39+
40+
- **740 passing + 4 skipped / 50 suites** (unchanged — pure UI addition).
41+
42+
### Files touched
43+
44+
- `public/js/pages/hosts.js` — new full-width NAS card in `_renderGuide()`
45+
- `public/js/i18n/en.js` — 19 new keys
46+
- `public/js/i18n/ro.js` — 19 new keys (Romanian translations)
47+
48+
---
49+
550
## [6.14.2] - 2026-04-22 — "UX polish — token hygiene + two latent CSS bugs fixed"
651

752
Post-v6.14.0 cross-release UX audit surfaced 11 inconsistencies accumulated across v6.11.x–v6.14.0. This release ships the 7 trivial ones (all S-class per the audit); the 3 medium and 1 large items need a design-system decision first and are deferred.

docker-compose.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ services:
44
context: .
55
dockerfile: Dockerfile
66
args:
7-
APP_VERSION: "${APP_VERSION:-6.14.2}"
8-
image: docker-dash:${APP_VERSION:-6.14.2}
7+
APP_VERSION: "${APP_VERSION:-6.14.3}"
8+
image: docker-dash:${APP_VERSION:-6.14.3}
99
container_name: docker-dash
1010
restart: unless-stopped
1111
env_file:
@@ -54,7 +54,7 @@ services:
5454
dd-egress-filter:
5555
build:
5656
context: ./docker/egress-filter
57-
image: docker-dash-egress-filter:${APP_VERSION:-6.14.2}
57+
image: docker-dash-egress-filter:${APP_VERSION:-6.14.3}
5858
container_name: dd-egress-filter
5959
restart: unless-stopped
6060
# Uses the default bridge so target containers on the default bridge can

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "docker-dash",
3-
"version": "6.14.2",
3+
"version": "6.14.3",
44
"description": "Full-featured Docker management dashboard",
55
"main": "src/server.js",
66
"scripts": {

public/js/i18n/en.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -415,6 +415,28 @@ i18n.register('en', 'EN', 'English', {
415415
guideSshKeyStep3: 'Step 3 — Paste private key in Docker Dash',
416416
guideSshKeyStep3Sub: 'Print your private key, then paste it in the SSH Private Key field when adding a host:',
417417
guideSshKeyNote: 'The private key is sent only when the SSH connection is opened and is never logged or exposed via the API.',
418+
// NAS Docker section
419+
guideNasTitle: 'NAS Docker (Synology / Unraid / TrueNAS / QNAP / OMV)',
420+
guideNasBadge: 'Best practices included',
421+
guideNasIntro: 'Most modern NAS platforms ship Docker (or a thin wrapper around it) and connect to Docker Dash via SSH Tunnel. The platform is auto-detected from <code>docker info</code> and rendered as a branded badge on the Multi-Host page. Detailed per-platform How-To guides cover the platform-specific quirks.',
422+
guideNasConnTitle: 'Connection setup (any NAS)',
423+
guideNasStep1: 'Enable SSH on the NAS (UI: Control Panel → Terminal/SSH or equivalent).',
424+
guideNasStep2: 'Add your admin user to the group:',
425+
guideNasStep3: 'Set up SSH key authentication (recommended over passwords)',
426+
guideNasStep3Link: 'SSH Key How-To (covers all NAS platforms)',
427+
guideNasStep4: 'In Docker Dash → Multi-Host → Add Host → choose <strong>SSH Tunnel</strong>, paste the private key, save.',
428+
guideNasGuides: 'Detailed per-platform guides',
429+
guideNasSecTitle: 'Synology security hardening (DSM 7.x)',
430+
guideNasSec1: '<strong>SSH key auth, then disable PasswordAuthentication</strong> in <code>/etc/ssh/sshd_config</code> (test the key works first, otherwise you lock yourself out).',
431+
guideNasSec2: '<strong>Move SSH off port 22</strong> to a non-standard port (Control Panel → Terminal &amp; SNMP). Cuts ~99% of bot traffic.',
432+
guideNasSec3: '<strong>Enable DSM 2-factor authentication</strong> for the admin account (Personal → Account → 2-Factor Authentication).',
433+
guideNasSec4: '<strong>Auto Block</strong>: Control Panel → Security → Account → enable Auto Block after N failed logins (recommended: 5 within 5 minutes, ban for 24h).',
434+
guideNasSec5: '<strong>Restrict SSH to LAN only</strong> via DSM Firewall (Control Panel → Security → Firewall). Block port 22/SSH from any external IP range.',
435+
guideNasSec6: '<strong>Disable the built-in <code>admin</code> user</strong> after creating a non-default admin (Control Panel → User &amp; Group → admin → Edit → Disable).',
436+
guideNasSec7: '<strong>Mount Docker socket read-only</strong> when running Docker Dash on the NAS itself: <code>-v /var/run/docker.sock:/var/run/docker.sock:<strong>ro</strong></code>. Limits damage if the dashboard is ever compromised.',
437+
guideNasSec8: '<strong>Run DSM Security Advisor weekly</strong> (Security Advisor → Settings → Schedule). Catches outdated DSM versions, weak passwords, and risky settings automatically.',
438+
guideNasSec9: '<strong>HTTPS-only for DSM UI</strong> (Control Panel → Network → DSM Settings → Automatically redirect HTTP to HTTPS). Even on LAN — HTTP credentials over WiFi are trivial to capture.',
439+
guideNasTip: 'Auto-detection identifies your NAS platform + DSM/QTS/OMV/etc. version from <code>docker info</code> with no extra configuration. Look for the platform badge above the host card on the Multi-Host page.',
418440
},
419441
// ── About ────────────────────────────────────
420442
about: {

public/js/i18n/ro.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -382,6 +382,28 @@ i18n.register('ro', 'RO', 'Română', {
382382
guideSshKeyStep3: 'Pasul 3 — Lipeste cheia privata in Docker Dash',
383383
guideSshKeyStep3Sub: 'Afiseaza cheia privata si lipeste-o in campul SSH Private Key cand adaugi un host:',
384384
guideSshKeyNote: 'Cheia privata este trimisa doar cand se deschide conexiunea SSH si nu este niciodata logata sau expusa prin API.',
385+
// Sectiunea NAS Docker
386+
guideNasTitle: 'NAS Docker (Synology / Unraid / TrueNAS / QNAP / OMV)',
387+
guideNasBadge: 'Best practices incluse',
388+
guideNasIntro: 'Majoritatea platformelor NAS moderne au Docker (sau un wrapper subtire) si se conecteaza la Docker Dash prin SSH Tunnel. Platforma este auto-detectata din <code>docker info</code> si afisata ca badge pe pagina Multi-Host. Ghidurile dedicate per platforma acopera ciudateniile specifice fiecareia.',
389+
guideNasConnTitle: 'Configurare conexiune (orice NAS)',
390+
guideNasStep1: 'Activeaza SSH pe NAS (UI: Control Panel → Terminal/SSH sau echivalent).',
391+
guideNasStep2: 'Adauga user-ul de admin in grupul:',
392+
guideNasStep3: 'Configureaza autentificare cu cheie SSH (recomandat in loc de parola)',
393+
guideNasStep3Link: 'Ghid SSH Key (acopera toate platformele NAS)',
394+
guideNasStep4: 'In Docker Dash → Multi-Host → Add Host → alege <strong>SSH Tunnel</strong>, lipeste cheia privata, salveaza.',
395+
guideNasGuides: 'Ghiduri dedicate per platforma',
396+
guideNasSecTitle: 'Hardening de securitate Synology (DSM 7.x)',
397+
guideNasSec1: '<strong>Cheie SSH, apoi dezactiveaza PasswordAuthentication</strong> in <code>/etc/ssh/sshd_config</code> (testeaza cheia INTAI, altfel te blochezi singur afara).',
398+
guideNasSec2: '<strong>Muta SSH de pe portul 22</strong> pe un port non-standard (Control Panel → Terminal &amp; SNMP). Taie ~99% din traficul de boti.',
399+
guideNasSec3: '<strong>Activeaza autentificare cu doi factori</strong> pentru contul de admin (Personal → Account → 2-Factor Authentication).',
400+
guideNasSec4: '<strong>Auto Block</strong>: Control Panel → Security → Account → activeaza Auto Block dupa N login-uri esuate (recomandat: 5 in 5 minute, ban 24h).',
401+
guideNasSec5: '<strong>Restrictioneaza SSH doar la LAN</strong> prin DSM Firewall (Control Panel → Security → Firewall). Blocheaza portul 22/SSH de la orice IP extern.',
402+
guideNasSec6: '<strong>Dezactiveaza user-ul integrat <code>admin</code></strong> dupa ce creezi un alt admin (Control Panel → User &amp; Group → admin → Edit → Disable).',
403+
guideNasSec7: '<strong>Monteaza socket-ul Docker read-only</strong> cand rulezi Docker Dash chiar pe NAS: <code>-v /var/run/docker.sock:/var/run/docker.sock:<strong>ro</strong></code>. Limiteaza pagubele daca dashboard-ul e vreodata compromis.',
404+
guideNasSec8: '<strong>Ruleaza DSM Security Advisor saptamanal</strong> (Security Advisor → Settings → Schedule). Detecteaza automat versiuni DSM vechi, parole slabe, setari riscante.',
405+
guideNasSec9: '<strong>Doar HTTPS pentru UI-ul DSM</strong> (Control Panel → Network → DSM Settings → Automatically redirect HTTP to HTTPS). Inclusiv pe LAN — credentialele HTTP pe WiFi sunt triviale de capturat.',
406+
guideNasTip: 'Auto-detect identifica platforma NAS + versiunea DSM/QTS/OMV/etc. din <code>docker info</code>, fara configurare suplimentara. Cauta badge-ul de platforma deasupra cardului de host pe pagina Multi-Host.',
385407
},
386408
// ── About ────────────────────────────────────
387409
about: {

public/js/pages/hosts.js

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -625,6 +625,63 @@ ssh your-user@host "docker ps"</div>
625625
</div>
626626
</div>
627627
628+
<!-- NAS Docker — full-width row covering setup + Synology security best practices -->
629+
<div style="border:1px solid var(--border);border-radius:var(--radius);padding:14px;margin-bottom:16px">
630+
<div style="display:flex;align-items:center;gap:8px;margin-bottom:10px;flex-wrap:wrap">
631+
<i class="fas fa-hdd" style="color:#11457e;font-size:18px"></i>
632+
<strong style="font-size:14px">${i18n.t('pages.hosts.guideNasTitle')}</strong>
633+
<span class="badge" style="font-size:10px;background:var(--bg-dim)">${i18n.t('pages.hosts.guideNasBadge')}</span>
634+
</div>
635+
<p class="text-sm text-muted" style="margin:0 0 14px">${i18n.t('pages.hosts.guideNasIntro')}</p>
636+
637+
<div style="display:grid;grid-template-columns:1fr 1fr;gap:18px">
638+
<!-- Connection setup -->
639+
<div>
640+
<div style="font-weight:600;margin-bottom:8px;font-size:13px">
641+
<i class="fas fa-link" style="color:var(--accent);margin-right:6px"></i>${i18n.t('pages.hosts.guideNasConnTitle')}
642+
</div>
643+
<ol class="text-sm" style="padding-left:20px;line-height:1.9;margin:0;color:var(--text)">
644+
<li>${i18n.t('pages.hosts.guideNasStep1')}</li>
645+
<li>${i18n.t('pages.hosts.guideNasStep2')} <code>docker</code></li>
646+
<li>${i18n.t('pages.hosts.guideNasStep3')} → <a href="#/howto/ssh-key-auth">${i18n.t('pages.hosts.guideNasStep3Link')}</a></li>
647+
<li>${i18n.t('pages.hosts.guideNasStep4')}</li>
648+
<li>${i18n.t('pages.hosts.guideNasGuides')}:
649+
<div style="display:flex;flex-wrap:wrap;gap:6px;margin-top:6px">
650+
<a href="#/howto/synology-dsm" class="badge" style="background:#11457e;color:#fff;text-decoration:none;font-size:10px"><i class="fas fa-hdd" style="margin-right:4px"></i>Synology DSM</a>
651+
<a href="#/howto/unraid" class="badge" style="background:#f15a29;color:#fff;text-decoration:none;font-size:10px"><i class="fab fa-docker" style="margin-right:4px"></i>Unraid</a>
652+
<a href="#/howto/truenas-scale" class="badge" style="background:#0095d5;color:#fff;text-decoration:none;font-size:10px"><i class="fas fa-server" style="margin-right:4px"></i>TrueNAS SCALE</a>
653+
<a href="#/howto/qnap-qts" class="badge" style="background:#ee3a25;color:#fff;text-decoration:none;font-size:10px"><i class="fas fa-hdd" style="margin-right:4px"></i>QNAP</a>
654+
<a href="#/howto/openmediavault" class="badge" style="background:#43a047;color:#fff;text-decoration:none;font-size:10px"><i class="fas fa-server" style="margin-right:4px"></i>OpenMediaVault</a>
655+
</div>
656+
</li>
657+
</ol>
658+
</div>
659+
660+
<!-- Synology security hardening -->
661+
<div>
662+
<div style="font-weight:600;margin-bottom:8px;font-size:13px;color:var(--green)">
663+
<i class="fas fa-shield-alt" style="margin-right:6px"></i>${i18n.t('pages.hosts.guideNasSecTitle')}
664+
</div>
665+
<ul class="text-sm" style="padding-left:20px;line-height:1.9;margin:0;color:var(--text)">
666+
<li>${i18n.t('pages.hosts.guideNasSec1')}</li>
667+
<li>${i18n.t('pages.hosts.guideNasSec2')}</li>
668+
<li>${i18n.t('pages.hosts.guideNasSec3')}</li>
669+
<li>${i18n.t('pages.hosts.guideNasSec4')}</li>
670+
<li>${i18n.t('pages.hosts.guideNasSec5')}</li>
671+
<li>${i18n.t('pages.hosts.guideNasSec6')}</li>
672+
<li>${i18n.t('pages.hosts.guideNasSec7')}</li>
673+
<li>${i18n.t('pages.hosts.guideNasSec8')}</li>
674+
<li>${i18n.t('pages.hosts.guideNasSec9')}</li>
675+
</ul>
676+
</div>
677+
</div>
678+
679+
<div class="tip-box" style="margin-top:14px">
680+
<i class="fas fa-lightbulb"></i>
681+
<div>${i18n.t('pages.hosts.guideNasTip')}</div>
682+
</div>
683+
</div>
684+
628685
<!-- Architecture diagram -->
629686
<div style="border:1px solid var(--border);border-radius:var(--radius);padding:14px;margin-bottom:16px">
630687
<div style="font-weight:600;margin-bottom:10px"><i class="fas fa-project-diagram" style="color:var(--accent);margin-right:6px"></i>${i18n.t('pages.hosts.guideArch')}</div>

public/js/pages/whatsnew.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,17 @@ const WhatsNewPage = {
99
// Add new releases at the TOP of this array.
1010
// Types: feature, fix, improvement, security, breaking
1111
_releases: [
12+
{
13+
version: '6.14.3',
14+
date: '2026-04-22',
15+
title: 'NAS Docker section in the host-connection guide',
16+
changes: [
17+
{ type: 'feature', text: 'New full-width NAS Docker section in the "How to Connect Docker Hosts" card on #/hosts. Closes the gap where v6.12.0-v6.12.2 added platform detection + How-Tos for 5 NAS platforms but the host-connection guide on #/hosts never mentioned them.' },
18+
{ type: 'feature', text: 'Left column — generic SSH-Tunnel setup that works on any NAS, with brand-colored pill links to the 5 platform-specific How-Tos: Synology DSM (slate blue), Unraid (orange), TrueNAS SCALE (teal), QNAP (red), OpenMediaVault (green). Users see their NAS at a glance.' },
19+
{ type: 'feature', text: 'Right column — 9-item Synology DSM 7.x security hardening checklist: SSH key auth + disable password, move SSH off port 22, 2FA for admin, Auto Block after failed logins, firewall SSH to LAN only, disable built-in admin user, read-only docker.sock mount, weekly Security Advisor scan, HTTPS-only DSM UI. Each with the exact Control Panel path.' },
20+
{ type: 'improvement', text: 'Bilingual: 19 new i18n keys in en.js + ro.js. Matches existing pattern; the Translations tab can fill the other 9 languages on demand.' },
21+
],
22+
},
1223
{
1324
version: '6.14.2',
1425
date: '2026-04-22',

src/version.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@
22
// Single source of truth for the application version.
33
// Updated automatically by: npm version X.Y.Z (via scripts/sync-version.js)
44
// server.js reads this to inject into index.html at startup — no build step needed.
5-
module.exports = '6.14.2';
5+
module.exports = '6.14.3';

0 commit comments

Comments
 (0)