My Home Server

TLDR - Tailscale, Docker Compose, and not a TLS cert in sight

Machine

  • OS: Ubuntu Server 24.04 LTS
  • CPU: Intel(R) Core(TM) i5-10400 CPU @ 2.90GHz
  • Mem: 2x32GB
  • Disks: (OS on NVMe, data striped on others)
    sda 8:0 0 14.6T 0 disk (WD RED)
    sdb 8:16 0 14.6T 0 disk (WD RED)
    sdc 8:32 0 14.6T 0 disk (WD RED)
    sdd 8:48 0 14.6T 0 disk (WD RED)
    nvme0n1 259:0 0 931.5G 0 disk (WD BLACK)
  • Case: SilverStone Technology CS351

Occasionally I'll throw a video card in the case to experiment with something, but it doesn't seem worth the power draw for my workloads — video transcoding on the CPU is fine, and I don't use my server for games.

If you're just getting started and don't want the ridiculous amount of storage I have here, mini PCs can probably handle the workloads you want to run for around $200. I run another server with the same services on a Beelink Mini PC, and it seems to be doing fine.

Host Software

  • ZFS: Software mirror raid, works well and tolerates me completely swapping out the OS (zfs import). This means I have 29.2T of available disk space but can tolerate at least one disk dying. Docker compose volumes always go in the ZFS pool, never the NVMe.
  • Tailscale: I use this as VPN software, allowing me to manage this machine from any network / any device without exposing it to the wider world. I used to run Nextcloud with exposed ports, and it never felt good, so I slowly moved toward a private network even if it means sacrificing public sharing. Also means that I don't need certificates / HTTPS, which is nice.
  • Docker: I run all of my homelab stuff through a single docker compose file under version control. If my server dies, all software and databases can be restored by copying over a backup into my ZFS pool and running sudo docker compose up -d. My docker compose file is in VCS.
  • rclone: Basically rsync with better remote destination support. Backups for valuable things go to remote stores (other computers or Backblaze B2).

Containers

  • Nextcloud
    • Postgres
  • Jellyfin
  • qBittorrent

I'm also interested in Immich, but haven't gotten around to adding it yet.

Lessons Learned

  1. Don't use Windows or macOS. Running a home server is an afterthought for these operating systems, and you'll run into issues with remote access, performance, and reliability in various ways. It's not worth it. WSL is not a stand-in for a standalone server.
  2. Ideally, don't use your day-to-day PC as a server if you're one of the few people that use Linux as a daily driver. The requirements will be different, and it's very freeing to have server issues and client issues be separate things.
  3. Avoid over-engineering, unless learning is the goal. You probably don't need Proxmox, definitely don't need K8s, but docker compose and version control are good ideas.