Skip to main content

Hetzner CX22 vs AX41 in 2026: €4.50 Cloud VM vs €45 Bare Metal for Your Self-Hosted PaaS

13 min readDora NodaDora Noda
Share

€4.50 a month versus €45 a month — that 10× multiple is why teams get stuck picking Hetzner's substrate. A CX22 Cloud VM buys you 2 shared vCPUs, 4 GB RAM, 40 GB local disk and 20 TB of traffic. An AX41 bare-metal box buys you a Ryzen 5 3600 with 6 dedicated cores, 64 GB RAM and two 512 GB NVMe drives on a 1 Gbit unmetered port — for roughly ten times the line item.

The cheap VM looks like the obvious home for a self-hosted PaaS until disks and tenant isolation make the dedicated box look cheap. The dedicated box looks like the obvious home for Kubernetes until you realize it has no Cloud API to provision it.

Here is the answer before the why.

The 30-second picker

Your fleet todayCheapest sane substrateWhy it wins right now
1 box, 1–10 apps, no HA neededCX22 — or skip Kubernetes entirely and run Docker Compose on one CX22/AX41One VM is enough, and Cluster API is overhead you will not use
3 nodes, you need HA / rolling upgrades3× CX22 (~€13.50) beats 1× AX41 (€45) for HA, but 1× AX41 wins on raw resources (see math below)HA on cloud VMs costs less than a single dedicated box; raw throughput on dedicated crushes any single VM
6–10 nodes or tenants that need NVMe I/OAX41 fleet — mix in CX22 workers only for bursty stateless loadLocal NVMe and dedicated cores are the decision, not price per core

The rest of this post makes that table auditable: exact specs and 2026 prices with the April hike, what each euro actually buys, worked monthly totals with sensitivity for bandwidth and disks, who owns machine lifecycle, and the three signals that you have outgrown Docker.

Head-to-head: what €4.50 and €45 actually buy in August 2026

Hetzner repriced Cloud on June 15, 2026 (applied April–June). Most cost-optimized VMs rose 30–37%; ARM stayed cheapest. Dedicated Robot pricing barely moved. Prices are ex VAT, Germany/Falkenstein; add 19% VAT. US Cloud is ~10–15% lower before VAT.

DimensionCX22 — Cloud VMAX41-NVMe — Dedicated
CPU2 shared vCPUs (Intel, burstable) — you share the host6 dedicated cores / 12 threads AMD Ryzen 5 3600 (Zen 2, 3.6 GHz base, 4.2 boost) — nothing shared
RAM4 GB DDR4 (host-managed)64 GB DDR4 (16× the CX22) — ECC optional +€5.50
Disk40 GB local SSD/NVMe on the host hypervisor — ephemeral to the host, snapshot via Hetzner Snapshots2× 512 GB NVMe Gen3 (Toshiba/Kioxia) in hardware RAID 1 by default — ~1 TB usable, local only
Extra disk optionCloud Volumes (network) — €0.044/GB/mo (~€4.40 per 100 GB), backed by Ceph, ~500–2k IOPS typicalNo Cloud Volumes; local RAID only. Extra 2× 1 TB NVMe or 2× 4 TB SATA as paid add-on via Robot
Network portUp to 1 Gbit shared, Cloud firewall included1 Gbit dedicated, unmetered — practical sustained ~300–330 TB/mo if you saturate it
Included traffic20 TB/mo included, then ~€1.00–1.19/TB overage (EU)Unmetered — no traffic cap, no per-TB meter to track
IPv41 included, extra €2.10/mo, Cloud floating IPs free1 included, extra €2.10/mo, no floating IP — bring MetalLB/kube-vip for floating
Provisioning~60 seconds via Cloud API / Terraform / CAPH~30–60 minutes via Robot API or manual order queue — bare metal must be racked/imaged
Price ex VAT ( Aug 2026)€3.79–€4.49 depending on source/VAT display; €3.79 on hetzner.com list before VAT, ~€4.50 incl VAT€38–€45 ex VAT on current Robot matrix; ~€45–€54 incl VAT — auction/SB can dip to €34
Price incl 19% VAT€4.50–€5.35 billed€45–€64 billed depending on add-ons
Pre-hike (early 2026) for reference€2.96–€3.29 ex VAT€34–€38 ex VAT — the hike hit Cloud harder than Robot

€4.50 is CX22 incl VAT after the 2026 hike (ex VAT €3.79); €45 is AX41 incl VAT on the Robot matrix (ex VAT ~€38), not the auction low. Both are August 2026 list and both flow into the math next.


What the price buys and what it quietly does not

The rows above look like a bigger-number-wins table. The operational differences decide the PaaS.

Shared vCPU vs dedicated cores

A CX22's 2 vCPUs are time-shared — you share the host. Burst is fine; sustained p95 latency under load is where tenants notice. An AX41's 6 cores are pinned to you. One AX41 soaks the steady-state CPU of roughly 8–12 CX22s before it saturates, not from clock speed but from zero steal and no noisy neighbor.

Check steal% in top/mpstat on a CX22 under your real app load. Consistently above 5–10% at target QPS means you are renting shared silicon for a job that wants dedicated cores.

Local disk vs network volume — the NVMe claim, quantified

CX22 gives you 40 GB local. Beyond that you buy Cloud Volumes — network Ceph at €0.044/GB/mo (~€4.40 per 100 GB), ~500–2k IOPS. 500 GB extra turns a €4.50 VM into a €26.50 VM; 1 TB extra makes it €48.

AX41 gives you 1 TB usable NVMe RAID 1 local with single-digit ms fsync and no network hop. etcd on local NVMe does p99 wal_fsync under 5–10 ms; on Cloud Volumes that doubles or triples — enough to make a control plane feel flaky when the disk, not the scheduler, is guilty.

Rule: if a worker needs more than ~100 GB persistent per node or runs etcd, the Cloud VM's disk math flips against it.

20 TB included vs 1 Gbit unmetered — the egress claim, quantified

Hetzner Cloud includes 20 TB then meters overage at ~€1/TB (€1.19 incl VAT in some locales). Most small fleets never leave the inclusion. An AX41 has no traffic meter — a 1 Gbit port can push ~330 TB/mo and the bill does not move whether you push 5 TB or 50.

Under 20 TB, CX22's inclusion is already paid for and the dedicated's unmetered port is unused advantage. Over ~60–100 TB pooled, overage becomes the line that decides the substrate — shown in the math next.


Worked monthly math: the same PaaS on CX22s vs AX41s, with sensitivity

Assumes a PaaS — control plane + tenants + ingress + monitoring — no managed DB (bring Neon/Supabase/RDS). Prices ex VAT; add 19%.

The base case (under 20 TB, no extra volumes)

Fleet shapeAll CX22All AX41Who wins on price alone
1 node — dev / single-tenant€3.79 (1× CX22)€38 (1× AX41) — wildly overprovisionedCX22 by 10× — and you should be on Docker, see below
3 nodes — minimal HA€11.37 (3× CX22)€38 (1× AX41) cannot do HA alone — need 3× AX41 = €114 for true HACX22 HA is 3× cheaper than one dedicated box, let alone three
10 nodes — small multi-tenant fleet€37.90 (10× CX22) — 20 vCPU shared, 40 GB RAM, 400 GB local€38 (1× AX41) — 6 cores dedicated, 64 GB, 1 TB NVMe or €76 for 2× AX41 with real HAPrice parity at ~10 VMs vs 1 box, but resources diverge

Ten CX22s and one AX41 cost the same — but are not the same machine. The question is not which is cheaper per euro but which resource you are constrained on.

Per-resource unit economics (ex VAT, August 2026):

ResourceCX22 fleet (10 nodes)AX41 (1 box)
€ per vCPU (shared vs dedicated)€1.90 / shared vCPU€6.30 / dedicated core — cheaper if you normalize for steal-free cycles
€ per GB RAM€0.95 / GB (40 GB total)€0.59 / GB (64 GB) — dedicated wins per GB by ~40%
€ per 100 GB usable disk€4.40 / 100 GB extra via Cloud Volumes on top of VM fee; 40 GB included local€0.00 past the included 1 TB — already sunk
€ per 10 TB egress <20 TB€0.00 — inside inclusion€0.00 — unmetered

The base case flatters CX22 while you stay inside 20 TB and 40 GB local per node. Leave those bounds and the sensitivity tables correct it.

Sensitivity: where CX22 stops winning

Egress sensitivity (one 3-node CX22 fleet vs 1× AX41, ex VAT):

Monthly egress (all tenants + ingress)**3× CX22 total1× AX41 totalWinner
10 TB — blog, light APIs€11.37 (all inside 3× 20 TB pools)€38CX22
50 TB — image-heavy SaaS, moderate video€11.37 + ~€0 overage (still inside pooled 60 TB)€38CX22
100 TB — CDN miss or log-heavy fleet€11.37 + ~€40 overage (40 TB past 60 pooled) = €51€38AX41 wins — overage ate the savings
200 TB — outlier but real€11.37 + ~€140 = €151€38AX41 by 4×

Hetzner pools included traffic per project, so 3× CX22 pool 60 TB. A single CX22 at 25 TB already pays ~€5 overage — the 100 TB row is shown fleet-wide for that reason. Rule: a CX22 fleet stays cheap up to ~nodes × 20 TB pooled; past that, unmetered wins.

Disk sensitivity (3-node CX22 HA fleet, ex VAT):

Per-node persistent need3× CX22 + Volumes1× AX41 (but not HA) / 2× AX41 (HA)
40 GB — fits local€11.37 — no volumes€38 / €76
200 GB per node — build cache, image layers€11.37 + 3× €7.04 (160 GB extra × €0.044) = €32.49€38 (1 TB local covers it) / €76
500 GB per node — per-tenant PVCs€11.37 + 3× €20.24 = €72.09€38 / €76 — dedicated wins outright at ~250 GB+ per node

Break-even is a band: CX22 HA stays cheaper while per-node disk stays under ~150–200 GB and pooled egress under ~nodes × 20 TB. Cross either threshold and an AX41 (or 2× for HA) is cheaper, before counting IOPS. The April 2026 hike nudged that band ~30% toward dedicated.


The operational seam: Cluster API vs Robot, and why one API does not imply the other

The "When Local Docker Beats Cluster API" parenthetical lands here.

ConcernCX22 via Cloud API (CAPH / Terraform)AX41 via Robot (CAPH Robot bare-metal)
Provision callPOST /servers — ~60s to SSH-readyRobot POST /boot/rescue + image — 30–60 min to SSH-ready (order queue + imaging)
Machine lifecycle ownerCluster API: declarative HCloudMachine — scale/replace/upgrade is a kubectl applyRobot has no Cloud-style Machine API; CAPH's Robot provider wraps Robot but replaces still mean reprovisioning bare metal — slower and you own the reboot
Node replacementEphemeral by design — volumes are not on the node (use Cloud Volumes); node is cattleLocal RAID is on the node — node is slightly pet-like; plan backup/restore of local state
UpgradesRolling MachineDeployment — new VM, cordon, drain, delete old — ~minutesSame rolling pattern but 30 min per node — budget real maintenance windows
Control-plane placementCloud volumes + Cloud LBs are API-managed; etcd should not be on Cloud Volumes (fsync tax) — use local disk nodes or dedicated etcd hostsetcd on local NVMe is ideal — fsync p99 stays under 10 ms without tuning
When CAPI is worth it3+ nodes where you use scale/upgrade/HA as code2+ AX41s where you repeat provision — otherwise plain install wins

The honest cost of Cluster API on CX22s is not the YAML — it is running a control plane to manage cattle you could manage with a for-loop over the Cloud API when the fleet is tiny. On AX41s it flips: bare metal needs declarative lifecycle because every replacement is slow and stateful.


When local Docker beats both

For a single-box PaaS, Kubernetes — and the CX22-vs-AX41 Cluster API question — is the wrong abstraction to pay for.

Stay on Docker Compose or a single Docker host with Caddy/Traefik when all three are true:

  1. One machine is enough — fewer than ~10 services and no tenant needs hard CPU/RAM isolation beyond cgroups.
  2. Deploys are tolerant — fewer than ~10 deploys/day, and a 10–30s restart per compose pull is acceptable. No zero-downtime blue/green contract.
  3. No HA promise yet — best-effort uptime, not 99.9% across AZs. A single-host reboot is an acknowledged failure mode.

Where Docker wins concretely: 1× CX22 or 1× AX41, up to ~8 containers, ~50 GB state, <500 GB egress, team of 1–3, deploys via a small git push webhook. Cost: €3.79 or €38 with no Kubernetes overhead — no CNI, no etcd backups.

Three signals you have outgrown Docker and CAPI starts paying rent:

  • Need a second machinersync + compose per host no longer reconciles state. That seam (no declarative lifecycle, no fleet scheduling) is what Cluster API owns.
  • Noisy neighbors — Compose has no quotas, namespaces, or NetworkPolicies to isolate tenants.
  • Need rollouts, not restarts — when compose pull && up -d causing 503s is unacceptable, you want Deployment rolling updates, PDBs, and readiness gates.

Migration path that avoids regret: start on one AX41 or CX22 with Docker; when signal 1 fires, reimage that host as a CAPH worker and add two cloud VMs for HA control plane.


Cheat sheet: four questions that pick the substrate

Answer in order; the first yes exits.

  1. Solo on one box today? Yes → Docker on CX22 (budget) or AX41 (I/O). Revisit at two boxes. Do not run CAPI for one node.
  2. Need HA? Yes and budget-tight → 3× CX22 (€11) beats 1× AX41 (€38) on price; 2–3× AX41 (€76–€114) beats CX22 fleet on I/O. Pick the constraint you are HA-ing.
  3. Any worker need >200 GB local state or strict fsync? Yes → AX41 — Cloud Volumes' €/GB + IOPS tax inverts the math past ~200 GB/node; etcd wants local NVMe.
  4. Will you exceed pooled 20 TB × nodes in egress? Yes past ~100 TB fleet egress → AX41 unmetered wins on overage; project growth, not this month.

No to all four → CX22 is the boring right answer — and "When Local Docker Beats Cluster API" is permission to stay more boring and not run Kubernetes yet.

Bex.co is the open-source, AI-native Render alternative — push a git repo, get a running HTTPS service on machines you own. It runs on the same CX22s and AX41s compared above, with Cluster API owning the fleet when you outgrow one box and staying out of the way when one Docker host is still the right call. Star the repo on GitHub or deploy your first app today.

Related articles

Run this on infrastructure you own

bex is the open-source, AI-native Render alternative — push a git repo and get a running HTTPS service on your own machines.

Get started with bex