Security / шифрование: - stream_key (128-byte KDF-derived key для encrypted H.265+) теперь шифруется Fernet как и пароль DVR. Добавлены _enc_stream_key / _dec_stream_key, расшифровка в _dvr_row, автомиграция plaintext→Fernet при старте для существующих записей - dvrs_add / dvrs_edit шифруют stream_key на INSERT/UPDATE Resource cleanup: - release(buf): kill() теперь вне buf.lock + wait(timeout=2) чтобы не оставлять зомби-процессов (wine/ffmpeg) после disconnect - view_playback: при смене ключа старый buffer также wait(timeout=2) Docker: - Dockerfile: установка wine + wine32 (i386) + xvfb для PlayCtrl.dll - Предварительная инициализация WINEPREFIX=/app/.wine во время build (избегаем задержек первого wineboot в runtime) - entrypoint.sh запускает Xvfb на :1, затем gunicorn - COPY dvr_admin/wine_playm4/ в образ (директория gitignore'д — нужно положить вручную перед docker build, см. DEPLOY.md) - DEPLOY.md: добавлена секция «Требования для сборки» с пояснением про wine_playm4/ и варианты без него Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
56 lines
1.9 KiB
Docker
56 lines
1.9 KiB
Docker
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"]
|