I run apps on all three. Most of my small tools and scheduled jobs live on Cloudflare Workers. A Hetzner Cloud server runs a pile of Docker containers. A few workloads sit on DigitalOcean droplets. Each one is the cheapest way to run a particular shape of app, and my hosting mistakes came from putting an app on the wrong one.
Prices and limits below are from each vendor’s pricing page as of October 2026. Hetzner raised its prices sharply in June, so anything you read from 2025 is out of date.
The Rule I Use
The question I ask is what the app does when nobody’s looking at it.
If it only does work when a request comes in or a cron fires, it goes on Workers. Small APIs, webhooks, redirects, scrapers that run every 15 minutes, a form handler, a tool with ten users. These sit idle most of the time, and on serverless billing idle costs nothing.
If it has to stay running, it goes on a VPS. A database you don’t want to rent by the query, a queue worker, n8n, anything that holds a WebSocket open, anything that ships as a Docker image, anything that needs more than a few seconds of CPU per job. A €5 to €20 box runs all of that around the clock for a flat price.
If I’d rather pay than operate, it goes on a managed platform. That’s the case for client work where nobody on the client’s side can patch a Linux box, or for a prototype where I want a URL in five minutes and don’t care about the bill yet.
Cloudflare Workers and the Free Plan Caps I Hit
The Workers Free plan gives you 100,000 requests a day, 10 ms of CPU per invocation, 50 subrequests per invocation and 5 cron triggers per account. D1, Cloudflare’s SQLite database, gives you 5 million rows read and 100,000 rows written a day, with 500 MB per database. KV gives you 100,000 reads and only 1,000 writes a day.
For most small apps that’s plenty. I’ve hit two of those limits in production, though, and both took something down.
The first was the subrequest cap. A cron made one fetch() per item in a list, and once the list passed 50 the job started failing partway through. Redirects count as extra subrequests, so you hit the cap earlier than your code suggests.
The second was D1’s write limit. One product uses a crawler with a URL queue in D1, and every enqueue and status update is a row write. The day it crossed 100,000 writes, D1 stopped accepting queries and the product’s API started returning 500s. The counter resets at midnight UTC, and until then every query fails.
The fix for both was the Workers Paid plan at $5 a month. That moves you to 10 million requests a month included, 30 million CPU milliseconds, 10,000 subrequests per invocation, 250 cron triggers, and D1 with 50 million rows written and 25 billion rows read a month included. Overage is cheap: $0.30 per extra million requests and $1.00 per extra million D1 rows written. R2 storage is $0.015 per GB-month with free egress.
I did weigh moving that product to the Hetzner box, where the database would cost nothing extra. Rewriting the storage layer and taking on one more process to babysit, all to save $5 a month, is a bad trade. On Workers I still have nothing to patch.
Treat the Free plan as a trial. Anything with users or a cron that matters should be on Paid from day one. The $5 buys you headroom and removes the class of outage where a daily counter takes your app down.
Workers is the wrong pick for long-running jobs, heavy CPU work and any library that needs the full Node runtime. Workers run a subset of Node APIs, and some npm packages assume things a V8 isolate doesn’t have. I wrote more about that runtime model in Serverless and edge functions, finally explained.
Hetzner After the June 2026 Price Rise
Hetzner raised cloud prices for new orders and rescales on June 15, 2026. The shared-vCPU CPX line more than doubled. In Germany and Finland, excluding VAT and IPv4:
- CX23 (2 vCPU, 4 GB RAM, 40 GB disk): €3.99 went to €5.49
- CAX11 (2 Arm vCPU, 4 GB, 40 GB): €4.49 went to €5.99
- CPX22 (2 AMD vCPU, 4 GB, 80 GB): €7.99 went to €19.49
- CCX13 (2 dedicated vCPU, 8 GB, 80 GB): €15.99 went to €42.99
A public IPv4 address is €0.50 a month on top. Servers you already had keep their old price unless you rescale them. When I checked the site this week, the cheap CX and CAX plans were marked as not available, so the €5 Hetzner box is hard to buy right now.
What hasn’t changed is traffic. Every cloud plan in the German and Finnish regions includes at least 20 TB of outbound traffic a month. In the US and Singapore regions it’s 0.5 to 8 TB depending on the plan. If you serve files or media, that 20 TB is the reason to be on Hetzner.
My Hetzner box runs Docker containers: an internal dashboard, n8n and a handful of internal tools. None of them has a public port. Cloudflare Tunnel connects them out to Cloudflare, and Cloudflare Access puts a login in front. I get HTTPS, SSO and no open firewall ports for free.
The cost of running your own box shows up in maintenance. Mine filled its 38 GB disk because each deploy left behind a 2.2 GB image and nothing pruned the old ones. Enough deploys later, the disk was full and containers started failing. The fix was a docker image prune step in the deploy script and a disk-usage alert. On a VPS that kind of failure is yours to prevent, along with OS updates, backups and reboots.
Hetzner dedicated servers got the same treatment. An AX42 is now €97.30 a month plus a €49 setup fee. The limited AX41 offer at €57.30 and the server auction are where the bargains went.
DigitalOcean Is Now in the Same Price Band
DigitalOcean’s Basic droplets start at $4 for 512 MB and $6 for 1 GB. The $24 droplet has 2 vCPU, 4 GB RAM, 80 GB SSD and 4 TB of transfer, with overage at $0.01 per GiB, pooled across all your droplets.
That $24 plan is the interesting comparison. Hetzner’s CPX22 with an IPv4 address now costs $23.59 in US dollars. So a mid-size DigitalOcean droplet and a mid-size Hetzner box now cost about the same. Hetzner still wins on traffic and on the bottom tier, if you can get a CX23.
Where DigitalOcean earns its place for me is everything around the droplet: US and Asian regions with real bandwidth allowances, clean docs and an API that’s pleasant to script. App Platform runs a container from $5 a month (512 MB, 50 GiB transfer), and managed Postgres or MySQL starts at $15.15. That’s why some of my workloads still sit on droplets.
The Comparison
| Cloudflare Workers | Hetzner Cloud | DigitalOcean | |
|---|---|---|---|
| Entry price | Free, or $5/mo Paid | €5.49/mo CX23 + €0.50 IPv4 (when in stock) | $4/mo droplet |
| Billing model | Per request, CPU time and storage rows | Flat monthly | Flat monthly |
| Included traffic | No egress charges on Workers, D1 or R2 | 20 TB/mo in EU, 0.5-8 TB in US/SIN | 0.5-10 TB/mo, pooled |
| Long-running processes | No | Yes | Yes |
| Database | D1 (SQLite), 10 GB per database on Paid | Whatever you install | Managed DBs from $15.15/mo |
| What you maintain | Your code | OS, Docker, backups, disk | OS, Docker, backups, disk |
| Best for | APIs, webhooks, crons, small tools | Containers, n8n, heavy jobs, media | US/Asia workloads, managed add-ons |
| Watch out for | Free plan daily caps, 50 subrequests | June 2026 prices, stock | Bandwidth on the small plans |
The Alternatives That Earn a Mention
Vercel is the right call for a Next.js front end, and the wrong one for anything commercial on the free tier: the Hobby plan is for personal, non-commercial use only. Pro is $20 a month with $20 of usage credit. Bandwidth is where Vercel bills used to get ugly, and Pro now offers a flat-rate CDN option that caps it.
Railway suits the case where you want a container running in five minutes without touching a server. Hobby is $5 a month including $5 of usage. Compute works out to about $20 per vCPU and $10 per GB of RAM per month, so a small always-on service is cheap and a big one isn’t. Egress is $0.05 per GB.
Render is the more conventional version of the same idea. A Starter web service is $7 a month for 512 MB, and the Pro workspace is $25 a month plus compute. Free web services spin down after 15 minutes without traffic, which is fine for a demo and bad for anything a customer touches.
Fly.io makes sense when you need a container close to users in several regions. A 256 MB machine is $2.19 a month and outbound traffic in North America and Europe is $0.02 per GB. New accounts get a short trial and there’s no free tier.
AWS Lightsail is DigitalOcean with an AWS bill: $5 for 512 MB, $7 for 1 GB, $12 for 2 GB, all with an IPv4 address and 1 to 3 TB of transfer. Worth it only if the rest of your stack already lives in AWS.
Coolify, Dokku and Kamal turn a VPS into your own Heroku. Coolify is free to self-host, or $5 a month for the hosted control panel covering two servers. This is the combination I’d point most indie builders to: a Hetzner or DigitalOcean box with Coolify gives you git-push deploys and a dashboard for the price of the box. You still own the disk filling up.
I left out Netlify, Vultr, Linode and the hyperscalers. They’re fine, and none of them changes the decision for a solo builder or a small agency.
What I’d Do Starting Today
Put the request-driven stuff on Workers Paid and stop thinking about it. Put the always-on stuff in containers on one VPS, behind Cloudflare Tunnel, with an image-prune step and a disk alert from day one. Pick Hetzner if you can get a CX23 and want EU traffic, DigitalOcean if you need US regions or managed databases. Pay Railway or Render only where your time costs more than the markup.
If you’re coming from managed WordPress hosting, Hosting beyond Kinsta covers the wider map of platforms, and Run Claude Code on a Hetzner box shows how I use the same server as a remote dev machine.

Leave a Reply