I started maintaining a “home server” more than 10 years ago. Although I tried to keep it extremely simple, the device, the software, and the setup evolved over time. Raspberry Pi was replaced with a mini PC. Plain old Linux services were replaced with Docker containers. The mini PC got a memory upgrade. Finally, at the beginning of this year, containers were replaced with Kubernetes.
Considering the diversity of the running services and the data they store, I had a storage upgrade recently. I wanted to properly store as much as data possible with the lowest budget possible (without used products – all new) and I wanted to reduce the risk of losing important data.
At the moment, I divided my storage needs into three categories:
- Personal data (data I cannot replace, such as photos, and documents. must be protected against single drive failure)
- Application data (such as configuration data. must be stored on a solid-state drive for fast access)
- Other data (data I can replace or don’t care if it gets lost. must be stored on a cost-effective drive)
Current Setup
The mini PC has one NVMe and one SATA 2.5” drive slot. I have used a small NVMe drive for the operating system and a SATA SSD for fast data access. Externally, I have a TerraMaster D5-300C, a 5-bay solution that can create a RAID configuration between the first two bays. Currently, I am only using the first 3 bays, first two are HDDs with RAID-1 configuration which will store my important data and the third is another HDD with a large capacity to store less important, high-volume data such as media files.
In summary, this is my current setup and I still have 2 empty bays to expand in the future:
Location | Type | Description |
---|---|---|
Internal | NVMe SSD | Operating System |
Internal | SATA SSD | Application Data |
External | 2x SATA HDD (RAID 1) | Personal Data |
External | SATA HDD | Other Data |
Kubernetes CSI
Since I use Kubernetes to orchestrate my services, I decided to use a container storage interface to create and manage volumes, even if I had only one node in my cluster. The reasons I went with this option were to gain hands-on experience with CSI drivers and to abstract underlying infrastructure from the services.
After considering several options for the CSI driver, instead of creating a Ceph cluster, I decided to use Longhorn. It is an actively maintained popular option for self-hosted setups, has minimal overhead, supports encrypted volumes, and is very easy to install and maintain. Volume encryption was an important feature for me, considering some of the data contains personal documents, passwords, medical data, etc.
What is next?
I have created two storage classes for each of all three categories, one encrypted and one plain. Now I have a tedious task to create new volumes for my services using new storage classes and move their data. But more importantly, now I have a proper storage setup to add new services in my home lab which means I will spend the next few weeks deploying lots of self-hosted services.