File size: 3,790 Bytes
5b04fa3
 
 
 
 
 
9a08963
5b04fa3
 
7786593
 
cacf723
5b04fa3
9a08963
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5b04fa3
9a08963
 
 
 
 
 
 
 
 
 
7786593
 
 
9a08963
7786593
9a08963
 
 
 
 
f40e9a4
 
 
 
 
9a08963
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# ОБНОВЛЕНО (аудит зависимостей, 16 августа 2026): 8.1.2 -> 9.0 — мажорный
# апстрим-бамп FFmpeg (ABI-слом внутри библиотек, но не в CLI-флагах, которые
# реально использует бот: -c:a libopus/-vf scale/ffprobe -show_entries — ни один
# из них не тронут релиз-нотами 9.0, см. официальный Changelog). Проверено
# точечно перед бампом, а не вслепую.
FROM mwader/static-ffmpeg:9.0 AS ffmpeg

# ОБНОВЛЕНО (аудит зависимостей, 16 августа 2026): 3.10 -> 3.13 — requirements.txt
# и так уже требовали только "Python 3.10+" (не конкретно 3.10), все закреплённые
# версии зависимостей (aiogram 3.31, google-genai 2.24, fastapi 0.141, uvicorn
# 0.53 и т.д.) заявляют поддержку вплоть до 3.14 — полный прогон тестового сьюта
# под новой версией прошёл без единого изменения кода.
FROM python:3.13-slim

ENV PYTHONUNBUFFERED=1 \
    PYTHONDONTWRITEBYTECODE=1 \
    PIP_NO_CACHE_DIR=1 \
    PIP_DISABLE_PIP_VERSION_CHECK=1

WORKDIR /app

# ca-certificates нужен для TLS из Python (Gemini API, OpenRouter, Pollinations, TikWM,
# Deno-прокси и т.д.). apt-get install ffmpeg отсюда убран — см. ниже.
RUN apt-get update \
    && apt-get install -y --no-install-recommends ca-certificates \
    && rm -rf /var/lib/apt/lists/*

# ffmpeg/ffprobe — статические бинарники из отдельного минимального образа, а не из apt.
# Пакет ffmpeg в Debian trixie (текущий базовый слой python:3.13-slim) тянет ~205
# транзитивных зависимостей — X11, Vulkan, Mesa OpenGL, PulseAudio, JACK, libsdl2,
# Samba/Kerberos, шрифты и т.п. (GUI/аудиосервер-стек, нужный только для ffplay,
# который в проекте не используется вообще). Это лишние ~460 МБ в образе и заметно
# более долгая и "тяжёлая" сборка — а боту нужны только сами бинарники ffmpeg/ffprobe
# для headless-задач (конвертация аудио в OGG/Opus для /tts, извлечение превью и
# метаданных видео для TikTok). Статические бинарники не имеют внешних зависимостей
# вообще — они просто копируются в PATH.
COPY --from=ffmpeg /ffmpeg /usr/local/bin/ffmpeg
COPY --from=ffmpeg /ffprobe /usr/local/bin/ffprobe

# Без `pip install --upgrade pip`: версии инструмента не зафиксированы, а образ
# пересобирается с нуля на каждом деплое — такой шаг делает сборку невоспроизводимой
# ровно в том смысле, ради которого закреплён requirements.txt (аудит 26.09.2026).
COPY requirements.txt /app/requirements.txt
RUN pip install -r /app/requirements.txt

COPY . /app

EXPOSE 7860

# Дешёвая проба живости — in-memory "/" без сетевых вызовов (см. healthcheck в
# bot.py). Отдельного curl в образе нет — хватает stdlib-urllib.
HEALTHCHECK --interval=60s --timeout=5s --start-period=60s --retries=3 \
  CMD python -c "import urllib.request; urllib.request.urlopen('http://127.0.0.1:7860/', timeout=4)"

CMD ["python", "-u", "bot.py"]