Pull to refresh

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

Level of difficultyEasy

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 выполняет миграции только после того, как база данных готова.

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

Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.