Загрузка данных


version: '3.8'

services:
  # 1. База данных Postgres (Критерий 2 - 3 балла)
  db:
    image: postgres:15-alpine
    env_file:
      - ./db/.db.env
    volumes:
      - pg_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 5s
      timeout: 5s
      retries: 5

  # 2. Init container для миграции и создания тестовых пользователей (Критерий 4 - 3 балла)
  db-init:
    build: ./backend
    env_file:
      - ./db/.db.env
    environment:
      # Переопределяем URL для SQLAlchemy, чтобы он шел к контейнеру db
      - DATABASE_URL=postgresql://postgres:postgres@db:5432/postgres
    depends_on:
      db:
        condition: service_healthy
    # Сначала создаем таблицы (init_db.py), затем наполняем данными (init_data.py)
    command: sh -c "python init_db.py && python init_data.py"

  # 3. Бэкенд приложение (Критерий 1 - 4 балла)
  backend:
    build: ./backend
    env_file:
      - ./db/.db.env
    environment:
      - DATABASE_URL=postgresql://postgres:postgres@db:5432/postgres
    depends_on:
      db-init:
        condition: service_completed_successfully
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8000/"]
      interval: 5s
      timeout: 5s
      retries: 5

  # 4. Фронтенд на NGINX (Критерий 3 - 3 балла)
  frontend:
    image: nginx:alpine
    ports:
      - "8189:80"  # Доступен на порту 8189 из внешней сети
    volumes:
      # Пробрасываем конфиг NGINX
      - ./frontend/nginx.conf:/etc/nginx/conf.d/default.conf:ro
      # Пробрасываем стили так, чтобы они оказались в /usr/share/nginx/html/static/styles.css
      - ./frontend/styles.css:/usr/share/nginx/html/static/styles.css:ro
    depends_on:
      backend:
        condition: service_healthy

volumes:
  pg_data:  # Выделенный Volume для постоянного хранения данных базы