Live incident — 164 civic domains taken offline simultaneously · April 3, 2026 · Cloudflare Case #02055919 open and unanswered

Your sovereign stack — step by step

The migration is not complex. It has been executed at scale — 164 domains in a single day — using the tools below. All open. All documented. All yours.

What you're leaving
Cloudflare Workers
Routing logic that can be switched off without notice. Free plan: 100k req/day hard limit. Payment gateway broken by design.
Cloudflare DNS (as compute dependency)
Free DNS is fine in isolation. The trap is routing business logic through Workers attached to it.
Any single-vendor critical path
If one company can take you offline without a phone call, you are not sovereign.
What you're building
Replit — Development & Deployment
Your build environment. The migration cookbook lives here. Rapid iteration, full control of routing logic.
Fly.io — Routing & Compute
Your routing script handles all traffic by Host header. Shared machine, no per-domain cost. Already live.
Bunny DNS — Authoritative DNS
Fast global anycast DNS. Clean REST API — create zones, add A records, and bulk-migrate all domains with a script. NS: kiki.bunny.net / coco.bunny.net.
Porkbun — Domain Registration
Nameserver updates scriptable via API. Point to Hetzner nameservers. Bulk update available.
NetSentinel — Attack Filtering
Drop-in Node.js middleware. Detects 22 attack signatures. RIPE NCC abuse contact lookup. Federated network. No Cloudflare dependency.

The migration sequence

# Phase 1: Deploy routing layer — do this once for all domains
1. Create Fly.io app (free tier, shared machine)
2. Deploy routing script — reads Host: header, proxies to your platform
3. Add health check endpoint to proxy (/health returns 200 JSON)
4. Set autostop = "suspend" — 2s resume vs 30s cold boot
5. Create second machine in a second region (East Coast + West Coast)
6. Note Fly.io shared IP address

# Phase 2: Canary domain first — validate end-to-end
7. Create Bunny DNS zone for first domain (API call)
8. Add A record → Fly.io IP
9. Update Porkbun nameservers → kiki.bunny.net / coco.bunny.net
10. Wait 15–30 min, verify TLS + site loads cleanly
11. Confirm: no Cloudflare in response headers

# Phase 3: Batch the rest — scriptable at ~30s/domain
12. Script Bunny DNS zone creation via API for all remaining domains
13. Script Porkbun nameserver updates via API (bulk endpoint available)
14. Run status checker — domains turn green when DNS propagates

# If the proxy goes silent: one-line recovery (no CLI tools required)
# curl -X POST https://api.machines.dev/v1/apps/APP/machines/ID/restart
# -H "Authorization: Bearer $FLY_IO_TOKEN"

# Total cost after migration: ~$0.01/month (Bunny DNS free, Fly shared machine)
# Time to migrate 164 domains after canary: < 4 hours with scripts
The health check is not optional. Without it, Fly.io cannot detect when your proxy enters a broken state and will not auto-restart it. A machine that looks "started" can silently stop routing traffic. The health check is what converts a human-dependent recovery into an automatic one.
Submit Your Cloudflare Incident →