WatchCow-飞牛Docker转换为应用

📒 本文整理自作者飞书笔记 · 查看原文档

WatchCow 是一款专为飞牛OS(fnOS)开发的 Docker 增强工具。它通过读取容器的 labels 标签,把手动部署的 Docker 服务转换成飞牛桌面和手机 App 里的标准应用图标,解决 Docker 应用“看不见、不好管”的痛点。

WatchCow 是一款专为飞牛OS (fnOS) 开发的 Docker 增强工具。它的核心功能是将你手动部署的、没有图形界面的 Docker 容器,“伪装”或转换成飞牛官方应用商店里的那种标准应用。

简单来说,它能让你在飞牛的桌面端和手机 App 里,像使用原生应用一样一键访问你自建的 Docker 服务,解决了 Docker 应用“看不见、不好管”的痛点。

以下是关于 WatchCow 的详细使用指南和解析:

WatchCow 是什么?

  • 定位:一个“无界面”的后台增强工具。
  • 原理:它通过读取 Docker 容器的 labels(标签)信息,识别出你想要暴露的服务,然后动态地将其打包成飞牛系统能识别的“应用”。
  • 效果:原本只能通过输入 IP:端口号访问的 Docker 服务(如 Portainer、Memos 等),现在会出现在飞牛的“应用中心”或“桌面图标”里,点击即可直达。

github项目地址

我的WatchCow项目-CloudDrive 2-网盘挂载

version: '3.8'

services:
  clouddrive:
    image: cloudnas/clouddrive2:latest
    container_name: clouddrive
    privileged: true  # 必须开启特权模式以支持 fuse 挂载
    network_mode: host  # 使用 host 网络便于端口访问和局域网发现
    environment:
      - PUID=0        # 可选:指定用户 ID(根据你的系统调整)
      - PGID=0        # 可选:指定组 ID
      - TZ=Asia/Shanghai # 时区
    volumes:
      - /path/to/config:/Config   # 配置文件目录(必须持久化)
      - /path/to/cache:/Cache     # 缓存目录(建议 SSD,提升性能)
      - /CD:/CD:rshared       # 挂载点(所有云盘将挂载到此目录下)
    restart: unless-stopped
    labels:                             #WatchCow标签
      watchcow.enable: "true"           # 设置为 "true" 以启用该容器的监控和抓取
      watchcow.display_name: "CloudDrive 2"    # 应用在桌面显示的名称
      watchcow.desc: "网盘挂载到本地"     # 鼠标悬停在图标上时显示的提示文字
      watchcow.service_port: "19798"     # Web UI 容器内端口
      watchcow.protocol: "http"         #【选填】访问协议
      watchcow.path: "/"                #【选填】访问路径
      watchcow.icon: "https://nasicon.top/icon/Clouddrive2--%E4%BA%91%E7%9B%98%E6%8C%82%E8%BD%BD--qdnas-s.png" #【选填】应用图标

我的WatchCow项目-flatnas-浏览导航

version: "3.8"

services:
  flatnas:
    image: qdnas/flatnas:1.0.41
    container_name: flatnas
    restart: unless-stopped
    ports:
      - "23000:3000"
    volumes:
      - /CD/OneDrive/应用/flatnas/data:/app/server/data:rshared #指定路径下新建data
      - /CD/OneDrive/应用/flatnas/music:/app/server/music:rshared #映射播放器路径
      - /CD/OneDrive/应用/flatnas/PC:/app/server/PC:rshared #映射背景路径
      - /CD/OneDrive/应用/flatnas/APP:/app/server/APP:rshared #映射移动端背景路径
      - /CD/OneDrive/应用/flatnas/doc:/app/server/doc:rshared #映射文件传输助手路径
      - /var/run/docker.sock:/var/run/docker.sock:rshared #映射Docker Socket
    labels:                             #WatchCow标签
      watchcow.enable: "true"           # 设置为 "true" 以启用该容器的监控和抓取
      watchcow.display_name: "flatnas"    # 应用在桌面显示的名称
      watchcow.desc: "浏览导航"     # 鼠标悬停在图标上时显示的提示文字
      watchcow.service_port: "23000"     # Web UI 容器内端口
      watchcow.protocol: "http"         #【选填】访问协议
      watchcow.path: "/"                #【选填】访问路径
      watchcow.icon: "https://nasicon.top/icon/flatnas.PNG" #【选填】应用图标

我的WatchCow项目-openresty-Web 平台

 labels:                             #WatchCow标签
      watchcow.enable: "true"           # 设置为 "true" 以启用该容器的监控和抓取
      watchcow.display_name: "openresty"    # 应用在桌面显示的名称
      watchcow.desc: "Web 平台"     # 鼠标悬停在图标上时显示的提示文字
      watchcow.service_port: "80"     # Web UI 容器内端口
      watchcow.protocol: "http"         #【选填】访问协议
      watchcow.path: "/"                #【选填】访问路径
      watchcow.icon: "https://nasicon.top/icon/Open-webui_B--WebUI.png" #【选填】应用图标

我的WatchCow项目-DERP-中转服务器

version: '3.8'

services:
  derper:
    container_name: DERP
    image: docker.1ms.run/fredliang/derper:latest
    restart: always
    network_mode: bridge
    mac_address: 02:42:ac:11:00:02

    ports:
      - "1234:1234/tcp"   
      - "3478:3478/udp"   

    volumes:
      - ./certs:/app/certs  
      
    environment:
      - DERP_ADDR=:1234
      - DERP_DOMAIN=域名
      - DERP_CERT_MODE=letsencrypt
      - DERP_CERT_DIR=/app/certs
      - DERP_STUN=true
      - DERP_HTTP_PORT=80
      - DERP_VERIFY_CLIENTS=false

    labels:                             #WatchCow标签
      watchcow.enable: "true"           # 设置为 "true" 以启用该容器的监控和抓取
      watchcow.display_name: "DERP"    # 应用在桌面显示的名称
      watchcow.desc: "中转服务器"     # 鼠标悬停在图标上时显示的提示文字
      watchcow.service_port: "1234"     # Web UI 容器内端口
      watchcow.protocol: "http"         #【选填】访问协议
      watchcow.path: "/"                #【选填】访问路径
      watchcow.icon: "https://nasicon.top/icon/Dashdot--%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%9B%91%E6%8E%A7--qdnas-s.png" #【选填】应用图标

我的WatchCow项目-Tailscale-内网穿透、异地组网

version: "3.8"
services:
  tailscale:
    image: tailscale/tailscale:latest #镜像源
    container_name: tailscale #名称
    restart: unless-stopped
    network_mode: "host"
    # 新增:固定MAC地址(解决重启新增节点的核心配置)
    mac_address: 02:42:ac:11:88:99
    cap_add:
      - NET_ADMIN
      - NET_RAW
    volumes:
      - /opt/1panel/tailscale_data:/var/lib/tailscale
      - /dev/net/tun:/dev/net/tun
    environment:
      - TS_AUTH_KEY=tskey-auth-密钥
      - TS_HOSTNAME=exit-node-192.168.1.1  # 标记为出口节点IP地址换自己服务器的
      # 关键:宣告为出口节点,并允许 IP 转发
      - TS_EXTRA_ARGS=--accept-routes --advertise-exit-node --accept-dns=false
      # 新增:显式指定配置存储目录,确保持久化生效
      - TS_STATE_DIR=/var/lib/tailscale
      # 若有内网网段,可同时宣告(可选)
      # - TS_ADVERTISE_ROUTES=192.168.1.0/24
    labels:                             #WatchCow标签
      watchcow.enable: "true"           # 设置为 "true" 以启用该容器的监控和抓取
      watchcow.display_name: "Tailscale"    # 应用在桌面显示的名称
      watchcow.desc: "内网穿透、异地组网"     # 鼠标悬停在图标上时显示的提示文字
      watchcow.service_port: "12345"     # Web UI 容器内端口
      watchcow.protocol: "http"         #【选填】访问协议
      watchcow.path: "/"                #【选填】访问路径
      watchcow.icon: "https://nasicon.top/icon/Tailscale--%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F--qdnas-s.png" #【选填】应用图标

我的WatchCow项目-Syncthing-文件同步工具

version: '3.8'

services:
  syncthing:
    image: syncthing/syncthing:latest
    container_name: syncthing
    hostname: syncthing
    network_mode: bridge
    mac_address: 02:42:ac:11:00:05
    ports:
      - "8384:8384"
      - "22000:22000/tcp"
      - "22000:22000/udp"
      - "21027:21027/udp"
    volumes:
      - /root:/root:rshared
      - /opt/1panel/docker/compose/syncthing/~syncthing/config:/var/syncthing/config
      - /opt/1panel/docker/compose/syncthing/~syncthing/data:/var/syncthing/data
    environment:
      - STGUIADDRESS=0.0.0.0:8384
      - PUID=0
      - PGID=0
      - PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
      - HOME=/var/syncthing
      - STHOMEDIR=/var/syncthing/config
    restart: unless-stopped
    labels:                             #WatchCow标签
      watchcow.enable: "true"           # 设置为 "true" 以启用该容器的监控和抓取
      watchcow.display_name: "Syncthing"    # 应用在桌面显示的名称
      watchcow.desc: "文件同步工具"     # 鼠标悬停在图标上时显示的提示文字
      watchcow.service_port: "8384"     # Web UI 容器内端口
      watchcow.protocol: "http"         #【选填】访问协议
      watchcow.path: "/"                #【选填】访问路径
      watchcow.icon: "https://nasicon.top/icon/Syncthing.png" #【选填】应用图标

我的WatchCow项目-Jellyfin-开源的媒体系统


    labels:                             #WatchCow标签
      watchcow.enable: "true"           # 设置为 "true" 以启用该容器的监控和抓取
      watchcow.display_name: "Jellyfin"    # 应用在桌面显示的名称
      watchcow.desc: "开源的媒体系统"     # 鼠标悬停在图标上时显示的提示文字
      watchcow.service_port: "8096"     # Web UI 容器内端口
      watchcow.protocol: "http"         #【选填】访问协议
      watchcow.path: "/"                #【选填】访问路径
      watchcow.icon: "https://nasicon.top/icon/Jellyfin_B--Jellyfin%E5%AA%92%E4%BD%93%E6%9C%8D%E5%8A%A1%E5%99%A8--qdnas-s.png" #【选填】应用图标

我的WatchCow项目-OpenList-开源的多网盘统一管理

version: '3.8'

services:
  openlist:
    image: openlistteam/openlist:v4.1.10
    container_name: openlist
    hostname: openlist
    restart: always
    user: "0:0"
    working_dir: /opt/openlist/
    command: /entrypoint.sh
    
    ports:
      - "5244:5244/tcp"
      - "5246:5246/tcp"
    
    networks:
      1panel-network:
    
    volumes:
      - /opt/1panel/apps/openlist/openlist/data:/opt/openlist/data:rw
    
    environment:
      - TZ=Asia/Shanghai
      - UMASK=022
      - PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
      - RUN_ARIA2=false
      - OPENLIST_ADMIN_PASSWORD=admin
    labels:
      - "watchcow.enable=true"
      - "watchcow.display_name=OpenList"
      - "watchcow.desc=开源的多网盘统一管理"
      - "watchcow.service_port=5244"
      - "watchcow.protocol=http"
      - "watchcow.path=/"
      - "watchcow.icon=https://nasicon.top/icon/icon-OpenList-4.1.9-x86-1767612700386.png"

networks:
  1panel-network:
    external: true

我的WatchCow项目-firefox-火狐浏览器

version: '3.8'

services:
  firefox:
    image: linuxserver/firefox:latest
    container_name: firefox
    security_opt:
      - seccomp:unconfined
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Asia/Shanghai
      - PULSE_SERVER=unix:/run/pulse/native      
      - PULSE_COOKIE=/run/pulse/cookie
    volumes:
      - ./firefox-config:/config
      - /dev/shm:/dev/shm
      - ./downloads:/downloads
      - /dev/snd:/dev/snd       
      - /run/pulse:/run/pulse       
      - ~/.config/pulse:/config/pulse
    ports:
      - "3000:3000"
      - "3001:3001"
    group_add:
      - audio
    environment:
      - WEB_AUDIO=1
    restart: unless-stopped
    labels:                             #WatchCow标签
      watchcow.enable: "true"           # 设置为 "true" 以启用该容器的监控和抓取
      watchcow.display_name: "firefox"    # 应用在桌面显示的名称
      watchcow.desc: "火狐浏览器"     # 鼠标悬停在图标上时显示的提示文字
      watchcow.service_port: "3001"     # Web UI 容器内端口
      watchcow.protocol: "https"         #【选填】访问协议
      watchcow.path: "/"                #【选填】访问路径
      watchcow.icon: "https://nasicon.top/icon/Firefox--%E7%81%AB%E7%8B%90%E6%B5%8F%E8%A7%88%E5%99%A8--mozilla.org.png" #【选填】应用图标

我的WatchCow项目-bililive-go-直播录制

version: '3.8'

services:
  bililive-go:
    image: chigusa/bililive-go:latest
    container_name: bililive-go
    # 直播录制工具通常不需要特权模式或复杂的security_opt,保持默认即可
    environment:
      - TZ=Asia/Shanghai
      - PUID=1000
      - PGID=1000
    volumes:
      # 1. 配置文件映射:建议先在宿主机创建好 config.yml
      - ./bililive-config:/etc/bililive-go/config
      # 2. 录制视频存储目录
      - ./bililive-videos:/srv/bililive
      - /vol02/1000-1-a5dc258a/直播录制:/vol02/1000-1-a5dc258a/直播录制:rshared
    ports:
      # Web管理界面端口
      - "8080:8080"
    restart: unless-stopped
    labels:                             # WatchCow 标签
      watchcow.enable: "true"           # 启用监控
      watchcow.display_name: "bililive-go"
      watchcow.desc: "多平台直播自动录制"
      watchcow.service_port: "8080"     # Web UI 端口
      watchcow.protocol: "http"         # bililive-go 默认通常是 HTTP
      watchcow.path: "/"
      # 图标链接(示例使用通用直播图标,你可以替换为喜欢的图片链接)
      watchcow.icon: "https://nasicon.top/icon/Bililive-go--B%E7%AB%99%E7%9B%B4%E6%92%AD%E5%BD%95%E5%88%B6--qdnas-s.png"

我的WatchCow项目-stream-rec-直播录制

# 官方文档
# https://stream-rec.github.io/docs/zh_CN
# https://github.com/stream-rec/stream-rec
# https://hub.docker.com/r/streamrec/stream-rec
# https://hub.docker.com/r/streamrec/stream-rec-front
# https://www.xzb5.com/tutorial/5254.html

# 账号为stream-rec,模板预设密码为123456,初始化会要求重新设置

---
version: "3"
# 最后编辑时间:2025-03-10
services:
  stream-rec-frontend:
    image: streamrec/stream-rec-front:latest
    # 镜像地址,latest是最新稳定内测版本,dev 是最新开发版
    container_name: stream-rec-frontend
    # 容器名字
    hostname: stream-rec-frontend
    # 主机名
    environment:
      - TZ=Asia/Shanghai
      # 时区
      - API_URL=http://localhost:12555/api
      - WS_API_URL=ws://localhost:12555/live/update
      # 后端api地址,以及WS_API_URL,客户端websocket url,用于实时状态更新
      # localhost:12555 替换为 后端的IP地址 和 后端的端口,如果用host网络模式可以保持默认
      - AUTH_TRUST_HOST=true
      # 是否存在反代,列如NGINX,建议打开,NEXT_AUTH暂时有bug
      - AUTH_SECRET=123456
      # 加密密钥,用于next-auth,预设为123456
      # - NEXT_PUBLIC_BASE_URL=https://abc.xyz
      # 域名基础URL,用于next-auth重定向登录页面
      # - NEXT_PUBLIC_BASE_PATH=/webui
      # 域名自定义路径,无需求不要填写
    # network_mode: bridge
    network_mode: host
    # host模式需要容器内的端口不被占用,不需要端口映射,后续端口映射全都开头加#注释掉,否则注释掉这条
    # ports:
      # - 15275:15275
      # 前端 WebUI 端口
    restart: unless-stopped
    # 重启策略,可根据实际情况而选择 no/always/unless-stopped/on-failure/on-failure:3
    depends_on:
      - stream-rec-backend
      # 关联后端容器


  stream-rec-backend:
    image: streamrec/stream-rec:latest
    # 镜像地址,latest是最新稳定内测版本,dev 是最新开发版
    container_name: stream-rec-backend
    # 容器名字
    hostname: stream-rec-backend
    # 主机名
    volumes:
      - /vol1/1000/视频/直播录像:/opt/records
      # 录像存放位置
      # - 【Rclone 配置文件路径】:/root/.config/rclone
      # 对应 Rclone 配置文件路径,如果不需要可以不启用
    environment:
      - LOGIN_SECRET=123456
      # 初始化登录密钥,您可以将其更改为任何您喜欢的字符串, 用于登录
      # 请注意,该密钥只有第一次运行时有效,后续更改不会生效,预设为123456
      - DB_PATH=/opt/records
      # 容器数据库路径
      - DOWNLOAD_PATH=/opt/records
      # 容器第一次初始化下载路径
      # - HTTP_PROXY=http://127.0.0.1:7890
      # 代理设置,只支持http代理
      - LOG_LEVEL=INFO
      # 日志级别,默认为info。调试日志对于调试非常有用,但可能非常冗长。 遇到问题时,您可以将其更改为debug。
      - PGID=1000
      - PUID=100
      # 用户和用户组权限,ssh中使用“id 用户名”查看,用户组一般为100(users)
      # 第一个用户而言,群晖为1026,新绿联为1000,linux类系统为1000,后续用户均+1
      - UMASK=022
      # 默认创建新文件的权限,一般写022
      - TZ=Asia/Shanghai
      # 时区
    # network_mode: bridge
    network_mode: host
    # host模式需要容器内的端口不被占用,不需要端口映射,后续端口映射全都开头加#注释掉,否则注释掉这条
    # ports:
      # - 12555:12555
      # 后端访问端口
    restart: unless-stopped
    # 重启策略,可根据实际情况而选择 no/always/unless-stopped/on-failure/on-failure:3

    labels:                             # WatchCow标签
      watchcow.enable: "true"           # 设置为 "true" 以启用该容器的监控和抓取
      watchcow.display_name: "stream-rec" # 应用在桌面显示的名称
      watchcow.desc: "全自动多平台直播录制" # 鼠标悬停在图标上时显示的提示文字
      watchcow.service_port: "15275"     # Web UI 容器内端口
      watchcow.protocol: "http"          # 访问协议
      watchcow.path: "/"                 # 访问路径
      watchcow.icon: "https://nasicon.top/icon/AirConnect--AirPlay%E6%A1%A5%E6%8E%A5.png" # 图标
© 版权声明
THE END
喜欢就支持一下吧
点赞7 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容