Crowi
運用

ストレージドライバ

ローカル / S3 のファイルストレージ設定

Crowi にアップロードされた添付ファイルは、ストレージドライバ を通じて 保存されます。Crowi 2.0 では、どのドライバを使うかをランナープロジェクトの crowi.config.json (storage.driver) で選択し、ドライバの実体は対応する @crowi/plugin-storage-* プラグインが提供します。

Note: Crowi v1 にあった FILE_UPLOAD 環境変数は廃止されました。 ストレージの選択は crowi.config.jsonstorage.driver と、対応する @crowi/plugin-storage-* パッケージの組み合わせで行います。

利用できるドライバ

ドライバ名提供プラグイン保存先
local@crowi/plugin-storage-local (デフォルトで常に有効)サーバのローカルファイルシステム
s3@crowi/plugin-storage-aws-s3Amazon S3 (互換ストレージ含む)

@crowi/plugin-storage-local暗黙のデフォルトプラグイン として常に 読み込まれます。crowi.config.json に何も書かなければ、local ドライバが 使われます。

ローカルストレージ (local)

ローカルストレージは、アップロードファイルをサーバのファイルシステムに 保存します。最小構成では設定は不要で、crowi.config.json を省略するか 次のように書くだけで有効になります。

{
  "storage": {
    "driver": "local"
  }
}

保存先ディレクトリのデフォルトは data/uploads です (crowi.config.json を置いたディレクトリからの相対パス)。

Tip: コンテナで運用する場合は、保存先ディレクトリを永続ボリュームに マウントしてください。コンテナを作り直すとローカルファイルは失われます。 S3 を使えばこの心配はなくなります。

S3 ストレージ (s3)

Amazon S3 (または S3 互換ストレージ) にファイルを保存するには、 @crowi/plugin-storage-aws-s3 プラグインを使います。

1. プラグインを有効化する

crowi.config.jsonplugins に S3 ストレージプラグインを追加し、 storage.drivers3 にします。

{
  "plugins": [
    "@crowi/plugin-storage-aws-s3"
  ],
  "storage": {
    "driver": "s3"
  }
}

@crowi/plugin-storage-aws-s3 は AWS の共通クレデンシャル基盤である @crowi/plugin-aws に依存しているため、依存プラグインは自動で 読み込まれます。プラグインの解決方法の詳細は プラグインの管理 を参照してください。

2. バケットとクレデンシャルを設定する

S3 のバケット名と AWS のクレデンシャルは、管理画面から設定します。

  • バケット名@crowi/plugin-storage-aws-s3 自身の設定。管理画面の プラグイン設定 (/admin/plugins) から「AWS S3」の設定を開いて入力します。
  • リージョン / アクセスキー / シークレットキー@crowi/plugin-aws の設定。同じくプラグイン設定から入力します。

アクセスキー ID とシークレットアクセスキーは機密扱いとして登録されて おり、CROWI_ENCRYPTION_KEY が設定されていれば自動で暗号化されて 保存されます。詳細は 機密設定の暗号化 を参照してください。

Tip: EC2 / ECS のインスタンスロールや IRSA を使う場合は、アクセス キーを空のままにしておけば、AWS SDK のデフォルトのクレデンシャル解決 (環境変数やインスタンスメタデータ) が使われます。

3. 設定の即時反映

プラグインの設定を管理画面から保存すると、S3 ドライバは reconfigure により サーバ再起動なしで 新しいバケット / クレデンシャルを反映 します。

ストレージの現在の状態を確認する

管理画面のストレージ画面 (/admin/storage) を開くと、登録されている ドライバの一覧と、現在アクティブなドライバが表示されます。内部的には GET /api/v2/admin/storage が呼ばれ、各ドライバについて以下が返ります。

  • driverName — ドライバ名 (local / s3 など)
  • pluginName — そのドライバを登録したプラグイン名
  • isActivecrowi.config.json で選択中のドライバかどうか

ドライバの切り替えとファイル移行

ドライバを切り替える (例: locals3) と、crowi.config.json を 書き換えた時点で 新規アップロードは新しいドライバに保存 されます。 しかし、既存のファイルは自動では移動しません。古いドライバに残った ファイルは、crowi-admin CLI で新しいドライバへコピーします。

crowi-admin rebuild storage copy

crowi-admin はサーバ内 (ssh / kubectl exec) での実行を想定した運用者用 CLI です。rebuild storage copy サブコマンドで、あるドライバから別のドライバへ 全オブジェクトをコピーできます。

# local から s3 へ全ファイルをコピー
crowi-admin rebuild storage copy --from local --to s3

# まず対象キーだけを確認する (コピーは行わない)
crowi-admin rebuild storage copy --from local --to s3 --dry-run

ポイント:

  • コピー元・コピー先の 両方のドライバが、いずれかのプラグインで 読み込まれている 必要があります。crowi.config.jsonstorage.driver が指す「アクティブなドライバ」とは無関係なので、s3 をアクティブに する前に local から s3 へデータを先にコピーしておけます。
  • --dry-run を付けると、コピー対象のキーを列挙するだけで実際の書き込みは しません。件数の事前確認に使えます。
  • 添付ファイルの行は MongoDB のカーソルで逐次処理されるため、ファイル数が 非常に多くてもメモリ使用量は一定です。
  • 1 件単位のエラーはイテレーションを止めず、failed カウントに加算 されます。再実行は安全です (local / S3 ドライバはキー単位で上書きします)。

終了コードは次のとおりです。

終了コード意味
0全件コピー成功 (または dry-run 完了)
1致命的エラー (初期化失敗、または処理開始前の例外)
2部分的失敗 (コピーは走ったが 1 件以上失敗 — 再実行を推奨)

推奨される移行手順

local から s3 へ移行する場合の安全な手順:

  1. @crowi/plugin-storage-aws-s3crowi.config.json:plugins に追加し、 管理画面で S3 バケット / クレデンシャルを設定する (storage.driver は まだ local のまま)。
  2. crowi-admin rebuild storage copy --from local --to s3 --dry-run で対象件数を 確認する。
  3. crowi-admin rebuild storage copy --from local --to s3 で実際にコピーする。 failed が出た場合は再実行する。
  4. crowi.config.jsonstorage.drivers3 に変更し、API を 再起動する。
  5. 新しいアップロードとダウンロードが S3 経由で動くことを確認する。

Tip: 手順 1 で先に S3 へデータをステージングしておけば、ドライバを 切り替えた瞬間からダウンタイムなしで S3 が使えます。

エディタからのアップロード制限

ページ編集画面では、画像の 貼り付け (paste) とファイルの ドラッグ&ドロップ でエディタへ直接アップロードできます (利用者向けの説明は 添付ファイル 参照)。 これらのアップロードには、サーバ負荷とストレージ消費を抑えるための 制限がかかっています。

レート制限

エディタからのアップロードは 1 ユーザーあたり 1 分間に 20 回 まで です。上限に達すると POST /api/v2/attachments/upload は HTTP 429 を Retry-After ヘッダ付きで返し、エディタ側には「アップロード上限に 達しました。N 秒後に再試行してください」というトーストが表示されます。

サイズ上限

経路1 ファイルあたりの上限
画像の貼り付け (paste)10 MB
ドラッグ&ドロップ50 MB

ドラッグ&ドロップは 1 回の操作で 最大 5 ファイル まで扱えます。 これを超えてドロップした場合はアップロードされず、トーストで通知 されます。

ファイル種別の許可リスト

エディタからアップロードできるファイル種別は許可リストで制限されて います。既定の許可リストは次のとおりです。

分類受け付けるもの
画像image/png / image/jpeg / image/gif / image/webp / image/svg+xml
文書.pdf / .txt / .md / .csv
アーカイブ.zip

許可リストにない種別は拒否され、エディタ側には拒否された種別名を 添えたトーストが表示されます。許可リストはインスタンス全体に対する グローバル設定です(ユーザーグループ単位の設定はありません)。

Note: これらの制限はエディタからの直接アップロード経路に対する ものです。ページフッターの添付ファイルセクションからのアップロード やストレージドライバ自体の設定とは独立しています。

次のステップ

On this page