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
| Advantage | Description |
|---|---|
| Data integrity | ZFS checksums detect and correct silent corruption. |
| Scalability | Add mirrors or replace drives without downtime. |
| Unified interface | SMB, NFS, and iSCSI expose the same underlying storage. |
| Container support | Native Docker daemon enables rapid deployment of services. |
| Cost‑effective | Commodity hardware can match enterprise‑grade performance. |
| Limitation | Consideration |
|---|---|
| Power consumption | High‑performance CPUs and multiple drives increase electricity draw. |
| Complexity | Tuning ZFS parameters requires careful testing. |
| Hardware wear | SSDs used for metadata or caching may have limited write cycles. |
| Noise | Multiple 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 Hub – Restic containers push encrypted snapshots to a remote object store, while the local pool retains the most recent three generations for fast restores.
Current State and Future Trends
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
| Component | Minimum Specification | Recommended Model |
|---|---|---|
| CPU | 6‑core, 3.5 GHz | AMD Ryzen 5 5600X |
| Motherboard | ATX, 4‑DIMM, 2‑PCIe x16 | ASRock Rack X470DU4 |
| RAM | 16 GB ECC | 2 × 16 GB DDR4 ECC |
| Primary Storage | 16 GB NVMe for OS | Intel Optane 16 GB |
| Media Pool | 2 × 3 TB HDD (mirrored) | 3 TB 7200 RPM SATA |
| GPU (optional) | Intel Arc A310 | Arc A310 for transcoding |
| Case | 4‑bay, good airflow | Jonsbo 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
- Verify BIOS settings: enable XMP for RAM speed, set SATA mode to AHCI, and disable Fast Boot to ensure proper device detection.
- Update the motherboard firmware (BIOS) to the latest version to avoid compatibility issues with NVMe drives.
- Ensure all drives are connected to the appropriate SATA ports; avoid mixing SATA and PCIe‑based storage on the same controller unless explicitly supported.
- 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