# 云瞰 飞牛 fnOS 部署
#
# 前提:
#   - fnOS(基于 Debian 12)已装好,docker 一等公民可用
#   - x86_64 CPU(N100 / N305 / J4125 等飞牛主推机型,内置 Intel 核显)
#   - 默认本文件用 openvino 变体(Intel iGPU 推理加速);纯 CPU 机型改为 yunkan-cpu
#
# 用法:
#   方式 A(Web UI):
#     1. fnOS 控制台 → docker 应用 → 自定义项目 → 上传本 yml 文件
#     2. 启动后浏览器打开 http://<飞牛 IP>:23406/
#   方式 B(SSH):
#     1. ssh 进飞牛,cd 到放置目录(如 /vol1/1000/yunkan)
#     2. wget https://yun-kan.com/compose/fnos.yml -O compose.yml(或上传本文件)
#     3. docker compose up -d
#
# 持久化:数据目录默认 /vol1/1000/yunkan/data(飞牛用户目录习惯路径);可改其它 ZFS / 卷。
#
# 防火墙:fnOS 默认 iptables 不挡;如有外网暴露需自行配置反向代理 + 限制端口。
#
# 升级:支持 yunkan-updater sidecar 自动升级;也可走 fnOS Web UI 重新拉镜像。

# ★ 本文件请保存为 compose.yml ★ —— OTA sidecar updater 靠固定文件名 compose.yml
# 定位本文件来重建主容器;存成下载得到的 fnos.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 直通(N100/N305 标配)
    devices:
      - /dev/dri:/dev/dri

    volumes:
      # 唯一必挂:所有持久化状态(DB / 录像 / 模型 / 日志 / cookies)
      # 飞牛用户目录习惯路径:/vol1/1000/
      - /vol1/1000/yunkan/data:/app/data

      # License 硬件指纹:把宿主机稳定标识 bind mount 进容器。
      - /etc/machine-id:/etc/machine-id:ro
      - /sys/class/dmi/id/product_uuid:/sys/class/dmi/id/product_uuid:ro

      # OTA 升级用
      - /var/run/docker.sock:/var/run/docker.sock

    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:
      - /vol1/1000/yunkan/data:/app/data
      - /vol1/1000/yunkan/compose.yml:/app/compose.yml:ro
      - /var/run/docker.sock:/var/run/docker.sock
    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
