深入解析绿联云 DX4600 Pro UGOS 系统 (2)

177 天前
 chowdpa02k413

上一集 深入解析绿联云 DX4600 Pro UGOS 系统(1)

OK ,讲了那么多系统底层的东西,接下来让我们看看与用户打交道最直接的,软件层级的用户交互体验。

真正上手体验过,你才会明白大伙之前对张小龙的态度有点过于严格了,他可能真的算是相对比较好的产品经理。

套件分析:文件管理

2023 年很少能够找到一个连 Explorer 都做得有点问题的软件开发商了。我们都知道绿联的这套东西是基于 Electron 的前端项目,所以里面有相当一部分交互被受限于纯前端的逻辑。

首先是这个前进后退键。说起来你可能不信,在 Explorer 中浏览文件,你不能够跳跃式地浏览目录,因为顶上的地址栏,是一个装饰品,你不能在上面键入任何的路径或者快速跳转。想要进入到某个目录,你只能从根目录一路递归到你想到达的地方,然后用多了几次你会发现,这两个箭头的逻辑是反 PC 的:

来看看你微软爹是怎么做 Explorer 的……

其次就是当我上传文件的时候,它总是会先问我,究竟是选择跳过、替换还是保留两者,而无论你要导入的文件是否存在重复。就好像是我高考先把志愿报了再进考场考试一样。那我肯定是希望当拷贝的时候把所有的冲突项记录下来,最后列表让我决定怎么做( Windows 逻辑),而它只有闭着眼睛闷头干,或者每次都询问我,不允许对每个文件进行单独的决策。

套件分析:相册

我的父亲是一位很热爱生活的人,很多年前他买了一台相机,游山玩水的时候会记录很多照片,回到家分门别类整理好放在每一个文件夹里,从 2010 年一直带到现在,光看目录就知道当时去了哪,在干什么。

那么,把整理得这么细致的照片放到绿联相册里会是什么样的呢?😅……

是的,绿联云在设计这个东西的时候一定是参考手机 OS 的 Gallery ,就是往一个叫做 DCIM 的文件夹里猛塞图片就好了。我从来没见过相册归纳软件竟然能完全抛弃子目录信息。我当然可以辛苦自己每个 subfolder 单独创建一个相册,但是人生的时间不是这么浪费的:

  1. 我的相册名必须低于 15 字,为什么?看看上面的文件夹有哪个 15 字写得完?
  2. 我必须从本机、存储空间、或者相册内部手动指定一张图片作为相册封面,在创建空相册时只能从本机照片指定,而不是根据相册内容自动创建封面
  3. 我不能从公共空间读取图片创建相册
  4. 我无法选择有限的成员开放相册共享,只有 0 和 1
  5. 我必须在相册 APP 里创建相册,与其它套件(说的就是你,文件管理)没有一丝一毫的联动
  6. 我必须先创建空相册,再双击进入到空相册内部才能添加图片
  7. 其实我说错了,当我在相册“收藏”一张图片时,他会以文件的形式出现在“文件管理”APP 左侧“我的收藏”里,但不会体现在“相册”里的任何一个地方

我发现一件事情,上面的第 2 点和“参考手机 OS 的 Gallery”交互理念是冲突的,手机 OS 的 Gallery 意图是让用户把图片全部丢进去就好,它去自动 AI 分析,省心,但是 UGOS 只省了一半,我还是得自己管理贴张图,是这个意思吗?

很难理解负责相册和 Explorer 的 UX (如有)在想什么,把图像和文件之间的管理搞得乱七八糟,而最关键所需的功能却见不到:

套件分析:云影院

实际上我自己长期以来在用的媒体库是 Jellyfin ,已经在 Jellyfin 搭建好了成型的接近 3TB 的庞大影视资源库。但问题在于,让完全不懂操作的家里人去弄端口登录,还额外下个 APP 也不现实,那就试试云影院好了。

(另外一个原因是,我的 Jellyfin 还提供一些同龄人看的东西,跟我的兄弟也好教、会折腾)

云影院更是一个重量级选手。它提供两种刮削源,一个内置的“智能识别”,以及 TMDB ( TheMovieDB ),让我们先来欣赏一下智能识别的准确率:

于此相比,同样的资源在 Jellyfin:

官方的智能识别源可谓是一塌糊涂。他犯下了一个质量差的刮削器能犯下的所有错误,比如说,把 Fate/Stay Night UBW 识别成了 Fate/Stay Night (近似错误)、把花絮和 Special 识别成了毫不相干的其它影视资源(随机错误)、把 Tenet.2020 识别成了册那 2020 (匹配错误)等。

而且在 PC 端,这个播放窗口竟然不能调整大小……只有 540P 小屏和全屏,并在在我的机器上( 5900X+3090 )部分视频源无论放什么视频都会在播放大概 2-3 秒之后停住不动,而拖动进度条却能继续播放,怀疑是播放器写得有问题,卡在了关键帧解码。至于字幕渲染质量什么的我也不好意思继续提,因为即使是与视频文件同名的字幕它都匹配不到,让我在文件夹里手动选……还是先把匹配做明白再去苛求质量吧。

然后你猜怎么着,这个云影院是有适配鼠标侧键前进后退的,然而文件管理却没有。

那我们把官方的“智能匹配”取消掉,使用 TheMovieDB 呢?当然没有问题,因为 Jellyfin 也将 TheMovieDB 作为数据源之一,能在 Jellyfin 正确识别的片源 90%以上都能单纯依靠 TheMovieDB 源识别成功。所以我建议原来在 Plex/Emby/Jellyfin 库迁移过来的朋友,使用纯 TheMovieDB 源。但我需要跟随官方一篇教程去花十来分钟注册 TheMovieDB 、申请 APIKEY 、测试解析配置 Hosts ,有一种传统互联网的美。

那如果我的老豆老母老姐老哥恰巧喜欢看外国电影、看美剧,而我自己不看怎么办?我还要一个个去教他们怎么去一个全英文的网站申请 API key 、测延迟选 Hosts 吗?

我想了想,也许这是我的问题。遵守国际源刮削规范的影片很明显在“智能匹配”识别率并不高,我在怀疑相比这样的名字:

Fast.and.Furious.F9.The.Fast.Saga.2021.DC.1080p.BluRay.x265-RARBG

是不是这种识别率更高呢?

速 d 与 j 情 9[1080P 蓝光超清][高清电影网]

既然云影院能够添加公共空间的视频,那么从这个云影院是公共的这件事也就合乎常理了。但是阿绿再一次选择了打破常规:我教我老姐如何使用 APP 的时候,惊奇地发现她的云影院是空的。我找了半天去哪里将片库设为公用,发现满屏幕只有“个人影院”,把个人影院四个字点烂了也只是一个筛选器在疯狂地伸缩,最后发现所谓的公共影院的功能叫做“一起看”,还是邀请制的,你分享一个片库需要被分享人同意……

就好像在一个悠闲的周末晚上我邀请大伙一起看电影,然后把片库分别发送到大家的手机上,电视放在那不开,大家点击自己的手机各看各的。并且经过实测,这个叫做“一起看”的功能完全没有类似异地放映室播放进度同步的机制,它只是单纯地把片源共享,有一些名不副实。产品经理知道什么叫做“一起”吗?

云影院的用户隔离机制无关技术问题,单纯是产品经理脑子出了问题,产品定义到这突然就混乱了,放着好好的公共/私人域不做,突然异想天开搞邀请分享制。

套件分析:云音乐/有声书

我相信这个东西应当不会有人用。不支持选择输出设备、不支持读取 FLAC 内置的 TAG(导致所有在 Foobar2000 分类整理好的歌单导进来全部变成文件名)、不支持导入公共空间资源、不支持 AIFF 、不支持 CUE ,道阻且长,绿联加油吧。

晚 22:00 更新:

它不是不支持读取 tag ,而是读得非常慢,晚上回来一看歌曲元数据慢慢都蹦出来了,怀疑在后台建库建索引,那么慢一定用的是 MySQL 。

套件分析:备份

我对 NAS 的另一个重要需求就是文件自动备份(和微信备份,但是这台 NAS 不支持),而且只要求备份不要求同步,因为我的主力机已经有 2TB+8TB 的空间。

我一般习惯把工作目录放在桌面,代码项目放在~/*Projects ,过一段时间后归档到硬盘中,现在有了绿联云 NAS 自动备份……

已经连续 4 天没有关机了。

PycharmProjects 文件夹总大小 101GB ,文件数量 536957 ,文件夹数量 66488 ,这套套件的 PC 端备份在遇到十万以上数量级时会出现严重的性能问题,以至于现在我 4 天没有关机,第一次全量备份的完成度还未达到一半。而且备份文件的速度会越来越慢,在连续运行十来个小时之后会停滞不前,“我的备份”窗口会直接无响应挂掉,必须退出绿联私有云客户端再重新启动,它才会以一个比较慢的速度继续运行备份。而且是每十几个小时需要重新启动一次,天知道我离第一次备份成功还有多远。

不过这种极限工况不是所有人都会遇到的,目前我的相册自动备份大概 3000 张,比较流畅,不会有什么问题。

套件分析:百度云

我自己是向来不用百度云盘的,从拥有自己的电脑开始,数据一直牢牢掌握在本地硬盘里,需要的资源也总能从云盘以外的地方找到替代品。

但是家里其他的年轻人会用。我在邀请他们加入私有云后,我说我不用百度云盘的,但是你可以登陆试试,把云盘上的东西下载到家里,本地化。然后她在她的手机点了一下百度云盘插件。

提示“仅限管理员使用”,她让我给她开下权限,这个时候我人已经麻了,因为我已经意识到百度网盘估计只有管理员能用这一事实。

所以现在我的账户上很无奈地登录着别人的网盘,挂着别人的下载,等到下载完之后还要操作移到公共空间给其他人取用(没错,百度网盘的保存位置,又不支持公共空间了)

我尝试理解这件事情,虽然不懂技术的人根本不会管为什么不能用。我推测这类第三方工具本身限制在一个系统里面运行多个实例,出于之前分析的用户机制,实例只能交给管理员用户运行。

那这种情况在不考虑法律风险的时候怎么解决呢?虚拟机或者容器化方案。这就是新的问题了:

  1. 现阶段绿联根本没把虚拟机做出来,在当前用户机制的约束下做出来的难度比拿正经 Linux 重构还大

  2. 假设我们使用容器来承载多个实例,并且对用户隐藏,可以做到吗?

答案是不完全可以。docker 是不支持隐藏 container 的,但是 docker 支持每个用户运行不同的dockerd,那系统镜像就交给 root 运行好了,其他用户以自己的身份管理自己的dockerd,方案很不错。

但是非管理员的用户在 Linux 不真实存在,并且现在套件里的 dockerd 就是以 root 身份运行,如果要更新,那么怎么处理 root 容器降权迁移的问题?

另外,dockerd 多用户机制依赖systemd,而 Openwrt 正是**不使用systemd**的一个 Linux 发行版,意味着多用户容器方案在当前架构下不可能实现。

下集预告

对这个奇葩系统的分析就此结束了。我们接下来将会基于这些分析的结论寻找解决方案,结合我踩坑的经验,告诉大家在这台机器上,想要部署一个普通的三方媒体库和下载插件需要经过哪些步骤,使用过程中又会遇到什么样的坑。

  1. 系统级部署 Tailscale 内网穿透
  2. docker 容器间组网和配置
  3. docker 公共空间的挂载方法
  4. aria2c 镜像部署
  5. qb 正确的配置方法
  6. 公网安全保护指南
  7. Jellyfin Plugin 配置和个性化配置

附录

根据 Nginx Conf 生成的反代列表,传入数据不合规的时候会被 rewrite 跳转至 404“固件版本过低”页。

列表由 GPT 整理,因为上下文过长,GPT 遗忘机制导致可能会出现一定的错误,请自行前往/etc/nginx比对甄别

# Generated by ChatGPT
LISTEN 9999 [::]:9999

# NAS server
/                                 -> :9996

# Ugreen launcher
/home                             -> /data/app/com.ugreen.ugos.launcher/www/index.html

# Docker Hub API
/docker/image/search              -> https://hub.docker.com/api/content/v1/products/search/

# Core server
/v1/user/login                    -> :9994

# Album server
/v1/album_svr/                    -> :9982
/v1/ai/album/                     -> :9982
/v3/ai/album/                     -> :9982
/v1/album/manage/                 -> :9982
/v2/album/group/                  -> :9982
/v3/cloud/album/                  -> :9982
/v1/ai/task/                      -> :9982
/v1/ai/scan/                      -> :9982
/v1/ai/similar/                   -> :9982
/v1/ai/blur/                      -> :9982
/v1/ai/face/                      -> :9982
/v1/ai/file/                      -> :9982
/v1/album/people/                 -> :9982
/v1/tidy/                         -> :9982
/v1/myself/del_myself_folder      -> :9982

# Baidu Pan server
/v1/baidu/rest/2.0/xpan/          -> https://pan.baidu.com/rest/2.0/xpan/
/v2/baidu/oauth/token             -> https://pan.baidu.com/rest/2.0/xpan/

# MiniApp Yun server
/v3/cmcc/devapp/                  -> https://miniapp.yun.139.com/richlifeApp/devapp/
/v3/cmcc/open-mpplatform/oauth2/  -> https://miniapp.yun.139.com/open-mpplatform/oauth2/

# Docker web
/docker/web                       -> /ugreen/docker/www

# TTYD server
/ttyd                             -> :DYNAMIC

# Docker images export
/docker/images/export/            -> :9375

# Docker image search
/docker/image/search              -> https://hub.docker.com/api/content/v1/products/search/

# Docker image repositories
/docker/image/repositories/       -> https://registry.hub.docker.com/v2/repositories/

# External backup server
/v1/file/external_backup/         -> :9984

# Favorites server
/v1/favorites/set                 -> :11024
/v1/favorites/get                 -> :11024
/v1/favorites/cancel              -> :11024

# File collect server
/ugos/v1/file_collect/            -> :12028

# File share server
/v1/share/get_shared_files_of_users -> :11025
/v1/share/get_users_of_share_file   -> :11025
/v1/share/share_files               -> :11025
/v1/share/cancel_shared_files       -> :11025
/v1/share/get_all_users             -> :11025
/ugos/fileshare/v1/shared_user/list -> :11025

# File search server
/ugos/globalsearch/v1/            -> :12029

# IPC server
/v1/task/                         -> :9992
/v1/baidu/                        -> :9992
/v1/transcode/                    -> :1080
/v1/disk/                         -> :9992
/v1/storage/                      -> :9992
/v2/storage/                      -> :9992
/v1/stormng/                      -> :9992
/v1/dl/                           -> :9992
/v1/cmcc/                         -> :9992
/v3/cmcc/                         -> :9992
/v1/file/storages                 -> :9992
/v1/file/disks                    -> :9992
/v1/category/                     -> :9992
/v2/category/                     -> :9992
/v3/category/                     -> :9992
/v3/storage/                      -> :9992
/v4/storage/                      -> :9992
/v5/storage/                      -> :9992

# LBook server
/ugos/lbook/v1/                   -> :11029

# Log Center server
/ugos/log_center/v1/              -> :10002

# Media Player server
/v1/mediaplayer/                  -> :1085

# Movies server
/v1/movies/                       -> :9980
/v2/movies/                       -> :9980
/v3/movies/                       -> :9980

# Music server
/ugos/music/v1/                   -> :11028

# Service Manager server
/ugos/service_mgr_svr/v1/         -> :19010

# Thunder server
/device/info/watch                -> :5050
/device/now                       -> :5050
/device/authlogin                 -> :5050
/device/v1/                       -> :5050

# Thunder web
/web/thunder/                     -> :5050

# Transcode server
/v1/transcode/online/                   -> :1080
/v1/transcode/online/info/              -> :1080
/v1/transcode/online/                   -> :1080
/v1/transcode/online/status             -> :1080
/v1/transcode/online/switch_resolution/ -> :1080

# Data app
/data/app/                        -> /

# App
/app/                             -> :9999

# User Management server
/v1/quota/project                 -> unix:/var/run/user_manage.sock
/v1/quota/user                    -> unix:/var/run/user_manage.sock
/v1/quota/volume                  -> unix:/var/run/user_manage.sock
/v1/timemachine/query             -> unix:/var/run/user_manage.sock
/v1/timemachine/set               -> unix:/var/run/user_manage.sock
/v1/cache/write                   -> unix:/var/run/user_manage.sock
/v1/cache/remove                  -> unix:/var/run/user_manage.sock
/v1/cache/clean                   -> unix:/var/run/user_manage.sock
/v1/cache/query                   -> unix:/var/run/user_manage.sock
/v1/localuser/list                -> unix:/var/run/user_manage.sock
/v1/localuser/exists              -> unix:/var/run/user_manage.sock
/v1/localuser/create              -> unix:/var/run/user_manage.sock
/v1/localuser/modify              -> unix:/var/run/user_manage.sock
/v1/localuser/delete              -> unix:/var/run/user_manage.sock

# WPS server
/v1/wps_doc/                      -> :11027
4629 次点击
所在节点    分享创造
43 条回复
someonedeng
177 天前
年度大型连续剧,快更快更
xshument
176 天前
分析的不错
lany
176 天前
催更
JensenQian
176 天前
nas 还是卖系统,不然真不如自己装
zqqian
176 天前
就是给的工资招不到高水平的产品经理和程序员罢了
互联网大厂的工资,哪个制造业企业能接得住?
cqj0908
176 天前
期待下一集!
cp19890714
176 天前
nginx no-cache 的问题, 我用 docker 搭建了另一个 nginx, 作为外网访问入口, 其中把 no-cache 替换掉.
这系统还有个严重问题, 上传下载文件和看视频 , 数据有效率只有 30%, 也就是说下载 100MB 的文件,实际的数据传输大概是 300MB.
modrich
176 天前
非常感谢 op 的深入分析,
绿联的系统太烂了,,实在是不喜欢 nas 还关联手机号码之类,我是到手就尝试刷黑威联通(没成功,退货了)
ysnow888
176 天前
同款用户 催更~
smarthing
176 天前
咱能直接换 Debian 系统么?我因为垃圾 ugos 的原因,已经把 dx4600 赔钱 600 元出手了。
Greendays
176 天前
这样看来问题很多啊。也难怪群晖敢卖这么贵了。
ik
176 天前
还没看 1 ,

可能这是真自研,体验像极了我司的产品😅
TORYOI
176 天前
我想知道绿联云这个 docker 里面的镜像如何开机启动,是不是一开始创建镜像时就要选配置了,创建好镜像之后就不能修改
Ericality
176 天前
看得我都累了 要不咱还是换回群晖吧....
不过会不会从一个小白的视角来看这个东西会不会"比较好用"?
chowdpa02k413
176 天前
@TORYOI
docker update --restart=[policy] [container]

policy:
no
on-failure[:max-retries]
always
unless-stopped

例如
docker update --restart=unless-stopped jellyfin
chowdpa02k413
176 天前
@Ericality
所以我没换系统,因为家里人都能用明白,而且他们都没有电脑,用的手机端
我自己想要折腾,才发现这么多毛病,秉承着来都来了的原则,也只能硬着头皮靠自己克服困难了
icefrogisgreat
176 天前
OP,我是 DX4600 我现在存了 5T 多的数据, 不想用这个系统了,我换了新系统的话, 硬盘是不是需要格式化啊?
chowdpa02k413
176 天前
@icefrogisgreat 不太需要,你跳转到文章的第(1)部分的目录窥探,对着取数据就行。至于 raid 的话按常理在别的系统要手动挂载一下吧,也不排除够智能的系统会自动识别
yuanliuzhen88
176 天前
有没有用过极空间的来对比一下??
shakoon
176 天前
这个相册功能真是无力吐槽,感觉他们这个产品真的就是只设计给手机用户使用的,相机用户不如狗

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/991948

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX