Как перенести приложение Parse на сервер Parse в Ubuntu 14.04

Вступление

Parse - это платформа Mobile Backend как сервис, которой Facebook владеет с 2013 года. В январе 2016 года Parse объявил, что его хостинговые услуги будут полностью закрыты 28 января 2017 года.

К счастью, Parse также выпустил an сервер API с открытым исходным кодом, совместимый с API размещенного сервиса, который называется * Parse Server *. Parse Server находится в стадии активной разработки и, вероятно, привлечет большое сообщество разработчиков. Его можно развернуть в различных средах, работающих под управлением Node.js и MongoDB.

В этом руководстве основное внимание уделяется миграции существующего приложения Parse на автономный экземпляр Parse Server, работающий в Ubuntu 14.04. Он использует шифрование TLS / SSL для всех соединений, используя сертификат, предоставленный Let’s Encrypt, новым центром сертификации, который предлагает бесплатные сертификаты. Он включает в себя несколько деталей, относящихся к DigitalOcean и Ubuntu 14.04, но должен быть широко применим к системам, использующим последние дистрибутивы Debian GNU / Linux.

Предпосылки

Это руководство основано на Как запустить Parse Server в Ubuntu 14.04. Требуется следующее:

  • Сервер Ubuntu 14.04, настроенный пользователем без полномочий + sudo +

  • Node.js 5.6.x

  • MongoDB 3.0.x

  • Доменное имя, указывающее на сервер

  • Приложение Parse для переноса

  • Nginx установлен и настроен с использованием SSL с использованием сертификатов Let Encrypt. Как обезопасить Nginx с помощью Let’s Encrypt в Ubuntu 14.04 будет проведу вас через процесс.

Целевой сервер должен иметь достаточно памяти для обработки всех данных вашего приложения. Поскольку Parse сжимает данные в их конце, они официально рекомендуют вам выделить как минимум в 10 раз больше места для хранения, чем используется вашим размещенным приложением.

Шаг 1 - Настройка MongoDB для миграции

Parse предоставляет инструмент миграции для существующих приложений. Чтобы использовать его, нам нужно открыть MongoDB для внешних подключений и защитить его с помощью копии сертификата TLS / SSL от Let’s Encrypt. Начните с объединения + 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

Теперь откройте + / etc / mongod.conf в` + nano + `(или в любом другом текстовом редакторе):

sudo nano /etc/mongod.conf

Здесь мы сделаем несколько важных изменений.

Сначала найдите строку «+ bindIp » в разделе « net: » и скажите MongoDB прослушивать все адреса, изменив « 127.0.0.1 » на « 0.0.0.0 +». Ниже добавьте конфигурацию 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

Выйдите и сохраните файл.

Перед запуском сервиса + mongodb нам нужно добавить пользователя с ролью` + admin`. Подключитесь к работающему экземпляру MongoDB:

mongo --port 27017

Создайте пользователя-администратора и выйдите. Обязательно замените его на желаемое имя пользователя и надежный пароль.

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

Перезапустите сервис + mongod +:

sudo service mongod restart

Шаг 2. Перенос данных приложения из Parse

Теперь, когда у вас есть удаленно доступный экземпляр 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 и откройте настройки для своего приложения. Под * General * найдите кнопку * Migrate * и нажмите ее:

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 + в конце, иначе соединение не будет установлено. Введите строку подключения в диалоге так:

изображение: https: //assets.digitalocean.com/articles/parse_migration/small-001.png [Parse App: диалог миграции]

Нажмите * Начать миграцию *. Вы должны увидеть диалоговые окна прогресса для копирования снимка вашей размещенной базы данных Parse на ваш сервер, а затем для синхронизации новых данных с момента создания снимка. Продолжительность этого процесса будет зависеть от объема передаваемых данных и может быть значительной.

изображение: https: //assets.digitalocean.com/articles/parse_migration/small-002.png [Приложение Parse: прогресс миграции]

image: https: //assets.digitalocean.com/articles/parse_migration/small-003.png [Приложение Parse: процесс миграции]

Проверьте миграцию данных

После завершения процесса миграции начнется этап проверки. Пока не завершите миграцию. Сначала вы захотите убедиться, что данные действительно переданы, и протестировать локальный экземпляр Parse Server.

image: https: //assets.digitalocean.com/articles/parse_migration/small-004.png [Приложение Parse: завершенная миграция, ожидание завершения]

Вернитесь к вашей оболочке + 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 глобально

Используйте + npm + для установки утилиты + parse-server +, менеджера процессов + pm2 + и их зависимостей глобально:

sudo npm install -g parse-server pm2

Создание выделенного пользователя Parse и домашнего каталога

Вместо запуска + parse-server + от имени * root * или вашего пользователя + sudo +, мы создадим системного пользователя с именем * parse *:

sudo useradd --create-home --system parse

Теперь установите пароль для * parse *:

sudo passwd parse

Вам будет предложено ввести пароль дважды.

Теперь используйте команду + 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');
});

Кроме того, вы можете перенести любой облачный код, определенный для вашего приложения, скопировав его из раздела * Cloud Code * настроек вашего приложения на панели инструментов Parse.

Выйти и сохранить.

Получить ключи и написать /home/parse/ecosystem.json

PM2 - это многофункциональный менеджер процессов, популярный среди разработчиков Node.js. Мы будем использовать утилиту + pm2 + для настройки нашего экземпляра + parse-server + и продолжения его работы в течение длительного времени.

Вам нужно будет получить некоторые ключи для вашего приложения. На панели анализа Parse нажмите * Настройки приложения *, а затем * Безопасность и ключи *:

image: https: //assets.digitalocean.com/articles/parse_migration/small-007.png [Панель инструментов Parse: Настройки приложения: Безопасность и ключи]

Из них требуются только * Application ID * и * Master Key *. Другие (ключи клиента, JavaScript, .NET и REST API) могут быть необходимы для поддержки более старых сборок клиента, но, если они установлены, будут требоваться во всех запросах. Если у вас нет оснований полагать иначе, вам следует начать с использования только идентификатора приложения и мастер-ключа.

Когда эти ключи готовы, отредактируйте новый файл с именем + / home / parse / ecosystem.json +:

nano ecosystem.json

Вставьте следующее, изменив значения конфигурации, чтобы отразить строку подключения MongoDB, идентификатор приложения и главный ключ:

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

Список процессов, которые + pm2 + выполняется для пользователя * parse *, теперь должен храниться в + / home / parse / .pm2 +.

Теперь нам нужно убедиться, что процесс + parse-wrapper +, который мы определили ранее в + ecosystem.json +, восстанавливается при каждом перезапуске сервера. К счастью, + pm2 + может генерировать и устанавливать скрипт самостоятельно.

Выйдите из вашего обычного пользователя + sudo +:

exit

Скажите + pm2 + установить сценарии инициализации для Ubuntu, которые будут запускаться от имени пользователя * parse *, используя + / home / parse + в качестве своего домашнего каталога:

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 для предоставления * обратного прокси * для + parse-server +, чтобы мы могли безопасно обслуживать Parse API через TLS / SSL.

В предварительных условиях вы настраиваете сервер + default + для ответа на ваше доменное имя, используя SSL, предоставляемый сертификатами Let Encrypt. Мы обновим этот файл конфигурации с нашей информацией о прокси.

Откройте + / etc / nginx / sites-enabled / default + в + nano + (или в любом другом редакторе):

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

Внутри основного блока + server + (он должен уже содержать блок + location / +) добавьте еще один блок + location для обработки прокси URL` + / parse / + `:

/ И т.д. / Nginx / сайты с поддержкой / по умолчанию

. . .
       # 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 - Тестирование сервера разбора

На этом этапе у вас должно быть следующее:

  • Сертификат TLS / SSL, предоставленный Let’s Encrypt

  • MongoDB, защищенный сертификатом Let’s Encrypt

  • + parse-server + работает под пользователем * parse * на порту 1337, настроенном с ключами, ожидаемыми вашим приложением

  • + pm2 + управление процессом + parse-server + под пользователем * parse * и сценарий запуска для перезапуска + pm2 + при загрузке

  • + nginx, защищенный с помощью сертификата Let 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 по умолчанию, а мы не предоставляем никаких данных, вам нужно всего лишь отправить идентификатор приложения, чтобы прочитать некоторые примеры данных обратно:

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

Выполнение примера облачного кода

Простой POST без реальных данных для + https: /// parse / functions / hello + запустит функцию + hello () +, определенную в + / home / parse / cloud / main.js +:

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. Проконсультируйтесь с official attribute документа об использовании SDK Parse с Parse Server. Вам понадобится последняя версия SDK для вашей платформы. Как и в приведенных выше тестах на основе + curl +, используйте эту строку для URL сервера:

https:///parse

Вернитесь на панель анализа Parse в своем браузере и перейдите на вкладку * Migration *:

изображение: https: //assets.digitalocean.com/articles/parse_migration/small-004.png [Parse App: процесс миграции]

Нажмите кнопку * Завершить *:

изображение: https: //assets.digitalocean.com/articles/parse_migration/small-005.png [Parse Migration Finaling Dialog]

Ваше приложение должно быть перенесено.

Заключение и последующие шаги

Это руководство предлагает функциональную отправную точку для миграции приложения, размещенного на Parse, на установку Parse Server в одной системе Ubuntu, например, в виде капли DigitalOcean. Описанная нами конфигурация должна подходить для приложения с небольшим трафиком и скромной базой пользователей. Для размещения более крупного приложения может потребоваться несколько систем для обеспечения избыточного хранения данных и балансировки нагрузки между конечными точками API. Даже небольшие проекты могут включать инфраструктурные соображения, которые мы не рассмотрели напрямую.

Помимо чтения официальной документации Parse Server и отслеживания проблем GitHub для проекта при устранении неполадок, вы можете изучить следующие темы:

Related