コンテンツにスキップ

オブジェクトストレージ (Cloudflare R2)

本書は、アセット・帳票・データベースバックアップのオブジェクト保管方針を扱います。本プロジェクトでは、これらの保管先として Cloudflare R2 を中心に使用します。

[!IMPORTANT] アセット・帳票・バックアップの保管判断は本書を正本とし、Fly.io 側のローカル永続化や配備詳細は system-architecture.md / deployment-guide.md を参照してください。

1. 目的

  • 可用性の向上: 商品画像を API サーバーから分離し、エッジネットワーク (Cloudflare) から直接配信する。
  • コスト削減: 出転送量 (Egress) 無料の特性を活かし、配信コストを抑える。
  • バックアップの永続化: データベースのダンプファイルを安全かつ安価に保存する。

2. バケット構成

環境 バケット名 用途 配信ドメイン (例)
Production ritsubi-ec-assets-prod 商品画像、PDF等 ec-assets.ritsubi-platform.com
Staging ritsubi-ec-assets-staging 検証用アセット ec-assets-staging.ritsubi-platform.com
Production ritsubi-wp-media-prod WordPress media cms-assets.ritsubi-platform.com
Staging ritsubi-wp-media-staging WordPress media cms-assets-staging.ritsubi-platform.com
Common ritsubi-ecommerce-backup DBバックアップ (配信なし)

3. アクセス設定

3.1 アプリケーションからのアクセス (Vendure)

Vendure Server は S3AssetStrategy を使用して R2 に接続します。

  • エンドポイント: https://<account-id>.r2.cloudflarestorage.com
  • 認証: AWS Secrets Manager の VENDURE_R2_ACCESS_KEY_ID / VENDURE_R2_SECRET_ACCESS_KEY を使用。

3.2 バックアップ用のアクセス

DB バックアップスクリプト (scripts/ops/backup-postgres-fly.sh) は、アプリ用とは別の専用キーを使用します。

  • 環境変数: BACKUP_R2_ACCESS_KEY_ID / BACKUP_R2_SECRET_ACCESS_KEY を使用。
  • 理由: 運用上の権限分離(最小権限の原則)を徹底するため。

3.3 WordPress media offload

WordPress media は Vendure asset とは別バケット・別ドメインで扱います。

  • staging: ritsubi-wp-media-staging -> cms-assets-staging.ritsubi-platform.com
  • prod: ritsubi-wp-media-prod -> cms-assets.ritsubi-platform.com

運用・検証・既存移行の詳細は wordpress-media-offload.md を正本とします。

4. 配信戦略 (VENDURE_ASSET_URL)

Storefront では API ドメインと画像配信ドメインを分離しつつ、React Dashboard ではアップロード直後の即時反映を優先します。

4.1 Storefront / shop API

  1. 設定: VENDURE_ASSET_URL に R2 のカスタムドメインを設定する。
  2. 動作:
  3. API リクエスト: VENDURE_BASE_URL (API サーバー) へ。
  4. 画像リクエスト: VENDURE_ASSET_URL (R2/Cloudflare エッジ) へ。
  5. メリット: API サーバーの負荷軽減と、エッジでの高速な画像最適化 (Next/Image) を両立。

4.2 React Dashboard / admin API

  1. 正本 URL: admin API が返す Asset URL は Vendure Server 同居の /assets/ を正本とする。
  2. 理由:
  3. Dashboard は管理者限定であり、Storefront ほど edge 配信最適化の優先度が高くない。
  4. アップロード直後の画像確認で、R2 custom domain + Cloudflare edge cache の stale 404 を避ける必要がある。
  5. 実装方針:
  6. shop API request だけ VENDURE_ASSET_URL を返す。
  7. admin API request は request host 基準の /assets/ を返す。

4.3 Cloudflare cache rule の位置づけ

  • ec-assets* に対する 404 TTL 短縮や bypass rule は、Storefront 配信の補助的な緩和策としては使える。
  • ただし、Dashboard の即時反映性は cache rule ではなく admin / shop の配信経路分離で担保する