Cloudflare Workers Alternative: When You Need More Than Serverless
Cloudflare Workers are great for lightweight edge logic — URL rewrites, auth checks, A/B testing. But the moment your workload needs real compute, persistent connections, or more than 128 MB of memory, you hit a wall. Here is when and why developers move from Workers to bare metal.
Where Workers Fall Short
Workers run on Cloudflare’s V8 isolate runtime. That architecture enables fast cold starts and global distribution, but it comes with hard limits that no pricing tier removes:
- CPU time — 10 ms on the free plan, 30 seconds on paid. Any compute-heavy task (image processing, PDF generation, data transformation) times out.
- Memory — 128 MB per invocation. Try loading a large dataset, ML model, or parsing a big CSV and you crash instantly.
- No persistent state — Workers are stateless. You must bolt on KV, Durable Objects, or D1 for any data persistence, each with its own pricing and latency.
- No TCP/UDP sockets — WebSocket support exists, but raw TCP connections (database drivers, SMTP, custom protocols) are not available.
- No native binaries — WASM helps, but you cannot run FFmpeg, ImageMagick, Puppeteer, or any tool that expects a Linux environment.
- Bundle size — 10 MB compressed for paid plans. Large dependencies push you over quickly.
These are not bugs. They are architectural trade-offs of running code inside V8 isolates at the edge. But they mean Workers cannot replace a real server for anything beyond request routing and light processing.
When You Outgrow Workers
If any of these describe your situation, you have outgrown serverless edge functions:
- Your API response time matters and you need persistent database connections (connection pooling, not per-request handshakes)
- You run background jobs, cron tasks, or long-running processes
- You need to process files, generate images, or transcode media
- You want to run Redis, PostgreSQL, or any stateful service alongside your app
- Your monthly Workers bill exceeds $50 and keeps climbing with traffic
Cost Comparison at Scale
Workers pricing looks cheap until you do the math at real traffic volumes. The paid plan costs $5/mo base plus $0.50 per million requests after the first 10 million.
At 50 million requests/month, Workers already costs 4x more than a dedicated bare metal server. And that is before you add KV reads ($0.50/million), Durable Object compute, D1 rows, or R2 operations. Each add-on has its own meter running.
A RAW bare metal server handles unlimited requests at a flat $6/mo. No per-invocation billing. No bandwidth overage. 20 TB transfer included.
What Bare Metal Gives You
Moving from Workers to bare metal is not a downgrade. It is an upgrade to a real computing environment:
- Full Linux — run any binary, any language, any framework. No runtime restrictions.
- Persistent processes — your app stays warm. No cold starts. Persistent database connections via connection pooling.
- Colocated services — run Redis, PostgreSQL, and your application on the same machine with sub-millisecond IPC.
- Unlimited CPU time — process images, run ML inference, transcode video. No 30-second kill switch.
- Dedicated resources — no noisy neighbors. Your cores and RAM are yours.
- Flat pricing — $6/mo. No surprises when traffic spikes.
Migration Path
If you are currently on Workers and hitting limits, the migration is straightforward:
# Deploy a RAW bare metal server
npx rawhq deploy
# SSH in and set up your runtime
ssh root@your-server-ip
apt update && apt install -y nodejs npm nginx certbot
# Move your app code
git clone your-repo
cd your-app && npm install && npm run build
# Set up Nginx reverse proxy + SSL
certbot --nginx -d yourdomain.com
# Run with PM2 or systemd
npm install -g pm2
pm2 start server.js --name my-app
pm2 save && pm2 startupYou keep Cloudflare as your DNS and CDN provider — just point the origin to your bare metal server instead of routing through Workers. You get Cloudflare’s DDoS protection and caching with full server capabilities behind it.
When Workers Still Make Sense
Workers are still the right choice for lightweight edge logic: geo-routing, A/B test assignment, header manipulation, bot detection, and simple API gateways that mostly proxy requests. If your Worker code fits comfortably within the CPU and memory limits, stay on Workers.
But the moment you need a real server — persistent state, background processing, colocated databases, or predictable pricing — bare metal is the natural next step.
Get Started
npx rawhq deploy7-day free trial. Dedicated bare metal in 13 seconds. No per-request billing, no memory limits, no CPU timeouts.