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:
image: https://assets.digitalocean.com/articles/parse_migration/small-001.png [Parse App: Migration Dialog]
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.
image: https://assets.digitalocean.com/articles/parse_migration/small-002.png [Parse App: Migration Progress]
image: https://assets.digitalocean.com/articles/parse_migration/small-003.png [Parse App: Migration Process]
Ü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 |
---|---|
|
Sets the request type, which would otherwise default to |
|
Sends a header which identifies your application to |
|
Sends a header which lets |
|
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:
image: https://assets.digitalocean.com/articles/parse_migration/small-004.png [Parse App: Migration Process]
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: