понеділок, 18 січня 2016 р.

Google Cloud: публікація додатку Node.js + MongoDB в хмарі

Нещодавно зіткнувся з проблемою розміщення в мережі невеликого додатку Node.js + MongoDB. Спробувавши кілька варіантів, вирішив зупинитись саме на пропозиції від Google Cloud. В цій статті спробую описати процес розміщення додатку.


Чому саме хмара від Google? 


Спочатку уточнення: буду використовувати контейнери Node.js та MongoDB від Bitnami, які присутні на gcloud. В жодному разі не рекомендую саме це рішення, як універсальну пігулку. Проте, для додатку Node.js з невеликою базою, що не вимагає реплікації, кращого рішення не знайшов.

Переваги:
  • низька вартість (до 10$/місяць);
  • можливість безболісного масштабування;
  • бонус у вигляді адреси додатку https://<ім'я проекту>.appspot.com;
  • два місяці тріалу.
Недоліки:
  • складне (як на мене, в порівнянні з Heroku чи Azure) налаштування;
  • бідна документація - просте посилання на сайт Bitnami з описом встановлення контейнера для всіх випадків.

Створення проекту gloud


Спочатку треба зареєструватись на cloud.google.com натиснувши кнопку "Free Trial". Також для користування навіть тріал-версіями продуктів, необхідно прив'язати платіжну картку (в процесі реєстрації чи пізніше через Menu - Billing консолі управління за адресою console.cloud.google.com).


Відразу після реєстрації, буде запропоновано створити новий проект. Якщо натиснути "Edit" можна підібрати цікаве ім'я для проекту, інакше воно буде згенероване автоматично:


Саме це ім'я буде фігурувати в адресі https://<ім'я проекту>.appspot.com, за якою буде доступний додаток. Можна погратись з "Advanced options", але на момент написання, керовані додатки можливо створювати лише в зоні "us-central".
В подпльшому, меню створення та керування проектами буде доступним після кліку на назві поточного проекту (права верхня частина тулбару консолі управління, поруч з полем пошуку):


Порожній проект Google Cloud створено. Нагадую, що консоль керування додатками знаходиться за адресою console.cloud.google.com.

Cloud Launcher


Cloud Launcher - зручний інструмент підключення модулів хмарного додатку. Саме з його допомогою підключимо до створеного проекту базу даних MongoDB від Bitnami. Для цього перейдемо до меню та виберемо відповідний пункт:


За допомогою рядка пошуку, знайдемо необхідний пакет - MongoDB від Bitnami

  

В наступному меню натиснемо кнопку "Launch on Compute Engine". Далі, оберемо параметри віртуального контейнера, на якому буде розміщено базу даних:


Параметрів конфігурації достатньо: оберіть відповідно до потреб Вашого додатку. Зверніть увагу на територіальне розміщення сервера - логічно розміщувати його поближче до споживачів. Я в цьому прикладі залишу все за змовчуванням, та натисну кнопку "Create". Встановлення завершиться через кілька хвилин з деталями створеного віртуального рескрсу. Увагу слід звернути, в першу чергу, на ім'я створеного ресурсу.

Налаштування Bitnami MongoDB


Перейдемо на вкладку менб "VM іnstances" та знайдемо створений віртуальний ресурс за ім’ям:


Перейшовши за посиланням, потрапляємо на сторінку кевування віртуальним ресурсом. На цій сторінці, серед різномаїття віджетів управління та контролю, також зібрані дані, що необхідні для доступу до віртуального сервера:


Перевіримо з’єднання з базою даних. Для цього на вашому комп’ютері має бути встановленим MongoDB та, якщо ви працюєте на Windows, більш-менш зручна консоль (термінал), наприклад, GitBash.
Відкриваємо термінал та набираємо команду для з’єднання:
mongo --username root -p --host xxx.xxx.xxx.xxx --port 27017
де xxx.xxx.xxx.xxx - IP адреса віртуального ресурсу (External IP з попереднього малюнка). В результаті цієї команди повинен з’явитись запит на введення паролю. Після введення правильного паролю - запрошення до введення команд у вигляді ">", та, можливо, деяка службова інформація.

Якщо з’днання встановлено, необхідно налаштувати базу даних. Більш детально почитати про налаштування можна почитати тут. Коротко - налаштування зводиться до трьох пунктів:
  • зміна паролю адміністратора баз даних;
  • створення окремого користувача та бази даних для додатку;
  • налаштування бази даних на прийом команд лише з адреси додатку.
Для зміни паролю адміністратора необхідно виконати команди (при встановленому підключенні):

db = db.getSiblingDB('admin')
db.changeUserPassword("root", "new_password")
де new_password - новий пароль адміністратора.

Щоб створити базу даних та користувача для додатку, потрібно виконати наступні команди:

db = db.getSiblingDB('db_name')
db.createUser( { user: "db_user", pwd: "db_password", roles: [ "readWrite", "dbAdmin" ] } )
де: db_name - ім’я бази даних, яку буде використовувати додаток, db_user - ім’я користувача бази даних, db_password - пароль для доступу до бази даних.
Щоб закрити поточне з’єднання, натисніть Ctrl + C або введіть команду "exit". Протестуємо з’єдняння створеного користувача з базою даних:
mongo xxx.xxx.xxx.xxx:27017/db_name -u db_user -p db_password
Залишилось налаштувати ще один параметр бази даних - IP-адресу додатку, з яким потрібно взаємодіяти. Повернимось до цього пункту в майбутніх публікаціях - зараз база доступна з будь-якої адреси.

Підключення з локального додатку Node.js


Спробуємо підключитись до створеної бази даних з додатку Node.js, що розміщений на локальному комп’ютері. Для прикладу створимо простий додаток Node.js:
npm init
Цей додаток просто підключатиметься до створеної бази даних та повідомлятиме про вдале підключення. Найкраще роботу додатку пояснює зміст файлу index.js:
var MongoClient = require('mongodb').MongoClient;
MongoClient.connect(process.env.DB_URI, function (err, db) {
    if (err) {
        return console.error('Can\'t connect to DB!');
    }
    console.log('Connection established'); 
})
Встановимо необхідний модуль mongodb (драйвер підключення до БД):
npm install --save mongodb
Задамо змінну середовища DB_URI та запустимо додаток:
DB_URI=mongodb://db_user:db_password@xxx.xxx.xxx.xxx/db_name node index.js
де db_user, db_password, xxx.xxx.xxx.xxx, db_name - ім’я користувача бази даних, пароль, IP-адреса, ім’я бази даних відповідно (див. попередній пункт цієї публікації).  Якщо в результаті роботи додатку отримали повідомлення
"Connection established" - значить все ОК.

Трохи вдосконалимо додаток, щоб ми змогли перевірити його роботу за допомогою браузера. Файл index.js повинен мати наступний вигляд:
var MongoClient = require('mongodb').MongoClient,
    express = require('express');
MongoClient.connect(process.env.DB_URI, function (err, db) {
    if (err) {
        return console.error('Can\'t connect to DB!');
    }
    var app = express();
    app.get('/', function (req, res) {
        res.json({ message: 'ok' });
    });
    app.listen(process.env.PORT || 3000, function () {
        console.log('Server started');
    });  
})
Також встановимо необхідний модуль express:
npm install --save express 
Для зручності, щоб не набирати щоразу команду запуску додатку, вкажемо її у розділі "scripts" файлу package.json для випадку тестової та production версій:
{
   ...
   ...
   "scripts": {
       "test": "DB_URI=mongodb://db_user:db_password@xxx.xxx.xxx.xxx/db_name node index.js",
       "start": "node index.js" 
   },
   ...
   ... 
}  
Тепер маємо можливість запустити додаток командою 
npm test 
Відкриємо браузер на сторінці localhost:3000, повинні спостерігати
{ "message" : "ok" }

 Публікація додатку за допомогою gcloud tool


Встановимо Google Cloud SDK відповідно до інструкцій. Виконаємо команду для ініціалізації gcloud:
gcloud init
В процесі ініціалізації ви повинні авторизуватись та надати відповідні дозволи для додатку (відкриється веб-браузер). Після надання доступу у браузері, в консолі необхідно буде ввести відповіді на кілька запитань, наприклад, зона розміщення сервера, тощо - на перший раз рекомендую залишити за змовчуванням. Також треба буде вказати ідентифікатор поточного проекту (див. пункт "Створення проекту gcloud"):
Enter project id would you like to use:
Після цього буде запропоновано зклонувати поточний проект: 
Generally projects have a repository named [default]. Would you like 
to try clone it? (Y/n)? 
 
Рекомендую відмовитись, тому що проект буде склоновано у поточну директорію під ім’ям "default", що може створити деяку путаницю. Склонувати проект можна командою:
gcloud source repos clone default YOUR_DIR
де YOUR_DIR - директорія, у яку буде склоновано проект. Особисто я полюбляю розміщувати цю директорію в папці проекту з ім’ям "release" або "dist", та копіювати в неї лише production версії файлів, необхідних для роботи додатку.

Скопіюємо в директорію YOUR_DIR файли нашого тестового проекту index.js та package.json, а також створимо файл app.yaml з наступним вмістом:
runtime: nodejs
vm: true
env_variables:
  DB_URI: 'mongodb://ufnprsr:News0FfoToUA16zx@104.155.55.150:27017/ufn'   skip_files:  - ^node_modules
Створений файл - конфігураційний, детальніше про можливі опції можна прочитати тут. В нашому випадку - вказано тип середовища, в якому працює додаток, що для нього потрібно створити окремий віртуальний ресурс, визначено змінну середовища та файли, які не потрібно копіювати на сервер.

Щоб запустити проект на сервері, потрібно виконати команду:
gcloud preview app deploy app.yaml --promote
підтвердити свої наміри в консолі (Y/n) та дочекатись завершення процесу встановлення, що може тривати кілька хвилин. Потім перейти за посиланням у браузері, що має вигляд https://<ім'я проекту>.appspot.com.

В результаті розгортання додатку nodejs на сервері, буде створено новий віртуальний сервер, що керується "google app engine" (його назва починатиметься з "gae"). Побачити його можна на вкладці "VM instances":


Увага! Під час наступних відправок додатку на сервер автоматично створюються нові віртуальні сервери. Cтарі не видаляються (на малюнку саме такий варіант). Навіть якщо ви їх видалите з з розділу "VM instances", через деякий час вони з’являться знову. Це може негативно вплинути на вартість користування хмарним сервісом.

Видаляти потрібно не віртуальні сервери, а версії додатку через меню "App Engine" -> "Versions". Також тут можливо змінити поточну активну версію додатку (Make Default):


На цьому закінчую опис розгортання веб-дадатку в Google Cloud. Нагадую, що в результаті описаних дій опубліковано тестовий додаток Node.js + MongoDB. Додаток працює на двох окремих обчислювальних нодах (compute engine VM instances), але в межах одного проекту. Звичайно, можливі й інші варани розгортання додатків такого типу в залежності від необхідних ресурсів. Наприклад, на єдиному обчислювальному вузлі з використанням рішення MEAN stack від Bitnami; або на троьх і більше обчислювальних вузлах при використанні для бази даних рішення MongoDB (Click to deploy). Успіхів!

Немає коментарів:

Дописати коментар