FROM python:3.11-slim

WORKDIR /app

# ОПТИМИЗАЦИЯ: Установка системных зависимостей (объединено в один RUN для уменьшения слоев)
RUN apt-get update && apt-get install -y \
     gcc \
     poppler-utils \
     tesseract-ocr \
     libxml2 \
     libxslt1.1 \
     antiword \
     catdoc \
     unrtf \
     libreoffice \
     default-jre \
     && rm -rf /var/lib/apt/lists/* \
     && apt-get clean

# ИСПРАВЛЕНО: Установка CPU-only torch перед sentence-transformers
# Это уменьшает размер образа на ~1.5-2GB и ускоряет установку
# sentence-transformers автоматически использует уже установленный torch
# ОПТИМИЗАЦИЯ: Используем --no-cache-dir для уменьшения размера образа
RUN pip install --no-cache-dir torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu

# ОПТИМИЗАЦИЯ: Копирование файлов требований отдельно для лучшего кэширования
# Этот слой кэшируется и пересобирается только при изменении requirements.txt
COPY requirements.txt .

# ОПТИМИЗАЦИЯ: Установка Python зависимостей с --no-cache-dir для уменьшения размера
# ВАЖНО: Этот шаг кэшируется отдельно, пересобирается только при изменении requirements.txt
RUN pip install --no-cache-dir -r requirements.txt

# ОПТИМИЗАЦИЯ: Предзагрузка моделей вынесена в отдельный этап (закомментировано)
# Предзагрузка увеличивает размер образа на ~500MB, но ускоряет первый запуск
# Раскомментировать если нужна предзагрузка для ускорения первого запуска
# RUN python -c "from sentence_transformers import CrossEncoder; CrossEncoder('BAAI/bge-reranker-base')"
# RUN python -c "\
# import os; \
# from optimum.onnxruntime import ORTModelForSequenceClassification; \
# from transformers import AutoTokenizer; \
# model_name = 'BAAI/bge-reranker-base'; \
# onnx_cache_dir = os.path.join(os.path.expanduser('~'), '.cache', 'onnx_models', model_name.replace('/', '_')); \
# os.makedirs(onnx_cache_dir, exist_ok=True); \
# print(f'Конвертируем модель {model_name} в ONNX...'); \
# onnx_model = ORTModelForSequenceClassification.from_pretrained(model_name, export=True); \
# tokenizer = AutoTokenizer.from_pretrained(model_name); \
# print(f'Сохраняем ONNX модель в кэш: {onnx_cache_dir}'); \
# onnx_model.save_pretrained(onnx_cache_dir); \
# tokenizer.save_pretrained(onnx_cache_dir); \
# print('ONNX модель успешно сохранена в кэш'); \
# "

# ОПТИМИЗАЦИЯ: Объединение COPY команд для уменьшения количества слоев
# Копируем только необходимые файлы (остальное исключено через .dockerignore)
COPY app.py \
     file_manager.py \
     document_parsers.py \
     process_documents.py \
     chroma_client.py \
     embedding_service.py \
     proper_retriever.py \
     reranker_client.py \
     retriever_settings.json \
     parser_settings.json \
     run_system.py \
     ./

# Копирование директорий
COPY templates/ templates/
COPY static/ static/
COPY production_configs/ /opt/autogen/production/configs/

# ОПТИМИЗАЦИЯ: Создание директорий объединено в один RUN
RUN mkdir -p /app/data \
             /opt/autogen/production/configs \
             /opt/autogen/development/configs

# Открытие порта
EXPOSE 9004

# Запуск приложения
CMD ["python", "app.py"]

