Move from Fly.io to RaidFrame — simpler networking, flat pricing, more built-in services.
Fly.io runs Docker containers on bare metal globally. RaidFrame does the same with a simpler mental model — no Fly Machines API, no fly.toml quirks, no surprise bills from idle machines you forgot about.
| Fly.io | RaidFrame |
|---|---|
| Fly Machines | Container services |
fly.toml | raidframe.yaml |
fly deploy | rf deploy |
fly postgres | rf add postgres |
| Upstash Redis (Fly addon) | rf add redis (managed) |
| Tigris (Fly addon) | rf add storage |
fly logs | rf logs |
fly scale | rf services scale |
fly ssh console | rf ssh |
fly secrets | rf secrets set |
| Fly Proxy / Anycast | Built-in load balancer |
| Fly Volumes | Object storage or persistent volumes |
| Fly Extensions | Built-in services |
# fly.toml
app = "my-app"
primary_region = "iad"
[build]
dockerfile = "Dockerfile"
[http_service]
internal_port = 8080
force_https = true
auto_stop_machines = true
auto_start_machines = true
min_machines_running = 1
[[services]]
internal_port = 8080
protocol = "tcp"
[[services.ports]]
port = 443
handlers = ["tls", "http"]
[env]
NODE_ENV = "production"
Becomes:
# raidframe.yaml
project: my-app
region: us-east-1
services:
web:
type: web
build:
dockerfile: Dockerfile
port: 8080
scaling:
min: 1
max: 10
scale_to_zero:
idle_timeout: 15m
env:
shared:
NODE_ENV: production
fly secrets list --json | jq -r '.[] | "\(.Name)=\(.Digest)"'
# Fly doesn't expose secret values — re-set them manually
rf secrets set DATABASE_URL=postgresql://... REDIS_URL=redis://... API_KEY=sk_live_...
# Connect to Fly Postgres
fly postgres connect -a my-app-db
# From inside psql:
# \copy (SELECT * FROM users) TO '/tmp/users.csv' CSV HEADER;
# Or use pg_dump from outside
fly proxy 15432:5432 -a my-app-db &
pg_dump -h localhost -p 15432 -U postgres mydb > backup.sql
rf add postgres
rf db import main backup.sql
Fly Volumes are local disk attached to machines. Move to object storage:
fly ssh console -a my-app
tar czf /tmp/data.tar.gz /data
exit
fly sftp get /tmp/data.tar.gz ./data.tar.gz -a my-app
tar xzf data.tar.gz
rf add storage
rf storage sync ./data/ s3://my-app-data/
rf deploy
rf domains add myapp.com
| Feature | Fly.io | RaidFrame |
|---|---|---|
| Pricing model | Usage-based (CPU/RAM per second) | Flat per-service |
| Idle machine costs | You pay for forgotten machines | Scale-to-zero or predictable flat |
| Managed Postgres | Fly Postgres (self-managed on Fly) | Fully managed (backups, replicas, branching) |
| Managed Redis | Via Upstash addon ($) | Built-in (rf add redis) |
| Object storage | Via Tigris addon ($) | Built-in (rf add storage) |
| Message queues | Not built-in | Built-in |
| Search | Not built-in | Built-in |
| Not built-in | Built-in | |
| Database branching | Not available | Fork, test, merge |
| CI/CD | Not built-in (use GitHub Actions) | Built-in |
| Preview environments | Manual | Automatic per PR |
| Traffic mirroring | Not available | Mirror prod → staging |
| MCP integration | Not available | Full AI assistant support |
| Cost forecasting | Not available | Predict and optimize |
Fly Machines are Firecracker microVMs. RaidFrame runs Docker containers. Your Dockerfile works identically — the runtime difference is transparent to your app.
On Fly, you fly scale count 2 --region iad,cdg. On RaidFrame:
rf regions add eu-west-1
Database read replicas follow automatically if configured.
If you use Fly's private WireGuard network for development, RaidFrame has the same:
rf vpn connect
Fly uses a fly-replay header for multi-region request routing. On RaidFrame, latency-based routing is automatic. Remove any fly-replay logic from your app.