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" ]
Вот что делает каждая команда в этом файле:
FROM node:18
: Указывает базовый образ для контейнера Docker. В этом случае мы используем официальный образ Node.js18.x
в качестве базового.WORKDIR /app
: Устанавливает рабочий каталог внутри контейнера на/app
. Сюда будет скопирован код приложения и отсюда будет запускаться контейнер.COPY package*.json ./
: Копирует файлыpackage.json
иpackage-lock.json
из текущего каталога на хост-компьютере в каталог/app
в контейнере.*
вpackage*.json
позволяет копировать оба файла одновременно.RUN npm install
: Устанавливает зависимости приложения в контейнере. На этом этапе используется командаnpm install
для установки зависимостей, перечисленных вpackage.json
.COPY . .
: Копирует код приложения с хост-компьютера в/app
каталог в контейнере.RUN npm run build
: Командаnpm run build
используется для сборки приложения в контейнере. Обычно эта команда создаетdist
папку с рабочей сборкой приложения.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:
- Откройте PgAdmin в веб-браузере, перейдя по адресу http://localhost:5050 (при условии, что мы используем конфигурацию по умолчанию в файле
docker-compose.yml
). - Войдите в систему, используя свой адрес электронной почты и пароль в файле
docker-compose.yml
для сервисаpgadmin
. - На левой боковой панели нажмите,
Servers
чтобы развернутьServers
меню. - Щелкните правой кнопкой мыши на
Servers
и выберитеRegister
->Server
. - На вкладке
General
в диалоговом окнеCreate - Server
мы можем дать серверу любое имя по своему усмотрению. - На
Connection
вкладке заполните следующие сведения:- Имя/адрес хоста: база данных
- Порт: 5432
- База данных обслуживания: postgres
- Имя пользователя: postgres
- Пароль: postgres
- Нажмите
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. Параметры host
, port
, username
, password
и 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