Home ยท Volume 1 ยท Chapter 10

๐Ÿ“– Chapter 10 โ€” The Build

The complete configuration in one place. The chapter you reference when you forget how a piece works.

v0.1 ยท draft Vol 1 ยท Ch 10
~20 min

Learning Objectives

Introduction

This is the chapter to come back to. The previous nine chapters explain why. This one is just what. The dataset tree, the users, the shares, the snapshot policies, the apps, the maintenance schedule. Print it, bookmark it, refer to it whenever you forget "wait, did we put a quota on the PhoneUploads dataset or not?"

If you're building your own NAS, this is the chapter that walks through the actual setup in the right order.

Hardware baseline

For TK's setup, the conversation converged on this hardware profile. Yours may differ; the structure below is what to aim for.

ComponentSpecWhy
CPUModern multi-core (Intel i5/i7 or AMD Ryzen 5/7)ZFS loves RAM and CPU for ARC + scrubs
RAM32 GB minimum, 64 GB recommendedZFS uses RAM for read cache (ARC); 1 GB per TB of storage is a good rule
Boot driveDedicated SSD (mirror recommended)TrueNAS lives here; pool lives on HDDs
Data drives6 ร— 12 TB (or similar) NAS-ratedRAIDZ2 gives ~44 TB usable with 2-drive fault tolerance
Network1 GbE minimum, 10 GbE if budget allows1 GbE = 125 MB/s; 10 GbE = 1.25 GB/s
CaseHot-swap bays, good coolingDrives run 24/7; airflow matters
UPSAt least 1000 VASurvives brownouts; protects the pool from dirty shutdowns

The dataset tree

This is the entire filesystem layout for TK's NAS. The conversation went through several revisions; this is the v2.2 final:

tank โ† pool (single vdev, RAIDZ2, 6ร—12TB) โ”œโ”€โ”€ Family โ† shared by all family members โ”œโ”€โ”€ Photos โ† shared photo library โ”œโ”€โ”€ Videos โ† shared video library โ”œโ”€โ”€ Documents โ† shared documents โ”œโ”€โ”€ Private โ† private to TK + Mimi (subdatasets) โ”‚ โ”œโ”€โ”€ Tom โ† private to Tom โ”‚ โ”œโ”€โ”€ Mimi โ† private to Mimi โ”‚ โ””โ”€โ”€ Lai โ† private to Lai โ”œโ”€โ”€ PhoneUploads โ† staging area, short retention โ”œโ”€โ”€ Apps โ† app data (no user access) โ”‚ โ”œโ”€โ”€ ix-applications โ† TrueNAS system data โ”‚ โ”œโ”€โ”€ immich โ† Immich's photo library โ”‚ โ”œโ”€โ”€ jellyfin โ† Jellyfin's metadata โ”‚ โ”œโ”€โ”€ vaultwarden โ† Vaultwarden's password database โ”‚ โ””โ”€โ”€ paperless โ† Paperless-ngx's document archive โ”œโ”€โ”€ Media โ† video production โ”‚ โ”œโ”€โ”€ Active โ† current project work โ”‚ โ””โ”€โ”€ Archive โ† completed projects โ””โ”€โ”€ Lab โ† VMs and testing (TK only)

Dataset properties

The compression, quota, and encryption settings per dataset:

DatasetCompressionQuotaEncryptionNotes
Familylz4โ€”โ€”
Photoslz4โ€”โ€”Already-compressed, but lz4 doesn't hurt
Videoslz4โ€”โ€”Same
Documentslz4โ€”โ€”Compresses well
Privatelz4โ€”โ€”Top-level for TK+Mimi
Private/Tomlz4500 GBYesPer-user, encrypted
Private/Mimilz4500 GBYesPer-user, encrypted
Private/Lailz4500 GBYesPer-user, encrypted
PhoneUploadslz4200 GBโ€”Staging area, low retention
Appslz4โ€”โ€”App data, automatic
Medialz4โ€”โ€”Video production
Media/Activelz42 TBโ€”Fast SSD-backed if possible
Media/Archivelz4โ€”โ€”Long-term, no limit
Lablz4โ€”โ€”TK only

Permissions matrix

The full owner / group / mode for every dataset (from Chapter 07):

DatasetOwnerGroupModeABSE
FamilytkFamily770โ€”
PhotostkFamily770โ€”
VideostkFamily770โ€”
DocumentstkFamily770โ€”
Privatetktk770Yes
Private/TomTomTom700โ€”
Private/MimiMimiMimi700โ€”
Private/LaiLaiLai700โ€”
PhoneUploadstkFamily770โ€”
AppstkFamily770โ€”
MediatkFamily770โ€”
Media/ActivetkFamily770โ€”
Media/ArchivetkFamily770โ€”
Labtktk700Yes

Users and groups

The complete user list (from Chapter 06):

UsernameRoleGroupAdminShell
tkHousehold adminFamilyYes/bin/bash
MimiFamily memberFamilyNonologin
LaiFamily memberFamilyNonologin
rootBuilt-in superuserrootโ€”(reserved, don't use)

When future family members or friends need access, add them to the Family group (for shared datasets) and create a Private/<name> subdataset for their personal data.

SMB shares

The complete share list (from Chapter 05). One share per top-level dataset; private subdatasets are not shared at the top level (they're accessed via the Private parent share or individually if needed).

Share namePathABSEAllowed users
Family/mnt/tank/Familyโ€”Family group
Photos/mnt/tank/Photosโ€”Family group
Videos/mnt/tank/Videosโ€”Family group
Documents/mnt/tank/Documentsโ€”Family group
Private/mnt/tank/PrivateYestk, Mimi, Lai (per their subdataset perms)
PhoneUploads/mnt/tank/PhoneUploadsโ€”Family group (drop files), tk (manage)
Apps/mnt/tank/Appsโ€”tk (apps have their own accounts)
Media/mnt/tank/Mediaโ€”Family group (read), tk (write)
Lab/mnt/tank/LabYestk only

Snapshot policies

The full schedule (from Chapter 09):

DatasetHourlyDailyWeeklyMonthlyYearly
Family / Photos / Videos / Documents48h30d12w12mo5y
PhoneUploads24hโ€”โ€”โ€”โ€”
Private/*โ€”7d4wโ€”โ€”
Apps/*on app update (manual or auto)
Media/Activeโ€”30dโ€”โ€”โ€”
Media/Archiveโ€”โ€”โ€”โ€”after each major edit
Labโ€”7dโ€”โ€”โ€”

Maintenance schedule

The automation that runs on TK's pool (from Chapter 09):

TaskFrequencyWhenWhere to monitor
Pool scrubMonthly2nd Sunday, 2 AMStorage โ†’ Snapshots; email alerts
SMART short testWeeklySaturday, 4 AMData Protection โ†’ SMART Tests
SMART long testMonthly1st Sunday, 2 AMData Protection โ†’ SMART Tests
App updatesMonthlyWhen you chooseApps โ†’ Discover โ†’ Update
TrueNAS updatesQuarterlyWhen you chooseSystem โ†’ Update
Backup verificationMonthlySame day as scrubSee Volume 6

Apps (the install order)

The order in which to install apps (from Chapter 08):

  1. Tailscale โ€” for remote access (install first; you need it for everything else)
  2. Immich โ€” for the family photo library (highest-value data)
  3. Jellyfin โ€” for media streaming (the "wow" app)
  4. Vaultwarden โ€” for password management (when the family is ready)
  5. Paperless-ngx โ€” for document scanning (when the family trusts the system)

Network access

The order of operations for the initial build

Don't try to do everything at once. This is the recommended order. Take a break between major steps.

Day 1: Hardware and base install

  1. Assemble the hardware. Drives in the case, motherboard in the case, cables connected.
  2. Connect to a monitor and keyboard. Boot from the TrueNAS installer USB.
  3. Install TrueNAS to the boot SSD (or mirror).
  4. Reboot. The system comes up with a web UI on a known IP (DHCP) or with a console prompt for static IP setup.
  5. From a laptop, browse to the TrueNAS web UI. Complete the initial setup wizard.

Day 2: Pool and datasets

  1. Storage โ†’ Create Pool. Name it tank. Choose RAIDZ2. Select all 6 drives. Confirm. Wait for the resilver to complete (15-30 minutes for an empty pool).
  2. Storage โ†’ Create Dataset. Create each dataset in the tree above. Set the compression, quota, and encryption per the table.
  3. Storage โ†’ Create Dataset (Child) for Private/<name> for each family member.
  4. Verify the tree matches the diagram above.

Day 3: Users and groups

  1. Credentials โ†’ Local Groups โ†’ Add. Create the Family group.
  2. Credentials โ†’ Local Users โ†’ Add. Create tk with admin privileges, Samba auth, /bin/bash shell.
  3. Create Mimi, Lai. No admin, Samba auth, nologin shell.
  4. Add each user to the Family group.
  5. From a laptop, try \\<nas-name>\ in File Explorer. Verify you can log in as tk and see the empty top-level shares.

Day 4: Shares and permissions

  1. Shares โ†’ SMB โ†’ Add for each dataset in the share table above.
  2. Set the dataset permissions per the matrix above (owner, group, mode, ABSE).
  3. Test: log in as Mimi from a different laptop. Verify she can see Family/Photos/Videos/Documents/PhoneUploads/Apps/Media but NOT Private or Lab.

Day 5: Snapshot and scrub schedules

  1. Data Protection โ†’ Periodic Snapshot Tasks โ†’ Add for each schedule in the snapshot table.
  2. Data Protection โ†’ Scrub Tasks โ†’ Add. Pool = tank. Schedule = monthly.
  3. Data Protection โ†’ S.M.A.R.T. Tests โ†’ Add. All data drives. Schedule = weekly short, monthly long.
  4. Set up email alerts: System โ†’ Email. Add your address. Enable alerts for SMART failures, scrub errors, and snapshot failures.

Day 6+: Tailscale and the first app

  1. Install Tailscale from the Apps catalog. Sign in. Install Tailscale on your laptop and phone.
  2. Verify: from your phone on cellular, you can reach the NAS at its Tailscale IP.
  3. Install Immich. Set up family users. Install the mobile app. Enable auto-upload.
  4. Wait a week. Make sure Immich is working. Then move to the next app.

Week 2+: Jellyfin

  1. Install Jellyfin. Set up the Media library. Stream something.
  2. Wait. Make sure Jellyfin is working.

Week 3+: Vaultwarden and Paperless-ngx

  1. Install Vaultwarden. Import passwords. Install browser extension.
  2. Install Paperless-ngx. Start scanning.

That's a 3-week build. The discipline is what makes it feel stable. Don't skip the wait periods.

Verification checklist (before you trust it)

Before you put irreplaceable data on this NAS, run through this checklist:

Engineering Note

This is the build you'll live with for years. Once the dataset tree is set, once the permissions are configured, once the apps are deployed, you'll stop thinking about it. The whole point of the long planning conversation in the original chat was to get to this configuration without regret.

Resist the urge to "just add one more app" right away. Add apps only when there's a real need driving them. The discipline is what turns a NAS into a reliable system instead of a science project.

Summary

One pool, one vdev, RAIDZ2, 6 ร— 12TB, ~44TB usable. Family group + per-user private subdatasets. One SMB share per top-level dataset. LZ4 compression everywhere, encryption on private subdatasets. Hourly/daily/weekly/monthly/yearly snapshot policies per dataset. Monthly scrubs, weekly SMART tests. Five apps in install order: Tailscale, Immich, Jellyfin, Vaultwarden, Paperless-ngx. Tailscale for remote access, no public SMB. Email alerts on SMART failures and scrub errors.

Checklist

Looking Ahead

Volume 1 is complete. Volume 2 โ€” Family NAS โ€” goes deeper into the apps and the family-facing experience: how to make Immich work for everyone, how to share albums, how to handle the family's media library, and how to add a friend or extended family member to the access list. The next volume turns the foundation into a household service.

Ch 10 ยท v0.1 ยท drafted from the original ChatGPT conversation, July 2026