version: '3.8' services: # --- Backend Service --- fastapi: build: context: ./backend dockerfile: Dockerfile # Не монтируем код в продакшене, он уже скопирован в образ # volumes: # - ./backend:/app # Используем CMD из базового образа tiangolo/uvicorn-gunicorn-fastapi (Gunicorn + Uvicorn workers) # command: uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload # Это для разработки command: uvicorn app.main:app --host 0.0.0.0 --port 8000 expose: - "8000" # Внутренний порт, доступный другим сервисам в сети networks: - app-network environment: # Переменная для подключения к MeiliSearch внутри Docker-сети - MEILISEARCH_URL=http://meilisearch:7700 - MEILISEARCH_KEY=dNmMmxymWpqTFyWSSFyg3xaGlEY6Pn7Ld-dyrnKRMzM # Добавьте сюда другие переменные окружения для бэкенда (ключи API, настройки БД и т.д.) # - DATABASE_URL=... # - SECRET_KEY=... depends_on: - meilisearch # Запускать после MeiliSearch restart: unless-stopped # --- Frontend Service --- frontend: build: context: ./frontend dockerfile: Dockerfile # Не монтируем исходный код в продакшене # volumes: # - ./frontend:/app # Сохраняем .next для возможного ускорения перезапусков (опционально) # volumes: # - frontend_next:/app/.next # Команда запускает уже собранное приложение command: npm start expose: - "3000" # Внутренний порт для Next.js сервера networks: - app-network environment: # URL для API-запросов из БРАУЗЕРА (через Nginx) # Браузер будет обращаться к /api/... на том же домене/хосте - NEXT_PUBLIC_API_URL=/api # URL для API-запросов со стороны СЕРВЕРА Next.js (SSR, API Routes) # Используем внутреннее имя сервиса Docker для серверных запросов - NEXT_SERVER_API_URL=http://fastapi/api # URL для доступа к MinIO (для изображений) - NEXT_PUBLIC_MINIO_URL=http://45.129.128.113:9000 # Включаем режим отладки для логирования URL изображений - NEXT_PUBLIC_DEBUG=true # Убедитесь, что ваш Next.js код использует INTERNAL_API_URL для серверных запросов # и NEXT_PUBLIC_API_URL (или просто относительный путь /api) для клиентских depends_on: - fastapi # Желательно запускать после бэкенда restart: unless-stopped # --- PHP Service --- php: image: php:8.2-apache volumes: - ./php:/var/www/html # Монтируем PHP скрипты expose: - "80" # Apache внутри контейнера слушает порт 80 networks: - app-network restart: unless-stopped # --- Nginx Reverse Proxy --- nginx: image: nginx:alpine volumes: # Монтируем наш конфиг Nginx (только для чтения) - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro # Опционально: монтируем статику, если она не раздается через Next.js/FastAPI # - ./static:/usr/share/nginx/html/static:ro ports: # Единственная точка входа: порт 80 хоста -> порт 80 Nginx - "80:80" # Если нужен HTTPS (рекомендуется), добавьте: # - "443:443" # И настройте SSL в nginx.conf, монтируя сертификаты depends_on: - fastapi - frontend - php networks: - app-network restart: always # --- MeiliSearch Service --- meilisearch: image: getmeili/meilisearch:latest container_name: meilisearch hostname: meilisearch # Не публикуем порт наружу, доступ только через FastAPI/Nginx ports: - "7700:7700" expose: - "7700" # Внутренний порт environment: # ВАЖНО: Используйте СВОЙ надежный мастер-ключ! - MEILI_MASTER_KEY=dNmMmxymWpqTFyWSSFyg3xaGlEY6Pn7Ld-dyrnKRMzM - MEILI_NO_ANALYTICS=true - MEILI_ENV=production volumes: - meili_data:/data.ms # Сохранение данных MeiliSearch healthcheck: test: ["CMD", "wget", "--no-verbose", "--spider", "http://localhost:7700/health"] interval: 10s timeout: 5s retries: 3 start_period: 15s restart: always networks: - app-network # Алиас не обязателен, если имя сервиса совпадает с hostname # aliases: # - meilisearch # --- Сеть для взаимодействия контейнеров --- networks: app-network: driver: bridge # --- Тома для сохранения данных --- volumes: meili_data: # Для данных MeiliSearch driver: local frontend_next: # Для кэша сборки Next.js (опционально) driver: local # version: '3.8' # Compose Specification v3.8 # services: # fastapi: # build: # context: ./backend # директория с Dockerfile FastAPI # volumes: # - ./backend:/app # монтируем код для live-reload # command: uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload # hot-reload # ports: # - "8000:8000" # networks: # - app-network # php: # image: php:8.2-apache # официальный PHP Apache образ # volumes: # - ./php:/var/www/html # ports: # - "8081:80" # networks: # - app-network # nginx: # image: nginx:stable # volumes: # - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro # монтируем конфиг NGINX # ports: # - "80:80" # depends_on: # - fastapi # - php # networks: # - app-network # meilisearch: # image: getmeili/meilisearch:latest # container_name: dressed-for-success-meilisearch # hostname: meilisearch # ports: # - "7700:7700" # environment: # - MEILI_MASTER_KEY=dNmMmxymWpqTFyWSSFyg3xaGlEY6Pn7Ld-dyrnKRMzM # - MEILI_NO_ANALYTICS=true # - MEILI_ENV=production # volumes: # - meilisearch_data:/meili_data # healthcheck: # test: ["CMD", "wget", "--no-verbose", "--spider", "http://localhost:7700/health"] # interval: 10s # timeout: 5s # retries: 3 # start_period: 15s # restart: always # networks: # app-network: # aliases: # - meilisearch # dns_search: . # volumes: # meilisearch_data: # networks: # app-network: # общая сеть для контейнеров # driver: bridge