Runs containers close to your users: deploy an image and it starts machines in several regions, with private networking and volumes attached.
Build me the deployment I actually need instead of Fly.io — and be honest about the verdict. What you are paying for is **machines in several regions from one command**, private networking between them, and instances that suspend when idle. If you genuinely serve users on three continents and care about latency, that is hard to reproduce and worth paying for. If you have users everywhere but one database, the multi-region story is mostly an illusion anyway — your writes still cross the ocean. Most applications are one machine, and this is what that looks like done properly. STACK - One or two VPS instances at a provider you like - Docker or Podman for the application and its services - Caddy in front for TLS and routing - Bash and systemd for the deploy. No orchestration platform for one machine THE HONEST ARCHITECTURE QUESTION - Multi-region reads are useful. Multi-region writes are a distributed database problem, and adding regions without solving it just adds latency and failure modes - So: one primary region with the database, and read replicas elsewhere only if you have measured that reads are the problem. Route writes to the primary and accept the replication lag deliberately - Put a CDN in front of anything static. That solves most of what "close to your users" actually means, for a fraction of the effort - Write this decision down before you start, because "we should be multi-region" is the most expensive unexamined assumption in hosting THE SHAPE - /srv/<app>/releases/<timestamp> per deploy, /srv/<app>/current a symlink - /srv/<app>/shared holds .env, uploads and the database, symlinked into each release. Nothing that must survive a deploy lives inside one - Deploy is: fetch, build, migrate, switch the symlink, restart, health check. A failure at any step leaves the old release serving - Rollback moves the symlink back. One command, tested before it is needed WHAT REPLACES EACH FEATURE - One command to deploy becomes a shell script that refuses on a dirty tree and rolls back on a failed health check - Machines that suspend when idle become one small always-on instance, which costs a few euros and has no cold start at all — usually the better trade - Private networking between regions becomes a WireGuard mesh if you truly need it, and nothing if you do not - Automatic TLS becomes Caddy, which is two lines - Zero-downtime deploys become a second process on a second port with Caddy switching once the new one passes its health check. Twenty lines, and worth it - Volumes become a directory, backed up nightly, off the machine DATABASE AND STATE - Migrations run before the symlink switch, each once, in order - Backwards-compatible across a deploy: add a column, deploy, use it, remove the old one later. Never in the same deploy - Continuous replication of the database to object storage, which gives you point-in-time restore - A restore rehearsed onto a clean machine, with the time it took written down. That is the entire disaster-recovery story THE OPERATIONAL FLOOR - Log rotation before the disk fills, a swap file so a memory spike degrades instead of killing the process, unattended security updates, a firewall allowing only what is needed, ssh on keys - Certificate renewal monitored, disk alerted at 80 per cent - An uptime check from somewhere that is not this machine — the one thing here you should not self-host - Everything on this list fails at once when the disk is full WHAT YOU ARE SIGNING UP FOR - You are the operator now: updates, disk, backups, and the person who is called. Write that in the README alongside what it costs and what it replaces WHAT MATTERS MOST The failed deploy, the rollback and the tested restore — and deciding honestly whether you need more than one region. Break the build deliberately and confirm the site stayed up, then restore a backup onto a clean machine and time it.
What you lose
- Deployment to a dozen regions from one command, with routing to the nearest one handled
- Private networking between your own machines across regions
- Machines that suspend when idle and wake on a request, which is what keeps the bill small
If you would rather not build
- A VPS with Docker Compose
- Hetzner or DigitalOcean, at a fraction of the price
What it costs
as published on their pricing page
| Plan | Billed monthly | Billed yearly | Last read |
|---|---|---|---|
| — | $5/mo | — | — |
Their pricing page is where these came from. Seeing a different price? Tell us.
The escape hatch
open source · no votes, no paid placement
Coolify
$0Self-hosted deployment platform: push to git, it builds and runs the container.
coollabsio/coolifyfree · open source
Why this verdict
our own opinion · changed only by a person
50/100
Verdict kinda at 50. One server replaces most of it; multi-region routing and suspend-on-idle are the parts you cannot rebuild cheaply.
History
tracked since 10 Aug 2026 · nothing is ever overwritten
Questions about Fly.io
answered from the record above
Is Fly.io free?
No — the plan we track is $5 a month. Pay as you go from around $5/month for a small always-on machine; billing is per second of compute.
Can you replace Fly.io by building your own?
ALMOST. A weekend of work, and real gaps remain. Replacement score 50 out of 100, build time a weekend. Read what you lose before you decide.
How much does Fly.io cost?
$5 a month on Pay as you go — $60 a year. Recorded 10 Aug 2026.
What do you lose by replacing Fly.io?
Deployment to a dozen regions from one command, with routing to the nearest one handled; Private networking between your own machines across regions; Machines that suspend when idle and wake on a request, which is what keeps the bill small. If any of those carry weight for you, keep paying.
Is there an open-source alternative to Fly.io?
Yes: Coolify, Dokku. The prompt on this page is for when you want it your way instead.
Related entries
same category first, most replaced first
Every week, something stops being worth paying for.
New verdicts, prices that moved, entries added. One email a week. Unsubscribe in one click. Nothing is being sent yet — your address is kept here, and the first issue is the first thing it is used for.
free forever · no tracking pixel · stored here, never passed to anyone

