diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..b62275ad --- /dev/null +++ b/.dockerignore @@ -0,0 +1,73 @@ +# 🚀 Docker ignore patterns for optimal build performance + +# 📁 Development environments +.venv/ +venv/ +env/ +__pycache__/ +*.pyc +*.pyo +*.pyd +.mypy_cache/ +.pytest_cache/ +.coverage +htmlcov/ + +# 🧪 Testing and temporary files +tests/ +test-results/ +*_test.py +test_*.py +.ruff_cache/ +.pytest_cache/ + +# 📝 Documentation and metadata +*.md +README* +CHANGELOG* +LICENSE* +docs/ +.gitignore +.dockerignore + +# 🔧 Development tools +.git/ +.github/ +.vscode/ +.idea/ +*.swp +*.swo +*~ + +# 🎯 Build artifacts and cache +dist/ +build/ +*.egg-info/ +node_modules/ +.cache/ +dump/ + +# 📊 Logs and databases +*.log +*.db +*.sqlite +*.sqlite3 +dev-server.pid + +# 🔐 Environment and secrets +.env +.env.* +!.env.example +*.key +*.pem + +# 🎨 Frontend development +panel/node_modules/ +*.css.map +*.js.map + +# 🧹 OS and editor files +.DS_Store +Thumbs.db +*.tmp +*.temp diff --git a/CHANGELOG.md b/CHANGELOG.md index 5bb2af69..0ab6c153 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,21 @@ - Ошибка происходила когда фильтр по топику не применялся, но проверка переменной выполнялась - Исправлено в функции `fetch_authors_with_stats()` в `resolvers/author.py:202` - API запрос `authors:stats:limit=20:offset=0:order=shouts:filter=all` теперь работает корректно +- **🔧 cached_query arguments**: Исправлена ошибка `unexpected keyword argument 'limit'` в кэширующей функции + - Внутренняя функция `fetch_authors_with_stats()` теперь принимает `**kwargs` для совместимости с `cached_query` + - Исправлено дублирование вызовов кэширования при обработке авторов со статистикой + +### 🚀 Docker Build Optimization +- **⚡ Dockerfile improvements**: Кардинально оптимизирован процесс сборки Docker образа + - Переупорядочены слои для максимального кэширования: системные пакеты → Python зависимости → Node.js зависимости → код приложения + - Убрано дублирование установки пакетов (`uv sync` + `pip install`) - теперь только `uv` + - Добавлены комментарии для понимания назначения каждого слоя + - Использование `--frozen` флага для uv для ускорения установки + - Объединены RUN команды для уменьшения количества слоёв +- **📁 .dockerignore**: Создан оптимизированный `.dockerignore` файл + - Исключены все файлы разработки, тесты, документация, логи + - Значительно уменьшен размер контекста сборки + - Исключены кэши и временные файлы для чистой сборки ## [0.9.19] - 2025-09-01 diff --git a/Dockerfile b/Dockerfile index b5332f16..3a7a305e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,6 @@ FROM ghcr.io/astral-sh/uv:python3.13-bookworm-slim +# 🔧 System dependencies layer (cached unless OS changes) RUN apt-get update && apt-get install -y \ postgresql-client \ git \ @@ -9,33 +10,33 @@ RUN apt-get update && apt-get install -y \ ca-certificates \ && rm -rf /var/lib/apt/lists/* +# 📦 Install Node.js LTS (cached until Node.js version changes) +RUN curl -fsSL https://deb.nodesource.com/setup_lts.x | bash - && \ + apt-get install -y nodejs \ + && rm -rf /var/lib/apt/lists/* \ + && npm upgrade -g npm + WORKDIR /app -# Создаем папку для кеша HuggingFace моделей +# 🧠 ML models cache setup (cached unless HF environment changes) RUN mkdir -p /app/.cache/huggingface && chmod 755 /app/.cache/huggingface ENV TRANSFORMERS_CACHE=/app/.cache/huggingface ENV HF_HOME=/app/.cache/huggingface -# Install only transitive deps first (cache-friendly layer) -COPY pyproject.toml . -COPY uv.lock . -RUN uv sync --no-install-project +# 🐍 Python dependencies layer (cached unless pyproject.toml/uv.lock changes) +COPY pyproject.toml uv.lock ./ +RUN uv sync --frozen --no-install-project -# Add project sources and finalize env -COPY . . -RUN uv sync --no-editable - -# Установка Node.js LTS и npm -RUN curl -fsSL https://deb.nodesource.com/setup_lts.x | bash - && \ - apt-get install -y nsolid \ - && rm -rf /var/lib/apt/lists/* - -RUN npm upgrade -g npm +# 📦 Node.js dependencies layer (cached unless package*.json changes) COPY package.json package-lock.json ./ -RUN npm ci +RUN npm ci --only=production + +# 🚀 Application code and final setup (rebuilt on any code change) COPY . . +RUN uv sync --frozen --no-editable + +# 🏗️ Frontend build (cached unless frontend code changes) RUN npm run build -RUN pip install -r requirements.txt EXPOSE 8000 diff --git a/resolvers/author.py b/resolvers/author.py index 350d6a29..062abf56 100644 --- a/resolvers/author.py +++ b/resolvers/author.py @@ -156,9 +156,12 @@ async def get_authors_with_stats( cache_key = f"authors:stats:limit={limit}:offset={offset}:order={order_value}:filter={filter_str}" # Функция для получения авторов из БД - async def fetch_authors_with_stats() -> list[Any]: + async def fetch_authors_with_stats(**kwargs: Any) -> list[Any]: """ Выполняет запрос к базе данных для получения авторов со статистикой. + + Args: + **kwargs: Дополнительные параметры от cached_query (игнорируются) """ try: with local_session() as session: