前書き

Parseは、2013年以来Facebookが所有しているサービスとしてのモバイルバックエンドプラットフォームです。 2016年1月、Parseは、ホストされたサービスが2017年1月28日に完全にシャットダウンすると発表しました。

幸いなことに、Parseはhttps://github.com/ParsePlatform/parse-server [オープンソースAPIサーバー]をリリースしました。これは* Parse Server *と呼ばれるホストされたサービスのAPIと互換性があります。 Parse Serverは活発に開発されており、大規模な開発者コミュニティを引き付ける可能性が高いようです。 Node.jsとMongoDBを実行しているさまざまな環境に展開できます。

このガイドでは、既存のParseアプリケーションをUbuntu 14.04で実行されているParse Serverのスタンドアロンインスタンスに移行することに焦点を当てています。 無料の証明書を提供する新しい認証局であるLet’s Encryptが提供する証明書を使用して、すべての接続にTLS / SSL暗号化を使用します。 DigitalOceanとUbuntu 14.04に固有のいくつかの詳細が含まれていますが、最近のDebian派生GNU / Linuxディストリビューションを実行しているシステムに広く適用できるはずです。

前提条件

このガイドは、https://www.digitalocean.com/community/tutorials/how-to-run-parse-server-on-ubuntu-14-04 [Ubuntu 14.04でParse Serverを実行する方法]に基づいています。 以下が必要です。

  • 非ルートの「+ sudo +」ユーザーで構成されたUbuntu 14.04サーバー

  • Node.js 5.6.x

  • MongoDB 3.0.x

  • サーバーを指すドメイン名

  • 移行する解析アプリ

  • Let’s Encrypt証明書を使用してSSLでインストールおよび構成されたNginx。 Ubuntu 14.04でLet’s EncryptでNginxを保護する方法プロセスを順を追って説明します。

ターゲットサーバーには、アプリのすべてのデータを処理するのに十分なストレージが必要です。 Parseはデータを圧縮するため、ホストされているアプリで使用されるストレージ容量の少なくとも10倍の容量をプロビジョニングすることを公式に推奨しています。

ステップ1 –移行のためにMongoDBを構成する

Parseは、既存のアプリケーション用の移行ツールを提供します。 これを利用するには、MongoDBを外部接続に対して開いて、Let’s EncryptのTLS / SSL証明書のコピーで保護する必要があります。 まず、 `+ fullchain1.pem `と ` privkey1.pem `を ` / etc / ssl +`の新しいファイルに結合します。

sudo cat /etc/letsencrypt/archive//{fullchain1.pem,privkey1.pem} | sudo tee /etc/ssl/mongo.pem

`+ mongo.pem +`が* mongodb *ユーザーによって所有され、その所有者のみが読み取り可能であることを確認します。

sudo chown mongodb:mongodb /etc/ssl/mongo.pem
sudo chmod 600 /etc/ssl/mongo.pem

ここで、 + nano +(または選択したテキストエディター)で `+ / etc / mongod.conf`を開きます。

sudo nano /etc/mongod.conf

ここでは、いくつかの重要な変更を行います。

最初に、「+ net:」セクションで「 bindIp 」行を探し、「 127.0.0.1+」を「0.0.0.0」に変更して、すべてのアドレスをリッスンするようMongoDBに指示します。 この下で、同じセクションにSSL構成を追加します。

/etc/mongod.conf

# network interfaces
net:
 port: 27017
 bindIp:

次に、「+#security +」の下で、クライアント認証を有効にします。

/etc/mongod.conf

# security
security:
 authorization: enabled

最後に、移行ツールでは、「+ failIndexKeyTooLong」パラメーターを「+ false」に設定する必要があります。

/etc/mongod.conf

setParameter:
 failIndexKeyTooLong: false

ファイルを終了して保存します。

`+ mongod `サービスを再起動する前に、 ` admin +`ロールを持つユーザーを追加する必要があります。 実行中のMongoDBインスタンスに接続します。

mongo --port 27017

管理ユーザーを作成して終了します。 必ず希望のユーザー名と強力なパスワードに置き換えてください。

use admin
db.createUser({
 user: "",
 pwd: "",
 roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
})
exit

`+ mongod +`サービスを再起動します:

sudo service mongod restart

ステップ2 –解析からアプリケーションデータを移行する

リモートでアクセス可能なMongoDBインスタンスができたので、Parse移行ツールを使用してアプリのデータをサーバーに転送できます。

移行ツールのMongoDB資格情報を構成する

新しい管理者ユーザーとローカルに接続することから始めます。

mongo --port 27017 --ssl --sslAllowInvalidCertificates --authenticationDatabase admin --username  --password

前に設定したパスワードの入力を求められます。

接続したら、データベースの名前を選択してアプリのデータを保存します。 たとえば、Todoというアプリを移行する場合は、「+ todo +」を使用できます。 また、* parse *というユーザー用に別の強力なパスワードを選択する必要があります。

`+ mongo `シェルから、このユーザーに `+`へのアクセスを許可します。

use
db.createUser({ user: "parse", pwd: "", roles: [ "readWrite", "dbAdmin" ] })

データ移行プロセスの開始

ブラウザーウィンドウでParseにログインし、アプリの設定を開きます。 *全般*で、*移行*ボタンを見つけてクリックします。

image:https://assets.digitalocean.com/articles/parse_migration/small-000.png [解析アプリの設定:一般:移行]

MongoDB接続文字列の入力を求められます。 次の形式を使用してください。

mongodb://parse:@:27017/?ssl=true

たとえば、ドメイン「+ example.com 」、ユーザー「 parse」、パスワード「+ o 」、および「 todo +」というデータベースを使用している場合、接続文字列は次のようになります。

mongodb://parse:[email protected]:27017/todo?ssl=true

最後に「+?ssl = true +」を忘れないでください。接続が失敗します。 次のようにダイアログに接続文字列を入力します。

image:https://assets.digitalocean.com/articles/parse_migration/small-001.png [解析アプリ:移行ダイアログ]

[移行の開始]をクリックします。 Parseがホストするデータベースのスナップショットをサーバーにコピーし、スナップショットが作成されてから新しいデータを同期するための進行状況ダイアログが表示されます。 このプロセスの所要時間は、転送されるデータの量に依存し、相当な量になる場合があります。

image:https://assets.digitalocean.com/articles/parse_migration/small-002.png [解析アプリ:移行の進行状況]

image:https://assets.digitalocean.com/articles/parse_migration/small-003.png [解析アプリ:移行プロセス]

データ移行の検証

完了すると、移行プロセスは検証手順に入ります。 まだ移行を完了しないでください。 まず、データが実際に転送されたことを確認し、Parse Serverのローカルインスタンスをテストします。

image:https://assets.digitalocean.com/articles/parse_migration/small-004.png [解析アプリ:移行の完了、完了を待っています]

`+ mongo +`シェルに戻り、ローカルデータベースを調べます。 含まれているコレクションにアクセスして調べることから始めます。

use
show collections
Sample Output for Todo AppTodo
_Index
_SCHEMA
_Session
_User
_dummy
system.indexes

`+ .find()+`メソッドで特定のコレクションの内容を調べることができます:

db..find()
Sample Output for Todo App>
{ "_id" : "hhbrhmBrs0", "order" : NumberLong(1), "_p_user" : "_User$dceklyR50A", "done" : false, "_acl" : { "dceklyR50A" : { "r" : true, "w" : true } }, "_rperm" : [ "dceklyR50A" ], "content" : "Migrate this app to my own server.", "_updated_at" : ISODate("2016-02-08T20:44:26.157Z"), "_wperm" : [ "dceklyR50A" ], "_created_at" : ISODate("2016-02-08T20:44:26.157Z") }

特定の出力は異なりますが、アプリのデータが表示されるはずです。 満足したら、 `+ mongo +`を終了してシェルに戻ります:

exit

ステップ3 – Parse ServerとPM2をインストールして構成する

MongoDBのアプリデータを使用して、Parse Server自体のインストールと、システムの他の部分との統合に進むことができます。 Parse Serverに専用ユーザーを与え、* PM2 *というユーティリティを使用して構成し、常に実行されるようにします。

Parse ServerとPM2をグローバルにインストールする

`+ parse-server `ユーティリティ、 ` pm2 `プロセスマネージャー、およびそれらの依存関係をグローバルにインストールするには、 npm +を使用します。

sudo npm install -g parse-server pm2

専用の解析ユーザーとホームディレクトリを作成する

  • root または `+ sudo `ユーザーとして ` parse-server +`を実行する代わりに、 parse *というシステムユーザーを作成します。

sudo useradd --create-home --system parse
  • parse *のパスワードを設定します:

sudo passwd parse

パスワードを2回入力するよう求められます。

次に、 `+ su +`コマンドを使用して* parse *ユーザーになります。

sudo su parse
  • parse *のホームディレクトリに変更します。

cd ~

クラウドコードファイルの作成または移行

クラウドコードディレクトリを作成します。

mkdir -p ~/cloud

`+ / home / parse / cloud / main.js`を編集します:

nano ~/cloud/main.js

テスト目的で、次を貼り付けることができます。

/home/parse/cloud/main.js

Parse.Cloud.define('hello', function(req, res) {
 res.success('Hi');
});

または、Parse Dashboardのアプリ設定の* Cloud Code *セクションからコピーして、アプリケーションに定義されたクラウドコードを移行できます。

終了して保存します。

キーを取得して/home/parse/ecosystem.jsonを書き込みます

PM2は機能が豊富なプロセスマネージャーで、Node.js開発者に人気があります。 `+ pm2 `ユーティリティを使用して、 ` parse-server +`インスタンスを設定し、長期にわたって実行し続けます。

アプリのキーの一部を取得する必要があります。 解析ダッシュボードで、*アプリの設定*に続いて*セキュリティとキー*をクリックします。

image:https://assets.digitalocean.com/articles/parse_migration/small-007.png [解析ダッシュボード:アプリの設定:セキュリティとキー]

これらのうち、*アプリケーションID *と*マスターキー*のみが必要です。 その他(クライアント、JavaScript、.NET、およびREST APIキー)は、古いクライアントビルドをサポートするために必要な場合がありますが、設定されている場合、すべてのリクエストで必要になります。 そうでないと信じる理由がない限り、アプリケーションIDとマスターキーだけを使用することから始めてください。

これらのキーを用意して、 `+ / home / parse / ecosystem.json +`という新しいファイルを編集します。

nano ecosystem.json

次を貼り付け、MongoDB接続文字列、アプリケーションID、およびマスターキーを反映するように構成値を変更します。

{
 "apps" : [{
   "name"        : "parse-wrapper",
   "script"      : "/usr/bin/parse-server",
   "watch"       : true,
   "merge_logs"  : true,
   "cwd"         : "/home/parse",
   "env": {
     "PARSE_SERVER_CLOUD_CODE_MAIN": "/home/parse/cloud/main.js",
     "PARSE_SERVER_DATABASE_URI": "mongodb://:@:27017/?ssl=true",
     "PARSE_SERVER_APPLICATION_ID": "",
     "PARSE_SERVER_MASTER_KEY": "",
   }
 }]
}

`+ env `オブジェクトは、環境変数を設定するために使用されます。 追加のキーを設定する必要がある場合、 ` parse-server +`は次の変数も認識します:

  • + PARSE_SERVER_COLLECTION_PREFIX +

  • + PARSE_SERVER_CLIENT_KEY +

  • + PARSE_SERVER_REST_API_KEY +

  • + PARSE_SERVER_DOTNET_KEY +

  • + PARSE_SERVER_JAVASCRIPT_KEY +

  • + PARSE_SERVER_DOTNET_KEY +

  • + PARSE_SERVER_FILE_KEY +

  • + PARSE_SERVER_FACEBOOK_APP_IDS +

終了して、「+ ecosystem.json」を保存します。

次に、 `+ pm2 +`でスクリプトを実行します。

pm2 start ecosystem.json
Sample Output...
[PM2] Spawning PM2 daemon
[PM2] PM2 Successfully daemonized
[PM2] Process launched
┌───────────────┬────┬──────┬──────┬────────┬─────────┬────────┬─────────────┬──────────┐
│ App name      │ id │ mode │ pid  │ status │ restart │ uptime │ memory      │ watching │
├───────────────┼────┼──────┼──────┼────────┼─────────┼────────┼─────────────┼──────────┤
│ parse-wrapper │ 0  │ fork │ 3499 │ online │ 0       │ 0s     │ 13.680 MB   │  enabled │
└───────────────┴────┴──────┴──────┴────────┴─────────┴────────┴─────────────┴──────────┘
Use `pm2 show <id|name>` to get more details about an app

次に、このプロセスリストを保存するように「+ pm2 +」に指示します。

pm2 save
Sample Output[PM2] Dumping processes
  • parse *ユーザーに対して実行されているプロセス `+ pm2 `のリストは、 ` / home / parse / .pm2 +`に保存されるはずです。

ここで、サーバーを再起動するたびに、先に「+ ecosystem.json 」で定義した「 parse-wrapper 」プロセスを復元する必要があります。 幸いなことに、 ` pm2 +`は独自にスクリプトを生成してインストールできます。

通常の `+ sudo +`ユーザーに戻ります:

exit

ホームディレクトリとして「+ / home / parse 」を使用して、* parse *ユーザーとして実行されるUbuntuの初期化スクリプトをインストールするように「 pm2 +」に指示します。

sudo pm2 startup ubuntu -u parse --hp /home/parse/

出力

[PM2] Spawning PM2 daemon
[PM2] PM2 Successfully daemonized
[PM2] Generating system init script in /etc/init.d/pm2-init.sh
[PM2] Making script booting at startup...
[PM2] -ubuntu- Using the command:
     su -c "chmod +x /etc/init.d/pm2-init.sh && update-rc.d pm2-init.sh defaults"
System start/stop links for /etc/init.d/pm2-init.sh already exist.
[PM2] Done.

ステップ4 – Nginxのインストールと構成

Nginx Webサーバーを使用して、 `+ parse-server +`に*逆プロキシ*を提供し、TLS / SSLを介して安全にParse APIを提供できるようにします。

前提条件では、Let’s Encrypt証明書で提供されるSSLを使用して、ドメイン名に応答するように「+ default +」サーバーを設定します。 この設定ファイルをプロキシ情報で更新します。

+ nano +(または選択したエディター)で `+ / etc / nginx / sites-enabled / default +`を開きます。

sudo nano /etc/nginx/sites-enabled/default

メインの + server +`ブロック(既に `+ location / +`ブロックが含まれている必要があります)内に、別の `+ location`ブロックを追加して、 + / parse / + `URLのプロキシを処理します。

/ etc / nginx / sites-enabled / default

. . .
       # Pass requests for /parse/ to Parse Server instance at localhost:1337
       location /parse/ {
               proxy_set_header X-Real-IP $remote_addr;
               proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
               proxy_set_header X-NginX-Proxy true;
               proxy_pass http://localhost:1337/;
               proxy_ssl_session_reuse off;
               proxy_set_header Host $http_host;
               proxy_redirect off;
       }

エディターを終了し、ファイルを保存します。 Nginxを再起動して、変更を有効にします。

sudo service nginx restart
Output * Restarting nginx nginx
  ...done.

ステップ5 –解析サーバーをテストする

この段階では、次のものが必要です。

  • Let’s Encryptが提供するTLS / SSL証明書

  • Let’s Encrypt証明書で保護されたMongoDB

  • ポート1337で* parse *ユーザーの下で実行され、アプリが期待するキーで設定された + parse-server +

  • * parse *ユーザーの下で `+ parse-server `プロセスを管理する ` pm2 `と、起動時に ` pm2 +`を再起動する起動スクリプト

  • + nginx、Let’s Encrypt証明書で保護し、` + https:/// parse`への接続を `+ parse-server +`インスタンスにプロキシするように設定します

これで、 `+ curl +`を使用して読み取り、書き込み、クラウドコードの実行をテストできるようになります。

POSTを使用したデータの書き込み

`+ curl +`にいくつかの重要なオプションを指定する必要があります。

Option Description

-X POST

Sets the request type, which would otherwise default to GET

-H "X-Parse-Application-Id: "

Sends a header which identifies your application to parse-server

-H "Content-Type: application/json"

Sends a header which lets parse-server know to expect JSON-formatted data

-d '{}

Sends the data itself

これらをすべてまとめると、次のようになります。

curl -X POST \
 -H "X-Parse-Application-Id: " \
 -H "Content-Type: application/json" \
 -d '{"score":1337,"playerName":"Sammy","cheatMode":false}' \
 https:///parse/classes/GameScore

出力例

{"objectId":"YpxFdzox3u","createdAt":"2016-02-18T18:03:43.188Z"}

GETを使用したデータの読み取り

`+ curl +`はデフォルトでGETリクエストを送信し、データを提供しないため、サンプルデータを読み戻すためにのみアプリケーションIDを送信する必要があります。

curl -H "X-Parse-Application-Id: " https:///parse/classes/GameScore

出力例

{"results":[{"objectId":"BNGLzgF6KB","score":1337,"playerName":"Sammy","cheatMode":false,"updatedAt":"2016-02-17T20:53:59.947Z","createdAt":"2016-02-17T20:53:59.947Z"},{"objectId":"0l1yE3ivB6","score":1337,"playerName":"Sean Plott","cheatMode":false,"updatedAt":"2016-02-18T03:57:00.932Z","createdAt":"2016-02-18T03:57:00.932Z"},{"objectId":"aKgvFqDkXh","score":1337,"playerName":"Sean Plott","cheatMode":false,"updatedAt":"2016-02-18T04:44:01.275Z","createdAt":"2016-02-18T04:44:01.275Z"},{"objectId":"zCKTgKzCRH","score":1337,"playerName":"Sean Plott","cheatMode":false,"updatedAt":"2016-02-18T16:56:51.245Z","createdAt":"2016-02-18T16:56:51.245Z"},{"objectId":"YpxFdzox3u","score":1337,"playerName":"Sean Plott","cheatMode":false,"updatedAt":"2016-02-18T18:03:43.188Z","createdAt":"2016-02-18T18:03:43.188Z"}]}

サンプルクラウドコードの実行

`+ https:/// parse / functions / hello `への実際のデータを持たない単純なPOSTは、 ` / home / parse / cloud / main.js `で定義されている ` hello()+`関数を実行します。

curl -X POST \
 -H "X-Parse-Application-Id: " \
 -H "Content-Type: application/json" \
 -d '{}' \
 https:///parse/functions/hello

出力例

{"result":"Hi"}

代わりに独自のカスタムクラウドコードを移行した場合は、 `+ main.js +`の既知の関数を使用してテストできます。

ステップ6 –サーバーを解析するためにアプリを構成し、移行を完了する

次のステップは、Parse Server APIエンドポイントを使用するようにクライアントアプリケーション自体を変更することです。 Parse ServerでのParse SDKの使用については、https://github.com/ParsePlatform/parse-server/wiki/Parse-Server-Guide#using-parse-sdks-with-parse-server [公式ドキュメント]を参照してください。 プラットフォームに対応した最新バージョンのSDKが必要です。 上記の `+ curl +`ベースのテストと同様に、サーバーURLに次の文字列を使用します。

https:///parse

ブラウザのParseダッシュボードと* Migration *タブに戻ります。

image:https://assets.digitalocean.com/articles/parse_migration/small-004.png [解析アプリ:移行プロセス]

  • Finalize *ボタンをクリックします。

image:https://assets.digitalocean.com/articles/parse_migration/small-005.png [Parse Migration Finalizationダイアログ]

これで、アプリを移行する必要があります。

結論と次のステップ

このガイドは、Parseでホストされたアプリを、DigitalOceanドロップレットなどの単一のUbuntuシステムにインストールされたParse Serverに移行するための機能的な出発点を提供します。 説明した構成は、適度なユーザーベースでトラフィックの少ないアプリに適しているはずです。 大きなアプリのホスティングには、冗長データストレージとAPIエンドポイント間の負荷分散を提供するために複数のシステムが必要になる場合があります。 小規模なプロジェクトであっても、直接対処していないインフラストラクチャの考慮事項が関係する可能性があります。

トラブルシューティングの際に、Parse Serverの公式ドキュメントを読み、https://github.com/ParsePlatform/parse-server/issues [プロジェクトのGitHubの問題]を追跡することに加えて、次のトピックを調べることもできます。