# 云瞰 TrueNAS Scale 24.10+(Electric Eel)部署
#
# 前提:
#   - TrueNAS Scale 24.10 起 SCALE-Apps 从 k3s 切换到 Docker。旧版(24.04 及之前 k3s)不适用本文件。
#   - x86_64 机型;Intel iGPU 推荐 openvino 变体,NVIDIA GPU 改为 yunkan-cuda 或 yunkan-trt
#   - 已建好一个 ZFS dataset 作为数据持久化(例如 /mnt/pool0/apps/yunkan/data)
#
# 用法(Custom App 方式 - 推荐):
#   1. TrueNAS UI → Apps → Discover Apps → 右上角 "Custom App"
#   2. App Name 填 "yunkan",其余按表单填(端口走 host network 模式所以不用 GUI 配端口)
#   3. 在 "Workloads" 或 YAML 编辑器中,复制本文件 services: 块下面的 yunkan 服务定义
#   4. 数据卷映射:Host Path 填你的 ZFS dataset 路径(替换本文件 ./data 为 /mnt/pool0/apps/yunkan/data)
#   5. 启动后浏览器打开 http://<TrueNAS IP>:23406/
#
# 用法(SSH + docker compose 方式 - 高级):
#   ssh root@<truenas-ip>
#   cd /mnt/pool0/apps/yunkan
#   wget https://yun-kan.com/compose/truenas.yml -O compose.yml
#   docker compose up -d
#
# 持久化(两个目录,可分别放不同 dataset / 盘):
#   data/        小状态:DB / cookies / 日志 / 升级状态(体积小,建议放 SSD dataset)。
#                (模型不在这里——已 bake 进镜像 /var/lib/skyview/models,不暴露给客户。)
#   recordings/  录像(可达 TB 级):嵌套挂到容器内 /app/data/recordings,recordings_dir
#                配置不变,可单独指到容量更大的 ZFS pool / 远端 NAS。
# 建议都挂 ZFS dataset(可走 snapshot 备份),不要用 ix-applications 的内置 PVC。
#
# 防火墙:TrueNAS Scale Web UI 占用 80/443,云瞰 23406 系列无冲突;
#         若开过 ZFS 防护或额外限制需放行 23406/23880/24214/24215/tcp + 23515/udp。
#
# 升级:推荐通过 Apps UI 升级(Discover Apps → yunkan → Edit 改 tag);
#       或保留 yunkan-updater sidecar 走 OTA。

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

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

    # host 网络:24.10+ Custom App 支持 host network 模式,Pod 直接绑宿主机端口。
    network_mode: host

    # Intel iGPU 直通(TrueNAS Scale 内核默认支持 i915)
    devices:
      - /dev/dri:/dev/dri

    volumes:
      # 状态盘:DB / cookies / 日志 / 升级状态(体积小)。(模型不在这里——已 bake 进镜像。)
      # ★ 替换为你的 ZFS dataset 实际路径 ★
      - /mnt/pool0/apps/yunkan/data:/app/data
      # 录像盘:可达 TB 级,可指到容量更大的 ZFS pool / NAS。嵌套覆盖 /app/data/recordings
      # (recordings_dir 配置不变,snapshots / 导出跟录像走)。改这一行左侧路径即可换盘。
      - /mnt/pool0/apps/yunkan/recordings:/app/data/recordings

      # License 硬件指纹:把 TrueNAS 宿主机稳定标识 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:
      - /mnt/pool0/apps/yunkan/data:/app/data
      - /mnt/pool0/apps/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
