I’ve been self-hosting for over a decade. At some point, everyone tells you to “just use AWS” or “scale with the cloud.” I did that too. Then I looked at my bills.
For most indie hackers and small teams, a single beefy VPS is all you need. Not a cluster. Not Kubernetes. Not auto-scaling. Just one server with enough horsepower to run everything.
The math nobody talks about
Let’s compare real numbers. A Hetzner CAX41 (ARM64) gives you:
- 16 vCPU
- 32 GB RAM
- 320 GB NVMe SSD
- 20 TB traffic
Cost: ~$38/month (€35).
The AWS equivalent? You’re looking at:
c7g.xlarge (4 vCPU, 8 GB) ~$100/month
+ EBS storage (320 GB gp3) ~$30/month
+ Data transfer (1 TB out) ~$90/month
= $220+/month minimum
And that’s a smaller instance. Match the Hetzner specs and you’re at $300-400/month easily. Google Cloud and Azure are in the same ballpark.
The cloud providers charge you for:
- CPU time
- Memory
- Storage
- Network egress (the killer)
- Load balancers
- Managed databases
- Every little thing
A VPS? Flat rate. Use what you need.
What you can run on one server
Here’s what I run on a single Hetzner box:
File storage - Nextcloud or OwnCloud. Your own Dropbox with 300+ GB. No monthly per-user fees.
docker run -d \
--name nextcloud \
-p 8080:80 \
-v nextcloud:/var/www/html \
nextcloud
AI development - Claude Code for agentic coding tasks, API-based AI workflows. Run your development environment without being tied to a specific machine.
Task automation - n8n or Temporal for workflows. Connect your apps, automate the boring stuff.
# docker-compose.yml for n8n
services:
n8n:
image: n8nio/n8n
ports:
- "5678:5678"
volumes:
- n8n_data:/home/node/.n8n
environment:
- N8N_SECURE_COOKIE=false
Personal VPN - WireGuard takes 5 minutes to set up. Secure browsing anywhere, access your home network remotely.
# Install WireGuard
apt install wireguard
# Generate keys
wg genkey | tee privatekey | wg pubkey > publickey
Analytics - Plausible or Umami. Privacy-friendly, no cookie banners needed.
Web apps - Multiple sites and APIs. Caddy or Traefik handles SSL automatically.
Databases - PostgreSQL, Redis, whatever you need. Direct access, no connection pooling nonsense.
All of this. Under $40/month.
When NOT to do this
I’m not saying VPS is always the answer. Skip it if you have:
- Compliance requirements - SOC2, HIPAA, PCI that mandate specific providers
- Global distribution needs - Users in 50 countries need edge nodes
- Massive scale - You’re handling millions of requests per second
- A team over 10 engineers - Coordination overhead outweighs cost savings
For everyone else? A VPS is probably enough.
How to set it up
The easiest path is Coolify or Caprover. They give you a Heroku-like experience on your own hardware.
# Install Coolify (one command)
curl -fsSL https://get.coolify.io | bash
Or go the Docker Compose route for more control:
# Basic setup
apt update && apt install docker.io docker-compose-v2
mkdir -p /opt/apps && cd /opt/apps
# Your apps go in separate directories
# Each with its own docker-compose.yml
Put Cloudflare in front for DDoS protection and caching. Set up automated backups to a second location. Monitor with Uptime Kuma or similar.
That’s it. You now have infrastructure that costs less than a nice dinner and handles more than most startups need.
Summary
The cloud is great for specific use cases. Massive scale, global distribution, enterprise compliance. For everything else, it’s overpriced complexity.
A single beefy VPS gives you sovereignty, simplicity, and savings. You own your data. You control your costs. You understand your infrastructure.
Start with a Hetzner, DigitalOcean, or Vultr box. Install Docker. Deploy your apps. Scale vertically first. You’ll be surprised how far one server can take you.