コンテンツにスキップ

オブジェクトストレージ設計(Wasabi / S3 互換)

概要

Vendure のアセット(商品画像・添付書類)とバックアップデータは Wasabi Object Storage をメインストレージとして運用する。Vendure の AssetServerPlugin からは S3 互換 API として接続し、必要に応じて Cloudflare R2 など他の S3 互換サービスへ切り替えられるよう環境変数名を S3_ 系に統一する。

ストレージ構成

用途 サービス 備考
本番アセット Wasabi (S3 互換 API) 東京リージョン ap-northeast-1 を想定
バックアップ Wasabi バケット (別フォルダ) 日次エクスポートを保存
代替 / フォールバック Cloudflare R2 など S3 互換 S3_ 変数を差し替えるだけで切替可能
  • 全アセットは Wasabi 上でバージョニングを有効化し、削除防止ポリシー(Object Lock or バージョン管理)を設定する。
  • バックアップ用フォルダ(例: backups/)に Vendure DB ダンプや設定ファイルを日次で保存し、90日保持する。

環境変数

変数名 説明
S3_BUCKET メインバケット名 ritsubi-production-assets
S3_ACCESS_KEY_ID アクセスキー Wasabi コンソールで発行
S3_SECRET_ACCESS_KEY シークレットキー Wasabi コンソールで発行
S3_ENDPOINT エンドポイント URL https://s3.ap-northeast-1.wasabisys.com
S3_REGION リージョン ap-northeast-1
S3_FORCE_PATH_STYLE パススタイル強制(true/false) true(Wasabi は推奨)
S3_SIGNATURE_VERSION 署名バージョン v4
VENDURE_ASSET_URL アセットURLプレフィックス(推奨) https://ritsubi-vendure.fly.dev/assets/
ASSET_URL アセットURLプレフィックス(代替) https://assets.ritsubi.co.jp/assets/
S3_PUBLIC_URL 公開 URL プレフィックス(非推奨) https://s3.ap-northeast-1.wasabisys.com/ritsubi-production-assets/
S3_ENABLE_IN_DEV 開発環境でも S3 を有効化するか false(既定)

旧 Cloudflare R2 向けに利用していた R2_* 変数は後方互換用途で読み込む。Wasabi を利用する場合は S3_* を設定すればよい。

Vendure AssetServer 設定

apps/vendure-server/src/vendure-config.tsS3_* 変数が揃っていれば storageStrategyFactoryでS3ストレージを設定できる。未設定の場合はローカルボリューム(static/assets)へ保存される。

重要: assetUrlPrefixは完全なURLを指定するか、undefinedにしてプラグインに自動推測させる必要があります。相対パス(/assets)を指定すると、Dashboard側でURL構築エラーが発生します。

AssetServerPlugin.init({
  route: 'assets',
  assetUploadDir: path.join(__dirname, '../static/assets'),
  // assetUrlPrefixは完全なURLを指定するか、undefinedにしてプラグインに自動推測させる
  // 公式ドキュメント: https://docs.vendure.io/reference/core-plugins/asset-server-plugin/asset-server-plugin-options/#asseturlprefix
  assetUrlPrefix:
    process.env.VENDURE_ASSET_URL ?? process.env.ASSET_URL ?? undefined,
  // S3ストレージを使用する場合はstorageStrategyFactoryを設定
  storageStrategyFactory: s3StorageStrategyFactory,
});

assetUrlPrefixの設定方針

  • 開発環境: undefinedを推奨(プラグインがリクエストから自動推測)
  • 本番環境: 環境変数 VENDURE_ASSET_URL または ASSET_URL に完全なURL(例: https://ritsubi-vendure.fly.dev/assets/)を設定
  • S3/CDN使用時: CDNのURLを設定(例: https://assets.ritsubi.co.jp/assets/

ローカル開発での利用

  1. .env.local では S3_* を指定せず、デフォルトのローカルディレクトリ保存で動かす。
  2. Wasabi/R2 を試す場合は上表の S3_* を設定し、必要に応じて S3_ENABLE_IN_DEV=true を追加。アクセスキーをローカルに置く際は direnvdoppler などで秘匿する。
  3. ローカルで Wasabi を利用する場合、assetUrlPrefixundefinedにするとプラグインが自動推測するため、管理画面からのプレビューはローカルサーバーのURLで表示される。S3 側の URL で確認したい場合は環境変数 VENDURE_ASSET_URL に完全なURL(例: https://s3.ap-northeast-1.wasabisys.com/ritsubi-production-assets/assets/)を設定する。

バックアップ運用

  1. DB + アセットエクスポート を日次バッチで生成し Wasabi バケット内 backups/ に保存。
  2. ライフサイクルルールで 90 日後に自動削除。
  3. 臨時復旧時は環境変数 VENDURE_ASSET_URL を一時的に Wasabi の公開URLに切り替え、復元後に通常運用へ戻す。

他ストレージへの切替

Cloudflare R2 など別サービスへ切り替える場合は、同じ S3_* 変数に値を入れ替えるだけでよい。R2 の場合は以下が代表例:

S3_BUCKET=ritsubi-prod-assets
S3_ACCESS_KEY_ID=<R2_ACCESS_KEY>
S3_SECRET_ACCESS_KEY=<R2_SECRET_KEY>
S3_ENDPOINT=https://<ACCOUNT_ID>.r2.cloudflarestorage.com
VENDURE_ASSET_URL=https://assets.example.com/assets/
S3_FORCE_PATH_STYLE=true

セキュリティと権限

  • API キーは最小権限(バケット単位)で発行。
  • IP 制限と MFA を管理者アカウントに設定。
  • Cloudflare CDN や将来の配信最適化に備え、環境変数 VENDURE_ASSET_URL をカスタムドメインへ変更できるよう Terraform/ IaC に組み込む。