Ramblings of an aging IT geek
← Ramblings of an aging IT geek
homelab

bringing it all back home, one service at a time

Why I moved most of my personal services off a cloud VPS and back to hardware at home, what it cost, and what I left in the cloud on purpose.

A server rack with mounted hardware

For a long time my personal infrastructure lived on a single cloud VPS. It was the path of least resistance: a few quid a month, someone else worried about the hardware, and I could rebuild it from a script if it ever fell over. Over the years it accreted things. A Git mirror, a couple of small web apps, a feed reader, an actual budget's worth of backups, a bunch of cron jobs I'd half forgotten about. It worked, and I mostly didn't think about it, which is the highest praise a server can earn.

Then the renewal came round and the price had crept up, the disk was nearly full, and I caught myself reaching for a bigger instance more or less on reflex. That was the moment I stopped and asked the question I should have asked a year earlier: why is this in the cloud at all?

What was actually paying rent

The honest answer was inertia. Almost none of these services needed to be on someone else's computer. They served me and a handful of people I know. They had no meaningful uptime requirement beyond "ideally up most of the time". The latency budget was generous. The data was mine and I'd rather it sat on a disk I can hold.

The things that genuinely wanted to be in the cloud were a much shorter list. Anything that had to be reachable when my home connection wasn't. Anything that needed an IP address that didn't change underneath it. And the off-site copy of my backups, because the whole point of off-site is that it isn't in the same building as the thing it's protecting.

So the plan wrote itself. Move the bulk back home. Keep a small, cheap presence in the cloud for the few jobs that earn it.

The hardware was already there

This is the bit that made it easy. I'd been running a small homelab for years, mostly for tinkering, and it had spare capacity sitting idle most of the day. A couple of mini PCs and a NAS, none of it new, all of it more than enough for a personal workload that mostly idles.

A homelab setup with mixed hardware

I'm not running anything clever for orchestration. Each service is a container, managed with Docker Compose, one stack per service, with the compose files in a Git repo so the whole thing is reproducible. No Kubernetes. I considered it for about an hour and decided that running a control plane to manage six containers was solving a problem I didn't have, with new problems I'd then have to learn at 11pm.

services:
  miniflux:
    image: miniflux/miniflux:latest
    restart: unless-stopped
    ports:
      - "8080:8080"
    environment:
      DATABASE_URL: postgres://miniflux:secret@db/miniflux?sslmode=disable
    depends_on:
      - db

The hard parts were never the apps

Migrating the applications themselves was tedious but straightforward. Dump the database, copy the volumes, stand it up at home, point a DNS record at it. The hard parts were the things around the edges.

Getting traffic in was the first. My home connection has a dynamic IP and the usual CGNAT-adjacent unpleasantness, so I'm not exposing ports directly. I put the publicly reachable services behind a tunnel, which terminates at a small cloud box and forwards to home over an outbound connection. That cloud box is now most of what I still pay for, and it's tiny, because all it does is hold a stable IP and pass packets along.

Backups were the second. The rule I won't bend on is that a backup is not a backup until it's somewhere else. So the home services back up locally for fast restores, and that local backup is then replicated to off-site storage, encrypted before it leaves the house. The cloud went from running my services to holding the encrypted copy of last resort, which is a much better use of it.

Then there's the boring, unglamorous matter of being on call for my own kit now. When the VPS provider had a wobble, that was their problem. When my home power blips or a disk starts throwing SMART errors, that's mine. I added a UPS that the NAS can see, so a power cut triggers a clean shutdown instead of a fsck and a prayer. I set up monitoring that pages me rather than me discovering an outage when something stops working a week later.

Was it worth it

Mostly, yes. The running cost dropped to a fraction of what it was, the services are faster for me because they're on the LAN, and I have a much clearer picture of what I'm actually running because I had to handle every piece of it on the way across. There's a real satisfaction in opening a thing in a browser and knowing the bytes never left the building.

The honest cost is that I've taken on responsibility I used to rent away. The cloud was, among other things, a way of paying someone to care about hardware so I didn't have to. Bring it home and that caring becomes yours. For me that's a fair trade, because I enjoy the caring, most of the time. If you don't, the cloud is selling you something genuinely valuable and you should keep buying it.

What I'd say to anyone tempted: don't move everything at once, and be ruthless about what genuinely needs the cloud. Move one service, live with it for a fortnight, then move the next. The ones that come home easily will surprise you. The one or two that fight you on the way out are exactly the ones worth leaving where they are.