Развертывание веб-приложения Node.js и MongoDB в Azure

Служба приложений Azure — это высокомасштабируемая служба размещения с самостоятельной установкой исправлений на основе операционной системы Linux. В этом руководстве показано, как создать безопасное приложение Node.js в Службе приложений Azure, которое подключено к базе данных MongoDB (с помощью Azure Cosmos DB с API MongoDB). По завершении вы получите приложение Express.js, работающее в Службе приложений Azure в Linux.

Схема, на которой показано, как приложение Express.js будет развернуто в Службе приложений Azure и как данные MongoDB будут размещены в Azure Cosmos DB.

В этой статье предполагается, что вы уже знакомы с разработкой Node.js, и что у вас установлены Node и MongoDB в локальной среде. Вам также потребуется учетная запись Azure с активной подпиской. Если у вас нет учетной записи Azure, ее можно создать бесплатно.

Пример приложения

Для работы с этим руководством клонируйте или скачайте пример приложения из репозитория https://github.com/Azure-Samples/msdocs-nodejs-mongodb-azure-sample-app.

git clone https://github.com/Azure-Samples/msdocs-nodejs-mongodb-azure-sample-app.git

Если вы хотите запустить приложение локально, сделайте следующее:

  • Установите зависимости пакета, выполнив команду npm install.
  • Скопируйте файл .env.sample в .env и в качестве значения параметра DATABASE_URL укажите URL-адрес MongoDB (например, MongoDB://localhost:27017/).
  • Запустите приложение с помощью команды npm start.
  • Чтобы просмотреть приложение, перейдите по адресу http://localhost:3000.

1. Создание Службы приложений и Cosmos DB

В этом шаге вы создадите ресурсы Azure. Действия, описанные в этом учебнике, создают набор ресурсов по умолчанию, включающий Службу приложений и API Azure Cosmos DB для MongoDB. В процессе создания вы укажете следующее:

  • Имя веб-приложения. Это имя используется в составе DNS-имени вашего веб-приложения в виде https://<app-name>.azurewebsites.net.
  • Регион для физического запуска приложения.
  • Стек среды выполнения для приложения. Здесь следует выбрать версию Node, которая будет использоваться для приложения.
  • План размещения для приложения. Это ценовая категория, которая включает набор функций и емкость масштабирования для вашего приложения.
  • Группа ресурсов для приложения. Группа ресурсов позволяет группировать (в логическом контейнере) все ресурсы Azure, необходимые для приложения.

Войдите на портал Azure и выполните следующие действия, чтобы создать ресурсы Службы приложений Azure.

Шаг 1. На портале Azure выполните следующие действия:

  1. Введите "веб-приложение база данных" в строке поиска в верхней части портала Azure.
  2. Выберите элемент с меткой Веб-приложение и база данных под заголовком Marketplace. Вы также можете перейти напрямую к мастеру создания.

Снимок экрана, на котором показано, как использовать поле поиска на верхней панели инструментов для поиска мастера создания

Шаг 2. На странице Создание веб-приложения+базы данных заполните форму следующим образом.

  1. Группа ресурсов — выберите Создать и используйте имя msdocs-expressjs-mongodb-tutorial.
  2. Регион → любой ближайший к вам регион Azure.
  3. Имя — используйте имя msdocs-expressjs-mongodb-XYZ, где XYZ представляет три произвольных символа. Это имя должно быть уникальным в Azure.
  4. Стек среды выполнения — Node 16 LTS.
  5. План размещения — Базовый. Позже, когда все будет готово, вы сможете вертикально увеличить масштаб до рабочей ценовой категории.
  6. API Cosmos DB для MongoDB выбран по умолчанию в качестве ядра СУБД. Azure Cosmos DB — это облачная база данных, предлагающая API со 100 % совместимостью с MongoDB. Запишите созданное имя базы данных (<имя-приложения>-database). Он понадобится вам позднее.
  7. Выберите Review + create (Просмотреть и создать).
  8. После завершения проверки щелкните Создать.

Снимок экрана: настройка нового приложения и базы данных в мастере

Шаг 3. Развертывание занимает несколько минут. После завершения развертывания нажмите кнопку Перейти к ресурсу. Вы перейдете непосредственно в приложение Службы приложений, но будут созданы следующие ресурсы:

  • Группа ресурсов — Контейнер для всех созданных ресурсов.
  • План службы приложений — определяет вычислительные ресурсы для Службы приложений. Создается план Linux на уровне Базовый.
  • Служба приложений — представляет приложение и выполняется в плане службы приложений.
  • Виртуальная сеть — интегрирована с приложением Службы приложений и изолирует внутренний сетевой трафик.
  • Частная конечная точка — конечная точка доступа к ресурсу базы данных в виртуальной сети.
  • Сетевой интерфейс — представляет частный IP-адрес для частной конечной точки.
  • API Cosmos DB для MongoDB — доступен только из частной конечной точки. База данных и пользователь создаются на этом сервере.
  • Частная зона DNS — включает разрешение DNS сервера Cosmos DB в виртуальной сети.

Снимок экрана: процесс развертывания завершен.

2. Настройка подключения к базе данных

Мастер создания уже создал универсальный код ресурса (URI) MongoDB, но приложению требуются переменные DATABASE_URL и DATABASE_NAME. На этом шаге вы создадите параметры приложения с нужным форматом.

Шаг 1. В левом меню на странице Службы приложений выберите Конфигурация.

Снимок экрана: открытие страницы конфигурации в Службе приложений.

Шаг 2. На странице Конфигурация вкладки Параметры приложения создайте параметр DATABASE_NAME:

  1. Выберите Новый параметр приложения.
  2. В поле Имя введите DATABASE_NAME.
  3. В поле Значение введите автоматически созданное имя базы данных из мастера создания, которое имеет вид msdocs-expressjs-mongodb-XYZ-database.
  4. Щелкните ОК.

Снимок экрана: просмотр автоматически созданной строки подключения.

Шаг 3.

  1. Прокрутите страницу вниз и выберите строку подключения MONGODB_URI. Она была создана мастером создания.
  2. В поле Значение нажмите кнопку Копировать и вставьте значение в текстовый файл для следующего шага. Для него используется формат URI строки подключения MongoDB.
  3. Нажмите кнопку Отмена.

Снимок экрана: создание параметра приложения.

Шаг 4.

  1. Используя те же действия, что и в шаге 2, создайте параметр приложения с именем DATABASE_URL и присвойте ему значение, скопированное из строки подключения MONGODB_URI (т. е. mongodb://...).
  2. В строке меню вверху выберите Сохранить.
  3. При появлении запроса выберите Далее.

Снимок экрана: сохранение параметров на странице конфигурации.

3. Развертывание примера кода

На этом шаге вы настроите развертывание GitHub с помощью GitHub Actions. Это всего лишь один из множества способов развертывания в Службе приложений, но это также отличный способ обеспечения непрерывной интеграции в процессе развертывания. По умолчанию каждая команда git push из репозитория GitHub запускает действие сборки и развертывания.

Шаг 1. В новом окне браузера сделайте следующее:

  1. Войдите в учетную запись GitHub.
  2. Перейдите к https://github.com/Azure-Samples/msdocs-nodejs-mongodb-azure-sample-app.
  3. Нажмите Fork.
  4. Щелкните Создать вилку.

Снимок экрана: создание вилка примера репозитория GitHub.

Шаг 2. На странице GitHub откройте Visual Studio Code в браузере, нажав клавишу ..

Снимок экрана: открытие окна браузера с Visual Studio Code в GitHub.

Шаг 3. В Visual Studio Code в браузере откройте файл config/connection.js в обозревателе. В функции getConnectionInfo вы увидите, что используются параметры приложения, созданные вами ранее для подключения MongoDB (DATABASE_URL и DATABASE_NAME).

Снимок экрана: Visual Studio Code в браузере и открытый файл.

Шаг 4. Вернитесь на страницу Службы приложений и в меню слева выберите Центр развертывания.

Снимок экрана: открытие центра развертывания в Службе приложений.

Шаг 5. На странице "Центр развертывания" сделайте следующее:

  1. В поле Источник выберите GitHub. По умолчанию в качестве поставщика сборки выбрано GitHub Actions.
  2. Войдите в свою учетную запись GitHub и следуйте инструкциям по авторизации Azure.
  3. В поле Организация выберите свою учетную запись.
  4. В репозитории выберите msdocs-nodejs-mongodb-azure-sample-app.
  5. В поле Ветвь выберите main.
  6. В меню сверху выберите Сохранить. Служба приложений фиксирует файл рабочего процесса в выбранном репозитории GitHub в каталоге .github/workflows.

Снимок экрана: настройка CI/CD с помощью GitHub Actions.

Шаг 6. На странице "Центр развертывания" сделайте следующее:

  1. Выберите Журналы. Прогон развертывания уже запущен.
  2. В элементе журнала для прогона развертывания выберите Журналы сборки и развертывания.

Снимок экрана: открытие журналов развертывания в центре развертывания.

Шаг 7. Вы перейдете в репозиторий GitHub и увидите, что выполняется действие GitHub. Файл рабочего процесса определяет два отдельных этапа: сборку и развертывание. Дождитесь, пока в выполнении действия GitHub не будет показано состояние Завершено. Это занимает около 15 минут.

Снимок экрана: выполнение действия GitHub.

4. Переход в приложение

Шаг 1. На странице Службы приложений сделайте следующее:

  1. В меню слева выберите Обзор.
  2. Выберите URL-адрес своего приложения. Также можно перейти непосредственно по адресу https://<app-name>.azurewebsites.net.

Снимок экрана: запуск Службы приложений с портала Azure.

Шаг 2. Добавьте несколько задач в список. Вы запустили безопасное управляемое данными приложение Node.js в Службе приложений Azure.

Снимок экрана: приложение Express.js, выполняющееся в Службе приложений.

5. Потоковая передача журналов диагностики

Служба приложений Azure захватывает все сообщения, выводимые на консоль, чтобы помочь в диагностике проблем приложения. Пример приложения выводит сообщения журнала консоли в каждой из своих конечных точек для демонстрации этой возможности. Например, конечная точка get выводит сообщение о количестве задач, полученных из базы данных, и если что-то идет не так, появляется сообщение об ошибке.

router.get('/', function(req, res, next) {
  Task.find()
    .then((tasks) => {      
      const currentTasks = tasks.filter(task => !task.completed);
      const completedTasks = tasks.filter(task => task.completed === true);

      console.log(`Total tasks: ${tasks.length}   Current tasks: ${currentTasks.length}    Completed tasks:  ${completedTasks.length}`)
      res.render('index', { currentTasks: currentTasks, completedTasks: completedTasks });
    })
    .catch((err) => {
      console.log(err);
      res.send('Sorry! Something went wrong.');
    });
});

Шаг 1. На странице Службы приложений сделайте следующее:

  1. В меню слева выберите Журналы службы приложений.
  2. Под элементом Ведение журнала приложения выберите Файловая система.

Снимок экрана: включение собственных журналов в Службе приложений на портале Azure.

Шаг 2. В меню слева выберите Поток журналов. Вы увидите журналы для своего приложения, включая журналы платформы и журналы из контейнера.

Снимок экрана: просмотр потока журналов на портале Azure.

6. Проверка развернутых файлов с помощью Kudu

Служба приложений Azure предоставляет веб-консоль диагностики с именем Kudu, которая позволяет проверять среду размещения сервера для веб-приложения. С помощью Kudu можно просматривать файлы, развернутые в Azure, проверять журнал развертывания приложения и даже открыть сеанс SSH в среде размещения.

Шаг 1. На странице Службы приложений сделайте следующее:

  1. В меню слева выберите Дополнительные инструменты.
  2. Выберите Перейти. Также можно перейти непосредственно по адресу https://<app-name>.scm.azurewebsites.net.

Снимок экрана: переход на страницу Kudu Службы приложений.

Шаг 2. На странице Kudu выберите Развертывания.

Снимок экрана: главная страница приложения Kudu SCM, на которой показана различная информация о среде размещения.

Если вы развернули код в Службе приложений с помощью Git или ZIP-развертывания, вы увидите журнал развертываний веб-приложения.

Снимок экрана: журнал развертывания приложения Службы приложений в формате JSON.

Шаг 3. Вернитесь на домашнюю страницу Kudu и выберите Site wwwroot.

Снимок экрана: выбор

Будете показана развернутая структура папок. Вы можете переходить по ней и просматривать файлы.

Снимок экрана: развернутые файлы в каталоге wwwroot.

7. Очистка ресурсов

По завершении работы можно удалить все ресурсы из вашей подписки Azure, удалив соответствующую группу ресурсов.

Шаг 1. В строке поиска в верхней части портала сделайте следующее:

  1. Введите имя группы ресурсов.
  2. Выберите группу ресурсов.

Снимок экрана: поиск группы ресурсов на портале Azure и переход к ней.

Шаг 2. На странице группы ресурсов нажмите Удалить группу ресурсов.

Снимок экрана: расположение кнопки

Шаг 3.

  1. Введите имя группы ресурсов для подтверждения удаления.
  2. Выберите команду Удалить.

Снимок экрана: диалоговое окно подтверждения для удаления группы ресурсов на портале Azure. :

Часто задаваемые вопросы

Сколько стоит такая конфигурация?

Цены на создание ресурсов приведены ниже:

  • План службы приложений создается на уровне Базовый, и его можно масштабировать вверх или вниз. См. цены на Службу приложений.
  • Сервер Cosmos DB создается в одном регионе и может быть распределен по другим регионам. См. страницу цен на Azure Cosmos DB.
  • Плата за виртуальную сеть не взимается, если только вы не настроите дополнительные функциональные возможности, такие как пиринг. См. цены на виртуальные сети Azure.
  • За частную зону DNS взимается небольшая плата. См. цены на Azure DNS.

Как подключиться к серверу Cosmos DB, защищенному виртуальной сетью, с помощью других средств?

  • Для базового доступа из программы командной строки можно запустить mongosh из терминала SSH приложения. Контейнер приложения не предоставляется вместе с mongosh, поэтому его необходимо установить вручную. Помните, что установленный клиент не сохраняется во время перезапуска приложения.
  • Чтобы подключиться из клиента MongoDB с графическим пользовательским интерфейсом, компьютер должен находиться в соответствующей виртуальной сети. Например, это может быть виртуальная машина Azure, подключенная к одной из подсетей, или компьютер в локальной сети с VPN-подключением типа "сеть — сеть" к виртуальной сети Azure.
  • Чтобы подключиться из оболочки Mongo со страницы управления Cosmos DB на портале, компьютер также должен находиться в виртуальной сети. Вместо этого можно открыть брандмауэр сервера Cosmos DB для IP-адреса локального компьютера, но это увеличит количество направлений атак для вашей конфигурации.

Как осуществляется разработка локальных приложений с использованием GitHub Actions?

Возьмем автоматически созданный файл рабочего процесса из Службы приложений в качестве примера, где каждый git push запускает новый прогон сборки и развертывания. Из локального клона репозитория GitHub вы вносите необходимые обновления в GitHub. Пример:

git add .
git commit -m "<some-message>"
git push origin main

Почему развертывание GitHub Actions идет так медленно?

Автоматически созданный файл рабочего процесса из Службы приложений определяет прогон из двух заданий — сначала сборка, потом развертывание. Так как каждое задание выполняется в собственной чистой среде, файл рабочего процесса гарантирует, что задание deploy имеет доступ к файлам из задания build:

Большая часть времени, затрачиваемого процессом из двух заданий, уходит на отправку и скачивание артефактов. При желании файл рабочего процесса можно упростить, объединив два задания в одно, что устраняет необходимость в шагах отправки и скачивания.

Дальнейшие действия