So migrieren Sie eine Parse-App auf den Parse-Server unter Ubuntu 14.04

Einführung

Parse ist eine Mobile Backend as a Service Plattform, die seit 2013 im Besitz von Facebook ist. Im Januar 2016 gab Parse bekannt, dass seine gehosteten Dienste am 28. Januar 2017 vollständig heruntergefahren werden.

Zum Glück hat Parse auch an open source API server veröffentlicht, der mit der API des gehosteten Dienstes, * Parse Server *, kompatibel ist. Parse Server befindet sich in der aktiven Entwicklung und wird wahrscheinlich eine große Entwicklergemeinde anziehen. Es kann in einer Reihe von Umgebungen bereitgestellt werden, in denen Node.js und MongoDB ausgeführt werden.

Dieses Handbuch konzentriert sich auf die Migration einer bereits vorhandenen Parse-Anwendung auf eine eigenständige Instanz von Parse Server unter Ubuntu 14.04. Es verwendet die TLS / SSL-Verschlüsselung für alle Verbindungen. Dabei wird ein Zertifikat verwendet, das von Let’s Encrypt, einer neuen Zertifizierungsstelle, bereitgestellt wird, die kostenlose Zertifikate anbietet. Es enthält einige Details speziell für DigitalOcean und Ubuntu 14.04, sollte aber allgemein auf Systeme anwendbar sein, auf denen neuere, von Debian abgeleitete GNU / Linux-Distributionen ausgeführt werden.

Voraussetzungen

Dieses Handbuch basiert auf So wird Parse Server unter Ubuntu 14.04 ausgeführt. Es erfordert Folgendes:

  • Ein Ubuntu 14.04-Server, der mit einem Benutzer konfiguriert ist, der kein Root-Benutzer ist

  • Node.js 5.6.x

  • MongoDB 3.0.x

  • Ein Domainname, der auf den Server verweist

  • Eine zu migrierende Parse-App

  • Nginx wurde mit SSL installiert und konfiguriert. Verwenden Sie dazu Let’s Encrypt certificates. So sichern Sie Nginx mit Let’s Encrypt unter Ubuntu 14.04 Begleiten Sie durch den Prozess.

Der Zielserver sollte über genügend Speicher verfügen, um alle Daten Ihrer App zu verarbeiten. Da Parse die Daten am Ende komprimiert, wird offiziell empfohlen, mindestens das Zehnfache des von Ihrer gehosteten App verwendeten Speicherplatzes bereitzustellen.

Schritt 1 - Konfigurieren Sie MongoDB für die Migration

Parse bietet ein Migrationstool für vorhandene Anwendungen. Um es nutzen zu können, müssen wir MongoDB für externe Verbindungen öffnen und es mit einer Kopie des TLS / SSL-Zertifikats von Let’s Encrypt sichern. Beginnen Sie mit der Kombination von + fullchain1.pem + und + privkey1.pem + in einer neuen Datei in + / etc / ssl +:

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

Stellen Sie sicher, dass "+ mongo.pem +" dem Benutzer "* mongodb *" gehört und nur von seinem Besitzer gelesen werden kann:

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

Öffne nun + / etc / mongod.conf + in + nano + (oder einem Texteditor deiner Wahl):

sudo nano /etc/mongod.conf

Hier nehmen wir einige wichtige Änderungen vor.

Suchen Sie zunächst im Abschnitt "+ net: " nach der Zeile " bindIp " und weisen Sie MongoDB an, alle Adressen abzuhören, indem Sie " 127.0.0.1 " in " 0.0.0.0 +" ändern. Fügen Sie darunter die SSL-Konfiguration demselben Abschnitt hinzu:

/etc/mongod.conf

# network interfaces
net:
 port: 27017
 bindIp:

Aktivieren Sie als Nächstes unter "+ # security +" die Client-Autorisierung:

/etc/mongod.conf

# security
security:
 authorization: enabled

Schließlich müssen wir für das Migrationstool den Parameter "+ failIndexKeyTooLong" auf "+ false" setzen:

/etc/mongod.conf

setParameter:
 failIndexKeyTooLong: false

Beenden und speichern Sie die Datei.

Bevor wir den Dienst "+ mongodb" starten, müssen wir einen Benutzer mit der Rolle "+ admin" hinzufügen. Stellen Sie eine Verbindung zur laufenden MongoDB-Instanz her:

mongo --port 27017

Erstellen Sie einen Administrator und beenden Sie das Programm. Stellen Sie sicher, dass Sie Ihren gewünschten Benutzernamen und ein sicheres Passwort verwenden.

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

Starten Sie den Dienst + mongod + neu:

sudo service mongod restart

Schritt 2 - Migrieren Sie die Anwendungsdaten von Parse

Da Sie nun über eine remote zugängliche MongoDB-Instanz verfügen, können Sie das Parse-Migrationstool verwenden, um die Daten Ihrer App auf Ihren Server zu übertragen.

Konfigurieren Sie die MongoDB-Anmeldeinformationen für das Migrationstool

Zunächst stellen wir vor Ort eine Verbindung mit unserem neuen Administrator her:

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

Sie sollten aufgefordert werden, das zuvor festgelegte Kennwort einzugeben.

Wählen Sie nach dem Herstellen der Verbindung einen Namen für die Datenbank, in der die Daten Ihrer App gespeichert werden sollen. Wenn Sie beispielsweise eine App namens "Todo" migrieren, können Sie "+ todo +" verwenden. Sie müssen auch ein anderes sicheres Kennwort für einen Benutzer mit dem Namen * parse * auswählen.

Geben Sie diesem Benutzer in der + mongo + Shell den Zugriff auf ++:

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

Initiieren Sie den Datenmigrationsprozess

Melden Sie sich in einem Browserfenster bei Parse an und öffnen Sie die Einstellungen für Ihre App. Suchen Sie unter * Allgemein * die Schaltfläche * Migrieren * und klicken Sie darauf:

image: https://assets.digitalocean.com/articles/parse_migration/small-000.png [Parse App Settings: General: Migrate]

Sie werden aufgefordert, eine MongoDB-Verbindungszeichenfolge einzugeben. Verwenden Sie das folgende Format:

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

Wenn Sie beispielsweise die Domain "+ example.com " mit dem Benutzer " parse", dem Kennwort "+ o " und einer Datenbank mit dem Namen " todo +" verwenden, sieht Ihre Verbindungszeichenfolge folgendermaßen aus:

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

Vergessen Sie am Ende nicht "+? Ssl = true +", sonst schlägt die Verbindung fehl. Geben Sie die Verbindungszeichenfolge wie folgt in den Dialog ein:

Klicken Sie auf * Beginne die Migration *. Es sollten Fortschrittsdialogfelder angezeigt werden, in denen Sie einen Snapshot Ihrer Parse-Datenbank auf Ihren Server kopieren und anschließend neue Daten synchronisieren können, seit der Snapshot erstellt wurde. Die Dauer dieses Vorgangs hängt von der zu übertragenden Datenmenge ab und kann erheblich sein.

Überprüfen Sie die Datenmigration

Nach Abschluss des Migrationsvorgangs wird ein Überprüfungsschritt eingeleitet. Schließen Sie die Migration noch nicht ab. Stellen Sie zunächst sicher, dass die Daten tatsächlich übertragen wurden, und testen Sie eine lokale Instanz von Parse Server.

image: https://assets.digitalocean.com/articles/parse_migration/small-004.png [Parse App: Beendete Migration, Warten auf Finalisierung]

Kehren Sie zu Ihrer "+ mongo +" - Shell zurück und untersuchen Sie Ihre lokale Datenbank. Beginnen Sie, indem Sie auf die darin enthaltenen Sammlungen zugreifen und diese untersuchen:

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

Sie können den Inhalt einer bestimmten Sammlung mit der Methode + .find () + untersuchen:

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") }

Ihre spezifische Ausgabe ist unterschiedlich, Sie sollten jedoch Daten für Ihre App sehen. Wenn Sie zufrieden sind, beenden Sie "+ mongo +" und kehren Sie zur Shell zurück:

exit

Schritt 3 - Installieren und Konfigurieren von Parse Server und PM2

Mit Ihren App-Daten in MongoDB können wir mit der Installation von Parse Server selbst und der Integration in den Rest des Systems fortfahren. Wir geben Parse Server einen dedizierten Benutzer und verwenden ein Dienstprogramm mit dem Namen * PM2 *, um es zu konfigurieren und sicherzustellen, dass es immer ausgeführt wird.

Installieren Sie Parse Server und PM2 global

Verwenden Sie "+ npm ", um das Dienstprogramm " parse-server ", den " pm2 +" - Prozessmanager und deren Abhängigkeiten global zu installieren:

sudo npm install -g parse-server pm2

Erstellen Sie einen dedizierten Parse-Benutzer und ein Basisverzeichnis

Anstatt "+ parse-server " als * root * oder als " sudo +" - Benutzer auszuführen, erstellen wir einen Systembenutzer mit dem Namen "* parse *":

sudo useradd --create-home --system parse

Legen Sie nun ein Passwort für * parse * fest:

sudo passwd parse

Sie werden zweimal aufgefordert, ein Passwort einzugeben.

Verwenden Sie jetzt den Befehl + su +, um der Benutzer * parse * zu werden:

sudo su parse

Wechseln Sie in das Ausgangsverzeichnis von * parse *:

cd ~

Schreiben oder Migrieren einer Cloud-Codedatei

Erstellen Sie ein Cloud-Code-Verzeichnis:

mkdir -p ~/cloud

Bearbeiten Sie + / home / parse / cloud / main.js:

nano ~/cloud/main.js

Zu Testzwecken können Sie Folgendes einfügen:

/home/parse/cloud/main.js

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

Alternativ können Sie jeden für Ihre Anwendung definierten Cloud-Code migrieren, indem Sie ihn aus dem Abschnitt * Cloud-Code * in den Einstellungen Ihrer App im Parse Dashboard kopieren.

Beenden und speichern.

Rufen Sie die Schlüssel ab und schreiben Sie /home/parse/ecosystem.json

PM2 ist ein funktionsreicher Prozessmanager, der bei den Entwicklern von Node.j beliebt ist. Wir werden das Dienstprogramm "+ pm2 " verwenden, um unsere Instanz " parse-server +" zu konfigurieren und sie langfristig laufen zu lassen.

Sie müssen einige der Schlüssel für Ihre App abrufen. Klicken Sie im Parse-Dashboard auf * App-Einstellungen *, gefolgt von * Sicherheit & Schlüssel *:

image: https://assets.digitalocean.com/articles/parse_migration/small-007.png [Parse Dashboard: App-Einstellungen: Sicherheit & Schlüssel]

Davon sind nur die * Application ID * und * Master Key * erforderlich. Andere (Client-, JavaScript-, .NET- und REST-API-Schlüssel) sind möglicherweise erforderlich, um ältere Client-Builds zu unterstützen, werden jedoch, sofern festgelegt, in allen Anforderungen benötigt. Sofern Sie keinen Grund zur Annahme haben, sollten Sie zunächst nur die Anwendungs-ID und den Hauptschlüssel verwenden.

Bearbeiten Sie mit den folgenden Schlüsseln eine neue Datei mit dem Namen "+ / home / parse / ecosystem.json":

nano ecosystem.json

Fügen Sie die folgenden Konfigurationswerte ein, um die MongoDB-Verbindungszeichenfolge, die Anwendungs-ID und den Hauptschlüssel wiederzugeben:

{
 "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": "",
   }
 }]
}

Das + env + Objekt dient zum Setzen von Umgebungsvariablen. Wenn Sie zusätzliche Schlüssel konfigurieren müssen, erkennt "+ parse-server +" auch die folgenden Variablen:

  • + 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 +

Beenden und speichern Sie "+ ecosystem.json".

Führen Sie nun das Skript mit + pm2 + aus:

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

Nun teilen Sie + pm2 + mit, diese Prozessliste zu speichern:

pm2 save
Sample Output[PM2] Dumping processes

Die Liste der Prozesse, die "+ pm2 " für den Benutzer "* parse *" ausführt, sollte nun in " / home / parse / .pm2 +" gespeichert werden.

Jetzt müssen wir sicherstellen, dass der zuvor in "+ ecosystem.json " definierte " parse-wrapper " -Prozess bei jedem Neustart des Servers wiederhergestellt wird. Glücklicherweise kann ` pm2 +` ein eigenes Skript generieren und installieren.

Beenden Sie zu Ihrem regulären Benutzer "+ sudo +":

exit

Weisen Sie + pm2 + an, Initialisierungsskripte für Ubuntu zu installieren, die als * parse * -Benutzer ausgeführt werden sollen, wobei + / home / parse + als Ausgangsverzeichnis verwendet wird:

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

Ausgabe

[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.

Schritt 4 - Installieren und Konfigurieren von Nginx

Wir werden den Nginx-Webserver verwenden, um einen * Reverse-Proxy * für "+ parse-server +" bereitzustellen, damit wir die Parse-API sicher über TLS / SSL bereitstellen können.

In den Voraussetzungen richten Sie den "+ default +" - Server so ein, dass er auf Ihren Domainnamen mit SSL reagiert, das durch Let’s Encrypt-Zertifikate bereitgestellt wird. Wir aktualisieren diese Konfigurationsdatei mit unseren Proxy-Informationen.

Öffne "+ / etc / nginx / sites-enabled / default " in " nano +" (oder einem Editor deiner Wahl):

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

Fügen Sie im Hauptblock "+ server " (der bereits einen " location / " -Block enthalten sollte) einen weiteren " location" -Block hinzu, um das Proxying von "+ / parse / +" -URLs zu handhaben:

/ 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;
       }

Beenden Sie den Editor und speichern Sie die Datei. Starten Sie Nginx neu, damit die Änderungen wirksam werden:

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

Schritt 5 - Analyseserver testen

Zu diesem Zeitpunkt sollten Sie Folgendes haben:

  • Ein TLS / SSL-Zertifikat, das von Let’s Encrypt bereitgestellt wird

  • MongoDB, gesichert mit dem Let’s Encrypt-Zertifikat

  • "+ parse-server +" wird unter dem Benutzer "* parse *" auf Port 1337 ausgeführt und mit den Schlüsseln konfiguriert, die von Ihrer App erwartet werden

  • + pm2 + Verwalten des Prozesses + parse-server + unter dem Benutzer * parse * und eines Startskripts, um + pm2 + beim Booten neu zu starten

  • + nginx, sicher mit dem Let’s Encrypt-Zertifikat und so konfiguriert, dass Verbindungen zu` + https: /// parsen` zur Instanz + parse-server + per Proxy übertragen werden

Es sollte nun möglich sein, Lese-, Schreib- und Cloud-Code-Ausführung mit "+ curl +" zu testen.

Schreiben von Daten mit einem POST

Sie müssen "+ locken +" mehrere wichtige Optionen angeben:

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

Wenn wir all dies zusammenfassen, erhalten wir:

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

Beispielausgabe

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

Daten mit einem GET lesen

Da "+ curl +" standardmäßig GET-Anforderungen sendet und wir keine Daten bereitstellen, müssen Sie nur die Anwendungs-ID senden, um einige Beispieldaten zurückzulesen:

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

Beispielausgabe

{"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"}]}

Ausführen von Beispiel-Cloud-Code

Ein einfacher POST ohne reale Daten für "+ https: /// parse / functions / hello " führt die in " / home / parse / cloud / main.js " definierte Funktion " hello () +" aus:

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

Beispielausgabe

{"result":"Hi"}

Wenn Sie stattdessen Ihren eigenen benutzerdefinierten Cloud-Code migriert haben, können Sie mit einer bekannten Funktion aus "+ main.js +" testen.

Schritt 6 - Konfigurieren Sie Ihre App für Parse Server und schließen Sie die Migration ab

Der nächste Schritt besteht darin, die Clientanwendung selbst so zu ändern, dass der Parse Server-API-Endpunkt verwendet wird. Informationen zur Verwendung von Parse SDKs mit Parse Server finden Sie in der official documentation. Sie benötigen die neueste Version des SDK für Ihre Plattform. Verwenden Sie wie bei den oben beschriebenen Tests auf der Basis von "+ curl +" diese Zeichenfolge für die Server-URL:

https:///parse

Kehren Sie zum Parse-Dashboard in Ihrem Browser und zur Registerkarte * Migration * zurück:

Klicken Sie auf die Schaltfläche * Finalisieren *:

image: https://assets.digitalocean.com/articles/parse_migration/small-005.png [Parse Migration Finalization Dialog]

Ihre App sollte jetzt migriert werden.

Fazit und nächste Schritte

Dieses Handbuch bietet einen funktionalen Ausgangspunkt für die Migration einer von Parse gehosteten App auf eine Parse Server-Installation auf einem einzelnen Ubuntu-System, z. B. einem DigitalOcean-Droplet. Die beschriebene Konfiguration sollte für eine App mit geringem Datenverkehr und einer bescheidenen Benutzerbasis geeignet sein. Für das Hosting einer größeren App sind möglicherweise mehrere Systeme erforderlich, um redundante Datenspeicherung und Lastenausgleich zwischen API-Endpunkten bereitzustellen. Selbst kleine Projekte beinhalten wahrscheinlich Überlegungen zur Infrastruktur, auf die wir nicht direkt eingegangen sind.

Zusätzlich zum Lesen der offiziellen Parse Server-Dokumentation und zum Verfolgen der Probleme mit GitHub für das Projekt bei der Fehlerbehebung möchten Sie möglicherweise die folgenden Themen untersuchen:

Related