V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
mgrddsj
V2EX  ›  问与答

是否存在一个自建文件缓存服务器软件

  •  
  •   mgrddsj · 315 天前 · 1049 次点击
    这是一个创建于 315 天前的主题,其中的信息可能已经有所发展或是发生改变。

    起因

    家里有一台 NAS ,存储了不少文件,但家宽的低上传带宽、非标端口、家宽 Web 服务敏感等问题使我一直没有用它直接分享文件给别人。

    我现在分享文件基本都是通过搭建在一台云服务器上的 File Browser 进行的,上传文件→分享→发送链接给朋友,使用体验还是相当满意的。不像国内网盘要登录+下载客户端才能下载 /在线播放视频,还“不限速”。但是云服务器的空间有限,一般系统盘就只有几十 GB ,付费扩容又感觉没什么必要(毕竟家里已经有 NAS 了)。

    我当然可以定期清理很久之前共享的文件,毕竟很多录屏等内容是有时效性的,聊天话题过去了就基本不会点开第二次了。但我个人并不喜欢“链接会过期”这个概念,大概是数据仓鼠的一个体现吧,但数据就这样“丢失”了会让我感到难受。况且这些文件我大概率会在 NAS 上有备份。

    需求

    所以我就想找这么个文件缓存服务器,能够打通我的云服务器和 NAS 。新的文件缓存在云服务器上供快速访问,达到某个阈值(存储空间限制 /访问频率)后删除云服务器上的缓存。缓存被删除的文件再次被访问到时就“回源”,从 NAS 上拉取,并缓存一段时间。

    某种意义上,这有点像品牌 NAS 自带的 SSD 缓存功能,把一些最近常用的文件存到 SSD 里,HDD 当仓库盘。但我想要的是远程的、可自建的。

    文件共享这块的网页前端操作起来最好要简单,因为如果搭好了,我是打算让家里人用的,让他们基本完全摆脱国内网盘(除了下载别人共享的文件,这个没太大办法)。

    目前找到的产品

    Nginx 配置 cache

    配置 Nginx 当反代和当网页服务器我还算熟悉,但反代+缓存的配置我是还没有接触过的。

    稍微看了一下 Nginx Content Caching 的文档,似乎是我要找的东西。但是我有几个疑问:

    • 像 File Browser 和 QNAP File Station 这样的网盘服务生成出来的分享链接都是动态的一串 hash ,这种情况能正常缓存吗?

    • 试了一下 File Browser 共享出来的文件(无密码),文件是存放在 /api/public/dl/HASH 下的,但 DevTools 显示 Cache-Control 为 private,这种情况下,Nginx 似乎是不能缓存这个内容的吧?

    • 这种缓存似乎得在创建分享链接后先访问 proxy_cache_min_uses 次,才能缓存到?所以我每次分享完还得最少手动访问一次才能缓存成功?不然我朋友访问第一次就是回源,会很慢吧。

    如果有朋友用过这种方案,可以分享下心得吗?感谢!

    Rclone Mount

    Rclone 在 mount 一个 remote 的时候,是可以设置 cache 的,感觉像是挺适合我的使用场景的。

    不过我之前在 Windows 上用 Rclone + WinFsp 的体验并不是特别好,有时连接不是很稳定会导致挂载的盘卡死。不知道在它的主要平台 Linux 上表现会不会好一点。

    如果 OK 的话,感觉 Rclone mount + File Browser 是个可行的选择。不知道是否有人有相关经验?或许过几天我有空可以试一下。

    但我也有一个担心:因为对于 File Browser 来说,mount 出来的是本地存储,在回源的时候延迟高一点的话不知道会不会直接请求失败。

    Alist

    看文档有提到缓存配置,就在之前搭好的 Alist 上用 WebDav 挂载了 NAS 试了一下,它似乎没法满足我的要求:

    • 存储无法自定义缓存大小,只能设置缓存到期时间,不知道是否有可能吃满服务器硬盘。

    • 缓存的似乎不是文件内容,而只是文件目录结构。监控服务器流量发现每次下载文件都在从 NAS 下载。

    • Alist 本质上是个文件列表程序,似乎更适合共享大量文件,而不是每次创建不同的共享(?)。我自己使用的体验是,共享单个文件没问题。但如果想共享单个文件夹并设置访问密码,但又不想 guest 帐户获取整个文件列表,那就得配置元信息。但要配置元信息对家人使用来说就不太友好了。不知道是我使用方法不对,还是本身就不是为这样的使用场景设计的。我希望能有 File Browser 那种简单的“网盘式”创建分享的体验。


    如果实在不行,我或许可以自己写一个这样的项目来练练手,不过如果现有方案能工作就最好了。

    6 条回复    2023-06-06 22:10:45 +08:00
    hymzhek
        1
    hymzhek  
       315 天前   ❤️ 2
    squid ?
    sofukwird
        2
    sofukwird  
       315 天前 via Android
    自己写一个,第一次访问的时候检查文件是否存在于 OSS 存储,有的话 302 返回 OSS 链接,没有的话访问 Nas 检查文件是否存在,存在则将文件上传至 OSS 后 302 返回 OSS 链接,不存在则返回 404
    OSS 文件可以设置在多少天后自动删除

    web ui 界面创建分享链接的时候就可以后台访问一次分享链接触发首次缓存
    Kinnice
        3
    Kinnice  
       315 天前
    群辉:
    CloudSync:自动同步 Nas 的 CloudShare 文件夹,想要分享的时候,就把 nas 的相关文件拷贝到 CloudShare 文件夹,自动同步到 某个存储(可以是你的云服务器或者[阿里云盘+alist]),配合群辉的定时任务 /自己写个 crontab ,自动清空过老的文件,CloudSync 也会删掉对面的(如果是阿里云盘,感觉都不用删
    mgrddsj
        4
    mgrddsj  
    OP
       315 天前
    @hymzhek #1 噢我没想到这个方案,之前折腾 HTTP 代理的时候有试着部署过,但是部署到一半嫌配置麻烦就放弃了。刚刚查了一下,第一次知道它还有 FTP 代理的功能。这个用起来应该比 Nginx 专业?(毕竟本身就是为了内容缓存而生的软件)我考虑下应该部署 File Browser + HTTP 代理还是 FTP 代理 + 支持 FTP 的文件管理前端。感谢提议!
    mgrddsj
        5
    mgrddsj  
    OP
       315 天前
    @sofukwird #2 是个办法,如果没有现成的方案我就试着写一下了。感谢提供思路。
    mgrddsj
        6
    mgrddsj  
    OP
       315 天前
    @Kinnice #3 嗯,这种就很多软件都能实现了,我也有用 Syncthing 来多端同步某个文件夹,但这并不是我想实现的效果,我就是不想自动清除过老的文件使分享链接失效才想找这么个缓存方案,不过还是感谢回复。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1278 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 17:49 · PVG 01:49 · LAX 10:49 · JFK 13:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.