Как развернуть приложение Nest.js?

How to Deploy a Nest.js Application_
How to Deploy a Nest.js Application_

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

Основные выводы

  • Выбор правильной стратегии развертывания для приложения Nest.js имеет решающее значение для масштабируемости и бесперебойной работы.
  • Варианты развертывания включают инфраструктуру как услугу (IaaS) и контейнер как услугу (CaaS).
  • Back4app Containers – популярный CaaS-провайдер для развертывания приложений Nest.js, предлагающий более высокую абстракцию и упрощенное управление.

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

Nest.js – это фреймворк Node.js для создания масштабируемых приложений на стороне сервера. Он решает проблему архитектуры, которую не решает большинство современных фреймворков и библиотек, используя модульную архитектуру. Такая архитектура позволяет разработчикам создавать хорошо организованные, масштабируемые и поддерживаемые кодовые базы.

Преимущества использования Nest.js

Ниже перечислены некоторые преимущества использования Nest.js:

  • Next.js имеет свое мнение о том, как должен быть структурирован код. Поэтому он избавляет вас от необходимости самостоятельно разбираться в том, как организовать свой код.
  • По умолчанию он поддерживает TypeScript, но также позволяет писать код на чистом JavaScript.
  • По умолчанию под капотом используется фреймворк Express, но его можно настроить на использование Fastify, который работает быстрее.
  • Nest.js легко интегрируется с такими фронтенд-библиотеками, как React и Angular.
  • В нем есть утилита командной строки под названием NestCLI. Он автоматически генерирует заранее написанный код для важных частей приложения, таких как контроллеры, модули и промежуточное ПО, способствуя улучшению работы разработчиков.
  • В Nest.js встроена поддержка микросервисов. Он предлагает различные транспортеры для обмена сообщениями между различными микросервисами.
  • Nest.js поддерживает интеграцию с любой базой данных SQL или NoSQL.
  • Он обеспечивает интеграцию с такими популярными библиотеками тестирования, как Supertest и Jest. Это упрощает написание модульных, интеграционных и сквозных тестов.
  • Nest.js предлагает исчерпывающую и упорядоченную документацию с примерами кода.

Недостатки использования Nest.js

Ниже перечислены некоторые недостатки использования Nest.js:

  • Шаблон дизайна приложений Nest.js может не совпадать с предпочтениями или требованиями проекта.
  • Nest.js абстрагирует сложность различных процессов и их внутреннюю работу. Такая абстракция позволяет разработчикам сосредоточиться на основной логике приложения, не заботясь о сложных деталях. Однако такой уровень абстракции может привести к ощущению зависимости, поскольку разработчики имеют ограниченное представление о конкретных деталях реализации.
  • Nest.js поставляется с большим количеством функций и возможностей. Существует потенциальный риск того, что разработчики будут слишком усложнять решения и нарушать сроки реализации проектов.
  • Nest.js имеет более сложную кривую обучения из-за своей сложной архитектуры и использования TypeScript из коробки,

Использовать ли Nest.js для своего проекта, в конечном счете, зависит от требований проекта, опыта команды и личных предпочтений.

Прежде чем принять решение, подумайте о преимуществах Nest.js, его возможностях, недостатках и масштабе вашего проекта.

Варианты развертывания Nest.js

При развертывании приложений Nest.js у вас есть различные варианты, включая инфраструктуру как сервис (IaaS) и контейнер как сервис (CaaS). Давайте обсудим эти два подхода.

Инфраструктура как услуга

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

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

Недостатком такого контроля является то, что вашей команде приходится управлять всем. Это может быть дорогостоящим.

Среди популярных поставщиков IaaS можно назвать следующих:

  • Microsoft Azure
  • Amazon Web Services (AWS)
  • Google Cloud Platform (GCP)

Контейнеры как сервис

Container as a Service (CaaS) – это облачный сервис для управления контейнерами. Он обеспечивает более высокий уровень абстракции над вычислительными, сетевыми ресурсами и ресурсами хранения данных по сравнению с IaaS.

С помощью CaaS вы упаковываете код приложения Nest.js, его зависимости, время выполнения и конфигурацию, необходимую для запуска приложения, в контейнер.

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

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

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

Среди популярных поставщиков CaaS можно назвать следующих:

  • Back4app Containers
  • Amazon Elastic Container Service (ECS)
  • Google Kubernetes Engine (GKE)

Как развернуть приложения Nest.js в контейнере Back4app

Пререквизиты

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

  • Node.js (версия >= 16), установленный в вашей операционной системе.
  • Учетная запись GitHub с настроенным Git в вашей операционной системе.
  • На вашей машине установлен Docker. Вы можете установить Docker desktop с официального сайта Docker.
  • Рабочие знания Nest.js.

Обзор контейнеров Back4app

Back4app Containers – это CaaS-провайдер, который управляет процессом развертывания за вас. Он управляет серверной инфраструктурой, устраняя необходимость в ручной настройке.

Back4app интегрируется с GitHub и позволяет добавлять докеризованные репозитории в ваше приложение. Эта интеграция упрощает поддержание приложения в актуальном состоянии.

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

Вы также можете следить за развертыванием с помощью панели управления и решать любые возникающие проблемы.

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

В этом руководстве мы рассмотрим процесс развертывания приложения Nest.js на Back4app. Для начала мы создадим базовое приложение Nest.js, которое докеризуем, а затем разместим на GitHub. Наконец, мы развернем приложение в контейнере Back4app.

Создание приложения Nest.js

Выполните следующие шаги, чтобы создать приложение Nest.js:

  • Выполните приведенную ниже команду в терминале, чтобы установить Nest.js CLI глобально.
npm install -g @nestjs/cli
  • Выполните следующую команду, чтобы сгенерировать новое приложение Nest.js.
nest new project-name

Не стесняйтесь заменить “project-name” на название вашего приложения. В этом руководстве используется nestjs-deploy-back4app.

nest new  nestjs-deploy-back4app

Эта команда создаст все необходимые файлы и папки, которые понадобятся вам для начала работы.

  • Перейдите в каталог созданного проекта и выполните следующую команду, чтобы запустить сервер разработки.
npm run start:dev

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

Докеризация приложения Nest.js

Чтобы развернуть приложение Nest.js в контейнере Back4app, необходимо выполнить докеризацию приложения с помощью Docker.

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

Чтобы создать образ контейнера, необходимо добавить в проект Dockerfile.

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

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

Следуйте приведенным ниже инструкциям, чтобы выполнить докеризацию проекта Nest.js:

  • Убедитесь, что на вашей машине установлен Docker. Если он не установлен, следуйте официальному руководству по установке Docker.
  • Перейдите в корень каталога вашего проекта Nest.js и создайте файл с именем Dockerfile.
touch Dockerfile
  • В удобном для вас редакторе кода откройте Dockerfile и определите базовый образ. Это образ, на основе которого вы будете создавать свой рабочий образ. В этом руководстве используется образ Node 20. Он поставляется с установленными Node и npm.
FROM node:18-alpine
  • Затем создайте рабочий каталог внутри образа. Здесь будет храниться код вашего приложения.
 WORKDIR /usr/src/app
  • Скопируйте файлы package.json и package-lock.json в контейнер. Затем выполните команду npm install для установки зависимостей проекта.
# A wildcard ensures package.json AND package-lock.json are copied
COPY package*.json ./

# Install project dependencies
RUN npm install
  • Скопируйте остальной код вашего приложения в контейнер.
COPY ..
  • Выполните команду build, чтобы собрать приложение в пакет. Эта команда компилирует код TypeScript в JavaScript и сохраняет его в папке dist.
RUN npm run build
  • Открыть порт 3000. Здесь указывается, какой порт должны использовать другие приложения для связи с этим контейнерным приложением.
EXPOSE 3000/tcp
  • Запустите ваше приложение. Здесь мы будем использовать node dist/main.js. Папка dist содержит скомпилированный код, а main.js является точкой входа в приложение.
CMD [ "node", "dist/main.js" ]

В целом, ваш Dockerfile должен выглядеть следующим образом:

FROM node:20-alpine

WORKDIR /usr/src/app

COPY package*.json  ./

RUN npm ci

COPY . .

RUN npm run build

EXPOSE 3000/tcp

CMD [ "node", "dist/main.js" ]

Добавьте файл .dockerignore

Файл .dockerignore работает подобно файлу .gitignore. В нем указывается, какие файлы Docker должен игнорировать. Это предотвращает добавление в образ больших и ненужных файлов или конфиденциальных данных.

Чтобы создать его, добавьте новый файл с именем .dockerignore в основание папки вашего проекта Nest.js и добавьте следующее.

.git
.gitignore
.env
README.md
Dockerfile
node_modules/
.github
.vscode
npm-debug.log
npm-debug.log.*

Теперь ваши модули node, файлы markdown, переменные env и журналы отладки не будут скопированы в образ Docker.

Создайте образ Docker локально

Выполните приведенную ниже команду в терминале, чтобы убедиться, что Dockerfile работает.

docker build -t nestjs-back4app .

Флаг -t позволяет пометить изображение именем. В данном случае – nestjs-back4app.

Если вы запустите docker images в терминале, вы увидите созданный образ.

REPOSITORY        TAG       IMAGE ID       CREATED          SIZE
nestjs-back4app   latest    afcba89613fc   39 seconds ago   333MB

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

docker run -p 49160:3000 -d nestjs-back4app

Это перенаправит порт 49160 на порт 3000, который мы указали в Dockerfile. Если вы зайдете на localhost:49160, вы сможете попасть на главную страницу вашего приложения.

Развертывание приложения Nest.js в контейнере Back4app

Убедившись, что Dockerfile работает, вы готовы развернуть приложение на Back4app.

Отправить приложение на GitHub

Back4app получает доступ к вашему приложению через GitHub. Создайте новый репозиторий, содержащий приложение Nest.js, выполнив следующие действия:

  • Посетите GitHub и войдите в свою учетную запись.
  • После того как вы вошли в систему, нажмите на значок “+” в правом верхнем углу страницы и выберите в выпадающем меню пункт “Новое хранилище”.
  • На странице “Создание нового хранилища” дайте хранилищу имя. Затем нажмите кнопку “Создать имя репозитория”. На следующей странице укажите URL-адрес репозитория.

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

git remote add origin <https://github.com/remigathoni/nestjs-deploy-back4app.git>
git branch -M main
git push -u origin main

После выполнения этих команд файлы вашего приложения будут добавлены в репозиторий GitHub.

Развертывание приложения Nest.js

Теперь вы можете развернуть свое приложение на Back4app, выполнив следующие действия:

Зарегистрируйте аккаунт на Back4App, если вы еще этого не сделали, иначе войдите в свой аккаунт. Вы будете перенаправлены на приборную панель.

На приборной панели нажмите на Build a new app (Создать новое приложение ).

Разверните Nest.js на Back4app


Back4app предлагает два варианта создания приложения. Вы можете использовать Backend как сервис (BaaS) или Container как сервис (CaaS).

BaaS обрабатывает весь бэкенд за вас, в то время как CaaS позволяет развернуть докеризованное приложение. Мы хотим развернуть только докеризованное приложение Nest.js, поэтому выберите Containers as a Service.

Скриншот, показывающий, как создать Back4app. Либо бэкэнд как сервисное приложение, либо контейнер как сервисное приложение

Back4app предложит вам подключить свой аккаунт к GitHub и предоставить ему разрешение на доступ к вашим репозиториям.

Скриншот, показывающий, как установить и авторизовать контейнеры Back4app

Выберите репозиторий Nest.js.

Снимок экрана показывает, как выбрать репозиторий GitHub для загрузки в Back4app

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

Снимок экрана, показывающий, как настроить первоначальное развертывание приложения Nestjs на Back4app

Нажмите кнопку Create App (Создать приложение ), чтобы развернуть приложение. Этот процесс может занять несколько минут.

Вот, собственно, и все! Вы успешно развернули приложение Nest.js на Back4app бесплатно.

Оптимизация развертывания с помощью многоэтапной сборки

Сейчас размер образа докера довольно большой – 333 МБ.

REPOSITORY        TAG       IMAGE ID       CREATED          SIZE
nestjs-back4app   latest    afcba89613fc   39 seconds ago   333MB

Для ускорения развертывания необходимо уменьшить размер образа. Уменьшение размера образа также сократит расходы на хранение в облаке и позволит оптимизировать ресурсы. Кроме того, это уменьшит уязвимости в системе безопасности за счет сокращения площади поверхности атаки.

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

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

Чтобы начать работу, откройте Dockerfile в приложении Nest.js в редакторе кода и удалите его содержимое.

В Dockerfile у нас будет два этапа:

  • Этап сборки, отвечающий за создание приложения. Сюда входит установка зависимостей и компиляция TypeScript в JavaScript
  • Производственная страница, на которой создается образ времени выполнения. Она содержит все файлы, необходимые для запуска приложения.

Имя этапа присваивается путем добавления AS *имя этапа* к инструкции FROM.

Определение этапа сборки

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

  • В файле DockerFile определите стадию из базового образа Node и назовите ее build.
FROM node:20-alpine as build

Обратите внимание, что изображения узла: -alpine base гораздо тоньше, чем изображения узла:.

  • Определите рабочий каталог.
WORKDIR /usr/src/app
  • Скопируйте файлы package.json и package-lock.json в контейнер.
# A wildcard ensures package.json AND package-lock.json are copied
COPY package*.json ./
  • Установите зависимости
RUN npm ci

Вместо npm install мы используем npm ci. Эти две команды одинаковы, но npm ci обеспечивает чистую установку зависимостей при каждом запуске.

  • Скопируйте код приложения на этап сборки.
COPY . .
  • Соберите приложение, выполнив команду npm build.
npm run build

Определение этапа производства

После того как вы создали приложение, определите этап производства.

  • Добавьте базовый образ Node.js и назовите его production.
FROM node:20-alpine AS build
  • Определите рабочий каталог, как это было сделано на этапе сборки.
WORKDIR /usr/src/app
  • Используйте метку from=build , чтобы скопировать папку dist и модули узлов из образа сборки в текущий производственный образ.
COPY  --from=build usr/src/app/dist ./dist
COPY  --from=build usr/src/app/node_modules ./node_modules
  • Открыть порт 3000
EXPOSE 3000/tcp 
  • Запустите приложение с помощью команды CMD.
CMD ["node", "dist/main.js"]

В целом, ваш Dockerfile должен выглядеть следующим образом:

# Build
FROM node:20-alpine AS build
WORKDIR /usr/src/app
COPY package*.json  ./
RUN npm ci
COPY . .
RUN npm run build && npm prune --production

# Production
FROM node:20-alpine AS production
WORKDIR /usr/src/app

COPY  --from=build usr/src/app/dist ./dist
COPY  --from=build usr/src/app/node_modules ./node_modules

EXPOSE 3000/tcp
CMD [ "node", "dist/main.js" ]

Если вы соберете докер-образ сейчас, то заметите, что его размер значительно уменьшился.

REPOSITORY             TAG       IMAGE ID       CREATED          SIZE
nestjs-back4app-opt    latest    d29aedae9bef   5 seconds ago   186MB

Уменьшив размер, вы увеличите время развертывания, а также сократите объем необходимого хранилища.

Заключение

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

У вас есть различные варианты развертывания приложения Nest.js, включая платформы Infrastructure as a Service (IaaS) и Container as a Service (CaaS).

Одним из лучших поставщиков CaaS является компания Back4app Containers. Контейнеры Back4app управляют и контролируют ваше развертывание, делая переход от разработки к производству без лишних хлопот.

В этом руководстве вы узнали, как развернуть приложение Nest.js в контейнере Back4app с помощью Docker. Кроме того, вы узнали о преимуществах оптимизации развертывания с помощью многоэтапных сборок.

Теперь вы можете создать приложение Nest.js, докеризировать его и развернуть на Back4app. Исходный код доступен на этом репозитории GitHub, а чтобы узнать больше, посетите документацию по контейнерам Back4app.

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

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

Nest.js — это ориентированный на мнение фреймворк Node.js, построенный с использованием TypeScript. Он использует модульный подход к проектированию, позволяя разработчикам создавать хорошо организованные, масштабируемые и легко поддерживаемые кодовые базы.

Какие существуют варианты развертывания для Docker?

– IaaS (AWS, GCP, Azure)
– CaaS (Back4app Containers, AWS ECS, Google Kubernetes Engine (GKE))

Как развернуть приложение Nest.js?

– Создайте приложение Nest.js.
– Упакуйте приложение Nest.js в Docker.
– Отправьте контейнеризированное приложение на GitHub.
– Создайте аккаунт Back4app.
– Создайте контейнер Back4app.
– Предоставьте Back4app доступ к вашему GitHub.
– Выберите репозиторий Nest.js и разверните ваше приложение.


Leave a reply

Your email address will not be published.