# 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

# 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"]
