f8e27b9e85
Объединённое состояние работ:
- Phase 10: source pool, motion-driven layout, Frigate motion_pulse,
zone-filter в pool, --source / --motion-mode CLI
- Phase 11 Steps 1-3c: 8×8 микро-сетка, JSON templates с asymmetric
layouts (tpl_1/3/4/5/6/7/8), reload через ZMQ, auto-labels per camera
В прод отдеплоено и откачено: используем gx/cuframes-composer:0.10 как
baseline. Phase 11 продолжится в branch phase11b-cpp как C++ refactor
с ООП-моделью Cell/Layout/Decoration.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
92 lines
4.7 KiB
Docker
92 lines
4.7 KiB
Docker
# cuframes-composer — production Docker image.
|
||
#
|
||
# Multi-stage:
|
||
# 1) builder: nvidia/cuda CUDA-toolkit + build deps + cmake build
|
||
# 2) runtime: nvidia/cuda base (минимум: libcudart) + runtime deps + бинарь
|
||
#
|
||
# Размер runtime image: ~250 MB (cuda runtime + apt-deps). Build image: ~5 GB.
|
||
#
|
||
# Использование:
|
||
# docker build -t gx/cuframes-composer:0.1 -f docker/Dockerfile .
|
||
# docker run --gpus all --network=cctv --ipc=container:cuframes-ipc-anchor \
|
||
# -v cctv_cuframes_sock:/run/cuframes:ro \
|
||
# -v cuda_grid_icons:/icons:ro \
|
||
# -v /usr/share/fonts/truetype/dejavu:/fonts:ro \
|
||
# -p 5599:5599 \
|
||
# gx/cuframes-composer:0.1 grid_record --out - --control tcp://0.0.0.0:5599 ...
|
||
#
|
||
# Лицензия: LGPL-2.1+
|
||
|
||
# ── Builder ──────────────────────────────────────────────────────────────
|
||
# CUDA 12 (не 13) — нужен для sm_61 (Pascal GTX 1050) в production.
|
||
# CUDA 13 deprecated Pascal. Ubuntu 22.04 jammy glibc 2.35 forward-compat
|
||
# на хосте 24.04 noble (glibc 2.39).
|
||
FROM nvidia/cuda:12.4.1-devel-ubuntu22.04 AS builder
|
||
|
||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||
build-essential cmake git pkg-config \
|
||
libpng-dev libfreetype-dev \
|
||
libzmq3-dev libjson-c-dev libmosquitto-dev \
|
||
libavformat-dev libavcodec-dev libavutil-dev \
|
||
&& rm -rf /var/lib/apt/lists/*
|
||
|
||
WORKDIR /src
|
||
COPY . .
|
||
|
||
RUN git submodule update --init --recursive || true
|
||
|
||
# CUDA architectures: production targets compiled to real binary,
|
||
# а sm_89-virtual генерит PTX для forward JIT на newer GPU (Blackwell sm_120
|
||
# = JIT на старте при первом kernel'е). Это избавляет нас от требования
|
||
# CUDA 12.8+ который sm_120 native. CUDA 12.4 здесь — sweet spot между
|
||
# Pascal (sm_61) и Ada (sm_89).
|
||
RUN mkdir -p build && cd build && \
|
||
cmake -DCMAKE_BUILD_TYPE=Release \
|
||
-DCMAKE_CUDA_ARCHITECTURES="61-real;75-real;86-real;89-real;89-virtual" \
|
||
.. && \
|
||
make -j$(nproc)
|
||
|
||
# ── Runtime ──────────────────────────────────────────────────────────────
|
||
# runtime variant включает libcudart12 (нужен grid_record/simple_record).
|
||
FROM nvidia/cuda:12.4.1-runtime-ubuntu22.04 AS runtime
|
||
|
||
# Ubuntu 22.04 jammy: package names иные чем noble (libpng16-16 без t64).
|
||
# libcudart12 уже в runtime image; здесь только наши user-space deps.
|
||
# netcat-openbsd — для healthcheck'а через ZMQ ping (см. HEALTHCHECK ниже).
|
||
# ffmpeg — для transmux raw h264 → mpegts (shell pipe chain после
|
||
# grid_record); без него ffmpeg-mux downstream не справляется с
|
||
# intra refresh без IDR boundaries.
|
||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||
libpng16-16 libfreetype6 \
|
||
libzmq5 libjson-c5 libmosquitto1 \
|
||
libavformat58 libavcodec58 libavutil56 \
|
||
fonts-dejavu-core \
|
||
netcat-openbsd \
|
||
&& rm -rf /var/lib/apt/lists/*
|
||
|
||
# Бинари + libcuframes (статически слинкована не вся, libcuframes shared нужен).
|
||
COPY --from=builder /src/build/examples/grid_record /usr/local/bin/grid_record
|
||
COPY --from=builder /src/build/examples/simple_record /usr/local/bin/simple_record
|
||
COPY --from=builder /src/build/third_party/cuframes/libcuframes/libcuframes.so.0.4.0 \
|
||
/usr/lib/x86_64-linux-gnu/libcuframes.so.0
|
||
COPY --from=builder /src/build/src/libcuframes_composer.so.0.1.0 \
|
||
/usr/lib/x86_64-linux-gnu/libcuframes_composer.so.0
|
||
|
||
# Phase 11 — layout templates.json. Editable in-container или mount override.
|
||
COPY docker/templates.json /etc/cfc-grid/templates.json
|
||
|
||
# NVIDIA_DRIVER_CAPABILITIES должен включать 'video' для NVENC через libnvidia-encode.
|
||
ENV NVIDIA_DRIVER_CAPABILITIES=compute,utility,video
|
||
|
||
# Healthcheck — проверяет что ZMQ control plane port слушается.
|
||
# Полная functional проверка через ZMQ ping требует ZMTP handshake (plain nc
|
||
# не подходит — это binary wire protocol с greeting), поэтому здесь только
|
||
# liveness через TCP probe. Composer thread'ы (compose/encode) могут зависнуть
|
||
# без падения main process'а, но external monitor (MQTT health uptime_s,
|
||
# Prometheus в Phase 7) дополнит контроль over time.
|
||
HEALTHCHECK --interval=30s --timeout=5s --start-period=20s --retries=3 \
|
||
CMD nc -z 127.0.0.1 5599 || exit 1
|
||
|
||
ENTRYPOINT ["/usr/local/bin/grid_record"]
|
||
CMD ["--help"]
|