# Среда запуска для imgbot-daemon. Сам код — не наш: проект живёт у агента # в /home/tgclaude/imgbot и правится им же. Здесь только окружение. # # База — официальный образ playwright с тегом ровно под версию из uv.lock # проекта (playwright 1.62.0): в нём уже есть chromium и его системные # библиотеки. Именно поэтому в контейнере не нужен костыль # ~tgclaude/chrome-libs/extract/usr/lib/... , которым это лечилось на хосте. FROM mcr.microsoft.com/playwright/python:v1.62.0-noble # В этом образе лежат только браузеры (/ms-playwright, PLAYWRIGHT_BROWSERS_PATH # уже выставлен), а python-пакета playwright нет — его ставим сами, и версию # фиксируем ровно 1.62.0 = версия из uv.lock проекта = ревизия chromium-1234, # вкомпилированная в этот тег. Разъезд версии пакета и образа даёт # "Executable doesn't exist" при launch(), поэтому теги менять только парой. # # Остальное — по фактическим импортам обоих сервисов из этого образа: # collector/fetcher → playwright # storage/analyze → pillow # daemon → apscheduler (tzlocal подтянётся зависимостью) # app/mcp_server → mcp (с ним приходят starlette, uvicorn, httpx) # Версии — из uv.lock проекта, чтобы образ и хостовый venv не разъезжались. RUN pip install --no-cache-dir \ playwright==1.62.0 \ pillow==12.3.0 \ apscheduler==3.11.3 \ mcp==1.29.1 # Исходники НЕ копируются в образ — они монтируются снаружи (см. compose), # чтобы правки в проекте применялись рестартом контейнера, без пересборки. # # HOME задан не случайно: collector.py безусловно вызывает Path.home(), а uid # 1001 внутри образа не имеет записи в /etc/passwd — без HOME expanduser # упадёт с RuntimeError. ENV PYTHONPATH=/app/src \ PYTHONUNBUFFERED=1 \ IMGBOT_DATA_DIR=/home/tgclaude/imgbot-data \ HOME=/tmp WORKDIR /app CMD ["python3", "-c", "from imgbot.daemon import main; main()"]