2025-12-11 01:07:04 +03:00
|
|
|
|
FROM python:3.11-slim
|
fix(downloaders): Deno runtime, свежий yt-dlp, честный health-check, смоук-тест
Возрастные YouTube-видео не скачивались: с cookies yt-dlp отбрасывает клиент
android и остаётся web, которому нужно решить n-challenge, а в образе стоял
Node 20 при требуемом минимуме 22 ("JS runtimes: node-20.19.2 (unsupported)").
Ставим Deno — рекомендованный yt-dlp рантайм и один статический бинарник.
Instagram падал с "empty media response" одинаково с cookies и без них —
дело было не в сессии, а в устаревшем экстракторе: слой pip был закеширован
на yt-dlp 2026.06.09. Поднимаем нижнюю границу до 2026.7.4.
/cookies/check помечал проблемой с cookies ЛЮБОЙ сбой, из-за чего на поломку
JS-рантайма прилетел алерт про протухшие cookies и увёл разбор не туда.
Теперь ответ содержит status: ok | cookies_invalid | extraction_failed |
no_cookies, и админ-бот шлёт разные сообщения. Разбор ответа в bot.py
сохраняет совместимость со старым форматом без поля status.
Добавлен smoke_test.py — гоняет реальные ссылки (включая обе регрессии выше)
через запущенные сервисы и печатает таблицу. Запускать после каждой правки.
Схема получения cookies переведена с крона на разовый ручной экспорт:
cookies-cron/ -> cookies/, удалены скрипты с анти-паттерном
`--cookies-from-browser BROWSER --cookies FILE`, который wiki yt-dlp прямо
запрещает и который сам ломал YouTube-сессию ротацией. Ключевые cookies живут
около года, поэтому обновление по расписанию не нужно — триггером служит алерт
health-check. deliver_cookies.sh только доставляет файлы по scp.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-26 00:31:16 +00:00
|
|
|
|
RUN apt-get update && apt-get install -y ffmpeg wget curl aria2 unzip && rm -rf /var/lib/apt/lists/*
|
|
|
|
|
|
# Deno — рекомендованный yt-dlp рантайм для решения n-challenge YouTube.
|
|
|
|
|
|
# Node из Debian bookworm — версия 20, а yt-dlp требует минимум 22 (иначе
|
|
|
|
|
|
# "JS runtimes: node-20.x (unsupported)" и "No video formats found" на путях с cookies).
|
|
|
|
|
|
RUN set -eux; \
|
|
|
|
|
|
case "$(uname -m)" in \
|
|
|
|
|
|
x86_64) DENO_ARCH=x86_64-unknown-linux-gnu ;; \
|
|
|
|
|
|
aarch64) DENO_ARCH=aarch64-unknown-linux-gnu ;; \
|
|
|
|
|
|
*) echo "unsupported arch: $(uname -m)" >&2; exit 1 ;; \
|
|
|
|
|
|
esac; \
|
|
|
|
|
|
curl -fsSL --retry 5 --retry-all-errors -o /tmp/deno.zip \
|
|
|
|
|
|
"https://github.com/denoland/deno/releases/latest/download/deno-${DENO_ARCH}.zip"; \
|
|
|
|
|
|
unzip -q /tmp/deno.zip -d /usr/local/bin; \
|
|
|
|
|
|
rm /tmp/deno.zip; \
|
|
|
|
|
|
chmod +x /usr/local/bin/deno; \
|
|
|
|
|
|
deno --version
|
2025-12-11 01:07:04 +03:00
|
|
|
|
WORKDIR /app
|
|
|
|
|
|
COPY requirements.txt .
|
|
|
|
|
|
RUN pip install --no-cache-dir -r requirements.txt
|
|
|
|
|
|
COPY . .
|
|
|
|
|
|
RUN mkdir -p downloads
|
|
|
|
|
|
ENV PYTHONUNBUFFERED=1
|
2026-06-30 20:24:46 +00:00
|
|
|
|
CMD sh -c "gunicorn --workers=1 --timeout=600 --preload --max-requests=20 --max-requests-jitter=5 --bind=0.0.0.0:\${PORT:-5000} app:app"
|