序章

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

幸い、Parseは、 ParseServerと呼ばれるホスト型サービスのAPIと互換性のあるオープンソースAPIサーバーもリリースしました。 Parse Serverは活発に開発されており、大規模な開発者コミュニティを引き付ける可能性があります。 Node.jsとMongoDBを実行しているさまざまな環境にデプロイできます。

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

警告:この手順は、ユーザー向けの本番アプリで試す前に、まずアプリの開発バージョンまたはテストバージョンでテストすることを強くお勧めします。 また、このガイドを公式の移行ドキュメントと併せて読むことを強くお勧めします。

前提条件

このガイドは、 Ubuntu14.04でParseServerを実行する方法に基づいています。 以下が必要です。

  • 非ルートで構成されたUbuntu14.04サーバー sudo ユーザー
  • Node.js 5.6.x
  • MongoDB 3.0.x
  • サーバーを指すドメイン名
  • 移行する解析アプリ
  • Let’sEncrypt証明書を使用してSSLでインストールおよび構成されたNginx。 Ubuntu 14.04でLet’sEncryptを使用してNginxを保護する方法では、プロセスについて説明します。

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

ステップ1-移行用にMongoDBを構成する

Parseは、既存のアプリケーション用の移行ツールを提供します。 これを利用するには、MongoDBを外部接続に開き、Let’sEncryptのTLS/SSL証明書のコピーで保護する必要があります。 組み合わせることから始めます fullchain1.pemprivkey1.pem の新しいファイルに /etc/ssl:

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

Let’s Encrypt証明書を更新した後、上記のコマンドを繰り返す必要があります。 Let’s Encrypt証明書の自動更新を構成する場合は、この操作を含めることを忘れないでください。

確実に mongo.pem mongodb ユーザーが所有し、その所有者のみが読み取り可能です。

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

開催中 /etc/mongod.confnano (または選択したテキストエディタ):

  1. sudo nano /etc/mongod.conf

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

まず、 bindIp の行 net: セクションを作成し、変更してすべてのアドレスをリッスンするようにMongoDBに指示します 127.0.0.10.0.0.0. この下に、SSL構成を同じセクションに追加します。

/etc/mongod.conf
# network interfaces
net:
  port: 27017
  bindIp: 0.0.0.0
  ssl:
    mode: requireSSL
    PEMKeyFile: /etc/ssl/mongo.pem

次に、 # security、クライアント認証を有効にします。

/etc/mongod.conf
# security
security:
  authorization: enabled

最後に、移行ツールでは、 failIndexKeyTooLong パラメータから false:

/etc/mongod.conf

setParameter:
  failIndexKeyTooLong: false

注:空白は、YAMLに基づくMongoDB構成ファイルで重要です。 構成値をコピーするときは、インデントを保持していることを確認してください。

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

再起動する前に mongod サービス、私たちはユーザーを追加する必要があります admin 役割。 実行中のMongoDBインスタンスに接続します。

  1. mongo --port 27017

管理者ユーザーを作成して終了します。 sammy を目的のユーザー名に、passwordを強力なパスワードに置き換えてください。

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

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

  1. sudo service mongod restart

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

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

移行ツールのMongoDBクレデンシャルを構成する

まず、新しい管理者ユーザーとローカルで接続します。

  1. mongo --port 27017 --ssl --sslAllowInvalidCertificates --authenticationDatabase admin --username sammy --password

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

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

から mongo シェル、このユーザーにアクセスを許可します database_name:

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

データ移行プロセスを開始する

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

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

mongodb://parse:password@your_domain_name:27017/database_name?ssl=true

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

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

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

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

データ移行を確認する

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

あなたに戻る mongo シェルを作成し、ローカルデータベースを調べます。 database_name にアクセスし、そこに含まれるコレクションを調べることから始めます。

  1. use database_name
  1. show collections
Sample Output for Todo App
Todo _Index _SCHEMA _Session _User _dummy system.indexes

特定のコレクションの内容を調べることができます .find() 方法:

  1. db.ApplicationName.find()
Sample Output for Todo App
> db.Todo.find() { "_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 そしてシェルに戻ります:

  1. exit

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

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

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

使用する npm インストールするには parse-server ユーティリティ、 pm2 プロセスマネージャーとその依存関係をグローバルに:

  1. sudo npm install -g parse-server pm2

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

走る代わりに parse-server rootまたはあなたの sudo ユーザー、parseというシステムユーザーを作成します。

  1. sudo useradd --create-home --system parse

次に、parseのパスワードを設定します。

  1. sudo passwd parse

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

今、使用します su parse ユーザーになるコマンド:

  1. sudo su parse

parseのホームディレクトリに移動します。

  1. cd ~

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

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

  1. mkdir -p ~/cloud

編集 /home/parse/cloud/main.js:

  1. nano ~/cloud/main.js

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

/home/parse/cloud/main.js
Parse.Cloud.define('hello', function(req, res) {
  res.success('Hi');
});

または、解析ダッシュボードのアプリ設定のクラウドコードセクションからコピーして、アプリケーション用に定義されたクラウドコードを移行することもできます。

終了して保存します。

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

PM2 は、Node.js開発者に人気の、機能豊富なプロセスマネージャーです。 を使用します pm2 を構成するユーティリティ parse-server インスタンスを作成し、長期間実行し続けます。

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

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

これらのキーを手に入れる準備ができたら、という新しいファイルを編集します /home/parse/ecosystem.json:

  1. 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://parse:password@your_domain_name:27017/database_name?ssl=true",
      "PARSE_SERVER_APPLICATION_ID": "your_application_id",
      "PARSE_SERVER_MASTER_KEY": "your_master_key",
    }
  }]
}

The 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:

  1. 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 このプロセスリストを保存するには:

  1. pm2 save
Sample Output
[PM2] Dumping processes

プロセスのリスト pm2 parseユーザーのために実行されています。 /home/parse/.pm2.

今、私たちは確認する必要があります parse-wrapper 以前に定義したプロセス ecosystem.json サーバーが再起動されるたびに復元されます。 幸運、 pm2 独自にスクリプトを生成してインストールできます。

通常の出口に戻る sudo ユーザー:

  1. exit

教えて pm2 Ubuntuの初期化スクリプトをインストールし、parseユーザーとして実行します。 /home/parse ホームディレクトリとして:

  1. 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を介してParseAPIを安全に提供できるようにします。

前提条件で、 default Let’sEncrypt証明書によって提供されるSSLを使用してドメイン名に応答するサーバー。 この構成ファイルをプロキシ情報で更新します。

開ける /etc/nginx/sites-enabled/defaultnano (または選択したエディター):

  1. 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を再起動して、変更を有効にします。

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

ステップ5–ParseServerをテストする

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

  • Let’sEncryptが提供するTLS/SSL証明書
  • Let’sEncrypt証明書で保護されたMongoDB
  • parse-server ポート1337のparseユーザーの下で実行され、アプリで期待されるキーで構成されています
  • pm2 管理 parse-server parse ユーザーの下で処理し、再起動するための起動スクリプト pm2 起動時
  • nginx、Let’s Encrypt証明書で保護され、接続をプロキシするように構成されています https://your_domain_name/parseparse-server 実例

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

注: curl このセクションのコマンドは、テストアプリまたは開発アプリで使用する場合は無害である必要があります。 本番アプリにデータを書き込むときは注意してください。

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

あなたは与える必要があります curl いくつかの重要なオプション:

オプション 説明
-X POST リクエストタイプを設定します。それ以外の場合はデフォルトで GET
-H "X-Parse-Application-Id: your_application_id" アプリケーションを識別するヘッダーをに送信します parse-server
-H "Content-Type: application/json" 次のようなヘッダーを送信します parse-server JSON形式のデータを期待することを知っている
-d '{json_data} データ自体を送信します

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

curl -X POST \
  -H "X-Parse-Application-Id: your_application_id" \
  -H "Content-Type: application/json" \
  -d '{"score":1337,"playerName":"Sammy","cheatMode":false}' \
  https://your_domain_name/parse/classes/GameScore
サンプル出力
{"objectId":"YpxFdzox3u","createdAt":"2016-02-18T18:03:43.188Z"}

GETでデータを読み取る

以来 curl デフォルトでGETリクエストを送信しますが、データは提供していません。サンプルデータを読み戻すには、アプリケーションIDを送信するだけで済みます。

  1. curl -H "X-Parse-Application-Id: your_application_id" https://your_domain_name/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"}]}

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

実際のデータがない単純なPOST https://your_domain_name/parse/functions/hello を実行します hello() で定義された関数 /home/parse/cloud/main.js:

curl -X POST \
  -H "X-Parse-Application-Id: your_application_id" \
  -H "Content-Type: application/json" \
  -d '{}' \
  https://your_domain_name/parse/functions/hello
サンプル出力
{"result":"Hi"}

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

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

次のステップは、ParseServerAPIエンドポイントを使用するようにクライアントアプリケーション自体を変更することです。 ParseServerでのParseSDKの使用については、公式ドキュメントを参照してください。 プラットフォームに最新バージョンのSDKが必要になります。 と同じように curl上記のベースのテストでは、サーバーのURLに次の文字列を使用します。

https://your_domain_name/parse

ブラウザの解析ダッシュボードと移行タブに戻ります。

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

これで、アプリが移行されます。

結論と次のステップ

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

トラブルシューティング時に、Parse Serverの公式ドキュメントを読み、プロジェクト GitHubの問題を追跡することに加えて、次のトピックを調べることをお勧めします。