設定

ストレージ

ObjectOS がファイルを置く場所。ローカルディスク、S3、R2、MinIO、Spaces。

対応エディション

ObjectOS のファイル(添付ファイル、アップロード、生成されたドキュメント)はストレージサービスを通ります。2 つのアダプターを持つプラグイン可能な抽象化で、ローカルファイルシステム(デフォルト)と S3 互換(本番)があります。

このサービスは @objectstack/service-storage が提供し、スタンドアロンとプロジェクトの起動ではデフォルトで有効です。

ユーザーがどう使うか

画面動作
UI のファイル / 画像フィールドブラウザが署名付き 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-presigner
import { 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 を別に用意する必要はありません。

稼働中の設定

設定サービスが有効な場合(デフォルトで有効です)、管理者は再起動せずに Setup → Configuration → Storage でストレージのアダプターを切り替えられます。

  • アダプター、バケット、リージョン、エンドポイントを選びます。
  • 認証情報を貼り付けます(sys_setting に暗号化して保存されます)。
  • 保存する前に Test connection をクリックします。

変更は次のリクエストから適用されます。再起動は必要ありません。

サイジング

リソースデフォルト調整方法
署名付き URL の TTL1 時間プラグインオプション presignedTtl
分割アップロードのセッションの TTL24 時間プラグインオプション sessionTtl
単一パートのアップロードの最大サイズバックエンドが課す制限(S3 = 5 GB)—
分割アップロードの最大サイズバックエンドが課す制限(S3 = 5 TB)—

次に進む