# Copyright (c) 2024-2025 Тарабанов Александр Викторович
# All rights reserved.
# This software is proprietary and confidential.
# For licensing inquiries: info@hb3-accelerator.com

# Production docker-compose для VDS
services:
  postgres:
    image: postgres:16
    container_name: dapp-postgres
    restart: unless-stopped
    networks:
      - dapp_network
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"
    volumes:
      - postgres_data:/var/lib/postgresql/data
      - ./backend/db/data:/mnt/isic_csv_data
    environment:
      - POSTGRES_DB=${DB_NAME:-dapp_db}
      - POSTGRES_USER=${DB_USER:-dapp_user}
      - POSTGRES_PASSWORD=${DB_PASSWORD:-dapp_password}
      # 🆕 SCRAM-SHA-256 для безопасной аутентификации
      - POSTGRES_INITDB_ARGS=--auth-host=scram-sha-256 --auth-local=scram-sha-256
    # НЕ открываем порт 5432 наружу - только внутри Docker сети
    healthcheck:
      test:
        - CMD-SHELL
        - pg_isready -U ${DB_USER:-dapp_user} -d ${DB_NAME:-dapp_db}
      interval: 5s
      timeout: 5s
      retries: 5

  ollama:
    image: digital_legal_entitydle-ollama:latest
    container_name: dapp-ollama
    restart: unless-stopped
    networks:
      - dapp_network
    logging:
      driver: "json-file"
      options:
        max-size: "20m"
        max-file: "3"
    volumes:
      - ollama_data:/root/.ollama
    deploy:
      resources:
        limits:
          cpus: '2.0'
          memory: 6G
        reservations:
          cpus: '1.0'
          memory: 4G
    environment:
      - OLLAMA_HOST=0.0.0.0
      - OLLAMA_ORIGINS=*
      - OLLAMA_NUM_PARALLEL=2
      - OLLAMA_NUM_GPU=0
      - OLLAMA_KEEP_ALIVE=86400
      - OLLAMA_MODEL_TIMEOUT=0
      - OLLAMA_MAX_LOADED_MODELS=2
      - OLLAMA_FLASH_ATTENTION=0
      - OLLAMA_LLM_LIBRARY=auto
    healthcheck:
      test: ["CMD", "ollama", "list"]
      interval: 30s
      timeout: 10s
      retries: 5
      start_period: 120s

  vector-search:
    image: digital_legal_entitydle-vector-search:latest
    container_name: dapp-vector-search
    restart: unless-stopped
    networks:
      - dapp_network
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"
    depends_on:
      ollama:
        condition: service_healthy
    volumes:
      - vector_search_data:/app/data
    environment:
      # 🆕 Исправленный URL для Ollama
      - OLLAMA_BASE_URL=http://dapp-ollama:11434
      - OLLAMA_EMBED_MODEL=${OLLAMA_EMBEDDINGS_MODEL:-mxbai-embed-large:latest}
      - VECTOR_SEARCH_PORT=8001
      - LOG_LEVEL=INFO
    # 🆕 Улучшенный health check с fallback
    healthcheck:
      test:
        - CMD-SHELL
        - >-
          python -c "import sys, urllib.request;
          sys.exit(0 if urllib.request.urlopen('http://127.0.0.1:8001/health', timeout=5).getcode() == 200 else 1)"
      interval: 20s
      timeout: 5s
      retries: 5
      start_period: 40s

  backend:
    image: digital_legal_entitydle-backend:latest
    container_name: dapp-backend
    restart: unless-stopped
    networks:
      - dapp_network
    logging:
      driver: "json-file"
      options:
        max-size: "5m"
        max-file: "2"
    # 🆕 Исправленные зависимости - backend запускается после postgres и ollama, но не ждет vector-search
    depends_on:
      postgres:
        condition: service_healthy
      ollama:
        condition: service_healthy
      vector-search:
        condition: service_started
    volumes:
      - backend_node_modules:/app/node_modules
      - ./ssl:/app/ssl:ro
      # Доступ к Docker socket для управления контейнерами на VDS
      - /var/run/docker.sock:/var/run/docker.sock:ro
      # Доступ к системным файловым системам для мониторинга и управления
      # Монтируем напрямую для работы команд top, free, ps и т.д.
      - /proc:/host/proc:ro
      - /sys:/host/sys:ro
      # Также монтируем в стандартные пути для совместимости (read-only для безопасности)
      - /proc:/proc:ro
      - /sys:/sys:ro
      - ~/.ssh:/root/.ssh:ro  # SSH ключи для подключения к VDS
    # Добавляем необходимые capabilities для управления системой
    cap_add:
      - SYS_ADMIN  # Для управления системой (reboot, shutdown, useradd и т.д.)
      - SYS_TIME   # Для управления временем системы
    environment:
      - NODE_ENV=production
      - PORT=8000
      - FRONTEND_URL=https://${DOMAIN}
      # 🆕 Исправленные переменные БД с правильными именами хостов
      - DB_HOST=dapp-postgres
      - DB_PORT=5432
      - DB_NAME=${DB_NAME:-dapp_db}
      - DB_USER=${DB_USER:-dapp_user}
      - DB_PASSWORD=${DB_PASSWORD:-dapp_password}
      # 🆕 DATABASE_URL с SCRAM-SHA-256 поддержкой
      - DATABASE_URL=postgresql://${DB_USER:-dapp_user}:${DB_PASSWORD:-dapp_password}@dapp-postgres:5432/${DB_NAME:-dapp_db}?sslmode=prefer
      # 🆕 Исправленный URL для Ollama
      - OLLAMA_BASE_URL=http://dapp-ollama:11434
      - OLLAMA_MODEL=${OLLAMA_MODEL:-qwen2.5:7b}
      - OLLAMA_EMBEDDINGS_MODEL=${OLLAMA_EMBEDDINGS_MODEL:-mxbai-embed-large:latest}
      # 🆕 Исправленный URL для Vector Search
      - VECTOR_SEARCH_URL=http://dapp-vector-search:8001
    # НЕ открываем порт 8000 наружу - только nginx подключается
    healthcheck:
      test: ["CMD", "node", "-e", "require('http').get('http://localhost:8000/api/health', (res) => { process.exit(res.statusCode === 200 ? 0 : 1) })"]
      interval: 30s
      timeout: 10s
      retries: 5
      start_period: 60s

  frontend:
    image: digital_legal_entitydle-frontend:latest
    container_name: dapp-frontend
    restart: unless-stopped
    networks:
      - dapp_network
    logging:
      driver: "json-file"
      options:
        max-size: "5m"
        max-file: "2"
    depends_on:
      backend:
        condition: service_healthy
    volumes:
      - ./ssl:/app/ssl:ro
    environment:
      - NODE_ENV=production
      - PORT=5173
      # 🆕 Исправленный URL для backend
      - VITE_BACKEND_URL=https://${DOMAIN}/api
      - VITE_WS_URL=wss://${DOMAIN}/ws
    # НЕ открываем порт 5173 наружу - только nginx подключается
    healthcheck:
      test: ["CMD", "node", "-e", "require('http').get('http://localhost:5173', (res) => { process.exit(res.statusCode === 200 ? 0 : 1) })"]
      interval: 30s
      timeout: 10s
      retries: 5
      start_period: 60s

  # Certbot контейнер для автоматического получения SSL сертификатов
  # 🆕 Убрана зависимость от frontend-nginx - certbot может работать независимо
  certbot:
    image: certbot/certbot
    container_name: dapp-certbot
    restart: "no"
    networks:
      - dapp_network
    volumes:
      - /etc/letsencrypt:/etc/letsencrypt
      - /var/www/certbot:/var/www/certbot
    command: >-
      certonly
      --webroot
      --webroot-path=/var/www/certbot
      --email ${EMAIL}
      --agree-tos
      --no-eff-email
      --non-interactive
      --keep-until-expiring
      --expand
      -d ${DOMAIN}
    # 🆕 Убрана зависимость - certbot работает независимо через временный nginx или существующий

  # Nginx с автоматическим SSL и поддержкой WebSocket
  frontend-nginx:
    image: digital_legal_entitydle-frontend-nginx:latest
    container_name: dapp-frontend-nginx
    restart: unless-stopped
    networks:
      - dapp_network
    ports:
      - "80:80"
      - "443:443"
    environment:
      - DOMAIN=${DOMAIN:-localhost}
      - BACKEND_CONTAINER=dapp-backend
      - EMAIL=${EMAIL}
      # 🆕 Переменные для WebSocket поддержки
      - WS_BACKEND_CONTAINER=dapp-backend
    volumes:
      # SSL сертификаты Let's Encrypt (автоматически обновляются)
      - /etc/letsencrypt:/etc/letsencrypt:ro
      # Webroot для certbot
      - /var/www/certbot:/var/www/certbot
    depends_on:
      - backend
      - frontend
    healthcheck:
      test: ["CMD-SHELL", "curl -k -f https://127.0.0.1/health || curl -f http://127.0.0.1/health || exit 1"]
      interval: 30s
      timeout: 10s
      retries: 5
      start_period: 30s

  webssh-agent:
    image: digital_legal_entitydle-webssh-agent:latest
    container_name: dapp-webssh-agent
    restart: unless-stopped
    volumes:
      - ~/.ssh:/root/.ssh:ro
      - /var/run/docker.sock:/var/run/docker.sock:rw
    # 🆕 Исправленный проброс портов - только локальный доступ для безопасности
    ports:
      - "127.0.0.1:3000:3000"
    environment:
      - NODE_ENV=production
    depends_on:
      - backend


# 🆕 Явное определение Docker сети для обеспечения связи между контейнерами
networks:
  dapp_network:
    driver: bridge
    name: dapp_network

volumes:
  postgres_data:
  ollama_data:
  vector_search_data:
  backend_node_modules:
