オブジェクトストレージ (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¶
- 設定:
VENDURE_ASSET_URLに R2 のカスタムドメインを設定する。 - 動作:
- API リクエスト:
VENDURE_BASE_URL(API サーバー) へ。 - 画像リクエスト:
VENDURE_ASSET_URL(R2/Cloudflare エッジ) へ。 - メリット:
API サーバーの負荷軽減と、エッジでの高速な画像最適化 (
Next/Image) を両立。
4.2 React Dashboard / admin API¶
- 正本 URL: admin API が返す Asset URL は Vendure Server 同居の
/assets/を正本とする。 - 理由:
- Dashboard は管理者限定であり、Storefront ほど edge 配信最適化の優先度が高くない。
- アップロード直後の画像確認で、R2 custom domain + Cloudflare edge cache の stale 404 を避ける必要がある。
- 実装方針:
shopAPI request だけVENDURE_ASSET_URLを返す。adminAPI request は request host 基準の/assets/を返す。
4.3 Cloudflare cache rule の位置づけ¶
ec-assets*に対する 404 TTL 短縮や bypass rule は、Storefront 配信の補助的な緩和策としては使える。- ただし、Dashboard の即時反映性は cache rule ではなく admin / shop の配信経路分離で担保する。