For a long time, my Mac Mini was the unintended backbone of my workflow. What started as a few local workflows, soon blossomed into a workflows for emails, scheduled jobs, Home Assistant alerts etc. It’s a great machine, and it handled my daily tasks alongside a growing list of background services-MongoDB, Postgres, Redis, and n8n-without breaking a sweat. It even ran my local AI models via Ollama.
But then came the “lab creep.” I started adding more: a MagicMirror instance for the family calendar, Excalidraw for diagrams, and various utility containers.
The Mac was starting to feel cluttered. I wanted a separation of concerns. I decided to keep the heavy lifting (Ollama) on the Mac but move the “always-on” infrastructure to a dedicated home server. Since most of these services are lightweight, I didn’t need a powerhouse; I needed something efficient, quiet, compact, and out of the way.
Finding the server
I’ve always been a fan of the “TinyMiniMicro” ecosystem. I already run a few of these little machines: one Raspberry Pi handles Pi-hole duties at the router, another runs my Home Assistant setup, and a few more sit scattered across my desk in various states of “work in progress.
For the home server, I decided to go for a mini-PC. Mini PCs are compact systems that takes up very minimal space and really quite. I hit Facebook Marketplace and found exactly what I was looking for: an HP EliteDesk 800 G3 Mini.
HP EliteDesk as it was shown on Facebook Marketplace
I managed to negotiate and got it for $80. It was a quite a quick purchase—found it in the morning, chatted with the seller, and had it on my desk by the afternoon.
| Component | Specification |
|---|---|
| CPU | Intel Core i5-7500T |
| RAM | 8GB DDR4 |
| Storage | 256GB NVMe SSD |
| OS | Windows 11 (Licensed) |
It felt like a steal. Until I tried to plug it in.
Additional Costs
The devil is in the details, and I missed a few. In my rush to snag the hardware, I skipped the background research and traded due diligence for pure excitement. I realized too late that this specific EliteDesk only had DisplayPort outputs-no HDMI. My monitor, of course, is HDMI-only. That meant a $14 trip to Walmart for a conversion cable.
Mini PC connection options
Then came the peripheral problem. The unit didn’t have Bluetooth, and I realized I didn’t have a spare wired keyboard or mouse lying around. Another trip, this time to Goodwill.
I walked away with a $10 USB keyboard and an $8 mouse, but I also spotted a Logitech K400+ wireless keyboard for $10. It was missing its USB receiver, but for ten bucks, it was worth the gamble. I ordered a replacement Logitech universal receiver on Amazon for $15.
Logitech K400+
Finally, I noticed there was no Wi-Fi card. Fortunately, this didn’t matter; the plan was always to tuck this away next to my network switch and run it hardwired.
The Bill of Materials
- Mini PC: $80.00
- Display Cable: $13.82
- Keyboards/Mouse: $25.00
- Logitech Receiver: $15.00
- Total: $133.82
Trial run
Initially, I left Windows 11 on the machine. I spent a few months experimenting-testing SurfShark VPN, adding it to my Tailscale network, and even seeing if it could handle some light Steam gaming. I eventually stood up Docker and Jellyfin just to see if I could.
It worked, but the friction was real.
Managing a headless Windows machine is a chore. Every time I wanted to tweak a config, I had to use Remote Desktop or physically drag a keyboard and monitor to the server. I missed the simplicity of a terminal. I realized that if I wanted a true “server”, I had to ditch Windows and move to Linux.
I briefly considered Ubuntu Desktop, but a 6GB ISO for a machine that won’t even have a monitor attached felt like bloat. I pivoted to Ubuntu Server 24.04.4. It’s lean and had all the essentials.
Setting up the environment
I partitioned the 250GB drive into two main chunks: 100GB for the OS (/) and 150GB for a dedicated data directory in the home folder.
Enabling SSH Access
During the installation process of Ubuntu server, I enabled password based SSH access. I always prefer key based SSH access. So the first order of business was killing password access. Passwords can be brute-forced; SSH keys generally can’t.
After adding my public key to authorized_keys, I edited /etc/ssh/sshd_config to disable password authentication:
# Ensure this line is set to no
PasswordAuthentication no
After this change we need to restart the ssh service with sudo service ssh restart.
Installing essentials
I updated the system & copied by aliases from here, and installed Nginx and Docker.
|
|
Setting up my services
Since I was already using Docker Compose on my Mac, the migration was painless. I also copied the data folder of each of these services to restore my data on the home server.
Creating NGINX routes.
To make things accessible, I configured Nginx to handle the reverse proxying. For n8n, I wanted to access it via a clean URL path. The configuration looks like this:
|
|
I added SSL certificates to Nginx so everything stays encrypted over my local network.
Final setup
The Mac Mini is back to being a workstation, and the EliteDesk sits quietly in the corner, managing my workflows in the background.
Home server configuration
./J