A 2014 Mini PC. Two Services. Zero Monthly Fees.
Post #013 — Homelab
A 2014 Mini PC. Two Services. Zero Monthly Fees.
Self-Hosting Immich and Jellyfin on an Intel NUC
This started as a practical decision. I had an Intel NUC from 2014 sitting on a shelf — stress-tested, cleaned, and confirmed working. I had a NAS full of movies and family photos. And I had two services on my list that I kept putting off: a self-hosted photo library and a local media server.
The NUC became the host. The only real question was whether an 8GB i3 machine from over a decade ago could handle both without falling apart.
It can.
What This Covers.
THE SHORT VERSION
This isn't a step-by-step tutorial. What I want to document here is the sequence — the order things need to happen in — and the honest friction that came with it. If you've been curious about self-hosting but assumed it required deep Linux knowledge, this might change your mind.
The rhythm is simple:
Ubuntu Server 24.04 LTS
Minimal install. No GUI. Just SSH access and a command line. The install itself took less than 15 minutes — bootable USB, follow the prompts, done.
Docker
One command installs the entire Docker engine. From this point forward, every service runs in its own container. No conflicts, no dependency hell.
curl -fsSL https://get.docker.com | sudo sh
NAS Mount via CIFS
The movies and photos live on the WD EX2 NAS. Rather than copy everything to the NUC, I mounted the NAS shares directly. The NUC reads from the NAS in real time.
docker-compose.yml
One file. Five containers. Jellyfin, Immich server, Immich machine learning, Redis, and PostgreSQL — all defined together, all starting with a single command.
docker compose up -d
fstab — Persistent Mounts
Without this step, the NAS mounts disappear on every reboot. Adding two lines to /etc/fstab makes them permanent. The NUC mounts the shares automatically every time it boots.
OPNsense Static DHCP
The NUC needs a fixed IP. Not on the NUC itself — in the router. OPNsense assigns the same IP every time based on the MAC address. No configuration changes needed on the server side.
Two Services, One Machine.
WHAT'S RUNNING
|
Jellyfin
192.168.2.114:8096
Local media server. Movies and series stream from the NAS through the NUC to any device on the network. No subscription. No account required. |
Immich
192.168.2.114:2283
Self-hosted photo library. Automatic backup from phones, face recognition, map view, timeline — everything a cloud service offers, running locally. |
The Part Nobody Mentions.
HONEST STATUS
The services work. But at the time of this deployment, OPNsense wasn't stable yet — it was the next item on the list, not the current one. That created a specific problem worth documenting.
Without a firewall managing DHCP, the NUC's IP address isn't guaranteed. Every restart is a question mark. The bookmark you saved yesterday might point nowhere today.
Instead, the NUC runs on DHCP. When the IP changes — which it does, occasionally — I find it the way a headless server should be found: through the network, not by plugging in a monitor.
That's where SSH earns its place. Once you know the new IP from the router's lease table, you're back in. No keyboard. No screen. No interruption to the services themselves — they keep running regardless.
This is also where my situation diverges from a simple home setup. This property spans ~1,250 m², runs two active businesses, and has over 30 devices on the network across multiple access points. The ISP equipment is locked down — no admin access, no app, no lease table. There's no way to check what IP was assigned without a dedicated firewall in the loop.
If your setup is simpler — one router, a handful of devices, and access to the admin panel — this friction probably doesn't apply to you. Most home routers let you assign a fixed IP from the app in under a minute. But if you're operating at scale without a firewall, you're flying blind in exactly the way I was.
OPNsense is the next post. That's where the IP becomes permanent and the network becomes visible.
Does a 2014 Machine Handle It?
THE HONEST ANSWER
Yes — with reasonable expectations. The NUC runs both services simultaneously without breaking a sweat during normal use. Streaming a movie while Immich indexes photos in the background? No problem.
Where you feel the age is in Immich's machine learning pipeline. Face recognition and smart search require real processing. On first run, with hundreds of photos to analyze, it takes time. Not hours — but long enough that you notice it's working.
For a household media server and photo library, an 8GB NUC from 2014 is more than enough.
immich_server — Up 20 hours (healthy)
jellyfin — Up 20 hours (healthy)
immich_ml — Up 20 hours (healthy)
immich_postgres — Up 20 hours
immich_redis — Up 20 hours
It boots, mounts the NAS, starts the containers, and disappears into the background. That's exactly what a server should do.
What's Next.
HONEST STATUS
The NUC is running. The services are stable. The next phase involves Home Assistant on a dedicated OptiPlex — which opens the door to smart plugs, NFC automation, door sensors, and on-demand wake for the NAS.
That's a separate post. For now, the media server is live, the photos are organized, and the monthly subscription cost for both is zero.
The fear of Linux was bigger than Linux itself. The installation was straightforward. The commands were learnable. The part that's genuinely hard isn't the server — it's the network.
Related Posts
- The NUC Wasn't the Problem. The Power Strip Was. — Post #010
- Got the Firewall Running Again. — Post #011
- Undust the EX2 — Bringing My NAS Back to Life — Post #012
Comments
Post a Comment