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


version: '3.8'

services:
  # 1. База данных Postgres
  db:
    image: postgres:15-alpine
    env_file:
      - ./db/.db.env
    ports:
      - "5433:5432"  # На хосте используем 5433, если 5432 занят в Windows
    volumes:
      - pg_data:/var/lib/postgresql/data
    networks:
      default:
        aliases:
          - backend  # Магия: база также откликается на имя backend для внешних контейнеров
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 5s
      timeout: 5s
      retries: 5

  # 2. Скрипт инициализации (таблицы + пользователи)
  db-init:
    build: ./backend
    env_file:
      - ./db/.db.env
    # Обнуляем сетевой стек до уровня контейнера db. 
    # Теперь для этого контейнера localhost — это и есть база данных.
    network_mode: "service:db"
    depends_on:
      db:
        condition: service_healthy
    command: sh -c "python init_db.py && python init_data.py"

  # 3. Бэкенд приложение (FastAPI)
  backend:
    build: ./backend
    env_file:
      - ./db/.db.env
    # Бэкенд тоже делит сеть с db, видя базу по адресу localhost:5432
    network_mode: "service:db"
    depends_on:
      db-init:
        condition: service_completed_successfully
    # Проверяем здоровье бэкенда локально внутри его сети
    healthcheck:
      test: ["CMD", "curl", "-f", "http://127.0.0.1:8000/"]
      interval: 5s
      timeout: 5s
      retries: 5

  # 4. Фронтенд на NGINX
  frontend:
    image: nginx:alpine
    ports:
      - "8189:80"
    volumes:
      - ./frontend/nginx.conf:/etc/nginx/conf.d/default.conf:ro
      - ./frontend/styles.css:/usr/share/nginx/html/static/styles.css:ro
    depends_on:
      # Ждем, пока бэкенд (запущенный в сети db) начнет отвечать на порту 8000
      db:
        condition: service_healthy

networks:
  default:  # Явно объявляем стандартную сеть для работы алиасов
    driver: bridge

volumes:
  pg_data: