Как развернуть приложение Nest.js?
Выбор правильной стратегии развертывания важен для обеспечения бесперебойной работы вашего приложения и его масштабирования по мере необходимости. В этой статье рассматриваются различные варианты развертывания, доступные для приложений Nest.js. В частности, она посвящена тому, как развернуть приложения Nest.js в контейнере Back4app.
Contents
- 1 Основные выводы
- 2 Что такое Nest.js?
- 3 Преимущества использования Nest.js
- 4 Недостатки использования Nest.js
- 5 Варианты развертывания Nest.js
- 6 Как развернуть приложения Nest.js в контейнере Back4app
- 7 Создание приложения Nest.js
- 8 Докеризация приложения Nest.js
- 9 Развертывание приложения Nest.js в контейнере Back4app
- 10 Оптимизация развертывания с помощью многоэтапной сборки
- 11 Заключение
- 12 ЧАСТО ЗАДАВАЕМЫЕ ВОПРОСЫ
- 13 Что такое Nest.js?
- 14 Какие существуют варианты развертывания для Docker?
- 15 Как развернуть приложение Nest.js?
Основные выводы
- Выбор правильной стратегии развертывания для приложения 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 (Создать новое приложение ).
Back4app предлагает два варианта создания приложения. Вы можете использовать Backend как сервис (BaaS) или Container как сервис (CaaS).
BaaS обрабатывает весь бэкенд за вас, в то время как CaaS позволяет развернуть докеризованное приложение. Мы хотим развернуть только докеризованное приложение Nest.js, поэтому выберите Containers as a Service.
Back4app предложит вам подключить свой аккаунт к GitHub и предоставить ему разрешение на доступ к вашим репозиториям.
Выберите репозиторий Nest.js.
В параметрах развертывания добавьте имя для своего приложения. Вы также можете задать ветку по умолчанию, корневой каталог, включить или отключить авторазвертывание и задать переменные окружения. В данном случае нам нужно задать только имя.
Нажмите кнопку 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 и разверните ваше приложение.