Comment migrer une application d’analyse vers un serveur d’analyse sur Ubuntu 14.04

introduction

Parse est une plate-forme Mobile Backend as a Service appartenant à Facebook depuis 2013. En janvier 2016, Parse a annoncé que ses services hébergés seraient complètement fermés le 28 janvier 2017.

Heureusement, Parse a également publié an serveur API open source, compatible avec l’API du service hébergé, appelé * Parse Server *. Parse Server est en cours de développement et devrait attirer une grande communauté de développeurs. Il peut être déployé dans divers environnements exécutant Node.js et MongoDB.

Ce guide se concentre sur la migration d’une application Parse préexistante vers une instance autonome de Parse Server s’exécutant sur Ubuntu 14.04. Il utilise le cryptage TLS / SSL pour toutes les connexions, à l’aide d’un certificat fourni par Let’s Encrypt, une nouvelle autorité de certification offrant des certificats gratuits. Il inclut quelques détails spécifiques à DigitalOcean et Ubuntu 14.04, mais devrait être largement applicable aux systèmes exécutant des distributions GNU / Linux dérivées de Debian récentes.

Conditions préalables

Ce guide s’appuie sur Comment exécuter le serveur Parse sur Ubuntu 14.04. Il nécessite les éléments suivants:

  • Un serveur Ubuntu 14.04, configuré avec un utilisateur + sudo + non root

  • Node.js 5.6.x

  • MongoDB 3.0.x

  • Un nom de domaine pointant vers le serveur

  • Une application d’analyse à migrer

  • Nginx est installé et configuré avec SSL à l’aide des certificats Let’Secrypt. Comment sécuriser Nginx avec Let’s Encrypt sur Ubuntu 14.04 vous guider dans le processus.

Le serveur cible doit disposer de suffisamment de mémoire pour gérer toutes les données de votre application. Comme Parse compresse les données à leur extrémité, ils vous recommandent officiellement de prévoir au moins 10 fois plus d’espace de stockage que celui utilisé par votre application hébergée.

Étape 1 - Configurer MongoDB pour la migration

Parse fournit un outil de migration pour les applications existantes. Pour pouvoir l’utiliser, nous devons ouvrir MongoDB aux connexions externes et le sécuriser avec une copie du certificat TLS / SSL de Let’s Encrypt. Commencez par combiner + fullchain1.pem + et + privkey1.pem + dans un nouveau fichier dans + / etc / ssl +:

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

Assurez-vous que + mongo.pem + appartient à l’utilisateur * mongodb * et ne peut être lu que par son propriétaire:

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

Maintenant, ouvrez + / etc / mongod.conf + dans + nano + (ou votre éditeur de texte de choix):

sudo nano /etc/mongod.conf

Ici, nous allons faire plusieurs changements importants.

Premièrement, cherchez la ligne + bindIp + dans la section + net: + et dites à MongoDB d’écouter toutes les adresses en modifiant + 127.0.0.1 + en + 0.0.0.0 +. Ci-dessous, ajoutez la configuration SSL à la même section:

/etc/mongod.conf

# network interfaces
net:
 port: 27017
 bindIp:

Ensuite, sous + # security +, activez l’autorisation du client:

/etc/mongod.conf

# security
security:
 authorization: enabled

Enfin, l’outil de migration nous oblige à définir le paramètre + failIndexKeyTooLong sur` + false`:

/etc/mongod.conf

setParameter:
 failIndexKeyTooLong: false

Quittez et enregistrez le fichier.

Avant de démarrer le service + mongodb, nous devons ajouter un utilisateur avec le rôle` + admin`. Connectez-vous à l’instance MongoDB en cours d’exécution:

mongo --port 27017

Créez un utilisateur administrateur et quittez. Assurez-vous de remplacer par votre nom d’utilisateur souhaité et par un mot de passe fort.

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

Redémarrez le service + mongod +:

sudo service mongod restart

Étape 2 - Migration des données d’application à partir de l’analyse

Maintenant que vous disposez d’une instance MongoDB accessible à distance, vous pouvez utiliser l’outil de migration Parse pour transférer les données de votre application sur votre serveur.

Configurer les informations d’identification MongoDB pour l’outil de migration

Nous allons commencer par nous connecter localement avec notre nouvel utilisateur admin:

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

Vous devriez être invité à entrer le mot de passe que vous avez défini précédemment.

Une fois connecté, choisissez un nom pour la base de données pour stocker les données de votre application. Par exemple, si vous migrez une application appelée Todo, vous pouvez utiliser + todo +. Vous devrez également choisir un autre mot de passe fort pour un utilisateur appelé * parse *.

Depuis le shell + mongo +, donnez à cet utilisateur l’accès à ++:

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

Lancer le processus de migration des données

Dans une fenêtre de navigateur, connectez-vous à Parse et ouvrez les paramètres de votre application. Sous * Général *, localisez le bouton * Migrer * et cliquez dessus:

image: https: //assets.digitalocean.com/articles/parse_migration/small-000.png [Paramètres de l’application d’analyse: Général: Migrer]

Une chaîne de connexion MongoDB vous sera demandée. Utilisez le format suivant:

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

Par exemple, si vous utilisez le domaine + exemple.com +, avec l’utilisateur + parse, le mot de passe` + o + et une base de données appelée + todo + `, votre chaîne de connexion ressemblera à ceci:

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

N’oubliez pas +? Ssl = true + à la fin, sinon la connexion échouera. Entrez la chaîne de connexion dans la boîte de dialogue comme suit:

image: https: //assets.digitalocean.com/articles/parse_migration/small-001.png [Application d’analyse: Boîte de dialogue de migration]

Cliquez sur * Commencer la migration *. Vous devriez voir des boîtes de dialogue de progression vous permettant de copier un instantané de votre base de données hébergée Parse sur votre serveur, puis de synchroniser de nouvelles données depuis l’instantané. La durée de ce processus dépend de la quantité de données à transférer et peut être considérable.

image: https: //assets.digitalocean.com/articles/parse_migration/small-002.png [Application d’analyse: Progression de la migration]

image: https: //assets.digitalocean.com/articles/parse_migration/small-003.png [Application d’analyse: processus de migration]

Vérifier la migration des données

Une fois terminé, le processus de migration entrera dans une étape de vérification. Ne finalisez pas encore la migration. Vous devez d’abord vérifier que les données ont bien été transférées et tester une instance locale de Parse Server.

image: https: //assets.digitalocean.com/articles/parse_migration/small-004.png [Application Parse: migration terminée, en attente de finalisation]

Revenez dans votre shell + mongo + et examinez votre base de données locale. Commencez par consulter et examiner les collections qu’il contient:

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

Vous pouvez examiner le contenu d’une collection spécifique avec la méthode + .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") }

Votre sortie spécifique sera différente, mais vous devriez voir les données de votre application. Une fois satisfait, quittez + mongo + et retournez dans le shell:

exit

Étape 3 - Installer et configurer Parse Server et PM2

Avec les données de vos applications dans MongoDB, nous pouvons passer à l’installation de Parse Server lui-même et à son intégration au reste du système. Nous allons donner à Parse Server un utilisateur dédié et utiliser un utilitaire appelé * PM2 * pour le configurer et s’assurer qu’il fonctionne toujours.

Installer Parse Server et PM2 globalement

Utilisez + npm + pour installer l’utilitaire + parse-server +, le gestionnaire de processus + pm2 + et leurs dépendances, globalement:

sudo npm install -g parse-server pm2

Créer un répertoire utilisateur et d’analyse dédié

Au lieu d’exécuter + parse-server + en tant que * racine * ou votre utilisateur + sudo +, nous allons créer un utilisateur système appelé * parse *:

sudo useradd --create-home --system parse

Maintenant, définissez un mot de passe pour * parse *:

sudo passwd parse

Vous serez invité à saisir un mot de passe deux fois.

Maintenant, utilisez la commande + su + pour devenir l’utilisateur * parse *:

sudo su parse

Passez au répertoire de base de * parse *:

cd ~

Écrire ou migrer un fichier de code de nuage

Créez un répertoire de code de nuage:

mkdir -p ~/cloud

Éditez + / home / parse / cloud / main.js:

nano ~/cloud/main.js

À des fins de test, vous pouvez coller les éléments suivants:

/home/parse/cloud/main.js

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

Vous pouvez également migrer n’importe quel code cloud défini pour votre application en le copiant à partir de la section * Cloud Code * des paramètres de votre application sur Parse Dashboard.

Quittez et enregistrez.

Récupérer des clés et écrire /home/parse/ecosystem.json

PM2 est un gestionnaire de processus riche en fonctionnalités, populaire auprès des développeurs de Node.js. Nous allons utiliser l’utilitaire + pm2 + pour configurer notre instance + parse-server + et la maintenir sur le long terme.

Vous devrez récupérer certaines des clés de votre application. Dans le tableau de bord Parse, cliquez sur * Paramètres de l’application * suivi de * Sécurité et clés *:

image: https: //assets.digitalocean.com/articles/parse_migration/small-007.png [Tableau de bord d’analyse: Paramètres de l’application: Sécurité et clés]

Parmi ceux-ci, seuls les * ID d’application * et * Master Key * sont requis. D’autres (clés d’API client, JavaScript, .NET et REST) ​​peuvent être nécessaires pour prendre en charge les versions de client plus anciennes, mais si elles sont définies, elles seront requises dans toutes les demandes. Sauf si vous avez des raisons de croire le contraire, vous devez commencer par utiliser uniquement l’ID de l’application et la clé principale.

Avec ces clés à portée de main, éditez un nouveau fichier appelé + / home / parse /osysteme.json:

nano ecosystem.json

Collez ce qui suit en modifiant les valeurs de configuration afin de refléter votre chaîne de connexion MongoDB, votre identifiant d’application et votre clé principale:

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

L’objet + env + est utilisé pour définir les variables d’environnement. Si vous devez configurer des clés supplémentaires, + parse-server + reconnaît également les variables suivantes:

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

Quittez et enregistrez + écosystèmes.json.

Maintenant, lancez le script avec + 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

Maintenant, indiquez + pm2 + pour enregistrer cette liste de processus:

pm2 save
Sample Output[PM2] Dumping processes

La liste des processus + pm2 + est en cours d’exécution pour l’utilisateur * parse * devrait maintenant être stockée dans + / home / parse / .pm2 +.

Maintenant, nous devons nous assurer que le processus + parse-wrapper + que nous avons défini précédemment dans + écosystèmes.json + est restauré à chaque redémarrage du serveur. Heureusement, + pm2 + peut générer et installer lui-même un script.

Sortie vers votre utilisateur + sudo + habituel:

exit

Dites + pm2 + pour installer les scripts d’initialisation pour Ubuntu, à exécuter en tant qu’utilisateur * parse *, en utilisant + / home / parse + comme répertoire de base:

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

Sortie

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

Étape 4 - Installer et configurer Nginx

Nous allons utiliser le serveur Web Nginx pour fournir un * proxy inverse * à + ​​parse-server +, afin de pouvoir servir l’API Parse en toute sécurité via TLS / SSL.

Dans les conditions préalables, vous configurez le serveur + default + pour qu’il réponde à votre nom de domaine, avec SSL fourni par les certificats Let’s Encrypt. Nous mettrons à jour ce fichier de configuration avec nos informations de proxy.

Ouvrez + / etc / nginx / sites-enabled / default + dans + nano + (ou votre éditeur de choix):

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

Dans le bloc + server + principal (il devrait déjà contenir un bloc + location / +), ajoutez un autre bloc + location pour gérer la transmission par proxy des URL` + / parse / + `:

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

Quittez l’éditeur et enregistrez le fichier. Redémarrez Nginx pour que les modifications prennent effet:

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

Étape 5 - Tester le serveur d’analyse

A ce stade, vous devriez avoir les éléments suivants:

  • Un certificat TLS / SSL, fourni par Let’s Encrypt

  • MongoDB, sécurisé avec le certificat Let’s Encrypt

  • + parse-server + s’exécutant sous l’utilisateur * parse * sur le port 1337, configuré avec les clés attendues par votre application

  • + pm2 + gestion du processus + parse-server + sous l’utilisateur * parse *, et un script de démarrage pour redémarrer + pm2 + au démarrage

  • + nginx, sécurisé avec le certificat Let’s Encrypt et configuré pour les connexions proxy à` + https: /// parse` à l’instance + parse-server +

Il devrait maintenant être possible de tester les lectures, les écritures et l’exécution de code dans le nuage en utilisant + curl +.

Écrire des données avec un POST

Vous devrez donner + curl + plusieurs options importantes:

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

En réunissant tout cela, nous obtenons:

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

Exemple de sortie

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

Lecture de données avec un GET

Étant donné que + curl + envoie les demandes GET par défaut et que nous ne fournissons aucune donnée, il vous suffirait d’envoyer l’ID de l’application pour pouvoir lire des exemples de données:

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

Exemple de sortie

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

Exécuter un exemple de code cloud

Un simple POST sans données réelles à + ​​https: /// parse / functions / hello + exécutera la fonction + hello () + définie dans + / home / parse / cloud / main.js +:

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

Exemple de sortie

{"result":"Hi"}

Si vous avez migré votre propre code de cloud personnalisé à la place, vous pouvez tester avec une fonction connue de + main.js +.

Étape 6 - Configurez votre application pour Parse Server et finalisez la migration

Votre prochaine étape consistera à modifier votre application cliente elle-même pour utiliser le point de terminaison de l’API Parse Server. Consultez la https://github.com/ParsePlatform/parse-server/wiki/Parse-Server-Guide#using-parse-sdks-with-parse-server (documentation officielle)] sur l’utilisation du SDK Parse avec Parse Server. Vous aurez besoin de la dernière version du SDK pour votre plate-forme. Comme avec les tests + curl + ci-dessus, utilisez cette chaîne pour l’URL du serveur:

https:///parse

Revenez dans le tableau de bord Parse de votre navigateur et dans l’onglet * Migration *:

image: https: //assets.digitalocean.com/articles/parse_migration/small-004.png [Application d’analyse: processus de migration]

Cliquez sur le bouton * Finaliser *:

image: https: //assets.digitalocean.com/articles/parse_migration/small-005.png [Boîte de dialogue de finalisation de la migration d’analyse]

Votre application devrait maintenant être migrée.

Conclusion et prochaines étapes

Ce guide offre un point de départ fonctionnel pour la migration d’une application hébergée par Parse vers une installation Parse Server sur un seul système Ubuntu, tel qu’un droplet DigitalOcean. La configuration que nous avons décrite devrait convenir à une application à faible trafic avec une base utilisateur modeste. L’hébergement d’une application plus grande peut nécessiter que plusieurs systèmes fournissent un stockage de données redondant et un équilibrage de la charge entre les points de terminaison de l’API. Même les petits projets sont susceptibles d’impliquer des considérations d’infrastructure que nous n’avons pas abordées directement.

En plus de lire la documentation officielle de Parse Server et de suivre les problèmes GitHub pour le projet lors du dépannage, vous souhaiterez peut-être explorer les sujets suivants: