DEV Community

niuniu
niuniu

Posted on

I Stored 1GB in the Cloud for $0: Cloudflare R2 vs Backblaze B2 vs Storj — One Is Not Like the Others

Last month my VPS disk hit 100% because I was dumb enough to store user uploads on local disk. Moving to object storage was overdue — but I refused to pay AWS $0.023/GB plus the infamous egress ransom. So I tested the three free tiers everyone recommends.

Same workload on all three: a 1GB mix of 2,400 files (images + JSON exports from my side project), uploaded via their official S3-compatible SDKs from the same server, same evening.

Free tier limits (the numbers that matter)

Cloudflare R2 Backblaze B2 Storj
Free storage 10 GB/mo 10 GB 25 GB (trial 30d, then paid)
Free egress Unlimited (zero egress fees) 3x storage/mo free (= 30 GB) 25 GB trial
Free Class A ops (writes) 1M/mo 2,500/day included in trial
Free Class B ops (reads) 10M/mo 2,500/day included in trial
S3-compatible API Yes Yes Yes

Real-world results

Upload throughput for the 1GB batch (multipart, 8MB chunks):

  • R2: 41 MB/s average, zero hiccups. boto3 with the R2 endpoint just worked.
  • B2: 33 MB/s average, but I hit the 2,500/day Class C (API call) free cap mid-upload on the second run and had to enable billing to continue. The free daily caps are per-day, not per-month — easy to blow past with small files.
  • Storj: 27 MB/s, and here's the catch — there is no permanent free tier anymore. The 25GB/25GB is a 30-day trial. After that, $4/TB stored. Their marketing pages still imply "free" in places, which wasted me an evening.

The code (identical for all three, thanks to S3 compatibility)

import boto3

s3 = boto3.client(
    "s3",
    endpoint_url="https://<accountid>.r2.cloudflarestorage.com",
    aws_access_key_id=KEY_ID,
    aws_secret_access_key=SECRET,
)
s3.upload_file("backup.tar.gz", "my-bucket", "backup.tar.gz")
Enter fullscreen mode Exit fullscreen mode

Swap the endpoint and credentials and the same script ran on B2 (s3.us-west-004.backblazeb2.com) and Storj (gateway.storjshare.io). That part was genuinely pleasant.

Verdict

  • Serving files to users (egress-heavy): R2, and it's not close. Zero egress fees is a structural advantage — B2's "3x storage free egress" evaporates the moment one of your files goes mildly viral.
  • Cold backup with rare reads: B2 is fine, and their paid pricing ($6/TB) is the cheapest exit ramp if you outgrow free.
  • Storj: interesting decentralization story, but calling a 30-day trial a "free tier" in 2026 comparisons is misleading. Don't build on it expecting free.

The "S3 vs GCS vs Azure Blob" debate is a distraction for side projects. The real question is: who doesn't charge you when your file actually gets downloaded?

I sketched the benchmark script and the multipart upload retry logic with MonkeyCode — free, open-source, and it caught my dumb bug where I forgot to close the multipart upload on retries: https://ly.cyberserval.tech/iIETXiF

Which one are you trusting with your side project's files — and has anyone actually been burned by B2's daily API caps in production?

Top comments (0)