Blog

Blob Storage, Hosting Immich

June 08, 2025

Getting off Google Photos and onto Immich got surprisingly involved.

Blob Storage

I want to back up my photos somewhere. Blob storage (or file storage/object storage) is much cheaper than block storage (like AWS EBS, DigitalOcean block storage, Linode block storage, etc.).

To store 2 TB of data, you would pay

AWS S3: $46 + transfer
GCP: $40 + transfer
DigialOcean: $40 + transfer
Linode: $40 + transfer
tigris: $40
CF R2: $30
Civo: $21.72
Wasabi: $14
Hetzner: $12 + transfer ($6 minimum)
Backblaze B2: $12
Storj.io: $8 + transfer

For comparison, consumer-grade cloud storage:

Google1: $10 (must sign in to see all plans)
Filen: 9€
iCloud+: $11
koofr: 20€ (2.51 TB, 4TB daily transfer)
ente.io: $24

At first, it seems surprising that GCP is 4× more expensive than Google1. But Google1's premium plan gives you exactly 2 TB of storage. You can't pay half as much for half the storage. If you want to store 2,000,000,000,001 bytes, you need to upgrade to the next tier (which is confusingly also called Premium, but gives you 5 TB for $25/mo). If you share your Google Drive files too frequently, Google simply blocks it. And if you want to find all photos not shared in a Google Photos album to delete, well you can go fuck yourself (if you delete a photo that's shared in an album, it simply disappears from the album too without warning).

If you want to store fewer than 2TB of data, Google1's pricing is much worse:

Basic: $2/100GB = 2¢/GB
Standard: $3/200GB = 1.5¢/GB
Premium: $10/2000GB = 0.5¢/GB
Premium (this is not a typo): $25/5000GB = 0.5¢/GB
Premium: $50/10000GB = 0.5¢/GB
Premium: $100/20000GB = 0.5¢/GB
Premium: $150/30000GB = 0.5¢/GB

CF R2 IA

Cloudflare R2 has an Infrequent Access storage tier that looks like it's cheaper and seems ideal for backup. The pricing table makes it seem like you pay 33% less for storage and twice as much to write the data.

In my case, I was storing 90 GB in 1353 files in my backup bucket that I wanted to switch to IA. This would've cost me 90 × $0.015 = $1.35/month in standard tier but should only cost 90 × $0.01 = $0.90 in IA. However, writing those 1353 files are Class A Operations. When Cloudflare says "$9.00 / million requests", they don't mean $0.000009 / request. They mean the first request costs $9, the next 999,999 are free, and the next one after that costs another $9.

That's still no big deal because I only need 1353 requests, and the free tier says I get a million of those for free, right? No: despite absolutely no text to the contrary, the free tier only applies to standard storage.

CF R2 invoice

I have opened a support ticket with Cloudflare on April 8 (2 months ago). The only reply I've received so far is

Thanks for contacting Cloudflare. Your issue is in our queue to address - it typically takes us around 24 hours to respond during Monday-Friday.

Immich

Immich is a self-hosted photo webapp that gives you a Google Photos-like experience. It has mobile apps, generates thumbnails, transcodes video, tags photos with objects and indexes them for search, and has facial recognition.

I tried using rclone and MinIO client to do what seemed like a very simple task: back up this directory to that bucket. Both of them struggled to do the right thing. At one point, mc managed to drop a / in between two directories and accidentally duplicated all the files.

In the end, I wrote r2_sync, because it was easier than trying yet another tool (I looked at s3sync). It uses uv run which is great, by the way.