FROM python:3.11-slim # ── Wine + Xvfb для PlayCtrl.dll (native SDK playback encrypted H.265+) ──── # wine32 тянет i386-архитектуру. Xvfb нужен для wine процессов (DISPLAY=:1). RUN dpkg --add-architecture i386 \ && apt-get update && apt-get install -y --no-install-recommends \ gcc \ libffi-dev \ ffmpeg \ wine \ wine32 \ xvfb \ && rm -rf /var/lib/apt/lists/* WORKDIR /app COPY dvr_admin_docker/requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # Приложение и нативные библиотеки COPY dvr_admin/lib/ /app/lib/ COPY dvr_admin/app.py . # Wine PlayCtrl — proprietary Hikvision DLL. # Директория gitignore'д; во время сборки ДОЛЖНА присутствовать в build-контексте. # Если playm4_pb_server.exe отсутствует — native SDK playback для encrypted # потоков работать не будет, остальной функционал останется. COPY dvr_admin/wine_playm4/ /app/wine_playm4/ # Пред-инициализация wine префикса под non-root окружением: создаёт # ~/.wine заранее, чтобы первый запуск не занимал минуты ENV WINEPREFIX=/app/.wine \ WINEARCH=win32 \ WINEDEBUG=-all \ DISPLAY=:1 RUN Xvfb :1 -screen 0 640x480x8 & \ sleep 1 && \ wine wineboot --init 2>/dev/null || true && \ wineserver -w || true VOLUME ["/data"] ENV DATA_DIR=/data \ SDK_DIR=/app/lib \ LD_LIBRARY_PATH=/app/lib \ _DVR_LD_SET=1 EXPOSE 8000 # Entrypoint: запускаем Xvfb в фоне, затем gunicorn. Xvfb = пустой display # на :1 (wine требует X-сервер даже в headless-режиме). COPY dvr_admin_docker/entrypoint.sh /app/entrypoint.sh RUN chmod +x /app/entrypoint.sh CMD ["/app/entrypoint.sh"]