Jean Galea

AI, Investing, Health, and Building Businesses

  • Start Here
  • AI & Tech
    • AI
    • Tech
    • Modern Web Stack
    • Business
  • Investing
    • Investing Basics
    • Crypto
    • Stocks
    • P2P Lending
    • Calculators
    • Dividends
    • FIRE & Early Retirement
    • European Investing Hub
  • Life
    • Essays
    • Barcelona
    • Padel
    • Health & Fitness
    • Hobbies
    • Family
  • About
    • My Story
    • Projects
    • AI Consultancy
    • Speaking
  • Blog
  • Community
    • Good Life Collective
    • Daily Driver AI
  • Search

Cloudflare Workers vs Hetzner vs DigitalOcean: How I Decide Where an App Runs

Published: October 21, 2026Leave a Comment

Cloudflare Workers pricing page comparing the Workers Free and Workers Paid plans

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.

Hetzner's cost-optimized cloud plans, with every CX and CAX server marked as not available

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.

DigitalOcean's Basic droplet pricing table, from $4 to $96 a month

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.

Related

Hosting Beyond Kinsta: Vercel, Fly, Railway, Cloudflare, and Friends
Run Claude Code on a Hetzner Box and Drive It From Your Laptop and Phone
Diagram showing local AI tools split into two layers: a surface layer with AnythingLLM, Open WebUI and Hermes sitting on top of an engine layer with Ollama, LM Studio, Jan, GPT4All and Msty
Which Local AI App Do You Actually Need? AnythingLLM, Hermes, LM Studio, and the Rest
Best Mobile Apps to Use in Barcelona in 2026
Next.js: The WordPress of React
Revolut Review 2026 – An Essential Digital Banking Solution

Filed under: Modern Web Stack for WordPress Developers, Tech

Leave a Reply Cancel reply

Thanks for choosing to leave a comment. Please keep in mind that all comments are moderated according to our comment policy, and your email address will NOT be published. Please Do NOT use keywords or links in the name field.

Jean Galea

Founder | AI builder | Dad of three | Athlete

Follow @jeangalea

  • My Padel Journey
  • Affiliate Disclaimer
  • Cookies
  • Contact

Copyright © 2006 - 2026