Services on my server

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

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

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+

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.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install -y apt-transport-https ca-certificates curl net-tools

# Nginx
sudo apt install nginx

# docker 
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker $USER
sudo systemctl daemon-reload
sudo systemctl restart 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:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
location /n8n/ {
	proxy_pass http://localhost:5678/;
	proxy_set_header Host $host;
	proxy_set_header X-Real-IP $remote_addr;
	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	proxy_set_header X-Forwarded-Proto $scheme;
	proxy_set_header Upgrade $http_upgrade;
	proxy_set_header Connection "upgrade";
	proxy_buffering off;
}

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

Home server configuration


./J