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:
- Cloudflare R2 — 10GB free storage, unlimited free egress (their headline feature)
- Backblaze B2 — 10GB free storage, egress free up to 3x your stored data per day
- 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)