207 lines
7.2 KiB
YAML
207 lines
7.2 KiB
YAML
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
|