オブジェクトストレージ設計(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.ts で S3_* 変数が揃っていれば
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/)
ローカル開発での利用¶
.env.localではS3_*を指定せず、デフォルトのローカルディレクトリ保存で動かす。- Wasabi/R2 を試す場合は上表の
S3_*を設定し、必要に応じてS3_ENABLE_IN_DEV=trueを追加。アクセスキーをローカルに置く際はdirenvやdopplerなどで秘匿する。 - ローカルで Wasabi を利用する場合、
assetUrlPrefixをundefinedにするとプラグインが自動推測するため、管理画面からのプレビューはローカルサーバーのURLで表示される。S3 側の URL で確認したい場合は環境変数VENDURE_ASSET_URLに完全なURL(例:https://s3.ap-northeast-1.wasabisys.com/ritsubi-production-assets/assets/)を設定する。
バックアップ運用¶
- DB + アセットエクスポート を日次バッチで生成し Wasabi バケット内
backups/に保存。 - ライフサイクルルールで 90 日後に自動削除。
- 臨時復旧時は環境変数
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 に組み込む。