Как разместить приложение Node.js?

Host Node JS
Host Node JS

В этой статье мы поговорим о Node.js и вариантах его развертывания, в частности о IaaS, PaaS и CaaS. Мы проанализируем каждый из вариантов и рассмотрим некоторых из наиболее популярных поставщиков, предлагающих эти облачные услуги.

Во второй части статьи мы узнаем, как собрать, докеризировать и развернуть простое Node.js-приложение в контейнерах Back4app.

Что такое Node.js?

Node.js – это кроссплатформенная серверная среда с открытым исходным кодом, которая позволяет выполнять JavaScript вне веб-браузера. Она имеет асинхронную событийно-ориентированную архитектуру и работает на движке V8 JavaScript Engine от Google. Эти две характеристики делают ее исключительно производительной и масштабируемой.

До появления Node.js JavaScript-разработчики могли работать только над кодом фронтенда. Это было довольно неудобно, поскольку бэкенды приходилось писать на другом языке программирования.

Кроме того, компаниям требовались как фронтенд-, так и бэкенд-инженеры. Но с выходом Node.js в 2009 году JavaScript-разработчики стали разработчиками полного стека.

У Node огромное количество вариантов использования. Серверная среда исполнения может использоваться для создания сценариев на стороне сервера, веб-игр, построения RESTful API, приложений реального времени и многого другого. Ее используют многие технологические компании, такие как PayPal, Uber, Netflix и LinkedIn.

Node широко используется благодаря своей скорости, масштабируемости, обширной экосистеме модулей и библиотек, зрелости и большому сообществу.

Тем не менее, он имеет ряд недостатков, таких как низкая производительность при выполнении сложных задач, нестабильный API и отсутствие сильной системы поддержки библиотек.

Чтобы узнать больше о преимуществах и недостатках Node.js, посмотрите статью Как развернуть приложение Node.js? (подход BaaS)

Где разместить приложение Node.js?

Приложения Node могут быть размещены на различных облачных вычислительных сервисах. Наиболее популярными вариантами для развертывания приложений Node.js являются:

  • Инфраструктура как услуга
  • Платформа как услуга
  • Контейнеры как сервис

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

Решения IaaS, PaaS и CaaS

Давайте рассмотрим каждую из упомянутых моделей облачных вычислений.

IaaS (инфраструктура как услуга)

Инфраструктура как услуга (IaaS) – это модель облачных вычислений, в которой поставщик облачных услуг предлагает вычислительные ресурсы через Интернет.

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

IaaS – это наименее абстрагированный вариант, поэтому очень гибкий и настраиваемый. Минус этого варианта в том, что клиент несет ответственность за свою ОС, приложения и данные. Этот вариант не подходит новичкам для размещения Node.js-приложений, поскольку требует приличных знаний в области системного администрирования.

Amazon Web Services (AWS)

Amazon Web Services (AWS) – это платформа облачных вычислений по требованию, предоставляемая компанией Amazon. Она предлагает широкий спектр облачных сервисов, включая виртуальные компьютеры, объектные хранилища, базы данных, инструменты ML/AI, сетевые технологии, системы технического зрения и многое другое.

На момент написания статьи AWS является самой популярной платформой для облачных вычислений с долей рынка около 32 %. Их трендовыми IaaS-решениями являются:

  • Amazon EC2 (Elastic Compute Cloud) используется для создания высококонфигурируемых виртуальных компьютеров.
  • Amazon S3 (Cloud Object Storage) – это простое в использовании и масштабируемое хранилище объектов.
  • Amazon VPC (Virtual Private Cloud) позволяет клиентам создавать изолированные виртуальные сети.

Чтобы развернуть готовое к производству приложение Node на AWS, вам, скорее всего, придется комбинировать различные решения IaaS и PaaS.

Google Cloud Platform

Google Cloud Platform (GCP) – еще одна популярная платформа облачных вычислений, подходящая для размещения Node.js. Это зрелая и стабильная платформа, которая была выпущена более десяти лет назад.

GCP предлагает широкий спектр решений IaaS, PaaS, CaaS и BaaS. Большинство продуктов Google для конечных пользователей, таких как Gmail, Slides и Docs, работают на GCP.

Наиболее популярными продуктами IaaS являются:

  • Google GKE (Compute Engine) позволяет клиентам создавать, управлять и запускать виртуальные машины.
  • Google GCS (облачное хранилище) – это управляемый сервис для хранения неструктурированных данных.
  • Google Persistent Disk – это надежное и высокопроизводительное блочное хранилище для экземпляров виртуальных машин.

Как и в случае с AWS, для развертывания приложения вам потребуется объединить несколько продуктов GCP.

Microsoft Azure

Microsoft Azure или просто Azure – это платформа облачных вычислений, предлагаемая компанией Microsoft, которая является отличным вариантом для размещения Node.js. Она включает в себя более 200 продуктов для вычислений, хранения данных, искусственного интеллекта, машинного обучения, технического зрения, интернета вещей и так далее. По данным исследования Appinventiv, ее доля рынка составляет 22 %.

Их популярными IaaS-предложениями являются Azure Virtual Machines, Azure Storage и Azure Backup.

PaaS (платформа как услуга)

Платформа как услуга (PaaS) – это модель облачных вычислений, которая позволяет пользователям разрабатывать, управлять и предоставлять приложения в облачной среде. Кроме того, поставщики PaaS обычно предлагают широкий спектр готовых инструментов для разработки, настройки и тестирования приложений.

PaaS проще в использовании, чем IaaS, и не требует особых знаний в области системного администрирования. Используя PaaS, вы также сможете воспользоваться преимуществами управляемых баз данных, автоматического резервного копирования, балансировщиков нагрузки и т. д. К минусам PaaS можно отнести риск привязки к поставщику, а также более низкий уровень гибкости и контроля по сравнению с IaaS.

Heroku

Heroku – самый популярный PaaS на рынке. Он был создан в 2007 году и стал одним из первых PaaS-решений. Она поддерживает множество языков программирования, включая Java, Node.js, PHP, Go, Scala и Python. Платформа чрезвычайно проста в использовании, обеспечивает большие возможности масштабирования и имеет огромную систему дополнений.

До конца 2022 года платформа предоставляла бесплатный тарифный план для веб-приложений, а также бесплатные экземпляры PostgreSQL и Redis. К сожалению, они отменили бесплатный тарифный план, чтобы противостоять мошенничеству и ботам.

К минусам Heroku можно отнести дороговизну по сравнению с другими решениями на рынке, риск блокировки поставщика и отсутствие хорошей региональной поддержки (если вы не корпоративный пользователь).

Render

Render – это единое облако для создания и запуска всех ваших приложений и веб-сайтов. Оно имеет удобный пользовательский интерфейс и очень простое в использовании. Самое лучшее в Render – это бесплатный хостинг для статических сайтов, веб-приложений и даже экземпляров PostgreSQL и Render.

К минусам Render можно отнести то, что это относительно новая платформа, приложения на бесплатном уровне долго загружаются, а также плохую региональную поддержку (всего 4 региона).

CaaS (контейнеры как услуга)

Контейнеры как услуга (CaaS) – это модель облачных вычислений, которая позволяет легко создавать, запускать, развертывать и управлять контейнерным программным обеспечением. Программное обеспечение обычно контейнеризируется с помощью технологии Docker. Такой подход требует первоначальной настройки, но после этого его очень легко использовать.

Back4app Containers

Back4app Containers – это платформа Containers as a Service (CaaS), которая позволяет легко развертывать докерные приложения. Она имеет встроенную систему CI/CD, отличную интеграцию с GitHub и является отличным вариантом для хостинга серверов Node.js.

Развернуть приложение на Back4app Containers так же просто, как импортировать репозиторий и нажать на кнопку. Платформа предлагает бесплатный уровень и платные уровни, которые масштабируются по мере продвижения.

Amazon Elastic Container Service (ECS)

Amazon Elastic Container Service (ECS) – это комплексный сервис для оркестровки контейнеров. Он упрощает развертывание, управление, наблюдение и масштабирование контейнерных приложений. Платформа относительно недорога и довольно проста в использовании, если вы уже знакомы с другими продуктами AWS.

Google Kubernetes Engine (GKE)

Google Kubernetes Engine (GKE) – это продвинутый и автоматизированный сервис Kubernetes. Платформа отличается высокой масштабируемостью и позволяет удовлетворить потребности любого сайта в трафике. Два самых больших минуса GKE – это то, что он не так прост в использовании и относительно дорог.

Как разместить приложение Node.js?

В этом разделе мы построим, докеризуем и развернем приложение Node.js в контейнерах Back4app.

Введение в проект

Мы создадим простой Node.js RESTful API для получения статистики пользователей GitHub. API будет возвращать информацию о пользователе на GitHub, а также количество его последователей, фолловеров и полученных звезд.

API будет реализован с помощью Express – фреймворка для веб-приложений Node.js. После тестирования мы докеризуем его и развернем на Back4app Containers.

Если вас интересует только процесс развертывания, смело пропускайте первые два раздела.

Проект “Инит

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

Сначала создайте новый каталог и перейдите в него:

$ mkdir express-github-stats && cd express-github-stats

Если вы работаете над сложным приложением Express, то, скорее всего, захотите создать его с помощью генератора приложений Express. Этот инструмент устанавливает все необходимое для создания сложных Express-приложений, например шаблоны, маршрутизацию и многое другое.

Затем запустите npm init, чтобы создать package.json для приложения:

$ npm init

Эта команда предложит вам ответить на ряд вопросов о версии пакета, его описании и так далее. Вы можете заполнить их или просто нажать ENTER несколько раз.

Поскольку мы хотим использовать Express, давайте установим его:

$ npm install express

Создайте новый файл с именем index.js в корне проекта, как показано ниже:

// index.js

const express = require("express");
const app = express();

app.get("/", (req, res) => {
  res.send("Back4app rocks!");
});

app.listen(3000, () => {
  console.log("App listening on port 3000")
});

Этот простой скрипт инициализирует новое приложение Express, которое слушает порт 3000. Кроме того, он определяет индексный маршрут(/), который возвращает сообщение Back4app rocks! Если маршрут не существует, возвращается ошибка 404.

Чтобы проверить его, запустите сервер:

$ node index.js

Затем откройте свой любимый веб-браузер и перейдите на сайт http://localhost:3000.

Лучший способ запуска приложений Node.js при разработке – использование Nodemon. Nodemon – это инструмент, который автоматически перезапускает ваше приложение Node.js при обнаружении изменений в файлах.

Код приложения

У нашего веб-приложения будет два URL-адреса:

  1. / возвращает информацию об API
  2. / / возвращает информацию и статистику GitHub конкретного пользователя.

Сначала измените конечную точку индекса следующим образом:

// index.js

// ...

app.get("/", (req, res) => {
  return res.json({
    name: "express-github-stats",
    description: "simple github user stats fetcher",
    version: "1.0.0",
  });
});

Затем определите конечную точку пользователя в нижней части файла index.js:

// index.js

// ...

app.get("/:username", async (req, res) => {
  const username = req.params["username"];
  return res.json({
    username: username,
  });
});

Эта конечная точка получает имя пользователя из URL и возвращает его в формате JSON.

API GitHub

Чтобы получить статистику пользователей GitHub, нам сначала нужно посмотреть, как работает их API. Если вы откроете страницу и прокрутите навигацию, то быстро найдете раздел “Пользователи”.

Документация по REST API GitHub

Получить данные о пользователе очень просто – достаточно отправить следующий запрос:

$ curl -L https://api.github.com/users/<username>

# For example:
# curl -L https://api.github.com/users/duplxey

Чтобы реализовать это в нашем коде, мы будем использовать Axios – основанный на обещаниях HTTP-клиент для браузера и Node.js.

Установите его с помощью NPM:

$ npm install axios

Затем добавьте его в качестве зависимости в верхнюю часть файла index.js:

const axios = require("axios");

Наконец, измените конечную точку пользователя следующим образом:

// index.js

// ...

app.get("/:username", async (req, res) => {
  const username = req.params["username"];
  try {
    const user = await axios({
      method: "get",
      url: `https://api.github.com/users/${username}`,
    });
    const { login, name, location, followers, following } = user.data;
    return res.json({
      username: login,
      name: name,
      location: location,
      followers: followers,
      following: following,
    });
  } catch (e) {
    console.error(e);
    return res.status(400).json({
      detail: "Oops, something went wrong. Check the console for more information.",
    });
  }
});

Этот код использует Axios для отправки GET-запроса к API GitHub. Затем он реструктурирует полученные данные и возвращает их в формате JSON.

Тестирование

Чтобы проверить, работает ли приложение, сначала перезапустите сервер, а затем выполните следующую команду:

$ curl -L http://localhost:3000/duplxey/

Также вы можете посетить URL-адрес в веб-браузере.

Приведенная выше команда должна дать аналогичный ответ:

{
  "username": "duplxey",
  "name": "Nik Tomazic",
  "location": "Slovenia, Europe",
  "followers": 108,
  "following": 11,
}

Приложение Dockerize

В этом разделе статьи мы выполним докеризацию приложения Node.js.

.dockerignore

Наш проект содержит некоторые файлы и каталоги, которые не должны быть включены в образ. Чтобы исключить их, мы можем создать файл .dockerignore в корне проекта, как показано ниже:

.git/
.idea/
node_modules/

Этот файл .dockerignore исключает директории .git, .idea и node_modules. Файл .dockerignore работает аналогично файлам .gitignore.

Если есть дополнительные файлы и каталоги, которые вы хотите игнорировать, измените этот файл соответствующим образом.

Dockerfile

Dockerfile – это текстовый файл, который позволяет определить инструкции, указывающие Docker, как должен быть собран контейнер. В нем можно указать базовый образ, переменные окружения, команды и многое другое.

Создайте Dockerfile со следующим содержимым:

FROM node:18-alpine

# set the working directory
WORKDIR /app

# copy over the dependency files
COPY package.json ./
COPY package-lock.json ./

RUN npm install --production

ENV NODE_ENV="production"

# copy over the project
COPY . .

EXPOSE 3000

CMD ["node", "index.js"]

Этот Dockerfile использует node:18-alpine в качестве базового образа, устанавливает рабочий каталог, копирует package.json, устанавливает зависимости и собирает проект. Наконец, он запускает сервер Node.js и открывает порт 3000.

Для получения дополнительной информации о докеризации приложений Node.js ознакомьтесь с официальной документацией Back4app.

Тестирование

Следующие шаги потребуют от вас установки Docker.

Сначала создайте и пометьте изображение:

$ docker build --tag express-github-stats:1.0 .

Перечислите образы и проверьте, появился ли новый образ с именем express-github-stats:

$ docker images

REPOSITORY             TAG       IMAGE ID       CREATED         SIZE
express-github-stats   1.0       5fcb7e4a87a1   2 minutes ago   182MB

Затем используйте образ для запуска нового контейнера:

$ docker run -it -p 3000:3000 -d express-github-stats:1.0

Сводка аргументов:

  1. -это запускает контейнер в интерактивном режиме
  2. -p 3000:3000 сопоставляет порт 3000 на хосте с портом 3000 в контейнере
  3. -d запускает контейнер в отсоединенном режиме (чтобы он не занимал терминал).

И наконец, проверьте запущенные контейнеры:

$ docker ps

CONTAINER ID   IMAGE                      COMMAND           CREATED    PORTS         
60cfegdfe84d   express-github-stats:1.0   "entrypoint.s…"   4s ago     3000->3000/tcp   

Если вы перейдете по адресу http://localhost:3000/ в браузере, вы увидите веб-приложение.

Отправить на GitHub

Для выполнения следующих шагов вам понадобится учетная запись GitHub и установленный Git.

Войдите в свою учетную запись GitHub. После входа в систему воспользуйтесь кнопкой “More”, чтобы начать процесс создания репозитория.

Индекс GitHub Создать репозиторий

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

GitHub Создать репозиторий

Далее обратите внимание на сгенерированный удаленный URL:

Удаленный URL-адрес GitHub

Давайте вернемся в наш проект и перенесем код.

Сначала откройте терминал и инициализируйте локальный Git-репозиторий:

$ git init

Затем добавьте удаленный, VCS все файлы и создайте новый коммит:

$ git remote add origin <your_remote_url>
$ git add . && git commit -m "init"

Обязательно замените на URL-адрес вашего удаленного ресурса GitHub.

И наконец, перенесите код в облако:

$ git push origin master

Если вы снова откроете свой репозиторий GitHub в браузере, вы сможете увидеть исходный код.

Развернуть приложение

Чтобы развернуть приложение в Back4app Containers, вам понадобится учетная запись Back4app.

Когда вы войдете в свою учетную запись Back4app, вы будете перенаправлены на панель приложений. Нажмите на кнопку “Создать новое приложение”, чтобы начать процесс создания приложения.

Back4app Создать приложение

Back4app предоставляет решения BaaS и CaaS. Поскольку мы развертываем контейнер, выберите “CaaS”:

Back4app Containers as a Service

Далее, перейдите и свяжите свой аккаунт GitHub с Back4app (если вы этого еще не сделали). Затем импортируйте репозиторий, который мы создали ранее.

Back4app Select Repository

Back4app Containers позволяет выполнять расширенную настройку. Мы создаем простое приложение, поэтому нам нужно указать только имя приложения. Чтобы развернуть приложение, нажмите кнопку “Развернуть”.

Back4app Настроить приложение

Подождите около 5 минут, пока ваше приложение развернется, и вуаля! Как только приложение будет готово, его статус изменится на “Готово”. Если нажать на ссылку в левой части экрана, приложение откроет ваш браузер.

Успешное развертывание Back4app

Заключение

На протяжении всей статьи мы узнали о Node.js и рассмотрели различные варианты развертывания Node.js. Теперь вы должны быть в состоянии объяснить разницу между IaaS, PaaS и CaaS. Кроме того, вы узнали, как развернуть простое Node.js-приложение на Back4app Containers.

Исходный код доступен на репозитории GitHub.

ЧАСТО ЗАДАВАЕМЫЕ ВОПРОСЫ

Что такое Node.js?

Node.js — это кроссплатформенная, с открытым исходным кодом серверная среда, которая позволяет запускать JavaScript вне веб-браузера. Она имеет асинхронную событийно-ориентированную архитектуру и работает на JavaScript-движке V8 от Google.

Какие существуют варианты развертывания Node.js?

Приложения Node.js можно развернуть на различных платформах. Обычно их делят на решения IaaS (AWS, GCP, Azure), PaaS (Heroku, DigitalOcean App Platform, Render) и CaaS (Back4app Containers, ECS).

Как разместить приложение на Node.js?

1. Напишите код приложения.
2. Упакуйте приложение в Docker.
3. Соберите и протестируйте образ локально.
4. Отправьте код в репозиторий на GitHub.
5. Зарегистрируйтесь на Back4app Containers и импортируйте репозиторий.
6. Настройте окружение и выполните деплой.


Leave a reply

Your email address will not be published.