How to back up Fly.io Postgres to Wasabi
RESTORE-TESTED · ENCRYPTED · IN A BUCKET YOU OWN
Fly.io keeps your database running, but its snapshots live in the same account and region as the database itself. An off-site copy in your own Wasabi bucket protects you from the failures the platform can't: a bad migration, a locked account, or a compliance question you need a real answer to. Here's how to set it up in a few minutes — and, crucially, how to know the backup actually restores.
Step 1 — Get your Fly.io connection string
Fly Postgres connection string (fly postgres connect details), or the credentials you set when you created the cluster.
Fly Postgres is unmanaged Postgres running as a Fly app. Make sure the database is reachable over the public internet — either allocate a public IP for the Postgres app or expose it — since backups connect from outside your Fly private network.
A read-only role is all you need. The exact CREATE ROLE SQL is on the security page.
Step 2 — Create a Wasabi bucket and access keys
- In the Wasabi console, create a bucket (keep it private).
- Create an access key pair under Access Keys.
- Copy the access key, secret key, and the regional endpoint for your bucket.
Create an access key in the Wasabi console. Wasabi is fully S3-compatible with flat pricing and no egress fees.
Endpoint: https://s3.<region>.wasabisys.com Region: your bucket's region, e.g. us-east-1 Bucket: your-backup-bucket
Step 3 — Connect it to OffsiteDB
Paste the Fly.io connection string, add Wasabi as your destination with the bucket and keys from Step 2, and choose a schedule (hourly to daily). OffsiteDB tests the connection, then runs pg_dump, gzips and seals the artifact with AES-256-GCM, and ships it to your bucket. It's plain Postgres; a read-only role on your schemas captures everything.
Step 4 — Know it restores (the part everyone skips)
Every snapshot is restore-drilled: OffsiteDB restores it into a throwaway Postgres cluster and counts the rows before marking it sealed. When you need it back, every artifact is a standard custom-format dump:
gunzip -c fly-db_2026-06-09.dump.gz \ | pg_restore -d "$NEW_DATABASE_URL" --clean --if-exists
You also get a monthly Restore Drill Report with tested restore times — the document you forward when someone asks “are your backups tested?”
Before your next migration
Scheduled snapshots cover the slow disasters; deploys are the fast ones. One step in CI seals a tagged, restore-drilled checkpoint seconds before each migration runs — so a bad ALTER TABLE costs you a revert, not a day of data. Here's how that Friday goes with and without one.
FAQ
Does this work with Fly.io's free tier?
What permissions does the backup need on Fly.io?
Where exactly does my data end up?
Can I just run pg_dump in a cron job instead?
Related guides
- Back up Supabase Postgres to Wasabi
- Back up Neon Postgres to Wasabi
- Back up Railway Postgres to Wasabi
- Back up Render Postgres to Wasabi
- Back up Fly.io Postgres to Amazon S3
Keep reading
- OffsiteDB vs a cron job running pg_dump — the honest comparison
- Anatomy of a bad migration — minute by minute, with and without a checkpoint