Вступление
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 |
---|---|
|
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 |
Собрав все это вместе, мы получим:
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 для проекта при устранении неполадок, вы можете изучить следующие темы: