# 云瞰 RK3588(瑞芯微 NPU)部署 —— rknn 变体
#
# 前提(硬件门槛比 x86 高,务必先满足):
#   - RK3588 / RK3588S 开发板(Orange Pi 5 系列 / Radxa Rock 5 系列 / firefly 等)
#   - ★ 必须是厂商 BSP 内核 ★(Armbian vendor kernel / 官方 Rockchip / 板厂系统)——
#     NPU(rknpu)、硬解(MPP)、2D 加速(RGA)驱动只在 BSP 内核里有;vanilla Debian /
#     Ubuntu 主线内核不含,装了也用不了 NPU。
#   - 设备节点齐全:/dev/dri /dev/dma_heap /dev/rga /dev/mpp_service(下面 devices 段)
#   - ⚠ 内存:推荐 4GB 板(已充分验证稳定)。8GB / 16GB 目前实验性——部分 BSP 内核上
#     AI 检测负载会触发 RGA 相关内核 panic 整机重启,修复中;已有 8G/16G 板可先少跑
#     几路相机或等修复版。
#
# 用法:
#   1. 先 docker load 离线镜像包,或有外网时直接 pull(见下 image 行);
#   2. docker compose -f compose.yml up -d
#   3. 浏览器打开 http://<板子IP>:23406/ 进 Setup 向导
#
# 持久化(两个目录,RK 板系统盘通常很小,建议都指到 NVMe / 大盘):
#   data/        小状态:数据库 / 日志 / 升级状态(体积小)
#   recordings/  录像(可达 TB 级),嵌套挂到容器内 /app/data/recordings
#
# ★ 本文件请保存为 compose.yml ★ —— OTA sidecar updater 靠固定文件名 compose.yml
# 定位本文件重建主容器;存成 rknn.yml 等别的名字会让网页后台在线升级失效。
# docker compose 项目名固定 yunkan(updater 靠同名找到主容器);图形界面导入时
# 项目 / 堆栈名也填 yunkan。
name: yunkan

services:
  yunkan:
    # ACR 公网镜像;离线部署改成 docker load 进来的本地名 yunkan-rknn:latest。
    image: registry.cn-hangzhou.aliyuncs.com/yunkan/yunkan-rknn:latest
    container_name: yunkan
    restart: always

    # host 网络:WebRTC ICE / RTSP / HLS 多端口直通,相机从局域网直连。
    network_mode: host

    # ─── RK3588 硬件节点(最小权限集,不用 privileged)───────────────────
    devices:
      - /dev/dri:/dev/dri                  # DRM 渲染节点(NPU / RGA 都经它)
      - /dev/dma_heap:/dev/dma_heap        # DMA buffer 分配器(零拷贝帧池)
      - /dev/rk_dma_heap:/dev/rk_dma_heap  # Rockchip 专属 DMA heap(★ 个别内核无此节点则注释本行 ★)
      - /dev/rga:/dev/rga                  # RGA 2D 加速(缩放 / 色彩转换 / 抠图)
      - /dev/mpp_service:/dev/mpp_service  # MPP 硬件编解码(硬解 / JPEG 硬编)
    # RKNN runtime 要访问 /sys 与 debugfs,默认 confinement 下部分内核会拦 NPU 初始化
    security_opt:
      - apparmor=unconfined
      - systempaths=unconfined

    volumes:
      # 状态盘:DB / 日志 / 升级状态(体积小)。RK 板系统盘通常仅 16-32G,建议放 NVMe。
      - ./data:/app/data
      # 录像盘:可达 TB 级,单独挂方便指到大盘(嵌套覆盖 /app/data/recordings)。
      - ./recordings:/app/data/recordings

      # License 硬件指纹:host machine-id 只读挂入(不挂则每次重建容器指纹漂移 → 占新
      # slot)。★ ARM 无 DMI,不挂 x86 模板里的 /sys/class/dmi/id/product_uuid ★。
      - /etc/machine-id:/etc/machine-id:ro

      # 整个 /sys 只读:SoC 探测 + NPU 利用率读 debugfs(devicetree / rknpu/load)。
      - /sys:/sys:ro

      # OTA 升级用(不需要在线升级可注释)
      - /var/run/docker.sock:/var/run/docker.sock

    environment:
      - TZ=Asia/Shanghai
      - SKYVIEW_SELF_CONTAINER_NAME=yunkan
      # 公网 / 异地访问时填公网域名或 IP(WebRTC ICE),也可事后在网页后台设置里填。
      # - SKYVIEW_WEBRTC_EXTERN_IPS=your-domain.com,1.2.3.4

  # ─── OTA sidecar updater(同其它平台)──────────────────────────────────
  updater:
    image: registry.cn-hangzhou.aliyuncs.com/yunkan/yunkan-updater:latest
    container_name: yunkan-updater
    restart: always
    network_mode: none
    volumes:
      - ./data:/app/data
      - ./compose.yml:/app/compose.yml:ro
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - TZ=Asia/Shanghai
      - COMPOSE_PROJECT_NAME=yunkan
      - STATE_FILE=/app/data/.upgrade-state
      - SKYVIEW_COMPOSE_FILE=/app/compose.yml
      - SKYVIEW_COMPOSE_SERVICE=yunkan
