KKurniawan
Back to blog
·5 min read·#infra#homelab#devops#cost

Self-hosting an AI SaaS on a Dell R620

When I tell engineers I host my AI SaaS on a Dell R620 in my own rack, the responses split predictably. Bandung-based devs say "yeah why not". SG/US-based devs say "you're crazy, what about scaling".

This is the longer answer.

The R620 in question

One Dell PowerEdge R620, second-hand from a local supplier in 2024. Specs that matter:

  • 2× Intel Xeon E5-2680 v2 (10 cores / 20 threads each — 40 logical)
  • 64 GB DDR3 ECC RAM
  • 2× 480 GB SSD (RAID-1, mdadm)
  • IPMI for headless ops

Acquisition cost: about Rp 5.5 juta. Power: ~180 W under typical load, ~280 W spikes. Indonesian electricity at ~Rp 1,500/kWh works out to ~Rp 200k/month all-in.

What it runs

A Proxmox VE 8 host with eight VMs:

  1. clipflow-app — Next.js 14 frontend
  2. clipflow-api — Fastify API + Prisma
  3. clipflow-mysql — MySQL 8 production database
  4. clipflow-redis — Redis 7 (Streams queue + cache)
  5. clipflow-worker — Python AI workers (Whisper, FFmpeg, Vertex AI, ElevenLabs)
  6. gitlab — Self-hosted GitLab + CI runner
  7. observability — Prometheus + Grafana + Loki + Alertmanager
  8. portfolio — This site

All stitched together via Nginx vhost-per-service, wildcard cert for *.cube-x.dev, all storage that doesn't fit on the SSD pushes to Cloudflare R2.

Year-one cost math

Compared with the same workload on AWS at on-demand pricing:

| Item | Bare-metal | AWS equivalent (rough) | |------|------------|--------------------------| | Compute (40 logical cores) | included | ~Rp 4.2 juta/month (m5.2xlarge × 2) | | 64 GB RAM | included | (in compute) | | 480 GB SSD | included | ~Rp 600k/month (gp3) | | Network (1 Gbps fibre) | ~Rp 600k/month | egress wildcard | | Power | ~Rp 200k/month | (in compute) | | Backup target (R710 + R2) | ~Rp 100k/month | ~Rp 200k/month | | Recurring | ~Rp 900k/month | ~Rp 5-7 juta/month | | Capex / depreciation | ~Rp 230k/month (R620 over 24 months) | none | | Effective monthly | ~Rp 1.13 juta | ~Rp 5-7 juta |

The ~5x asymmetry is the entire reason ClipFlow can run as a side project. If I had to pay AWS prices, I'd need ~50 paying users at $10/month just to break even. On bare metal that breakeven sits around 8-10 users.

What it doesn't give me

A cloud bill is also paying for things you don't think about until you don't have them:

  • Auto-scaling. If ClipFlow goes viral on a Tuesday I don't spawn 20 more boxes; I queue the workload (Redis Streams handles this gracefully) and the user waits longer.
  • Multi-region failover. Single-region. If my colocation goes down, the service is down.
  • Managed databases. I run MySQL myself. I do my own backups, upgrades, parameter tuning.
  • Insulation from hardware failure. If an SSD dies at 3 AM, my monitoring alerts me; I have a spare SSD on hand and ~30 minutes of restore time. AWS would do that automatically and silently.

For a one-developer side project with non-critical SLA, those trade-offs are fine. For a financial services API, they wouldn't be. The right answer for "where do I host" is "what does this service actually owe its users?"

When I'd switch

I have a mental tripwire that would push me toward managed cloud:

  • ClipFlow gets to 200 paying users (revenue covers managed costs AND I'd be losing more income to outages than to cloud bills)
  • I want to take a 2-week vacation without phone proximity
  • A serious customer requires a contractually-defined uptime SLA
  • I want to focus on product and stop being my own SRE

Until then, every "let's just spin up a VPC" reflex costs months of runway. Bare metal is the unsexy answer that keeps the lights on.

Practical advice if you want to try it

  1. Start with a Proxmox VM, not bare metal. Friction of re-imaging a host is real. VMs let you snapshot and roll back.
  2. Wildcard cert from day one. Saves you from certbot --nginx per service forever. Cloudflare gives wildcard free with their plan.
  3. Pick an unsexy stack. Docker compose + Nginx + systemd. The day Kubernetes starts looking necessary, you're probably building the wrong thing.
  4. Backup before launch, restore once. A backup that's never been restored is not a backup.
  5. Wire Prometheus + Loki before users. Cheap to add early, painful to bolt on after an incident.

Bottom line

The R620 sitting in my colo will outlast my third side project. AWS charges in your sleep; bare metal charges in your weekend ops slot. Pick whichever one your time-vs-money ratio prefers.

For a Bandung programmer earning a fraction of a SF salary but with infrastructure-engineer skills, bare metal isn't a constraint — it's leverage.