Parse Serverの起動オプションについて

[ニフクラ mobile backendは3月末で終了します](https://mbaas.nifcloud.com/info/2023/12/post-171.html)。

ニフクラ mobile backendからの移行先として、お勧めしているのが[Parse Server](https://parseplatform.org/)です。設計思想が近く、変更するコード量が少なく済むのではないかと思います。

Parse Server自体はオープンソース・ソフトウェアなので、自分で立ち上げる必要があります（海外にはホスティングサービスもあります）。立ち上げる際にはオプションを指定するのですが、実に数多くのオプションがあります。また、日本語情報も不足しています。

そこで、Parse Serverの起動オプションをまとめて紹介します。

## Parse Serverの起動

Parse ServerとNode.jsのアプリケーションサーバーであるExpressと組み合わせる場合には、以下のように起動します。

```javascript
const express = require('express');
const { ParseServer } = require('parse-server');

// Parse Serverの起動オプション
const config = {
  // 後述
};
const app = express();
const api = new ParseServer(config);
api.start()
  .then(() => {
    app.use('/parse', api.app);
  });

const port = 1337;
app.listen(port, function() {
  console.log('parse-server-example running on port ' + port + '.');
});
```

以下は、上記コードの `config` で指定できる内容です。

## 環境変数での指定

Parse Serverは環境変数で起動時にオプション指定もできるのですが、一部うまく指定できないものがあります（OAuthに関する内容など）。そのため、JavaScriptオブジェクトで指定する方が確実です。

| キー                             | 型                         | 説明                                                             |
| -------------------------------- | -------------------------- | ---------------------------------------------------------------- |
| accountLockout                   | Any                        | ログイン失敗時のアカウントロックに関するポリシー                 |
|                                  |                            |                                                                  |
| allowClientClassCreation         | Boolean                    | クライアントからクラス作成を許可するかどうか（デフォルトはtrue） |
| allowCustomObjectId              | Boolean                    | ユニークキー（objectId）を変更するかどうか（デフォルトはfalse）  |
| allowHeaders                     | Array.<String>             | Access-Control-Allow-Headersに追加するヘッダー                   |
| allowOrigin                      | String                     | Access-Control-Allow-Originにに指定する文字列                    |
| analyticsAdapter                 | Adapter.<AnalyticsAdapter> | 解析に利用するアダプター                                         |
| appId                            | String                     | アプリID                                                         |
| appName                          | String                     | アプリ名                                                         |
| auth                             | Any                        | 認証の設定。[詳細はこちらを参照][link1]のこと。                     |
| cacheAdapter                     | Adapter.<CacheAdapter>     | キャッシュに利用するアダプター                                   |
| cacheMaxSize                     | Number                     | キャッシュの最大サイズ。デフォルトは10000                        |
| cacheTTL                         | Number                     | キャッシュ時間。デフォルトは5000（5秒）                          |
| clientKey                        | String                     | クライアントキー。iOS/macOS/tvOS用                               |
| cloud                            | String                     | クラウドコードのフルパス（main.jsを指定）                        |
| cluster                          | Number または Boolean      | クラスタリングする場合のプロセス数                               |
| collectionPrefix                 | String                     | クラスのプリフィックス文字列                                     |
| customPages                      | CustomPagesOptions         | パスワードリセットなどに用いるカスタムページ                     |
| databaseAdapter                  | Adapter.<StorageAdapter>   | データベースに利用するアダプター                                 |
| databaseOptions                  | Any                        | MongoDB接続に利用するオプション                                  |
| databaseURI                      | String                     | データベース接続のURI                                            |
| directAccess                     | Boolean                    | JavaScript SDKでのHTTPインタフェースを変更する。実験的機能       |
| dotNetKey                        | String                     | .NET SDK用のキー                                                 |
| emailAdapter                     | Adapter.<MailAdapter>      | メール送信用のアダプター                                         |
| emailVerifyTokenReuseIfValid     | Boolean                    | メール確認用文字列の再利用を可能とするかどうか                   |
| emailVerifyTokenValidityDuration | Number                     | メール確認の期限。秒数で指定                                     |
| enableAnonymousUsers             | Boolean                    | 匿名ユーザーを有効にするかどうか。デフォルトはtrue               |
| enableExpressErrorHandler        | Boolean                    | Expressのエラーをハンドリングするかどうか                        |
| enableSingleSchemaCache          | Boolean                    | スキーマーのキャッシュに関する指定                               |
| encryptionKey                    | String                     | ファイルの暗号化用キー                                           |
| expireInactiveSessions           | Boolean                    | 無効なセッションを削除するかどうか                               |
| fileKey                          | String                     | ファイル用のキー                                                 |
| filesAdapter                     | Adapter.<FilesAdapter>     | ファイル用のアダプター                                           |
| graphQLPath                      | String                     | GraphQLのパス                                                    |
| graphQLSchema                    | String                     | GraphQLのスキーマーファイルのパス                                |
| host                             | String                     | ホストアドレス。デフォルトは0.0.0.0                              |
| idempotencyOptions               | IdempotencyOptions         | ネットワークエラーによる重複リクエストの処理に関する設定         |
| javascriptKey                    | String                     | JavaScript SDK用のキー                                           |
| jsonLogs                         | Boolean                    | ログをJSONオブジェクトにするかどうか                             |
| liveQuery                        | LiveQueryOptions           | ライブクエリーに関する設定                                       |
| liveQueryServerOptions           | LiveQueryServerOptions     | ライブクエリーサーバーに関する設定                               |
| loggerAdapter                    | Adapter.<LoggerAdapter>    | ログ用のアダプター                                               |
| logLevel                         | String                     | ログレベル                                                       |
| logsFolder                       | String                     | ログが保存されるフォルダ                                         |
| masterKey                        | String                     | マスターキー                                                     |
| masterKeyIps                     | Array.<String>             | マスターキーが使えるアクセス元IPアドレス                         |
| maxLimit                         | Number                     | limitオプションで指定できる最大件数                              |
| maxLogFiles                      | Number または String       | ログファイルの最大数                                             |
| maxUploadSize                    | String                     | 最大のアップロードサイズ。デフォルトは20MB                       |
| middleware                       | Union                      | Expressサーバーのミドルウェア                                    |
| mountGraphQL                     | Boolean                    | GraphQLエンドポイントのマウント                                  |
| mountPath                        | String                     | サーバーのパス。デフォルトは /parse                              |
| mountPlayground                  | Boolean                    | GraphQLのプレイグラウンド指定                                    |
| objectIdSize                     | Number                     | objectIdのサイズ。デフォルトでは10                               |
| passwordPolicy                   | Any                        | パスワードポリシー                                               |
| playgroundPath                   | String                     | GraphQLのプレイグラウンドパス。デフォルトは /playground          |
| port                             | Number                     | ポート番号。デフォルトは1337                                     |
| preserveFileName                 | Boolean                    | ファイル名にユニークなハッシュを付けるかどうか                   |
| preventLoginWithUnverifiedEmail  | Boolean                    | メールアドレスが確認できていないユーザーがログインできるかどうか |
| protectedFields                  | ProtectedFields            | セキュリティなどで保護するフィールドを指定                       |
| publicServerURL                  | String                     | Parse ServerのURL（公開用）                                      |
| push                             | Any                        | プッシュに関する設定。[詳細はこちらを参照][link2]のこと。           |
| readOnlyMasterKey                | String                     | 読み取り専用のマスターキー                                       |
| restAPIKey                       | String                     | REST API用のキー                                                 |
| revokeSessionOnPasswordReset     | Boolean                    | パスワード変更時などにセッションをすべて削除するかどうか         |
| scheduledPush                    | Boolean                    | プッシュ通知のスケジュール可否。デフォルトはfalse                |
| schemaCacheTTL                   | Number                     | スキーマーのキャッシュ時間。デフォルトは5000                     |
| serverCloseComplete              | function                   | サーバー終了時のコールバック関数                                 |
| serverStartComplete              | function                   | サーバー起動時のコールバック関数                                 |
| serverURL                        | String                     | Parse ServerのURL（内部用）                                      |
| sessionLength                    | Number                     | セッションの有効期限を秒数で指定。デフォルトは1年間              |
| silent                           | Boolean                    | コンソール出力を制御                                             |
| startLiveQueryServer             | Boolean                    | ライブクエリーサーバーを開始するかどうか制御                     |
| userSensitiveFields              | Array.<String>             | 未ログインユーザーからは隠すユーザーのフィールド                 |
| verbose                          | Boolean                    | ログを詳細出力する設定                                           |
| verifyUserEmails                 | Boolean                    | ユーザーのメールアドレス確認設定。デフォルトはfalse              |
| webhookKey                       | String                     | Webhook送信時のキー                                              |

[link1]: http://docs.parseplatform.org/parse-server/guide/#oauth-and-3rd-party-authentication
[link2]: http://docs.parseplatform.org/parse-server/guide/#push-notifications

## まとめ

Parse Serverのオプションは実に多いです。また、アダプターを組み合わせることでAmazon S3を使ったり、データベースをPostgreSQLに変更することができます。

すべてのオプションを覚える必要はありませんが、必要に応じて適切な設定を行うことで、より最適なバックエンドシステムができるでしょう。

[Parse Platform](https://parseplatform.org/)