Как стать автором
Обновить

Инструкция по настройке Docker для приложения с PostgreSQL и Prisma

Уровень сложностиПростой

1. Структура проекта

Предположим, у вас есть проект на NestJS с использованием Prisma и PostgreSQL. Приблизительная структура проекта:

project/
│
├── prisma/
│   └── schema.prisma   # Схема Prisma для вашей базы данных
├── src/                # Исходный код приложения NestJS
├── Dockerfile          # Dockerfile для вашего приложения
├── docker-compose.yml  # Конфигурация Docker Compose для мульти-контейнеров
└── .env                # Переменные окружения

2. Создание Dockerfile для вашего приложения

Создайте Dockerfile для контейнера с приложением:

FROM node:18-alpine

# Установим bash, чтобы выполнять необходимые скрипты
RUN apk add --no-cache bash

# Устанавливаем рабочую директорию
WORKDIR /app

# Копируем только файлы package*.json для кэширования зависимостей
COPY package*.json ./

# Устанавливаем зависимости
RUN npm install --production

# Копируем весь исходный код
COPY . .

# Генерируем Prisma клиент
RUN npx prisma generate

# Собираем приложение
RUN npm run build

# Открываем порт 3000
EXPOSE 3000

# Копируем скрипт ожидания и даем ему права на выполнение
COPY wait-for-db.sh /app/wait-for-db.sh
RUN chmod +x /app/wait-for-db.sh

# Запуск скрипта ожидания базы данных перед стартом приложения
CMD ["/bin/bash", "/app/wait-for-db.sh"]

3. Создание скрипта ожидания базы данных (wait-for-db.sh)

Для того чтобы ваше приложение подождало, пока база данных станет доступной, создайте файл wait-for-db.sh в корне проекта:

#!/bin/bash

# Ждем, пока база данных будет доступна на порту 5432
until nc -z -v -w30 db 5432; do
  echo "Waiting for database connection..."
  sleep 1
done

# Когда база данных доступна, выполняем миграции и запускаем приложение
echo "Database is up, running prisma db push"
npx prisma db push

# Запускаем приложение
npm run start:prod

4. Создание docker-compose.yml

docker-compose.yml конфигурирует два контейнера: один для вашего приложения и один для базы данных PostgreSQL.

version: '3.7'

services:
  db:
    image: postgres:latest
    environment:
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=password
      - POSTGRES_DB=base_name
    ports:
      - "5432:5432"
    networks:
      - base_name_network

  app:
    build: .
    environment:
      - DATABASE_URL=postgresql://user:password@db:5432/base_name
    depends_on:
      - db  # Убедимся, что приложение стартует только после базы данных
    networks:
      - base_name_network
    ports:
      - "3000:3000"

networks:
  planner_network:
    driver: bridge

5. Настройка переменных окружения

В файле .env вашего приложения укажите строку подключения к базе данных:

DATABASE_URL=postgresql://user:password@db:5432/base_name

Важно: Здесь db — это имя сервиса базы данных, как указано в docker-compose.yml. Docker Compose автоматически настраивает сетевой доступ между контейнерами, используя имена сервисов.

6. Сборка и запуск контейнеров

  1. Соберите и запустите контейнеры с помощью Docker Compose:

    docker-compose up --build -d

    Эта команда:

    • Соберет ваш Docker образ для приложения.

    • Запустит контейнеры для PostgreSQL и вашего приложения.

    • Приложение будет ожидать, пока база данных станет доступной, а затем выполнит команду npx prisma db push для синхронизации базы данных с моделью Prisma.

  2. После запуска контейнеров вы сможете получить доступ к приложению по адресу: http://localhost:3000.

7. Дополнительные шаги

  1. Применение миграций: Если вы используете миграции в Prisma, вам нужно будет выполнять миграции с помощью команды prisma migrate dev или prisma migrate deploy в процессе разработки или в рамках CI/CD. Это можно сделать вручную или автоматизировать в скриптах.

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

    docker logs <container_name_or_id>
  3. Устранение ошибок: Если вы столкнулись с ошибками, проверьте логи контейнеров, выполните команду docker ps для проверки состояния контейнеров и убедитесь, что все сервисы работают корректно.


Заключение

Теперь ваше приложение настроено для работы в Docker. С помощью Docker Compose вы можете развернуть и управлять мульти-контейнерным приложением с PostgreSQL и Prisma. Важно использовать скрипт ожидания базы данных, чтобы убедиться, что Prisma выполняет миграции только после того, как база данных готова.

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

Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.