DEV Community

Emanuele
Emanuele

Posted on • Originally published at Medium

How I replaced paid hosting with a €100 home server (and saved hundreds)

The slow bleed of cloud costs
A few years ago, I did a rough calculation of everything I was paying for hosting.

VPS here, managed instance there, a database service I barely touched. Nothing individually catastrophic — but add it all up and I was spending somewhere between €150 and €200 per year on infrastructure for projects that maybe five people used, including me.

The worst part? Most of it was idle. Side projects running 24/7 “just in case.” APIs that handled a handful of requests per day sitting on machines provisioned for production workloads.

But here’s what I hadn’t fully accounted for: the SaaS subscriptions on top of that. Password manager, note-taking app, file sync, photo backup, private Git — small monthly fees that, combined, easily added another €10–15 per month. Services I was paying for, where the open source alternative exists and runs perfectly well on your own hardware.

I wasn’t paying for what I used. I was paying for the comfort of not thinking about it.

Then I bought a mini PC for €100, and that changed.

The actual problem with home hosting
Moving services home sounds obvious once you have a home server — until you realize why most developers don’t bother.

It’s not the hardware. It’s not even the networking. The real friction comes from one very unglamorous fact:

Your ISP gives you a dynamic public IP.

It changes. Randomly. Sometimes weekly, sometimes daily. And every time it does, every DNS record you’ve set up points to the wrong address, and your services go dark.

That’s the wall most people hit. They set something up, it breaks a few days later, and they go back to paying for a VPS where someone else manages this stuff.

What I needed wasn’t just a server. I needed a stack that could handle this reliably, without me babysitting it.

The stack
Here’s what I landed on after some iteration. Each piece has a specific role, and together they cover everything that makes home hosting actually work.

Hardware: a mini PC
I went with a small x86 mini PC — the kind you can find for €80–120. Fanless, low power draw (~10W), small enough to sit quietly in a corner.

Today, that machine runs 60 containers with a mix of personal tools, dashboards, self-hosted SaaS replacements, and side projects — all without breaking a sweat. The resources that feel modest on paper (8GB RAM, a mid-range CPU) are more than enough when your workloads are lightweight services, not production traffic.

The key insight is that you don’t need a proper server. For personal tools and homelab services, these machines are more than enough. And unlike a Raspberry Pi, you get x86 compatibility, more RAM options, and no SD card to corrupt at inopportune moments.

Running costs? Around €2–3 per month in electricity. The machine paid for itself in under three months.

Docker
Everything runs in containers. This isn’t a controversial choice in 2025, but it’s worth explaining why it matters specifically for home hosting.

With Docker, each service is isolated and reproducible. If something breaks, you tear down the container and bring it back up. Updates are docker pull and docker compose up -d. You can run a dozen services — or sixty — on one machine without them stepping on each other.

It’s also what makes self-hosting SaaS replacements practical. Nextcloud, Vaultwarden, Gitea, Paperless-ngx, Immich — nearly all of them ship as Docker images with official Compose files. Going from “I want to try this” to “it’s running” takes minutes, not an afternoon.

Nginx Proxy Manager
This one deserves more attention than it usually gets in homelab writeups.

Nginx Proxy Manager sits in front of all your services and handles two things that would otherwise be painful to manage: reverse proxying and SSL certificates.

Nginx Proxy Manager

You point your domain to your home IP, configure a proxy host in the UI, and NPM handles routing traffic to the right container — plus it automatically issues and renews Let’s Encrypt certificates. Every service gets HTTPS with no manual configuration.

The alternative is writing and maintaining Nginx configs by hand, which works fine until you have eight services and forget what any of the blocks do. NPM wraps all of that in a clean interface without hiding the underlying logic when you need it.

Cloudflare
My domains go through Cloudflare, and this is one of those decisions that has paid off repeatedly.

Beyond DNS management, Cloudflare acts as a reverse proxy for your public-facing services — which means your real home IP is never exposed in DNS records. You get DDoS protection, caching, and the ability to toggle traffic on and off at the CDN layer.

The free tier covers everything you need for a homelab setup. The API is solid and well-documented, which matters for the next piece.

Solving dynamic DNS
The dynamic IP problem is well-known, and there are plenty of scripts floating around that solve it. The issue is that scripts are opaque: they run, you hope they work, and when they don’t, you have no idea why.

What you want is something with visibility — logs, a dashboard, support for multiple DNS providers, and a UI you can check instead of SSH-ing into a machine to grep log files.

DriftDNS is a self-hosted DDNS manager that does exactly this. It runs as a container, checks your public IP on a configurable interval, and updates your DNS records automatically when it changes. The dashboard shows your current IP, the last sync time, all configured endpoints, and a log of every update. It currently supports Cloudflare and AWS Route53, with more providers on the roadmap.

DriftDNS dashboard

How the pieces fit together
The request flow once everything is running:

  1. A user hits myapp.example.com

  2. Cloudflare resolves the DNS record (kept current by DriftDNS) and proxies the request to your home IP

  3. Your router forwards the request to the mini PC

  4. Nginx Proxy Manager routes it to the correct Docker container

  5. The container handles the request

DriftDNS runs quietly in the background. If your IP changes at 3am, it’s updated before you wake up.

The numbers
One-time cost: — Mini PC: ~€100

Ongoing monthly costs: — Electricity: ~€2–3/month

What a comparable cloud setup would cost: — 1–2 VPS instances: €10–30/month — SaaS subscriptions for equivalent tools: €20–30/month — Total: €30–60/month → €360–720/year

The math works out quickly.

Tools you need
To replicate this setup, these are the main components:

• Docker → docker.com

• Nginx Proxy Manager → nginxproxymanager.com

• Cloudflare → cloudflare.com

• DriftDNS → github.com/emanueledeamicis/DriftDNS

All of them are free. Cloudflare has paid tiers, but the free plan is more than sufficient for a homelab.

Honest tradeoffs
Reliability depends on your home network. If your internet goes down, your services go down. For anything with real SLA requirements, this isn’t the right architecture.

Bandwidth. For most personal use cases this isn’t an issue — especially if you’re on fiber, which is increasingly common. If you’re serving large files to many users simultaneously, you might eventually hit residential upload limits. For everything I run, I’ve never come close.

Initial setup takes time. The first weekend you spend configuring this, it will feel like more work than just paying for a VPS. That’s accurate. After that, it mostly runs itself.

Final thoughts
I’m not suggesting everyone should shut down their cloud accounts. For production systems and anything requiring guaranteed uptime, cloud providers exist for good reasons.

But there’s a category of workloads — personal projects, homelab services, developer tools, SaaS alternatives, experiments — where the default choice of “spin up a VPS” or “pay for a subscription” is mostly habit, not necessity.

If you have a spare machine or can justify a €100 purchase, the tools to build this stack are mature, well-documented, and genuinely enjoyable to work with.

Sixty containers, a few euros a month in electricity. It’s a good trade.

Top comments (0)