# Storage Mounts — Homelab Centralised reference for all remote shares mounted across the homelab. Every host with shares exports them via SMB (CIFS), except where NFS is noted. --- ## Architecture Overview ``` homelab-vm (192.168.0.210) /mnt/... / Atlantis ─── LAN ─── 8× CIFS + 1× NFS pi-5 ─── LAN ─── 1× CIFS Calypso ─ Tailscale ─ 6× CIFS Setillo ─ Tailscale ─ 4× CIFS Guava ─ Tailscale ─ 7× CIFS ``` --- ## Share Inventory ### Atlantis (192.168.0.200) — Synology 1823xs+ | Share | Mount point | Protocol | Notes | |-------|-------------|----------|-------| | `archive` | `/mnt/repo_atlantis` | NFS v3 | Git/archive storage | | `data` | `/mnt/atlantis_data` | CIFS | Primary data (media/torrents/usenet subdirs) | | `docker` | `/mnt/atlantis_docker` | CIFS | Docker volumes/configs | | `downloads` | `/mnt/atlantis_downloads` | CIFS | Download staging | | `games` | `/mnt/atlantis_games` | CIFS | Game files | | `torrents` | `/mnt/atlantis_torrents` | CIFS | Torrent data (885G, separate volume) | | `usenet` | `/mnt/atlantis_usenet` | CIFS | Usenet downloads (348G, separate volume) | | `website` | `/mnt/atlantis_website` | CIFS | Web content | | `documents` | `/mnt/atlantis_documents` | CIFS | Documents | > **Note:** Only `archive` and `data` are NFS-exported by DSM to this host. All other shares use CIFS. The old `atlantis_docker` NFS entry in fstab was replaced with CIFS as the NFS export was not configured in DSM. ### Calypso (100.103.48.78) — Synology DS723+, via Tailscale | Share | Mount point | Protocol | |-------|-------------|----------| | `data` | `/mnt/calypso_data` | CIFS | | `docker` | `/mnt/calypso_docker` | CIFS | | `docker2` | `/mnt/calypso_docker2` | CIFS | | `dropboxsync` | `/mnt/calypso_dropboxsync` | CIFS | | `Files` | `/mnt/calypso_files` | CIFS | | `netshare` | `/mnt/calypso_netshare` | CIFS | ### Setillo (100.125.0.20) — Synology DS223j, via Tailscale | Share | Mount point | Protocol | |-------|-------------|----------| | `backups` | `/mnt/setillo_backups` | CIFS | | `docker` | `/mnt/setillo_docker` | CIFS | | `PlexMediaServer` | `/mnt/setillo_plex` | CIFS | | `syncthing` | `/mnt/setillo_syncthing` | CIFS | ### Guava (100.75.252.64) — TrueNAS SCALE, via Tailscale | Share | Mount point | Notes | |-------|-------------|-------| | `photos` | `/mnt/guava_photos` | 1.6T | | `data` | `/mnt/guava_data` | passionfruit user home data | | `guava_turquoise` | `/mnt/guava_turquoise` | 4.5T, 68% used — large archive | | `website` | `/mnt/guava_website` | | | `jellyfin` | `/mnt/guava_jellyfin` | Jellyfin media | | `truenas-exporters` | `/mnt/guava_exporters` | Prometheus exporters config | | `iso` | `/mnt/guava_iso` | ISO images | > **TrueNAS password quirk:** TrueNAS SCALE escapes `!` as `\!` when storing SMB passwords internally. If your password ends in `!`, the credentials file must append a backslash: `password="REDACTED_PASSWORD"\!`. Setting the password is done via `sudo python3 -c "import subprocess,json; subprocess.run(['midclt','call','user.update','USER_ID',json.dumps({'password':'PASS'})], capture_output=True, text=True)"` — then restart SMB with `sudo midclt call service.restart cifs`. ### pi-5 / rpi5-vish (192.168.0.66) — Raspberry Pi 5 | Share | Mount point | Protocol | Notes | |-------|-------------|----------|-------| | `storagepool` | `/mnt/pi5_storagepool` | CIFS | 457G NVMe btrfs | > pi-5 also mounts `atlantis:/volume1/data` → `/mnt/atlantis_data` via NFS. --- ## Setup from Scratch ### 1. Install dependencies ```bash sudo apt-get install -y cifs-utils nfs-common ``` ### 2. Create credentials files All files go in `/etc/samba/`, owned root, mode 0600. ```bash # Atlantis & Setillo share the same credentials sudo bash -c 'cat > /etc/samba/.atlantis_credentials << EOF username=vish password=REDACTED_PASSWORD EOF chmod 600 /etc/samba/.atlantis_credentials' sudo bash -c 'cat > /etc/samba/.calypso_credentials << EOF username=Vish password=REDACTED_PASSWORD EOF chmod 600 /etc/samba/.calypso_credentials' sudo bash -c 'cat > /etc/samba/.setillo_credentials << EOF username=vish password=REDACTED_PASSWORD EOF chmod 600 /etc/samba/.setillo_credentials' sudo bash -c 'cat > /etc/samba/.pi5_credentials << EOF username=vish password=REDACTED_PASSWORD EOF chmod 600 /etc/samba/.pi5_credentials' ``` ### 3. Create mount points ```bash sudo mkdir -p \ /mnt/repo_atlantis \ /mnt/atlantis_{data,docker,downloads,games,torrents,usenet,website,documents} \ /mnt/calypso_{data,docker,docker2,dropboxsync,files,netshare} \ /mnt/setillo_{backups,docker,plex,syncthing} \ /mnt/pi5_storagepool ``` ### 4. Apply fstab Copy the entries from `hosts/vms/homelab-vm/fstab.mounts` into `/etc/fstab`, then: ```bash sudo mount -a ``` ### 5. Verify ```bash df -h | grep -E 'atlantis|calypso|setillo|pi5' ``` --- ## Troubleshooting ### Mount fails with "Permission denied" (CIFS) - Credentials file has wrong username or password - On Synology, the SMB user password is the DSM account password — separate from SSH key auth - Test a single mount manually: `sudo mount -t cifs //HOST/SHARE /tmp/test -o credentials=/etc/samba/.CREDS,vers=3.0` ### Mount fails with "No route to host" (Calypso/Setillo) - These are Tailscale-only — ensure Tailscale is up: `tailscale status` - Calypso and Setillo are not reachable over the LAN directly ### Guava LAN shares unreachable despite SMB running Calypso advertises `192.168.0.0/24` as a Tailscale subnet route. Any node with `accept_routes: true` will install that route in Tailscale's policy routing table (table 52), causing replies to LAN clients to be sent back via the Tailscale tunnel instead of the LAN — the connection silently times out. **Check for rogue routes:** ```bash ssh guava "ip route show table 52 | grep 192.168" ``` **Fix — remove stale routes immediately:** ```bash ssh guava "sudo ip route del 192.168.0.0/24 dev tailscale0 table 52" ``` **Fix — permanent (survives reboot):** Set `accept_routes: false` in the TrueNAS Tailscale app config via `midclt call app.update` or the web UI. See `docs/troubleshooting/guava-smb-incident-2026-03-14.md` for full details. ### NFS mount hangs at boot - Ensure `_netdev` and `nofail` options are set in fstab - NFS requires the network to be up; `_netdev` defers the mount until after networking ### atlantis_docker was previously NFS but not mounting - DSM's NFS export for `docker` was not configured for this host's IP - Switched to CIFS — works without any DSM NFS permission changes