Перейти к содержимому
Главная страница » Запуск NestJS в Docker по шагам

Запуск NestJS в Docker по шагам

NestJS, PostgreSQL и Docker — это три мощных инструмента, которые помогут вам быстро и легко создавать надежные веб-приложения. NestJS — это современный, прогрессивный фреймворк Node.js , который позволяет создавать серверные приложения с использованием TypeScript. PostgreSQL — это мощная система управления базами данных с открытым исходным кодом, обеспечивающая надежное хранение и извлечение данных. Docker — это платформа контейнеризации, которая упрощает развертывание приложений и управление ими.

Эти три инструмента представляют собой мощный набор средств для создания масштабируемых и эффективных веб-приложений. В этой статье представлено удобное для новичков руководство по использованию NestJS, PostgreSQL и Docker для создания веб-приложений.

Предварительное условие

  • Базовое понимание TypeScript, PostgreSQL и RESTful API
  • Docker Desktop установлен на вашем компьютере (запустите команду docker -v для проверки установки); если нет, установите его здесь

Настройка приложения NestJS

Для инициализации нового проекта нам нужен узел и его менеджер пакетов npm.

Чтобы установить Node, перейдите на сайт Nodejs и следуйте инструкциям. Мы проверяем установку Node.js с помощью приведенной ниже команды в терминале:

node -v
v18.15.0 //node version installed

Результат показывает версию Node.js, которую мы установили на наш компьютер.

Далее мы установим NestJS глобально и инициализируем новый проект, выполнив в терминале следующую команду:

$ npm i -g @nestjs/cli

$ nest new nest-docker-postgres

Обязательно выберите npm в качестве менеджера пакетов в командной строке.

Запустите сервер разработки с помощью приведённой ниже команды и перейдите по адресу http://localhost:3000/, чтобы увидеть работу приложения:

$ npm run start:dev

Контейнеризация приложения

Чтобы контейнеризировать наше приложение NestJS, мы сначала создаём файл с именем Dockerfile в корневом каталоге нашего проекта, а затем файл docker-compose.yml также в корневом каталоге нашего проекта.

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

Файл docker-compose настраивает среду с несколькими контейнерами. В ней мы будем запускать приложение NestJS с PostgreSQL и pgAdmin.

Файл Dockerfile

FROM node:18

WORKDIR /app

COPY package*.json ./

RUN npm install

COPY . .

RUN npm run build

CMD [ "npm", "run", "start:dev" ]

Вот что делает каждая команда в этом файле:

  1. FROM node:18: Указывает базовый образ для контейнера Docker. В этом случае мы используем официальный образ Node.js 18.x в качестве базового.
  2. WORKDIR /app: Устанавливает рабочий каталог внутри контейнера на /app. Сюда будет скопирован код приложения и отсюда будет запускаться контейнер.
  3. COPY package*.json ./: Копирует файлы package.json и package-lock.json из текущего каталога на хост-компьютере в каталог /app в контейнере. * в package*.json позволяет копировать оба файла одновременно.
  4. RUN npm install: Устанавливает зависимости приложения в контейнере. На этом этапе используется команда npm install для установки зависимостей, перечисленных в package.json.
  5. COPY . .: Копирует код приложения с хост-компьютера в /app каталог в контейнере.
  6. RUN npm run build: Команда npm run build используется для сборки приложения в контейнере. Обычно эта команда создает dist папку с рабочей сборкой приложения.
  7. CMD ["npm", "run", "start:dev"]: Указывает команду, которая будет выполняться при запуске контейнера. В данном случае мы запускаем команду npm run start:dev, которая запустит сервер в режиме разработки. Эта команда отслеживает изменения в коде и автоматически перестраивает контейнер при обнаружении изменений. Это позволяет ускорить циклы разработки, так как изменения в коде можно быстро протестировать в контейнере без ручной перестройки или перезапуска.

docker-compose.yml

version: '3.5'

services:
  db:
    image: postgres
    restart: always
    environment:
      - POSTGRES_PASSWORD=postgres
    container_name: postgres
    volumes:
      - ./pgdata:/var/lib/postgresql/data
    ports:
      - '5432:5432'

  app:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: nest-docker-postgres
    environment:
      - PORT=${PORT}
    ports:
      - '3000:3000'
    depends_on:
      - db
    volumes:
      - ./src:/app/src

  pgadmin:
    image: dpage/pgadmin4
    restart: always
    container_name: nest-pgadmin4
    environment:
      - PGADMIN_DEFAULT_EMAIL=admin@admin.com
      - PGADMIN_DEFAULT_PASSWORD=pgadmin4
    ports:
      - '5050:80'
    depends_on:
      - db

В этом файле:

  • version Это поле в начале файла Docker Compose определяет версию формата файла Compose, которую мы используем.
  • db Этот сервис настраивает базу данных PostgreSQL с помощью официального образа postgres из Docker Hub. Он устанавливает пароль для пользователя postgres на postgres, создаёт именованный том pgdata для хранения данных базы данных и сопоставляет порт контейнера 5432 с портом хоста 5432. Опция restart: always гарантирует, что контейнер автоматически перезапустится в случае сбоя или остановки.
  • app Эта служба создает образ Docker для приложения NestJS, используя Dockerfile в текущем каталоге. Она задает имя контейнера nest-docker-postgres, задает переменную среды PORT со значением переменной среды PORT хоста, сопоставляет порт контейнера 3000 с портом 3000 хоста и монтирует каталог src на хосте в каталог /app/src в контейнере. Опция depends_on указывает, что эта служба зависит от службы db, то есть контейнер db будет запущен до контейнера app.
  • pgadmin Эта служба настраивает pgAdmin, веб-инструмент администрирования PostgreSQL, с помощью образа dpage/pgadmin4 из Docker Hub. Она устанавливает имя контейнера nest-pgadmin4, устанавливает адрес электронной почты и пароль по умолчанию для входа в pgAdmin, сопоставляет порт контейнера 80 с портом хоста 5050 и указывает, что эта служба зависит от службы db.

Нам также нужно добавить новый файл с именем .dockerignore. Он определяет файлы и каталоги, которые .dockerignore следует исключить из контекста сборки Docker.

.докеригнор

Dockerfile
.dockerignore
node_modules
npm-debug.log
dist

Создание контейнеров

Следующее, что нам нужно сделать, — это собрать и запустить наше приложение в Docker, создав контейнеры. Выполните приведённую ниже команду, чтобы контейнеризировать приложение:

$ docker compose up

Команда ищет службы, указанные в файле docker-compose.yml, и создаёт для них контейнеры. Если образы, необходимые для этих служб, недоступны локально, Docker загрузит их из Docker Hub или любого другого настроенного реестра. Если образы уже доступны локально, Docker будет использовать их вместо повторной загрузки.

Как только контейнеры запущены, мы можем получить доступ к приложению NestJS, открыв http://localhost:3000 в веб-браузере, а к pgAdmin — открыв http://localhost:5050 в веб-браузере.

Войдите в pgAdmin, используя адрес электронной почты и пароль, которые мы указали ранее в файле docker-compose.yml, и вы увидите следующее:

Настройка pgAdmin и сервера PostgreSQL

Чтобы подключиться к серверу PostgreSQL из PgAdmin, нам нужно создать в PgAdmin объект сервера с указанием сведений о сервере PostgreSQL.

Вот шаги по созданию сервера в pgAdmin:

  1. Откройте PgAdmin в веб-браузере, перейдя по адресу http://localhost:5050 (при условии, что мы используем конфигурацию по умолчанию в файле docker-compose.yml).
  2. Войдите в систему, используя свой адрес электронной почты и пароль в файле docker-compose.yml для сервиса pgadmin.
  3. На левой боковой панели нажмите, Servers чтобы развернуть Servers меню.
  4. Щелкните правой кнопкой мыши на Servers и выберите Register -> Server.
  5. На вкладке General в диалоговом окне Create - Server мы можем дать серверу любое имя по своему усмотрению.
  6. На Connection вкладке заполните следующие сведения:
    • Имя/адрес хоста: база данных
    • Порт: 5432
    • База данных обслуживания: postgres
    • Имя пользователя: postgres
    • Пароль: postgres
  7. Нажмите Save, чтобы сохранить конфигурацию сервера.

Примечание: поскольку сервер PostgreSQL работает в контейнере Docker, имя хоста/адрес будет соответствовать имени службы Docker для контейнера базы данных, как указано в файле docker-compose.yml . По умолчанию имя службы становится именем хоста/адресом контейнера в сети Docker.

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

Подключение к серверу PostgreSQL из NestJS

Nest предоставляет пакет @nestjs/typeorm для интеграции с базами данных SQL и NoSQL. Установите пакеты с помощью приведенной ниже команды:

$ npm install --save @nestjs/typeorm typeorm pg

Затем в файле app.module.ts добавьте следующий код в массив imports:



    TypeOrmModule.forRoot({
      type: 'postgres',
      host: 'db',
      port: 5432,
      username: 'postgres',
      password: 'postgres',
      database: 'postgres',
      entities: [],
      synchronize: true,
      autoLoadEntities: true,
    }),


Мы импортируем TypeOrmModule из @nestjs/typeorm пакета.

Мы передаем options объект в TypeOrmModule для настройки сведений о подключении к PostgreSQL. В type опции указывается используемая система управления базами данных PostgreSQL. Параметры hostportusernamepassword и database содержат сведения о подключении к серверу PostgreSQL.

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

Мы устанавливаем для параметра synchronize значение true, что означает, что TypeORM будет автоматически генерировать таблицы базы данных на основе сущностей. Однако в рабочей среде этот параметр следует использовать с осторожностью, поскольку он может привести к потере данных и конфликтам.

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

$ docker compose up --build

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

Заключение

В заключение мы рассмотрели, как настроить приложение NestJS с помощью Docker и PostgreSQL в пошаговом руководстве. Использование Docker и PostgreSQL в сочетании с NestJS может ускорить и повысить эффективность разработки веб-приложений.

Используемые ресурсы

Step-by-Step Guide: Setting Up a NestJS Application with Docker and PostgreSQL

How to Dockerize NestJS

docker-compose for NestJS project

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *