# 云瞰 Fedora 39+ 部署
#
# 前提:
#   - Fedora 39+(默认装的是 podman,需要装 docker-ce,详见 docs/install-fedora)
#   - SELinux 默认 enforce 模式 — ★ 所有 volumes 必须加 :Z 或 :z 标签 ★(本文件已加)
#   - firewalld 默认启用 — 端口需 firewall-cmd 显式放行(详见 docs)
#
# 用法:
#   1. 浏览器下载本文件 / wget 到本地 / 或参考 docs/install-fedora
#   2. cd 到目录,docker compose up -d
#   3. 浏览器打开 http://<服务器IP>:23406/
#
# 持久化(两个目录,可分别放不同盘):
#   data/        小状态:DB / cookies / 日志 / 升级状态(体积小,建议放系统 SSD)。
#                (模型不在这里——已 bake 进镜像 /var/lib/skyview/models,不暴露给客户。)
#   recordings/  录像(可达 TB 级):嵌套挂到容器内 /app/data/recordings,recordings_dir
#                配置不变,可单独把它指到大盘 / 远端 NAS。
# 两个目录都走 SELinux :Z 私有标签;同目录下不会被其它容器误读。
#
# 硬件加速变体:本文件用 openvino(Intel 集显 + 11 代+ Intel CPU 推荐)。
#   - 纯 CPU / AMD CPU 改 image 为 yunkan-cpu
#   - NVIDIA GPU 改为 yunkan-cuda 或 yunkan-trt,并取消下面 deploy 注释
#     (需 dnf 装 nvidia-container-toolkit)

# ★ 本文件请保存为 compose.yml ★ —— OTA sidecar updater 靠固定文件名 compose.yml
# 定位本文件来重建主容器;存成下载得到的 fedora.yml 等别的名字会让网页后台在线
# 升级失效。
#
# docker compose 项目名固定为 yunkan —— updater 在它自己的容器里跑 compose 重建
# 主容器时,要靠同一项目名找到已存在的 yunkan 容器;用 NAS 图形界面导入本文件时,
# 请把"项目 / 堆栈"名称也填 yunkan。
name: yunkan

services:
  yunkan:
    image: registry.cn-hangzhou.aliyuncs.com/yunkan/yunkan-openvino:latest
    container_name: yunkan
    restart: always

    # host 网络最省事:WebRTC ICE / RTSP / HLS 多端口直接暴露,不用逐个映射。
    network_mode: host

    # Intel iGPU 直通(/dev/dri 在 Fedora 上 i915 驱动开箱即用)
    devices:
      - /dev/dri:/dev/dri

    # ─── NVIDIA GPU 直通(改 image 为 yunkan-cuda 后取消注释)──
    # deploy:
    #   resources:
    #     reservations:
    #       devices:
    #         - driver: nvidia
    #           count: all
    #           capabilities: [gpu]

    volumes:
      # ★ Fedora SELinux 关键 ★:所有读写卷加 :Z(私有标签);只读卷无需打标签
      # 状态盘:DB / cookies / 日志 / 升级状态(体积小)。(模型不在这里——已 bake 进镜像。)
      - ./data:/app/data:Z
      # 录像盘:可达 TB 级,可指到大盘 / NAS。嵌套覆盖 /app/data/recordings
      # (recordings_dir 配置不变,snapshots / 导出跟录像走)。改这一行左侧路径即可换盘。
      - ./recordings:/app/data/recordings:Z

      # License 硬件指纹:把宿主机稳定标识 bind mount 进容器(只读,无需 SELinux 标签)
      - /etc/machine-id:/etc/machine-id:ro
      - /sys/class/dmi/id/product_uuid:/sys/class/dmi/id/product_uuid:ro

      # OTA 升级用(docker socket 走 :z 共享标签,因为 sidecar 也要访问)
      - /var/run/docker.sock:/var/run/docker.sock:z

    environment:
      - TZ=Asia/Shanghai
      - SKYVIEW_SELF_CONTAINER_NAME=yunkan

  updater:
    image: registry.cn-hangzhou.aliyuncs.com/yunkan/yunkan-updater:latest
    container_name: yunkan-updater
    restart: always
    network_mode: none
    volumes:
      - ./data:/app/data:Z
      - ./compose.yml:/app/compose.yml:ro
      - /var/run/docker.sock:/var/run/docker.sock:z
    environment:
      - TZ=Asia/Shanghai
      # 项目名必须和主容器侧一致(本文件顶层 name: yunkan)
      - COMPOSE_PROJECT_NAME=yunkan
      - STATE_FILE=/app/data/.upgrade-state
      - SKYVIEW_COMPOSE_FILE=/app/compose.yml
      - SKYVIEW_COMPOSE_SERVICE=yunkan
