オブジェクトストレージ設計(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-vendure-media-prd |
DOCS_S3_BUCKET |
帳票PDF用バケット名(任意) | ritsubi-vendure-docs-prd |
LOGS_S3_BUCKET |
ログ保管バケット名(任意) | ritsubi-logs |
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/ |
apps/vendure-server/src/vendure-config.shared.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_*を指定せず、デフォルトのローカルディレクトリ保存で動かす。- S3 互換のローカル開発は MinIO を標準とする。
- MinIO は
apps/vendure-server/docker-compose.dev.ymlで起動し、以下のバケットを作成する。 ritsubi-vendure-media-localritsubi-vendure-docs-localritsubi-logs-local- MinIO を使う場合は
.env.localにS3_*を設定する(例)。
S3_BUCKET=ritsubi-vendure-media-local
DOCS_S3_BUCKET=ritsubi-vendure-docs-local
LOGS_S3_BUCKET=ritsubi-logs-local
S3_ACCESS_KEY_ID=minioadmin
S3_SECRET_ACCESS_KEY=minioadmin
S3_ENDPOINT=http://localhost:9000
S3_REGION=ap-northeast-1
S3_FORCE_PATH_STYLE=true
S3_SIGNATURE_VERSION=v4
doppler runを使う場合はDOPPLER_CONFIG=dev_vendureを指定する(Vendure 用の設定)。- Wasabi/R2 を試す場合は上表의
S3_*を設定する。アクセスキーをローカルに置く際はdirenvやdopplerなどで秘匿する。 - ローカルで Wasabi を利用する場合、
assetUrlPrefixをundefinedにするとプラグインが自動推測するため、管理画面からのプレビューはローカルサーバーのURLで表示される。S3 側の URL で確認したい場合は環境変数VENDURE_ASSET_URLに完全なURL(例:https://s3.ap-northeast-1.wasabisys.com/ritsubi-production-assets/assets/)を設定する。
MinIO Console(Web UI)でのログイン¶
- URL:
http://localhost:9001 - 認証情報は
apps/vendure-server/docker-compose.dev.ymlのMINIO_ROOT_USER/MINIO_ROOT_PASSWORDを使用する。 - 既定値は
minioadmin/minioadmin minio-initコンテナが起動時に以下のバケットを自動作成する(mc mb --ignore-existing)。\n+ -ritsubi-vendure-media-local\n+ -ritsubi-vendure-docs-local\n+ -ritsubi-logs-local
帳票PDFのバケット分離¶
DOCS_S3_BUCKETを指定すると、帳票プラグインはそのバケットを使用する。- 未指定の場合は S3 への保存は行われずローカル保存にフォールバックする。
バックアップ運用¶
- DB + アセットエクスポート を日次バッチで生成し Wasabi バケット内
backups/に保存。 - ライフサイクルルールで 90 日後に自動削除。
- 臨時復旧時は環境変数
VENDURE_ASSET_URLを一時的に Wasabi の公開URLに切り替え、復元後に通常運用へ戻す。
Terraform 管理(Wasabi)¶
Wasabi のバケット設定は Terraform で管理する。構成は infra/terraform/wasabi
に配置し、既存バケットは import 済み。
管理対象バケット¶
ritsubi-ecommerce-backupritsubi-logsritsubi-vendure-docs-prdritsubi-vendure-docs-stgritsubi-vendure-media-prdritsubi-vendure-media-stg
設定内容¶
- バージョニング:
vendure-media-*,vendure-docs-*で 有効 - 旧バージョン削除: 30日
- バックアップ削除:
ritsubi-ecommerce-backupのbackups/を 90日
State バケット¶
- バケット:
ritsubi-terraform-state - リージョン:
ap-northeast-1 - エンドポイント:
https://s3.ap-northeast-1.wasabisys.com
Doppler(Vendure)¶
stg_vendure / prd_vendure に以下を設定済み(秘匿情報は除外)。
S3_BUCKET(stg/prd で切替)DOCS_S3_BUCKET(stg/prd で切替)LOGS_S3_BUCKET=ritsubi-logsS3_ENDPOINT=https://s3.ap-northeast-1.wasabisys.comS3_REGION=ap-northeast-1S3_FORCE_PATH_STYLE=trueS3_SIGNATURE_VERSION=v4
運用上の注意¶
- Wasabi のライフサイクル設定は 反映遅延があり、Terraform apply がタイムアウトする場合がある。コンソールで反映済みなら import で state 取り込みを行う。
- Terraform 実行コマンドは
infra/terraform/wasabi/README.mdを参照。
他ストレージへの切替¶
Cloudflare R2 など別サービスへ切り替える場合は、同じ S3_*
変数に値を入れ替えるだけでよい。R2 の場合は以下が代表例:
S3_BUCKET=ritsubi-vendure-media-prd
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 に組み込む。