設定
環境変数と crowi.config.json による Crowi の設定
Crowi 2.0 の設定は、大きく 3 つのレイヤーに分かれています。
- 環境変数 (
.env/ プロセス環境) — 接続先や暗号鍵など、起動時に 必要な値。 crowi.config.json— どのプラグインを読み込み、どのドライバを 有効にするか。- 管理画面の設定 — アプリのタイトルや OAuth、メール、ストレージの
詳細値。MongoDB の
Configコレクションに保存されます。
このページでは 1 と 2 を扱います。3 の設定値については 管理画面 を参照してください。
環境変数
API は起動時に、カレントワーキングディレクトリの .env を dotenv で
読み込みます。開発時のそのディレクトリは リポジトリルート です
(pnpm dev の api スクリプトが明示的に読み込みます)。本番では
ランナープロジェクトのディレクトリ (api が起動する process.cwd()) に
なるか、もしくはファイルの代わりに compose / オーケストレータから変数を
注入します。.env.example をコピーして編集してください。
cp .env.example .envAPI は起動時にこれらの環境変数をまとめて検証します。PORT / MONGO_URI
(またはエイリアス) / REDIS_URL (またはエイリアス) / CROWI_ENCRYPTION_KEY
の形式が不正な場合、検出できた問題をすべて含む 1 つのエラーメッセージと
ともに起動が即座に失敗します。CLIENT_URL / CROWI_MULTI_INSTANCE /
NODE_ENV / JWT_ACCESS_TOKEN_TTL_SECONDS / JWT_REFRESH_TOKEN_TTL_SECONDS
/ COLLAB_MAX_EDITORS_PER_PAGE / MIGRATION_PREFLIGHT_UNAPPLIED_POLICY
などの形式不正は起動を妨げず、起動ログに 1 箇所へまとめて warning として
出力されます(CLIENT_URL が未設定の場合も、送信メール内のリンクが相対
パスになってしまう旨の warning が同じレポートに含まれます)。
WS_TOKEN_SECRET は例外的に、NODE_ENV の値によって重大度が変わる
唯一の変数です — 値が設定されているものの 32 文字未満のとき、
NODE_ENV=production(未設定時のデフォルトも production 扱い)では
起動が失敗し、それ以外(development / test など)では上記と同じ
1 箇所の warning レポートに含まれます。詳細は下表を参照してください。
CROWI_ / WS_TOKEN_ / JWT_ / COLLAB_ / REDIS / MONGO /
MIGRATION_ のいずれかの既知プレフィックスを持つものの、既知の変数名の
どれとも完全一致しない環境変数は、タイポの疑いとして同じ warning
レポートに含まれます。判定にはレーベンシュタイン距離(編集距離)を使い、
既知の変数名のうち最も近いものとの距離が 2 以下であれば「もしかして
XXX では?」という形で warning を出します(fail にはなりません — 誤検知
を許容するヒューリスティックです)。PATH / CI / GITHUB_* / npm_*
など上記プレフィックスを持たない一般的な OS/CI 環境変数は対象外です。
主要な環境変数
| 変数名 | 必須 | 用途 |
|---|---|---|
MONGO_URI | はい | MongoDB の接続文字列 (例: mongodb://localhost/crowi) |
PORT | いいえ (デフォルト 4301) | API サーバの待ち受けポート |
NODE_ENV | いいえ | development / production |
REDIS_URL | 条件付き | セッション・Socket.IO アダプタ・リアルタイム共同編集の pub/sub・編集者上限カウンタ。シングルインスタンスでは省略可、マルチインスタンス構成では必須。TLS には rediss:// を使用 |
PASSWORD_SEED | はい | レガシーパスワードハッシュのシード (フォールバック検証で使用) |
CLIENT_URL | 本番では必須 | Web のオリジン。api 側に設定する。CORS の許可オリジン、および送信メール内のリンク生成に使われる。開発環境では localhost が自動許可される |
CROWI_ENCRYPTION_KEY | 推奨 | 機密 Config を AES-256-GCM で暗号化する 32 バイトのマスターキー (base64)。未設定時は平文保存にフォールバック。詳細は 機密設定の暗号化 |
JWT_ACCESS_TOKEN_TTL_SECONDS | いいえ (デフォルト 3600 = 1 時間) | api が JWT アクセストークンを発行するときの TTL |
JWT_REFRESH_TOKEN_TTL_SECONDS | いいえ (デフォルト 2592000 = 30 日) | api が JWT リフレッシュトークンを発行するときの TTL |
SECRET_TOKEN | いいえ | セッション関連のシークレット |
リアルタイム共同編集まわりの変数
リアルタイム共同編集 (RFC-0003) で使う変数です。詳細は リアルタイム共同編集の運用 を参照してください。
| 変数名 | 必須 | 用途 |
|---|---|---|
WS_TOKEN_SECRET | マルチで必須 | WebSocket 接続認証に使う短命 JWT (wsToken) の HMAC 署名鍵 (presence・通知・メールトークンとも共用)。マルチインスタンスでは全レプリカで同じ値にする。未設定時はプロセスごとにランダム生成され、警告ログが出る。設定する場合は 32 文字以上必須 — 32 文字未満だと NODE_ENV=production (デフォルト) では起動失敗、それ以外は警告 (既知のプレースホルダ値は対象外)。openssl rand -base64 32 で生成 |
COLLAB_MAX_EDITORS_PER_PAGE | いいえ (デフォルト 20) | 1 ページあたりの同時編集者上限。超過したクライアントは read-only で接続する |
NEXT_PUBLIC_COLLAB_URL | いいえ | ブラウザが接続する WebSocket URL。実行時(window.__ENV)に読まれる。未指定時の解決順: NEXT_PUBLIC_API_URL → dev の api ポート → window.location。api/web が 別ホスト のとき、または Vercel(edge が WS を proxy できない)で設定 |
NEXT_PUBLIC_API_URL | いいえ(クロスオリジン時のみ) | ブラウザから見た api の絶対オリジン。実行時(window.__ENV、再ビルド不要)に読まれる。推奨の同一オリジン + リバースプロキシ構成では 未設定(ブラウザは相対 /api/v2 を使う)。クロスオリジン構成でのみ設定 — デプロイ構成 参照 |
CROWI_API_URL | いいえ | Next サーバ が rewrites() proxy に使う api URL。output: 'standalone' では build 時に焼かれるため、pnpm dev / Vercel edge でのみ有効。self-host 本番は前段リバースプロキシを使う |
Tip:
WS_TOKEN_SECRETとCROWI_ENCRYPTION_KEYはどちらもopenssl rand -base64 32で生成できます。CROWI_ENCRYPTION_KEYはpnpm --filter @crowi/api crypto:gen-keyでも生成できます。
Docker での環境変数
docker compose --profile app で全スタックを起動する場合、api
サービスは .env を env_file として読み込みます。ただし
コンテナネットワーク向けの URI (MONGO_URI / REDIS_URL /
CLIENT_URL) は docker-compose.yml 側の environment 指定が
.env の値を上書きします。機密値 (CROWI_ENCRYPTION_KEY /
WS_TOKEN_SECRET など) は .env に書いておけばそのまま渡ります。
Tip: Web アプリ (
@crowi/web) はプラグイン依存ゼロの 独立した デプロイ対象 です。api とは HTTP で通信し、どこにでもデプロイできます (Vercel・コンテナ・api と同居など)。一方 api は長寿命の Node サーバ (Mongoose・Redis・組み込みの Hocuspocus WebSocket エンジン・実行時の プラグインロード) であり、Node ランタイムが必須 です — Node ホスト または Node コンテナ (ECS / EKS / Fly / Render / Cloud Run / Cloudflare Containers)。Cloudflare Workers のような edge/isolate 系のサーバレス 基盤では動作しません。
crowi.config.json
crowi.config.json は ランナープロジェクトのルート に置く JSON
ファイルです (モノレポでは、リファレンスのランナープロジェクトは
apps/crowi-runner なので、その設定は
apps/crowi-runner/crowi.config.json にあります)。どのプラグインを
読み込み、どのドライバを有効にするか を宣言します。プラグインごとの
設定値 (S3 のバケット名、OAuth クライアント ID、メール / ストレージの
認証情報など) はここには書かず、MongoDB の Config コレクションに保存し、
管理画面から編集します。
{
"plugins": [
"@crowi/plugin-storage-aws-s3",
"@crowi/plugin-search-elasticsearch",
"@crowi/plugin-renderer-plantuml",
"@crowi/plugin-renderer-emoji",
"@crowi/plugin-renderer-katex"
],
"storage": {
"driver": "s3"
},
"search": {
"driver": "elasticsearch"
}
}フィールド一覧
| キー | 型 | デフォルト | 内容 |
|---|---|---|---|
plugins | string[] | [] | 起動時に読み込むプラグインの npm パッケージ名。暗黙のデフォルト (@crowi/plugin-storage-local / @crowi/plugin-search-mongo / @crowi/plugin-mail-smtp) に追加される形で読み込まれる |
storage.driver | string | "local" | ファイルアップローダが使うストレージドライバ名。詳細は ストレージドライバ |
search.driver | string | "mongo" | 検索サービスが使うドライバ名。詳細は 検索のセットアップ |
ファイルが存在しない場合や項目が省略された場合は、上記のデフォルト値が 適用されます。スキーマに合わない内容を書くと、起動時に明示的なエラーで 失敗します。
プラグインの解決方法
@crowi/api は プラグインを同梱しません。SDK (@crowi/plugin-api) と
コアのみを出荷し、ドライバは同梱しません。プラグインはランナープロジェクトが
所有します。plugins に挙げた名前は、起動時にランナープロジェクトの
node_modules/ から (createRequire(projectDir) で) 解決されます。
プラグインを追加するには、ランナーの package.json に依存として宣言した
うえで crowi.config.json:plugins に名前を追加します。api パッケージ自体を
再ビルドする必要はありません。
3 つのプラグインが 暗黙のデフォルトプラグイン として常に読み込まれ、
設定不要で動作します: @crowi/plugin-storage-local、
@crowi/plugin-search-mongo、@crowi/plugin-mail-smtp。そのため、新規
インストールは ローカルストレージ + MongoDB 検索 + SMTP メール が
そのまま動きます — 必須のインフラは MongoDB だけです。
ランナープロジェクトは package.json の "start": "crowi-api" スクリプト
(@crowi/api が提供する crowi-api bin) で起動します。process.cwd() が
projectDir になるよう、プロジェクトディレクトリから実行します。
プラグインが他のプラグインを requires で宣言している場合、その依存先も
自動で (transitive に) 解決・ロード されます。そのため、依存先を
plugins に重ねて書く必要はありません。例えば @crowi/plugin-storage-aws-s3
と @crowi/plugin-mail-aws-ses は共通基盤の @crowi/plugin-aws を requires
で宣言しているので、plugins には driver プラグインだけ を列挙すれば
@crowi/plugin-aws は自動でロードされます。umbrella の @crowi/plugin-aws
を明示列挙する必要はありません (重複ロードを避ける)。AWS 一式を使う通し
手順は AWS Lightsail で動かす を参照してください。
プラグインの追加・有効化の詳しい手順は プラグインの管理、 プラグインの種類は プラグインの概要 を参照して ください。
ドライバ名とプラグインの対応
storage.driver / search.driver に指定できるドライバ名は、読み込んだ
プラグインが登録したものです。代表的な対応は次のとおりです。
| 設定 | ドライバ名 | 提供プラグイン |
|---|---|---|
storage.driver | local | @crowi/plugin-storage-local (デフォルト) |
storage.driver | s3 | @crowi/plugin-storage-aws-s3 |
search.driver | mongo | @crowi/plugin-search-mongo (デフォルト) |
search.driver | elasticsearch | @crowi/plugin-search-elasticsearch |
レンダラ系プラグイン (@crowi/plugin-renderer-emoji /
-katex / -plantuml / -crowi-legacy) は plugins に追加するだけで
有効になり、storage / search のようなドライバ選択は不要です。
Tip:
crowi.config.jsonでドライバ名を切り替えても、対応する プラグインがpluginsに入っていなければ起動時に警告が出ます。ドライバを 切り替えるときは、プラグインの追加とセットで行ってください。