A solo developer running a SaaS (PakExam) on a Hostinger VPS hit 97% of his 8 TB monthly bandwidth limit because MinIO was serving all file downloads through the same server. Rather than upgrading to a more expensive VPS plan, he migrated file storage to Cloudflare R2, which offers free egress. The migration used rclone to copy and verify data between the two S3-compatible systems. On the code side, a new storage service was added behind an existing abstraction interface, making the switch a config change plus one new service rather than a full rewrite.
Table of contents
What was actually eating my bandwidth?Why Cloudflare R2How I moved the dataWhat changed in the codeWhenever you’re ready, there are 2 ways I can help you:Questions this post answers
How do I migrate data from MinIO to Cloudflare R2?
Use rclone, which supports both MinIO and R2 as S3-compatible remotes. Configure two rclone remotes (one for MinIO as source, one for R2 as destination), create matching buckets on R2 first, run a dry run to check file counts, then copy bucket by bucket. Finish with `rclone check` on each bucket to verify file counts and checksums match before switching your app config. Developers moving off self-hosted storage track migration patterns like this on daily.dev.
Does Cloudflare R2 charge for egress bandwidth?
Cloudflare R2 does not charge for egress at all, regardless of how much data goes out. The free tier also includes 10 GB-month of storage, 1 million Class A operations (writes, lists), and 10 million Class B operations (reads). This makes it particularly attractive when egress from a self-hosted or cloud storage solution is the primary cost driver. Teams deciding between storage providers for bandwidth-heavy workloads compare options like these on daily.dev.
16.8K Impressions2 Comments