Post

Just Finished My Nashome Server

Just Finished My Nashome Server

Just Finished My Nashome Server

Introduction

Building a reliable, self‑hosted storage platform is a milestone for any homelab enthusiast or DevOps practitioner. The moment you power up a dedicated NAS‑style server and watch your data settle into organized pools, you realize how much smoother operations become when you control every layer of the stack. This post walks you through the entire journey of designing, assembling, and fine‑tuning a modern home server that serves as the backbone for services such as ARR, Immich, and Frigate.

The title Just Finished My Nashome Server captures the excitement of completing a build that blends robust hardware, enterprise‑grade file systems, and containerized workloads into a single, cohesive environment. Readers will learn why a purpose‑built storage layer matters, how to select the right components, and which configuration patterns keep the system performant and secure. By the end of this guide you will have a clear blueprint for replicating the setup, understanding the trade‑offs between RAID, mirroring, and erasure coding, and applying best‑practice hardening techniques that are essential for any production‑grade homelab.

Key takeaways include: - A concise overview of the hardware choices that balance cost, power consumption, and expandability.

  • Guidance on selecting and provisioning storage pools using ZFS mirrors and RAID‑Z2 for different workloads.
  • Step‑by‑step instructions for installing TrueNAS SCALE, configuring SMB shares, and exposing services via Docker containers without compromising security. - Practical examples of dataset tuning, compression, and deduplication that maximize usable capacity while preserving data integrity.
  • Strategies for monitoring, backup, and scaling the system as your data footprint grows.

Whether you are migrating from a consumer‑grade NAS, expanding an existing homelab, or designing a brand‑new build, this guide equips you with the technical depth and actionable steps needed to turn raw components into a resilient, self‑hosted storage platform.

Understanding the Topic

What Is a NAS‑Centric Home Server?

A Network‑Attached Storage (NAS) server is a dedicated compute node that provides block‑level or file‑level storage to other devices on a network. In a homelab context, the server doubles as a control plane for containerized applications, media transcoding, and backup targets. The term NAS‑home server emphasizes the convergence of traditional storage services with modern orchestration tools, enabling you to run workloads such as ARR (Automatic Re‑Recognition of Recordings), Immich (self‑hosted photo management), and Frigate (AI‑based object detection) on the same hardware that manages your primary data repository. ### Historical Context

Early home storage solutions relied on external USB drives or consumer‑grade routers with attached storage. The advent of ZFS brought enterprise‑grade data integrity to commodity hardware, while TrueNAS SCALE merged the stability of FreeBSD with the flexibility of Docker and Kubernetes. Today, a typical build may feature a Ryzen‑based CPU, ECC memory, and multiple drive bays, all housed in a compact case that fits on a desk or rack shelf.

Core Features

  • ZFS Dataset Management – Create separate datasets for applications, media, and backups, each with its own compression, deduplication, and quota settings.
  • Mirrored Pools – Use two‑disk mirrors for high availability; larger groups of mirrors can be combined into a single pool for capacity scaling.
  • SMB/CIFS Shares – Provide Windows, macOS, and Linux clients with seamless file access via the Samba protocol.
  • Docker Integration – Run containerized services in isolated environments, leveraging network namespaces and resource limits. - AI Acceleration – Deploy an Intel Arc GPU or dedicated NPU to handle transcoding and inference workloads efficiently.

Pros and Cons

AdvantageDescription
Data integrityZFS checksums detect and correct silent corruption.
ScalabilityAdd mirrors or replace drives without downtime.
Unified interfaceSMB, NFS, and iSCSI expose the same underlying storage.
Container supportNative Docker daemon enables rapid deployment of services.
Cost‑effectiveCommodity hardware can match enterprise‑grade performance.
LimitationConsideration
Power consumptionHigh‑performance CPUs and multiple drives increase electricity draw.
ComplexityTuning ZFS parameters requires careful testing.
Hardware wearSSDs used for metadata or caching may have limited write cycles.
NoiseMultiple spinning disks can generate audible noise in quiet environments.

Use Cases and Success Stories

  • Media Server – A mirrored pool of 3 TB drives stores 4K video files, while a separate SSD‑based dataset hosts Docker images for Plex and Jellyfin.
  • AI‑Enhanced Surveillance – An Intel Arc A310 GPU runs Frigate to process camera feeds in real time, leveraging hardware‑accelerated decoding. - Backup HubRestic containers push encrypted snapshots to a remote object store, while the local pool retains the most recent three generations for fast restores.

The homelab ecosystem continues to mature, with projects like TrueNAS SCALE integrating Kubernetes for orchestrating micro‑services. Upcoming trends include native support for NVMe over Fabrics (NVMe‑of‑TCP) to expand storage capacity without adding physical drives, and tighter integration between ZFS and container runtimes to enable per‑dataset resource quotas.

Prerequisites ### Hardware Requirements

ComponentMinimum SpecificationRecommended Model
CPU6‑core, 3.5 GHzAMD Ryzen 5 5600X
MotherboardATX, 4‑DIMM, 2‑PCIe x16ASRock Rack X470DU4
RAM16 GB ECC2 × 16 GB DDR4 ECC
Primary Storage16 GB NVMe for OSIntel Optane 16 GB
Media Pool2 × 3 TB HDD (mirrored)3 TB 7200 RPM SATA
GPU (optional)Intel Arc A310Arc A310 for transcoding
Case4‑bay, good airflowJonsbo N4

Software Stack

  • Operating System – TrueNAS SCALE (based on Debian and ZFS).
  • Docker Engine – Version 24.x or later, configured to use the overlay2 storage driver.
  • Samba – Latest stable release for SMB share serving.
  • Certbot – For automatic TLS certificate renewal if exposing services externally.

Network and Security

  • Assign a static IPv4 address within your LAN (e.g., 192.168.1.10).
  • Enable firewall rules that allow only required ports (SMB 445, 139, Docker 2375, and any custom service ports).
  • Use SSH key‑based authentication for remote administration; disable password logins. ### User Permissions

  • Create a dedicated truenas user for Docker operations, granting membership to the docker group.
  • Restrict SMB share permissions to specific groups (e.g., media, backup) to enforce least‑privilege access.

Pre‑Installation Checklist

  1. Verify BIOS settings: enable XMP for RAM speed, set SATA mode to AHCI, and disable Fast Boot to ensure proper device detection.
  2. Update the motherboard firmware (BIOS) to the latest version to avoid compatibility issues with NVMe drives.
  3. Ensure all drives are connected to the appropriate SATA ports; avoid mixing SATA and PCIe‑based storage on the same controller unless explicitly supported.
  4. Back up any existing data before initializing new pools, as the process will format the selected disks.

Installation & Setup ### Step 1 – Deploy TrueNAS SCALE

Download the latest TrueNAS SCALE ISO from the official repository and create a bootable USB drive. During installation, select the Intel Optane 16 GB device as the boot medium and allow the installer to format the remaining drives for ZFS.

```bash# Example: Create a bootable USB on a Linux host dd if=TrueNAS-SCALE-13.0-U5.iso of=/dev/sdX bs=4M status=progress && sync

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
After the first boot, access the web UI at `http://<IP_ADDRESS>` and complete the initial configuration wizard.  

### Step 2 – Create ZFS Pools  

Define two distinct pools: **app_pool** for Docker images and application data, and **data_pool** for user files and media.  

```yaml
# Pool configuration (YAML example for TrueNAS UI)
app_pool:
  vdevs:
    - type: mirror
      devices:
        - serial: XYZ1234567890
        - serial: XYZ0987654321  properties:
    compression: lz4    atime: off
    recordsize: 128K
data_pool:
  vdevs:
    - type: mirror      devices:
        - serial: ABC1122334455
        - serial: ABC6677889900
  properties:
    compression: zstd
    atime: off    recordsize: 1M

Step 3 – Provision Datasets Create datasets for each service to isolate storage characteristics.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# Dataset hierarchy
app_dataset:
  parent: app_pool
  name: docker
  properties:
    quota: 2T
    compression: lz4    dedup: off
media_dataset:
  parent: data_pool
  name: videos  properties:
    compression: zstd
    quota: none
backup_dataset:
  parent: data_pool
  name: backups
  properties:
    compression: lz4
    encryption: on

Step 4 – Install Docker Engine

TrueNAS SCALE includes a built‑in Docker daemon. Enable it via the UI or through the command line:

1
2
3
# Enable Docker service
systemctl enable docker
systemctl start docker

Configure Docker to use the overlay2 driver, which is optimal for mixed SSD/HDD environments.

1
2
3
4
5
6
# Docker daemon configuration (JSON)
{
  "storage-driver": "overlay2",
  "log-level": "info",
  "default-runtime": "runc"
}

Place the JSON file at /etc/docker/daemon.json and restart the daemon.

Step 5 – Deploy Application Containers

Below are example docker-compose.yml snippets for ARR, Immich, and Frigate. Note the use of $CONTAINER_ID and $STATUS placeholders where container identifiers are referenced in scripts.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# docker-compose.yml (excerpt)
version: "3.8"
services:
  arr:
    image: linuxserver/arr
    container_name: $CONTAINER_NAMES-arr
    restart: unless-stopped
    environment:
      - PUID=1001
      - PGID=1001
      - TZ=America/New_York
    volumes:
      - /mnt/data_pool/videos:/config
      - /mnt/app_pool/docker/arr:/data
    ports:
      - "8989:8989"
    networks:
      - homelab_net  immich:
    image: linuxserver/immich
    container_name: $CONTAINER_NAMES-immich
    restart: unless-stopped
    environment:
      - PUID=1002
      - PGID=1002
      - TZ=America/New_York
    volumes:
      - /mnt/app_pool/docker/immich:/config
      - /mnt/data_pool
This post is licensed under CC BY 4.0 by the author.