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>
16 lines
463 B
Bash
16 lines
463 B
Bash
#!/bin/bash
|
||
# Запускает Xvfb на DISPLAY :1 для wine PlayCtrl.dll, потом gunicorn.
|
||
set -e
|
||
|
||
# Xvfb в фоне. -nolisten tcp чтобы не ловили извне.
|
||
Xvfb :1 -screen 0 640x480x8 -nolisten tcp &
|
||
XVFB_PID=$!
|
||
|
||
# Xvfb обычно поднимается за <1с
|
||
sleep 1
|
||
|
||
trap "kill $XVFB_PID 2>/dev/null || true" EXIT
|
||
|
||
exec gunicorn --bind 0.0.0.0:8000 --workers 1 --threads 16 \
|
||
--timeout 3600 --worker-class gthread app:app
|