В процессе очередного подхода в обучении разработке для Android Studio я наткнулся на Parse Server. Решил поднять его на своем VDS, поднял, использую. Эта статья просто шпаргалка по установке Parse Server на собственный VDS с Debian 8 Jessie x64.
Что такое Parse Server
Parse Server сейчас (раньше это был готовый сервис для бэкэнда приложений, и в этом качестве все это выглядело куда интереснее) — это бесплатная софтовая прокладка (backend) для соединения внешних приложений (Android, iOS и любых других) с noSQL БД MongoDB для хранения данных используемых приложением.
Для обеспечения доступа к серверу Parse Server поднимает HTTP сервер на фреймворке ExpressJS для Node.js. Кроме обеспечения доступа к MongoDB Parse Server умеет делать WebHooks, то есть можно создавать свои endpoints для выполнения скриптов на JS выполняемых в Node.JS. А также может делать задачи по расписанию — Jobs, которые также пишутся на JavaScript для Node.JS.
Панель управления для Parse Server — Parse Dashboard
У Parse Server есть довольно симпатичная и удобная Parse Dashboard, в которой можно админить как монгу, так и вебхуки с кронджобами. В пределах одного инстанса Parse Server и одного инстанса Parse Dashboars можно создавать backends для нескольких приложений (то есть не нужно под каждое приложение поднимать свой Parse Server).
Впечатления вебразработчика о Parse Server
С позиции вебразработчика все это нагромождение технологий выглядит сомнительно. На мой взгляд просто для доступа к базе было бы достаточно в качестве вебсервера nginx для ограничений доступа и самой базы хоть MySQL хоть MongoDB, но возможно это просто дело привычки.
Но, как бы то ни было, сложилось впечатление что Parse Server на рынке мобильных приложений уже сложился. AWS предлагает его установку из коробки, DigitalOcean вроде бы тоже (но это не точно), но мне было интересно развернуть его на своем VDS от RuWEB (который мне стоит 130 рублей в месяц и соотв. значительно дешевле чем любое облако).
Установка Parse Server на VDS с Debian 8 Jessie
Для установки Parse Server нам будут нужны MongoDB и NodeJS с npm. Я не использую эти технологии в основной работе, знаком с ними поверхностно, и не профессиональный админ, поэтому схема установки наверняка может быть более эффективной, однако описанная схема вполне рабочая. Поскакали.
Установка MongoDB на Debian 8 Jessie x64
Для Parse Server нам нужна MongoDB > 2.6 , оптимальная на момент написания статьи это 3.2 (самая свежая 4.0). Нюанс о который я убил больше часа в том что коммьюнити версия монги для 32 битных версий Debian не ставится из репозитория, только из архивов ручками. А из репозитория Debian ставится версия 2.4 на которую не ставится Parse Server !!!! Поэтому для Parse Server лучше заказывать VDS с 64 разрядной операционкой. В этом случае схема установки проста и описана на https://docs.mongodb.com/v3.2/tutorial/install-mongodb-on-debian/
1 2 3 4 |
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv D68FA50FEA312927 echo "deb http://repo.mongodb.org/apt/debian jessie/mongodb-org/3.2 main" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.2.list sudo apt-get update sudo apt-get install -y mongodb-org |
Если получаем ошибку
1 |
E: unable to locate package mongodb-org |
То, скорее всего, это как раз ситуация когда у вас 32 разрядная ОС ( можно уточнить командой
arch , а версию ОС можно уточнить
cat /etc/issue ). В этом случае можно поставить MongoDB командой
1 |
sudo apt-get install -y mongodb |
Однако в этом случае она будет установлена из репо Debian, и в моем случае ставилась версия 2.4, что мало для Parse Server. Кстати для удаления не нужной версии монги нужно
1 2 3 |
sudo apt-get remove mongodb sudo apt-get purge mongodb sudo apt-get autoremove |
Монгу коммьюнити (mongodb-org) для 32 разрядной версии Debian можно поставить только из tar ручками. Я этого делать не стал, а взял под Parse Server 64 битный Debian.
Затем запускаем sudo service mongod start проверяем версию mongod --version . С базой все.
Установка NodeJS
Здесь все гораздо проще. Стабильная версия на момент написания статьи 10. Полезная статья https://www.digitalocean.com/community/tutorials/how-to-install-node-js-on-debian-9
1 2 3 4 5 6 7 |
sudo apt-get install curl cd ~ curl -sL https://deb.nodesource.com/setup_10.x -o nodesource_setup.sh sudo bash nodesource_setup.sh sudo apt-get install –y nodejs node –v npm –v |
Если версии вывелись, то все готово и переходим к установке Parse Server.
Установка Parse Server
Для его установки нам может понадобится git. Parse Server будет установлен в папку пользователя под которым все эти действия происходят.
1 2 3 4 5 6 |
sudo apt-get install git cd ~ git clone https://github.com/ParsePlatform/parse-server-example.git cd ~/parse-server-example npm install npm start |
Если npm start отработал успешно и без ошибок, то устанавливаем модуль npm parse-dashboard , который и есть та панель управления .
1 |
npm install parse-dashboard -g |
Обратите внимание на параметр -g который означаем что мы ставим модуль глобально. Это позволило бы нам запускать панель из командной строки с прописыванием настроек в config.json (как пишут во многих инструкциях), но мы так делать не будем — мы пропишем загрузку панели в настройку Parse Server и запуск одновременно с ним.
Также установим модуль npm forever, который позволит запустить сервер в фоне и позволит работать и ему и панели управления после завершения сеанса SSH.
1 |
npm install forever -g |
Теперь перейдем к настройке Parse Server
Настройка Parse Server
Все настройки сервера хранятся в файле ~/parse-server-example/index.js , открываем его и заполняем его примерно таким образом (см. комментарии).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
var express = require('express'); // подключаем модуль вебсервера var ParseServer = require('parse-server').ParseServer; // подключаем модуль Parse Server var path = require('path'); // подключаем модель Parse Dashboard // !! обратить внимание на путь - он такой в сл. глобальной установки var ParseDashboard = require('/usr/lib/node_modules/parse-dashboard'); var databaseUri = process.env.DATABASE_URI || process.env.MONGODB_URI; if (!databaseUri) { console.log('DATABASE_URI not specified, falling back to localhost.'); } // * ключи var appId = "appIDazzrael1907"; var masterKey = "masterKeyazzrael1907"; var endPoint = "azzraelru"; // * настройка Parse Dashboard var dashboard = new ParseDashboard({ "apps": [{ "serverURL": "http://IPвашегосервера:1337/parse/" + endPoint, "appId": appId, "masterKey": masterKey, "appName": "azzraelru" } ], // придумай админские пароли к Dashboard "users": [{ "user": "admin", "pass": process.env.USER_PASS || "admin12345" }] }, { allowInsecureHTTP: true }); // чтобы получить доступ к панели по http // * настройка Parse Server var api = new ParseServer({ databaseURI: databaseUri || 'mongodb://localhost:27017/' + endPoint, cloud: process.env.CLOUD_CODE_MAIN || __dirname + '/cloud/main.js', appId: process.env.APP_ID || appId, // см. выше masterKey: process.env.MASTER_KEY || masterKey, // см. выше serverURL: process.env.SERVER_URL || 'http://localhost:1337/parse', // !!! НЕ МЕНЯТЬ liveQuery: { classNames: ["Posts", "Comments"] // List of classes to support for query subscriptions } }); // * Готовим ExpressJS var app = express(); app.use('/public', express.static(path.join(__dirname, '/public'))); var mountPath = process.env.PARSE_MOUNT || '/parse/' + endPoint; // !!! Префикс /parse/ ОБЯЗАТЕЛЕН app.use(mountPath, api); // текст который будем отдавать на открытие ссылки в браузере app.get('/', function(req, res) { res.status(200).send('Nothing here'); }); app.get('/test', function(req, res) { res.sendFile(path.join(__dirname, '/public/test.html')); }); var port = process.env.PORT || 1337; // порт можно поменять var httpServer = require('http').createServer(app); httpServer.listen(port, function() { console.log('parse-server-example running on port ' + port + '.'); }); // This will enable the Live Query real-time server ParseServer.createLiveQueryServer(httpServer); |
Это настройка для одного приложения. Для нескольких нужно создать несколько объектов ParseServer со своими appId, masterKey и endPoint и прописать их в массив ParseDashboard apps.
Если на VDS используется iptables , то надо не забыть прописать rules на порт 1337 и 4040. Например такие
1 2 |
-A INPUT -p tcp -m tcp --dport 1337 -j ACCEPT -A INPUT -p tcp -m tcp --dport 4040 -j ACCEPT # dashboard |
После этого Панель Управления будет доступна по адресу http://
Подключение своего Parse Server в Android Studio
В build.gradle (Module) добавляем блок
1 2 3 4 5 |
repositories { mavenCentral() jcenter() maven { url 'https://jitpack.io' } } |
В strings.xml прописываем url до Parse Server и ключи
1 2 3 |
<string name="ps_server_url">http://IP вашего сервера:1337/parse/ваш endPoint</string> <string name="ps_app_id">ваш appId</string> <string name="ps_client_key">ваш masterKey</string> |
В манифест
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
... <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.INTERNET"/> <application ...> <meta-data android:name="com.parse.SERVER_URL" android:value="@string/ps_server_url" /> <meta-data android:name="com.parse.APPLICATION_ID" android:value="@string/ps_app_id" /> <meta-data android:name="com.parse.CLIENT_KEY" android:value="@string/ps_client_key" /> <activity android:name=".MainActivity"> ... |
И используем в приложении подобным образом
1 2 3 4 5 6 7 8 9 10 |
Parse.initialize(new Parse.Configuration.Builder(this) .applicationId(getString(R.string.ps_app_id)) .clientKey(getString(R.string.ps_client_key)) .server(getString(R.string.ps_server_url)) .build() ); ParseObject testObject = new ParseObject("wheather"); testObject.put("city", "Leningrad"); testObject.saveInBackground(); |
С необходимыми импортами.