ストレージ
ObjectOS がファイルを保存する場所 — ローカルディスク、S3、R2、MinIO、Spaces。
ストレージ
ObjectOS のファイル(添付ファイル、アップロード、生成されたドキュメント)は ストレージサービス を経由します。これは 2 つのアダプターを備えた プラガブルな抽象化レイヤーです。ローカルファイルシステム(デフォルト)と S3 互換(本番環境)です。
このサービスは @objectstack/service-storage によって提供され、
スタンドアロンおよびプロジェクトの起動時にデフォルトで有効になります。
ユーザーはどのように操作するか
| 操作面 | 動作 |
|---|---|
| Console のファイル / 画像フィールド | ブラウザが署名付き URL を介してストレージへ直接アップロード |
REST /api/v1/storage/* | プログラムによるアップロード / ダウンロードのエンドポイント |
オブジェクトの file / image フィールド | アップロードウィジェットとして描画され、メタデータは sys_file に永続化される |
ファイルは sys_file システムオブジェクトで追跡されます。レコード内に
生のパスとして保存されることはありません。これにより、データモデルが
ストレージバックエンドから切り離されます。
ローカルファイルシステム(デフォルト)
適した用途: 開発、シングルノードのデプロイ、デモ。
// objectstack.config.ts (or wherever you assemble plugins)
import { StorageServicePlugin } from '@objectstack/service-storage';
new StorageServicePlugin({
adapter: 'local',
local: {
rootDir: './uploads',
baseUrl: 'http://localhost:3000', // for presigned URLs
signingSecret: process.env.OS_STORAGE_SIGNING_SECRET, // optional; auto-generated if omitted
},
presignedTtl: 3600, // seconds — TTL for presigned URLs
sessionTtl: 86400, // seconds — TTL for chunked upload sessions
});スタンドアロンモード(プロジェクトなしの os start)では、ランタイムが
.objectstack/data/uploads/ 配下にローカルストレージを自動的に構成します。
ルートディレクトリは OS_STORAGE_ROOT 環境変数で上書きできます。
本番環境での適合性はデプロイの形態によって決まります:
- ✅ デスクトップアプリ、シングルノードの社内ツール、エッジ / オンプレミスの
アプライアンス —
uploads/ディレクトリがファイルシステムのバックアップに 含まれている(またはデスクトップアプリの場合はユーザー管理の同期フォルダー上に 存在する)限り、ローカルストレージで問題ありません。 - ❌ マルチノード、マルチ AZ、またはクロスリージョンの耐久性を必要とするもの — S3 互換ストレージを使用してください。
S3 互換(本番環境)
適した用途: 本番環境、マルチノード、耐久性 + ライフサイクル管理。
pnpm add @aws-sdk/client-s3 @aws-sdk/s3-request-presignerimport { StorageServicePlugin } from '@objectstack/service-storage';
new StorageServicePlugin({
adapter: 's3',
s3: {
bucket: 'my-bucket',
region: 'us-east-1',
// omit credentials to use the AWS SDK's default chain
// (env, ~/.aws, IAM role)
},
});AWS SDK は通常のチェーンから認証情報を読み取ります:
| ソース | 環境変数 |
|---|---|
| 標準の環境変数 | AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_REGION |
| セッショントークン | AWS_SESSION_TOKEN |
| 共有設定 | ~/.aws/credentials, AWS_PROFILE |
| IAM ロール | EC2 / ECS / EKS / Lambda 上では自動 — 設定不要 |
Cloudflare R2
new StorageServicePlugin({
adapter: 's3',
s3: {
bucket: 'my-bucket',
region: 'auto',
endpoint: 'https://<account-id>.r2.cloudflarestorage.com',
forcePathStyle: false,
},
});認証情報: R2 のアクセスキー ID + シークレットを、標準の AWS_* 環境変数
またはシークレットマネージャー経由で渡します。
MinIO(セルフホスト)
new StorageServicePlugin({
adapter: 's3',
s3: {
bucket: 'my-bucket',
region: 'us-east-1',
endpoint: 'http://minio.internal:9000',
forcePathStyle: true,
},
});DigitalOcean Spaces
new StorageServicePlugin({
adapter: 's3',
s3: {
bucket: 'my-bucket',
region: 'nyc3',
endpoint: 'https://nyc3.digitaloceanspaces.com',
forcePathStyle: false,
},
});S3 バケットポリシー
ストレージは署名付きの PUT/GET URL を使用します。推奨されるバケットポリシー:
- すべてのパブリックアクセスをブロックする。
- CORS: ObjectOS のホスト名から
PUT/GETを許可する。 - ライフサイクル: 未完了のマルチパートアップロードを 1〜7 日後に期限切れにする。
temp=trueのタグが付いたオブジェクトを 24 時間後に期限切れにする。 - バージョニング + Object Lock: 任意。コンプライアンス対応のデプロイでは推奨。
REST インターフェイス
@objectstack/client がこれらを呼び出します。通常は直接アクセスする必要はありません:
| メソッド | パス | 目的 |
|---|---|---|
| POST | /api/v1/storage/upload/presigned | 署名付きアップロード URL を取得する |
| POST | /api/v1/storage/upload/complete | 完了したアップロードをコミットする |
| POST | /api/v1/storage/upload/chunked | チャンクアップロードを開始する |
| PUT | /api/v1/storage/upload/chunked/:uploadId/chunk/:i | チャンクをアップロードする |
| POST | /api/v1/storage/upload/chunked/:uploadId/complete | チャンクアップロードを完了する |
| GET | /api/v1/storage/upload/chunked/:uploadId/progress | 進捗をポーリングする |
| GET | /api/v1/storage/files/:fileId/url | 署名付きダウンロード URL を取得する |
ファイルごとの認可は、sys_file オブジェクトに対するセキュリティプラグインの
権限エバリュエーターによって処理されます。ストレージ層に個別の ACL を
用意する必要はありません。
ライブ構成
設定サービスが有効になっている場合(デフォルトで有効です)、管理者は Console → Configuration → Storage からストレージアダプターを再起動せずに 切り替えることができます:
- アダプター、バケット、リージョン、エンドポイントを選択する。
- 認証情報を貼り付ける(
sys_setting内で保存時に暗号化される)。 - 保存する前に Test connection をクリックする。
変更は次のリクエストから適用されます。再起動は不要です。
サイジング
| リソース | デフォルト | 調整可能 |
|---|---|---|
| 署名付き URL の TTL | 1 時間 | presignedTtl プラグインオプション |
| チャンクアップロードセッションの TTL | 24 時間 | sessionTtl プラグインオプション |
| 単一パートアップロードの最大サイズ | バックエンドによる制限(S3 = 5 GB) | — |
| チャンクアップロードの最大サイズ | バックエンドによる制限(S3 = 5 TB) | — |
次に読むべきもの
- システム設定 — ライブ構成と、 ストレージの切り替えで使用される設定サービス
- 本番環境への準備 — オブジェクトストレージの 耐久性とバックアップを含むチェックリスト
- GitHub 上の
@objectstack/service-storage— ソースとすべてのオプションのリファレンス