name: prodman # Имя проекта, которое будет префиксом для всех контейнеров и сетей services: # --- БАЗА ДАННЫХ --- db: image: postgres:15-alpine # Легкий образ Postgres на базе Alpine Linux restart: unless-stopped # Перезапускать всегда, кроме случаев, когда ты сам его выключил environment: # Данные тянутся из твоего файла .env - POSTGRES_DB=${DB_NAME} - POSTGRES_USER=${DB_USER} - POSTGRES_PASSWORD=${DB_PASS} volumes: # Храним базу в именованном томе, чтобы данные не пропали при удалении контейнера - postgres_data:/var/lib/postgresql/data # --- ПРИЛОЖЕНИЕ (DJANGO) --- web: build: . # Собирает образ из Dockerfile в текущей папке restart: unless-stopped env_file: - .env # Прокидывает все секреты и настройки внутрь Python - ENV_TYPE=server volumes: # Общие папки для статики и картинок. Сюда Django их складывает. - staticfiles:/app/staticfiles - mediafiles:/app/media expose: - "8000" # Открывает порт ТОЛЬКО внутри сети Docker для Nginx depends_on: - db # Сначала запустится база, потом приложение # --- ВЕБ-СЕРВЕР (ФАСАД) --- nginx: image: nginx:1.25-alpine restart: unless-stopped volumes: # Основной конфиг маршрутизации - ./nginx/default.conf:/etc/nginx/conf.d/default.conf:ro # Читаем статику и медиа, которые подготовил контейнер 'web' # :ro (read-only) — защита: даже если Nginx взломают, файлы не удалят - staticfiles:/app/staticfiles:ro - mediafiles:/app/media:ro ports: - "80:80" # Единственная "дырка" в мир: порт 80 сервера -> порт 80 контейнера depends_on: - web # Nginx запустится только после Django # Описание "жестких дисков" (Volumes), которые живут дольше контейнеров volumes: postgres_data: # Для данных БД staticfiles: # Для CSS, JS и картинок интерфейса (collectstatic) mediafiles: # Для загруженных тобой чертежей и фото