收起左侧

自定义 Docker 应用桌面图标项目

20
回复
462
查看
[ 复制链接 ]

2

主题

9

回帖

0

牛值

江湖小虾

让自定义 Docker 容器自动变成飞牛桌面应用 —— WatchCow 分享

这是个什么东西?

为自部署的 Docker 应用添加桌面图标

B站视频:

背景

楼主之前用 Docker 跑了一些自己的服务, 但除了官方应用商店外的 Docker 应用, 没办法在桌面生成图标, 也没办法和 FN Connect 集成

所以一直使用 homepage + traefik 的方式构建自己的导航页

楼主选择这两个软件的原因也是因为, 我非常喜欢使用 Docker Label 的方式对容器做配置, 优点很明显, 就是管理集中, 我的任何修改都直接体现在 compose 文件中, 也容易在不同的 Docker 实例之间分享, 只需要复制 compose 文件, 启动后就可以完成转发之类的各种配置, 同时 Label 是 Docker 官方的功能, 兼容性也没问题

一个多月前, 楼主在论坛发帖, 希望能有一个官方支持的集成方案, 但没有得到确定要做的消息, 所以就干脆自己搓一个

工作流程

首先, 你需要安装 watchcow 的fpk包, 你可以从 https://github.com/tf4fun/watchcow/releases/tag/v0.2.0 中下载

之后你需要在你的 docker-compose 文件, 添加一些额外的 label

比如你跑了个 Nginx:

labels:
  # 启用 WatchCow 发现
  watchcow.enable: "true"

  # 应用标识 (对应 manifest.appname)
  watchcow.appname: "watchcow.nginx"

  # 显示信息 (对应 manifest 字段)
  watchcow.display_name: "Nginx"
  watchcow.desc: "高性能 Web 服务器"
  watchcow.version: "1.0.0"
  watchcow.maintainer: "WatchCow"

  # 网络配置
  watchcow.service_port: "8080"
  watchcow.protocol: "http"
  watchcow.path: "/"

  # UI 配置
  watchcow.ui_type: "url"  # url=新标签页, iframe=桌面窗口
  watchcow.icon: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/png/nginx.png"

容器一启动,你就能看到新的图标

实现细节

楼主之前看官方的开发者文档时, 看到官方提供的应用的模板

仔细研究之后发现并不复杂, 你完全可以将任意的应用打包为飞牛的官方应用包

所以 WatchCow 做的事情就是:

  1. 后台监听 Docker 的事件(哪个容器启动了、停止了、删除了)
  2. 发现有 watchcow.enable=true 标签的容器,就自动生成一个符合飞牛格式的应用包
  3. 调用 appcenter-cli install-local 把它装上

容器停了,应用也会跟着停;容器删了,应用也会自动卸载。完全不用手动操作

得到的好处是

  1. 简单, 将一个官方不支持的应用改为官方支持的应用, 只需要修改 compose 文件, 如果你不会修改, 直接扔给豆包或者DS也能有一个**不离十的结果, 分享应用也简单, 一个 compose 文件就可以
  2. 兼容, label 不会对 docker 应用产生任何的副作用, 也可以和其他的软件一起使用, 比如我前文提到的 Treafik 和 Homepage, 不管是否有这些软件, 额外的 label 也不会有任何问题, 同时使用的安装方式也是飞牛官方的模式, 只要安装包的结构不变就不会有兼容问题

其他

之前楼主其实搓了一个第一版, 当时由于不知道官方的扩展方式, 必须采用一些入侵式的手段, 常见的比如 hook 系统调用, 修改数据库, 修改前端文件之类的方案, 为了防止修改对飞牛系统本身产生影响, 楼主当时选择了一种纯内存修改的方案——ebpf, 也就是 watchcow 的 0.1 版本,通过Linux 内核提供的监听机制, 在进程之间交换数据时, 篡改请求数据, 由于是在内存中修改, 所以不会在系统中产生副作用, 但 0.1 版本有非常多的问题, 比如不支持手机端和FN Connect, 后面发现了官方的开发文档之后才有了 0.2 版本


项目地址:https://github.com/tf4fun/watchcow

有问题欢迎反馈!

收藏
送赞 6
分享

5

主题

4

回帖

0

牛值

江湖小虾

还是不错的

3

主题

31

回帖

0

牛值

江湖小虾

好用,手机app也显示图标了。

这是bug吧

services:
easynode:
image: chaoszhu/easynode
container_name: EasyNode
restart: always
ports:

  • "8082:8082"
    volumes:
  • /vol3/1000/Docker/EasyNode:/easynode/app/db
    labels:

启用 WatchCow 发现

watchcow.enable: "true"

  # 应用标识 (对应 manifest.appname)
  watchcow.appname: "watchcow.EasyNode"

  # 显示信息 (对应 manifest 字段)
  watchcow.display_name: "EasyNode"
  watchcow.desc: "ssh"
  watchcow.version: "1.0.0"
  watchcow.maintainer: "EasyNode"

  # 网络配置
  watchcow.service_port: "28082"
  watchcow.protocol: "https"
  watchcow.host: "10.0.0.1"
  watchcow.path: "/"

  # UI 配置
  watchcow.ui_type: "url"  # url=新标签页, iframe=桌面窗口
  watchcow.icon: "file:///vol2/1000/Photos/icon/HDicons/Nexterm_A.png"

微信图片_20251129111825_122_112.png

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
watchcow.host无效  详情 回复
昨天 11:39

0

主题

2

回帖

0

牛值

江湖小虾

非常好用,感谢大佬

2

主题

20

回帖

0

牛值

江湖小虾

这个可以有,试下效果

11

主题

51

回帖

0

牛值

fnOS系统内测组

fnOS1.0上线纪念勋章社区上线纪念勋章

一只重启,

11

主题

51

回帖

0

牛值

fnOS系统内测组

fnOS1.0上线纪念勋章社区上线纪念勋章

version: '3'
services:
v2raya:
container_name: v2raya
image: mzz2017/v2raya:latest
restart: always
volumes:

  • /vol2/1000/Docker/v2raya:/etc/v2raya:rw
    network_mode: host
    privileged: true
    devices:
  • /dev/fuse:/dev/fuse:rwm
    labels:

必需标签

watchcow.enable: "true" # 启用 WatchCow 发现
watchcow.appName: "v2raya" # 应用唯一标识
watchcow.title: "V2rayA" # 显示名称
watchcow.port: "2017" # 外部访问端口(v2raya 默认端口)
watchcow.fnDomain: "v2raya" # fnOS 域名

  # 可选标签
  watchcow.desc: "V2ray网络代理"  # 应用描述
  watchcow.icon: "[img]https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/png/v2ray.png[/img]"  # 图标 URL
  watchcow.category: "网络服务"         # 分类
  watchcow.protocol: "http"            # 协议(http/https)
  watchcow.host: ""                    # 主机地址(默认为空,使用本地)
  watchcow.path: "/"                   # URL 路径

有问题,显示的是肥牛的图标而且端口不生效呢

这是我自己用的 compose.yaml, v2raya 的图标没有包含在 dashboard-icons 项目中, 你可以从这个地方下载放到本地, https://v2raya.org/android-chrome-512x512.png, 然后还有一点是 v2raya ,启动会需要从github下载  详情 回复
前天 17:32

2

主题

9

回帖

0

牛值

江湖小虾

前天 17:32 楼主 显示全部楼层
[quote][size=2][url=forum.php?mod=redirect&goto=findpost&pid=208507&ptid=45663][color=#999999]quanmingxin 发表于 2025-11-28 16:39[/color][/url][/size] version: '3' services: v2raya: [/quote]

这是我自己用的 compose.yaml, v2raya 的图标没有包含在 dashboard-icons 项目中, 你可以从这个地方下载放到本地, https://v2raya.org/android-chrome-512x512.png, 然后还有一点是 v2raya ,启动会需要从github下载一些依赖文件, 依赖文件可能会被墙...

services:
  v2raya:
    image: mzz2017/v2raya:latest
    container_name: v2raya
    restart: always
    network_mode: bridge
    ports:
      - 2017:2017
      - 20170:20170
      - 20171:20171
      - 20172:20172
    volumes:
      - ./volumes/v2raya_etc:/etc/v2raya
      - ./volumes/v2raya_usr:/usr/local/share/v2raya
    labels:
      # 启用 WatchCow 发现
      watchcow.enable: "true"

      # 应用标识 (对应 manifest.appname)
      watchcow.appname: "watchcow.v2raya"

      # 显示信息 (对应 manifest 字段)
      watchcow.display_name: "v2raya"
      watchcow.desc: "v2raya 代理服务"
      watchcow.version: "1.0.0"
      watchcow.maintainer: "WatchCow"

      # 网络配置
      watchcow.service_port: "2017"
      watchcow.protocol: "http"
      watchcow.path: "/"

      # UI 配置
      watchcow.ui_type: "url"
      watchcow.icon: "file:///vol1/1000/Docker/v2raya/v2raya.png"
感谢,我在github上看到的的watchcow.service_port和你这个帖子的名称不一样  详情 回复
前天 18:20

2

主题

20

回帖

0

牛值

江湖小虾

image.png

好像不支持中文显示名称,第一次构建正常修改后图标不能正常显示了。svg 图标好像也不支持

https://www.wangyunf.com/blossom-doc/imgs/blossom/logo.svg

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
svg标签我没试过, 但是官方文档的要求是png格式的, 以及 atchcow.display_name 用于控制显示, 你可以是看到的之前v0.1的label标签, 我之前没有将v0.2的改动合并到main中,总之以这个帖子和最新的github README.md为准  详情 回复
前天 18:58

11

主题

51

回帖

0

牛值

fnOS系统内测组

fnOS1.0上线纪念勋章社区上线纪念勋章

星河流放 发表于 2025-11-28 17:32
这是我自己用的 compose.yaml, v2raya 的图标没有包含在 dashboard-icons 项目中, 你可以从这个地方下载 ...

感谢,我在github上看到的的watchcow.service_port和你这个帖子的名称不一样
我没说清楚, v0.2版本重构后在另一个分支上, 需要切换到新分支才能看到, 现在已经merge到main了  详情 回复
前天 18:56

2

主题

9

回帖

0

牛值

江湖小虾

前天 18:56 楼主 显示全部楼层
quanmingxin 发表于 2025-11-28 18:20
感谢,我在github上看到的的watchcow.service_port和你这个帖子的名称不一样

我没说清楚, v0.2版本重构后在另一个分支上, 需要切换到新分支才能看到, 现在已经merge到main了

2

主题

9

回帖

0

牛值

江湖小虾

前天 18:58 楼主 显示全部楼层
andychao 发表于 2025-11-28 18:00
好像不支持中文显示名称,第一次构建正常修改后图标不能正常显示了。svg 图标好像也不支持
https://www.wa ...

svg标签我没试过, 但是官方文档的要求是png格式的, 以及 atchcow.display_name 用于控制显示, 你可以是看到的之前v0.1的label标签, 我之前没有将v0.2的改动合并到main中,总之以这个帖子和最新的github README.md为准

11

主题

51

回帖

0

牛值

fnOS系统内测组

fnOS1.0上线纪念勋章社区上线纪念勋章

我上传了一千多个NAS专用的APPpng图片库,有需要可以自行下下载https://share.feijipan.com/s/I1ZMtBys
image.png

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

3

主题

31

回帖

0

牛值

江湖小虾

lubover 发表于 2025-11-28 12:36
好用,手机app也显示图标了。
这是bug吧
services:

watchcow.host无效
v0.2 版本对于label做了修改, 你看到的应该是之前github main分支的配置, v0.2在另一个分支上,现在已经合并到main了, host 无效是因为官方的安装包不支持这个属性  详情 回复
昨天 11:43

2

主题

9

回帖

0

牛值

江湖小虾

昨天 11:43 楼主 显示全部楼层

v0.2 版本对于label做了修改, 你看到的应该是之前github main分支的配置, v0.2在另一个分支上,现在已经合并到main了, host 无效是因为官方的安装包不支持这个属性
好吧,那就是只要host不一致的docker用不了,无解了吗  详情 回复
昨天 12:40

3

主题

31

回帖

0

牛值

江湖小虾

星河流放 发表于 2025-11-29 11:43
v0.2 版本对于label做了修改, 你看到的应该是之前github main分支的配置, v0.2在另一个分支上,现在已经合 ...

好吧,那就是只要host不一致的docker用不了,无解了吗
官方的跳转逻辑没办法设置这个, 但host不一致,你是想要跳转到另一台机器吗?如果是这样,我能想到的方案只能是,你在本机启动一个http服务器,然后让他发送重定向到目标机器,但明显,这个方案也挺麻烦  详情 回复
昨天 12:57

2

主题

9

回帖

0

牛值

江湖小虾

昨天 12:57 楼主 显示全部楼层
lubover 发表于 2025-11-29 12:40
好吧,那就是只要host不一致的docker用不了,无解了吗

官方的跳转逻辑没办法设置这个, 但host不一致,你是想要跳转到另一台机器吗?如果是这样,我能想到的方案只能是,你在本机启动一个http服务器,然后让他发送重定向到目标机器,但明显,这个方案也挺麻烦
是的,例如easynode必须https才能复制粘贴,所以用lucky,把nas的http://10.0.0.2:8082,反代到路由器https://10.0.0.1:28082用。。。  详情 回复
昨天 14:04

3

主题

31

回帖

0

牛值

江湖小虾

星河流放 发表于 2025-11-29 12:57
官方的跳转逻辑没办法设置这个, 但host不一致,你是想要跳转到另一台机器吗?如果是这样,我能想到的方案只 ...

是的,我有方法了
听起来是你在nas上部署了一个 easynode, 然后因为chrome需要https才能允许粘贴,但你的https证书只能在路由器上, 所以,你需要通过路由器的https反向代理nas的http服务,那你直接在nas的easynode前加一个https的入口不  详情 回复
昨天 14:33

2

主题

9

回帖

0

牛值

江湖小虾

昨天 14:33 楼主 显示全部楼层
lubover 发表于 2025-11-29 14:04
是的,例如easynode必须https才能复制粘贴,所以用lucky,把nas的http://10.0.0.2:8082,反代到路由器http ...

听起来是你在nas上部署了一个 easynode, 然后因为chrome需要https才能允许粘贴,但你的https证书只能在路由器上, 所以,你需要通过路由器的https反向代理nas的http服务,那你直接在nas的easynode前加一个https的入口不也行吗,你用过traefik吗?这个可以自签署证书,也可以用acme challenge从letsencrypt签署合法证书
已解决,由于我是在路由器(10.0.0.1)装的lucky,反代nas(10.0.0.2)的easynode的话,只能通过https://10.0.0.1:28082访问http://10.0.0.2:8082 解决方法:nas也装个lucky专门做反代内网。 easynode可通过https://10.0  详情 回复
昨天 14:45

3

主题

31

回帖

0

牛值

江湖小虾

星河流放 发表于 2025-11-29 14:33
听起来是你在nas上部署了一个 easynode, 然后因为chrome需要https才能允许粘贴,但你的https证书只能在路 ...

已解决,由于我是在路由器(10.0.0.1)装的lucky,反代nas(10.0.0.2)的easynode的话,只能通过https://10.0.0.1:28082访问http://10.0.0.2:8082
解决方法:nas也装个lucky专门做反代内网。
easynode可通过https://10.0.0.2:28082访问http://10.0.0.2:8082
举一反三,访问路由器的lucky,可通过http://10.0.0.2:26601访问http://10.0.0.1:16601
这样就不纠结host了
这个方案也行, 关于跳转的方案, 我在 github 仓库里补充了一个跳转到 bilibili 的样例, https://github.com/tf4fun/watchcow/blob/main/examples/bilibili/compose.yaml  详情 回复
昨天 15:03

2

主题

9

回帖

0

牛值

江湖小虾

昨天 15:03 楼主 显示全部楼层
lubover 发表于 2025-11-29 14:45
已解决,由于我是在路由器(10.0.0.1)装的lucky,反代nas(10.0.0.2)的easynode的话,只能通过https://10.0 ...

这个方案也行, 关于跳转的方案, 我在 github 仓库里补充了一个跳转到 bilibili 的样例, https://github.com/tf4fun/watchc ... libili/compose.yaml
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则