📒 本文整理自作者飞书笔记 · 查看原文档
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





暂无评论内容