Why we picked Proxmox over OpenStack for a single-node cloud
OpenStack is the reflexive answer for 'open source AWS'. For a small platform serving real customers, it's wildly over-engineered. Proxmox VE wins.
When we started CloudNx, the internet's reflexive answer to "open-source AWS" was OpenStack. We got close to deploying it, stepped back, and picked Proxmox VE instead. Two months in, that was clearly the right call.
OpenStack is a platform for platforms
OpenStack is genuinely impressive. It's also ~30 services, 3 message queues, a complex networking layer (Neutron), and a documentation surface that requires a dedicated SRE to navigate. The official "minimum production deployment" calls for at least 3 controller nodes, dedicated networking nodes, and a separate storage cluster. That's six servers before you've launched a single VM.
For a company at our stage — one paying customer, one engineer, one bare-metal box — OpenStack is over-engineered by an order of magnitude. The people who use it well are Telcos and big enterprises with dedicated infrastructure teams. Not solo founders shipping a cloud.
Proxmox VE is a hypervisor with a UI
Proxmox is what KVM + LXC always wanted: a single Debian machine, one apt repo, a web UI that exposes most operations, and a REST API for the rest. It runs single-node out of the box, clusters when you're ready, and never pretends to be something it isn't.
The trade is upfront: Proxmox doesn't ship customer-facing primitives. There's no notion of "tenancy", no built-in IAM, no public API for self-service VM lifecycle. We had to build all of that ourselves. But the alternative — owning OpenStack — was building all of that ourselves anyway, except wrapped around 30 services we didn't want.
What we built on top
Three Go services and one Postgres database:
- compute — wraps Proxmox's REST API, queues VM lifecycle via Asynq, owns the user-facing concept of an "instance".
- auth — JWT, IAM, Razorpay, GST invoicing, audit logs.
- storage — S3-compatible API on top of MinIO.
- nat — a tiny iptables reconciler that keeps SSH port-forwarding in sync with the database.
The whole control plane fits in ~30,000 lines of Go. OpenStack's Nova alone is over 200,000.
When we'll outgrow Proxmox
Proxmox can cluster (~30 nodes comfortably, more with tuning), do live migration, and use Ceph for shared storage. It scales further than people give it credit for. Our actual ceiling is more likely to be Postgres than the hypervisor layer.
If we ever hit a wall, the migration path is to swap Proxmox for OpenStack-on-Kubernetes (Kubevirt + Tekton), not vanilla OpenStack. By then we'll have customers paying enough to warrant the engineering team.
The lesson
Pick the smallest tool that solves your actual problem. "Industry standard" is often a proxy for "what enterprises with completely different constraints picked." Your constraints are not their constraints. Optimize for what lets you ship and survive, not what looks good on a LinkedIn profile.