# 云瞰 Ubuntu / Debian 部署（通用 Linux 模板）
#
# 前提:
#   - Ubuntu 22.04 / 24.04 LTS 或 Debian 12 (Bookworm)
#   - 已装 docker + docker compose v2(curl -fsSL https://get.docker.com | sh)
#   - x86_64 机器;镜像变体按硬件选:
#       · 纯 CPU / AMD CPU              → yunkan-cpu
#       · Intel 集显(11 代+ / N 系列)  → yunkan-openvino(本文件默认)
#       · NVIDIA GPU                   → yunkan-cuda 或 yunkan-trt
#
# 用法:
#   1. wget https://yun-kan.com/compose/ubuntu-debian.yml -O compose.yml
#   2. 按硬件改下面 yunkan 的 image 标签(默认 openvino)
#   3. docker compose up -d
#   4. 浏览器打开 http://<服务器IP>:23406/ 进入 Setup 向导
#
# 持久化(两个目录,可分别放不同盘):
#   ./data        小状态:数据库 / cookies / 日志 / 升级状态(体积小,建议放系统 SSD)。
#                 (模型不在这里——已 bake 进镜像 /var/lib/skyview/models,不暴露给客户。)
#   ./recordings  录像(可达 TB 级):嵌套挂到容器内 /app/data/recordings,可指到大盘 / NAS。
# 删 data/database.toml 会重新初始化。
#
# 防火墙:Ubuntu 默认 UFW 关闭;若启用需放行(23406=网页+App接口+直播,必须;
#   23515=实时画面低延迟通道;23880=RTSP 直连,可选。24214 是内部服务不用放行):
#   sudo ufw allow 23406/tcp && sudo ufw allow 23515 && sudo ufw allow 23880/tcp && sudo ufw reload
#
# 外网访问:不用在这里配。网页后台 → 设置 → 通用 → HTTPS 证书,填自己的域名即可
#   自动申请证书(Let's Encrypt DNS-01,不需要开 80 端口),再选一个公网端口(默认
#   23443),路由器上转发这一个 TCP 端口就行;宽带有 IPv6 的话连转发都不用。
#   详见 https://yun-kan.com/docs/remote-access

# ★ 本文件请保存为 compose.yml ★ —— 与其它部署路径统一约定名;升级成功后系统会
# 同步本文件的 image 行,防止手动 force-recreate 时静默降级回旧版本。
#
# docker compose 项目名固定为 yunkan(历史约定,保持稳定)。
name: yunkan

services:
  yunkan:
    # 按硬件改:yunkan-cpu / yunkan-openvino / yunkan-cuda / yunkan-trt
    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 直通(openvino 变体需要;纯 CPU 变体把这两行删掉)──
    devices:
      - /dev/dri:/dev/dri

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

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

      # License 硬件指纹:把宿主机稳定标识 bind mount 进容器。
      # 不挂的话每次重建容器 machine-id 随机变 → 指纹变 → license 占新 slot 死循环。
      - /etc/machine-id:/etc/machine-id:ro
      - /sys/class/dmi/id/product_uuid:/sys/class/dmi/id/product_uuid:ro

      # OTA 在线升级用(pull + 拉起一次性升级执行容器都走 docker socket)
      - /var/run/docker.sock:/var/run/docker.sock

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