19ddaf2dde
MVP Phase 8 feature: headless Chromium snapshot URL → PNG → existing icon
overlay infrastructure. Use case — Grafana dashboard, web chat, любой
HTML widget с transparent background поверх video composite.
Архитектура:
BrowserRenderer launches один shared Chromium instance, per-dashboard
page. Loop:
page.reload (для свежих данных — Grafana auto-refresh не triggers
в headless mode без user interaction)
page.add_style_tag (re-inject transparent CSS — reload teryает styles)
page.wait_for_selector (если selector задан)
page.screenshot(omit_background=True) или locator(selector).screenshot
save PNG к icon_dir
dispatcher._reload_icon → filter re-reads atlas
Config (dynamic_overlays.dashboards в controller.yaml):
id, target_instance, cell, url, x, y, w_px, h_px,
refresh_sec (default 2.0s, min 0.5s — frequent reload bad см. stutter memory),
inject_css (default — transparent background + zero margins),
selector (optional CSS selector — экспортить только конкретный element),
viewport_w/h (override page viewport, default = w_px/h_px;
полезно при selector чтобы page layout не collapsed),
wait_until, page_timeout_ms, opacity, z_order.
Dockerfile:
+ pip install playwright
+ playwright install --with-deps chromium (~170MB Chromium + ~150MB system libs)
Если dashboards не нужны — можно убрать оба install'а (playwright
import lazy, BrowserRenderer.start() graceful no-op без playwright).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
49 lines
1.5 KiB
Docker
49 lines
1.5 KiB
Docker
# cuda-grid-controller — Python sidecar для vf_cuda_grid filter.
|
|
|
|
FROM python:3.11-slim AS base
|
|
|
|
ENV PYTHONDONTWRITEBYTECODE=1 \
|
|
PYTHONUNBUFFERED=1 \
|
|
PIP_NO_CACHE_DIR=1
|
|
|
|
WORKDIR /app
|
|
|
|
# ffmpeg для snapshot endpoint — нужен basic CPU build (RTSP read + PNG output).
|
|
# Размер: ~120 MB additional (ffmpeg + libs); приемлемо для controller image.
|
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
ffmpeg \
|
|
&& rm -rf /var/lib/apt/lists/*
|
|
|
|
# Install deps первым layer — пересборка только при изменении pyproject.toml
|
|
COPY pyproject.toml ./
|
|
RUN pip install --no-cache-dir \
|
|
fastapi \
|
|
"uvicorn[standard]" \
|
|
pydantic \
|
|
pydantic-settings \
|
|
aiomqtt \
|
|
pyzmq \
|
|
pyyaml \
|
|
structlog \
|
|
typer \
|
|
sse-starlette \
|
|
pillow \
|
|
httpx \
|
|
playwright
|
|
|
|
# Playwright headless Chromium для browser-rendered overlays (Grafana, чаты).
|
|
# install-deps добавляет system libs (libnss3, libxkbcommon0, libgbm1...).
|
|
# Chromium ~170 MB + system deps ~150 MB. Можно отключить если dashboards
|
|
# не нужны: убрать `playwright` из pip и закомментировать ниже.
|
|
RUN playwright install --with-deps chromium
|
|
|
|
# Source code
|
|
COPY cuda_grid_controller ./cuda_grid_controller
|
|
COPY examples ./examples
|
|
|
|
RUN pip install --no-cache-dir -e .
|
|
|
|
EXPOSE 8080
|
|
ENTRYPOINT ["cuda-grid-controller"]
|
|
CMD ["--config", "/app/controller.yaml"]
|