~/VibeHandbook

Cloudflare

developers.cloudflare.com

R2

Что это

R2 — это объектное хранилище Cloudflare, место для размещения файлов: изображений, видео, резервных копий, загрузок пользователей, артефактов сборки. Оно использует тот же API, что и Amazon S3, поэтому большинство инструментов и SDK для S3 работают с ним без изменений. Главное отличие — в ценообразовании: R2 берёт плату за хранение и операции, но без платы за исходящий трафик, так что отдача данных наружу бесплатна.

Сильные стороны

  • Нулевая плата за исходящий трафик — серьёзная экономия для приложений с большим объёмом медиа или загрузок.
  • S3-совместимый API, поэтому существующие инструменты и библиотеки просто работают.
  • Привязывается напрямую к Worker для чтения и записи без хранения учётных данных в коде.
  • Может работать за CDN Cloudflare для быстрой кэшированной отдачи.
  • Масштабируется до больших объектов и больших бакетов без предварительного выделения ресурсов.

Компромиссы

  • Это объектное хранилище, а не файловая система или база данных — нет запросов к содержимому файлов.
  • Операции (PUT/GET/LIST) тарифицируются, поэтому частые обращения накапливаются в стоимости.
  • Строгая согласованность и набор возможностей отличаются в деталях от S3; проверяйте граничные случаи.
  • Для крошечных, часто изменяемых значений KV или D1 подойдут лучше.

Когда использовать

Используйте R2 для пользовательских загрузок, сгенерированных файлов, крупных статических ресурсов, экспортов данных и резервных копий — особенно там, где расходы на трафик в S3 были бы болезненными.

Подходит для vibe coding

R2 хорошо сочетается со сборками под управлением ИИ, потому что привязка избавляет от обычной возни с учётными данными — агент пишет напрямую в env.BUCKET. Скажите агенту, публичные ли файлы (отдача через Worker или собственный домен) или приватные (подписанный доступ), чтобы он правильно настроил доставку. В примере привязывается бакет и загружается файл из CLI.

# wrangler.toml
[[r2_buckets]]
binding = "BUCKET"
bucket_name = "uploads"
npx wrangler r2 bucket create uploads
npx wrangler r2 object put uploads/logo.png --file ./logo.png