version: '3.8' services: # 1. PostgreSQL - база данных postgres: image: postgres:15-alpine # лёгкая версия для ARM64 container_name: blog-postgres environment: POSTGRES_DB: blog POSTGRES_USER: blog_user POSTGRES_PASSWORD: blog_password volumes: - postgres_data:/var/lib/postgresql/data - ./app/init.sql:/docker-entrypoint-initdb.d/init.sql # скрипт инициализации ports: - "5432:5432" # только для отладки, можно убрать networks: - blog-network healthcheck: test: ["CMD-SHELL", "pg_isready -U blog_user -d blog"] interval: 5s timeout: 5s retries: 5 # 2. Flask-приложение (собирается из Dockerfile) flask: build: . # использует Dockerfile в текущей папке container_name: blog-flask environment: DB_HOST: postgres DB_NAME: blog DB_USER: blog_user DB_PASSWORD: blog_password depends_on: postgres: condition: service_healthy networks: - blog-network # Не публикуем порт 5000 наружу, только через Nginx # 3. Nginx - обратный прокси nginx: image: nginx:alpine container_name: blog-nginx ports: - "80:80" # основной вход в приложение volumes: - ./nginx/default.conf:/etc/nginx/conf.d/default.conf:ro depends_on: - flask networks: - blog-network # Тома для сохранения данных БД volumes: postgres_data: # Сеть для всех сервисов networks: blog-network: driver: bridge