DEV Community

Alex Chen
Alex Chen

Posted on

I Ran the Same 30GB Backup Through Cloudflare R2, Backblaze B2 Free, and an Oracle VM with MinIO — One Charged Me $0 and Slept Fine

Everyone benchmarks upload speed on free object storage. Nobody benchmarks the day you actually need the data back. I found out the hard way when a botched migration forced a full 30GB restore — and I got to compare egress behavior across all three free tiers I'd been hedging on.

The setup

Same dataset: 30GB of Postgres dumps + media files, pushed nightly via rclone for 90 days to:

  1. Cloudflare R2 — 10GB free storage, unlimited free egress (their headline feature)
  2. Backblaze B2 — 10GB free storage, egress free up to 3x your stored data per day
  3. MinIO self-hosted on Oracle Always Free VM — 200GB block volume, $0 everything, you own the box

90 days of actual numbers

Metric R2 B2 free MinIO on Oracle
Storage used 10GB (capped, rotated) 10GB (capped) 30GB (no rotation needed)
Nightly push (avg) 34s 41s 12s (same DC)
Full 30GB restore cost $0 (but can't fit 30GB) $0 (within 3x rule) $0
Restore speed n/a 18 min 4 min
90-day total cost $0 $0 $0
Anxiety level "did my rotation trim something I need?" "is tonight's restore within 3x?" "is the VM still alive?"

The part the marketing pages skip

R2's free egress is real but the 10GB cap is the actual constraint. My 30GB dataset doesn't fit, so R2 became my "last 7 days only" tier. Free egress is worthless when you can't store the thing you'd egress.

B2's 3x egress rule sounds generous until you model a bad week. Store 10GB, restore fully on Monday (30GB egress = exactly 3x ✓), need another restore Wednesday (60GB total, 30GB over → billed). Two disasters in one week and the "free" tier sends an invoice. Small, but the psychological safety of "free" evaporates.

MinIO won on everything except the single point of failure. Same-datacenter restores at 4 minutes vs 18 is not a rounding error when you're restoring production. And 200GB of block storage means no rotation gymnastics. But: Oracle can reclaim idle Always Free instances, and my VM is the backup. One termination email = no backups at all.

The controversial conclusion

The "right" answer everyone gives — use managed object storage, don't self-host backups — is wrong for side projects under ~50GB. The failure mode of MinIO-on-free-VM (total loss, loud, you'd notice immediately) is safer than the failure mode of B2-free (silent egress overage, small bill, works until it doesn't) or R2 (your retention window silently shrinking as the dataset grows).

Redundancy beats trust: I now push to both B2 (offsite managed) and MinIO (fast local restores). Total cost: $0. Total 3am restore time: 4 minutes.

I sketched the rclone config with MonkeyCode — free AI coding assistant: https://ly.cyberserval.tech/iIETXiF

Where does your backup actually live — and have you ever timed a full restore, or are you trusting the upload benchmark?

Top comments (0)