# Развёртывание из готовых образов Docker Hub (без сборки из исходников). # # Быстрый старт: # 1) cp .env.example .env (при необходимости отредактируйте) # 2) создайте каталоги: mkdir env_config storage logs # 3) положите свой .env бэкенда в env_config/.env (ключи см. DOCKER.md) # 4) добавьте маунты хранилищ хоста в раздел volumes (см. ниже) # 5) docker compose -f docker-compose.release.yml up -d # # Образы по умолчанию берутся из Docker Hub. Переопределите при необходимости: # $env:IMAGE_OWNER=""; $env:IMAGE_TAG="v1.2.3" # docker compose -f docker-compose.release.yml up -d # # HOST-РЕЖИМ (network_mode: host): # backend в сети хоста — нужен для multicast DNS (поиск устройств _umni_api._tcp.local.) # и приёма UDP-широковещательного syslog (порт 514) от устройств. # frontend в сети хоста — nginx слушает 80 на хосте, проксирует на backend по loopback. # postgres остаётся на bridge app-network, публикуется только на 127.0.0.1:5432. # # ВАЖНО: сервис с network_mode: host не может иметь networks:, ports:, expose:. # Ошибка "only one instance of 'host' network is allowed" = это правило нарушено. services: postgres: image: postgres:16-alpine container_name: umni_postgres restart: unless-stopped env_file: - ./env_config/.env environment: TZ: Europe/Moscow POSTGRES_DB: ${DB_NAME:-umni} POSTGRES_USER: ${DB_USER:-postgres} POSTGRES_PASSWORD: ${DB_PASSWORD:-postgres} ports: - "127.0.0.1:5432:5432" volumes: - postgres_data:/var/lib/postgresql/data networks: - app-network healthcheck: test: ["CMD-SHELL", "pg_isready -U ${DB_USER:-postgres}"] interval: 10s timeout: 5s retries: 5 backend: image: ${IMAGE_OWNER:-sazanof}/umni-ecosystem-backend:${IMAGE_TAG:-latest} container_name: umni_backend restart: unless-stopped network_mode: host command: uvicorn main:app --host 127.0.0.1 --port 8000 depends_on: postgres: condition: service_healthy env_file: - ./env_config/.env environment: DB_HOST: 127.0.0.1 DB_USER: ${DB_USER:-postgres} DB_PASSWORD: ${DB_PASSWORD:-postgres} DB_NAME: ${DB_NAME:-umni} DB_PORT: ${DB_PORT:-5432} LOG_LEVEL: ${LOG_LEVEL:-INFO} LOG_DIR: /app/logs STORAGE_HOST_BASE: ${STORAGE_HOST_BASE:-/host} TZ: Europe/Moscow volumes: - ./logs:/app/logs # .env монтируется на запись: приложение само хранит ENCRYPTION_KEY. - ./env_config:/app/env_config - ./storage:/app/storage - ./plugins/custom:/app/plugins/custom # Хранилища хоста. Путь в storages задаётся ХОСТОВЫЙ (например "D:\CameraData"), # backend сам переведёт его в контейнерный: "/D/CameraData". # # Windows-хост (Docker Desktop): монтируем весь диск в /host/<буква>. # - type: bind # source: 'D:\' # target: /host/D # # Linux-хост: путь в storages задаётся контейнерный, как в маунте ниже. # - type: bind # source: /mnt/rec # target: /mnt/rec frontend: image: ${IMAGE_OWNER:-sazanof}/umni-ecosystem-frontend:${IMAGE_TAG:-latest} container_name: umni_frontend restart: unless-stopped network_mode: host volumes: - ./nginx.host.conf:/etc/nginx/nginx.conf:ro depends_on: backend: condition: service_healthy volumes: postgres_data: networks: app-network: driver: bridge