自建文件服务器有哪些选择?

2023-03-12 17:24:26 +08:00
 yodhcn

现在我有一个设想的方案:

  1. 当已授权用户需要请求某个目录中的文件时,需要先请求 Api 服务 "http://xxx.api.com/api/download_token?dir=DIRxxxxx" 拿到 token="TOKENxxxxx"
  2. 用户携带 token 访问文件服务 "http://xxx.file.com/file/DIRxxxxx/music.mp3?token=TOKENxxxxx",可以在该 token 过期前访问 "/DIRxxxxx" 下的所有文件

请问需要实现至少 "下载、上传、token 鉴权"等 这些基本功能的自建文件服务器有哪些选择?

PS: 不想使用对象存储,因为使用对象存储的文件在操作系统中不能直接读取。 希望使用原生文件系统实现,因为方便在操作系统的文件资源管理器中管理文件。

3590 次点击
所在节点    程序员
24 条回复
piku
2023-03-12 17:26:18 +08:00
为什么不搭一个私有云并开启 api 功能呢(比如 nextcloud
shellus
2023-03-12 17:32:22 +08:00
使用 minio 部署一个和阿里云 OSS 兼容的云储存服务,然后使用 OSS 挂载工具挂载为本地盘,既可以像云储存用法,也可以本地访问用法
shellus
2023-03-12 17:34:18 +08:00
以下是 chatgpt 的回答,其实也挺靠谱,基本上那些 nginx 和 apache 都可以借助模块来实现鉴权:
如果你希望使用原生文件系统实现这些基本功能,可以考虑使用开源的文件服务器软件,比如以下几个:

Apache HTTP Server:Apache 是一款非常流行的 Web 服务器软件,可以作为文件服务器使用。它支持多种操作系统和平台,包括 Windows 、Linux 、macOS 等。你可以通过 Apache 的模块来实现文件下载和上传功能,并结合 Apache 的认证模块实现 token 鉴权功能。

Nginx:Nginx 也是一款流行的 Web 服务器软件,支持 Windows 、Linux 、macOS 等平台。你可以使用 Nginx 的模块实现文件下载和上传功能,并结合 Nginx 的认证模块实现 token 鉴权功能。

FileZilla Server:FileZilla 是一个免费、开源的 FTP 服务器软件,可以支持文件上传和下载功能。你可以在 FileZilla Server 中设置用户账户和密码,实现基于账户密码的身份认证。对于 token 鉴权功能,你可以使用 FileZilla Server 的自定义脚本功能来实现。

vsftpd:vsftpd 是一个非常小巧、安全的 FTP 服务器软件,可以支持文件上传和下载功能。它可以在 Linux 和 Unix 系统上运行,并且具有很高的性能和可靠性。你可以使用 vsftpd 的认证模块实现基于账户密码的身份认证,也可以使用自定义脚本来实现 token 鉴权功能。

需要注意的是,以上这些文件服务器软件都是开源软件,你需要自己搭建服务器和配置相应的功能。在部署这些软件时,一定要注意安全性和权限控制,避免出现数据泄露等安全问题。
lovelylain
2023-03-12 17:36:29 +08:00
喜欢折腾的话 nginx+node.js
yodhcn
2023-03-12 17:40:30 +08:00
@shellus #2 "使用 OSS 挂载工具挂载为本地盘,既可以像云储存用法,也可以本地访问用法" 这部分能详细说说吗?这种配置方式对应文档里的哪一部分?我对 minio 了解的不是很多
0o0O0o0O0o
2023-03-12 17:43:23 +08:00
yodhcn
2023-03-12 17:45:33 +08:00
@yodhcn #5 我还是误解了,就算使用挂载工具,minio 存储的实现也不是原生文件系统实现的。
"nginx 和 apache 都可以借助模块来实现鉴权" 这我还是第一次了解
yodhcn
2023-03-12 17:48:36 +08:00
@yodhcn #7 主要还是怕自己部署的 minio 哪天出问题了,导致数据读不出来
Kinnice
2023-03-12 17:54:51 +08:00
话说你这个需求还用得着什么什么文件服务器? 基本随便找个顺手的语言一会儿就搞定了吧。

怕 minio 出问题导致数据读不出来,minio 是低冗余且磁盘损坏高容忍,换句话说如果 minio 出问题读不出来,你自己搞的什么依赖操作系统文件系统的更别指望了。
shellus
2023-03-12 18:24:25 +08:00
ngx_http_auth_request_module
@yodhcn
KevinBlandy
2023-03-12 19:19:19 +08:00
直接用 go 的 http.ServeContent 写一个吧,自动处理啥缓存,Range 请求。自己也方便控制权限。
renmu
2023-03-12 19:21:50 +08:00
直接 smb ,简单易用稳定
yodhcn
2023-03-13 00:32:28 +08:00
@shellus #10
这个模块好像需要 nginx-plus ,我现在在看 njs ,使用脚本也会更灵活些
https://github.com/nginx/njs-examples#getting-arbitrary-field-from-jwt-as-a-nginx-variable-http-authorization-jwt
forelegance
2023-03-13 01:00:39 +08:00
@renmu 特别容易被攻击
dann73580
2023-03-13 04:19:10 +08:00
其实我没懂,minio 不开加密的话本地是明文按照存储桶的结果保存的,完全不存在不好读取的情况,可以轻松进行备份。你的担忧是不存在的。
lovelylain
2023-03-13 09:38:15 +08:00
@yodhcn #13 auth_request 我也折腾过,用于文件分享感觉不如 X-Accel-Redirect 好用,具体好像是因为我把授权路径加密放到了 token 里,要在验证接口里解密出来用于下一步 rewrite ,没记错的话是解决了一半有其他问题没解决。我折腾文件分享的过程是 secure_link -> X-Accel-Redirect -> auth_request -> X-Accel-Redirect 。
yodhcn
2023-03-13 10:32:16 +08:00
@dann73580 请问你说的这个 minio 关闭加密,在文档的哪个部分有提到?怎么设置?
yodhcn
2023-03-13 10:59:23 +08:00
@dann73580 我正是需要这项配置,但我不知道在 Google 上该搜什么关键词
dann73580
2023-03-13 12:55:31 +08:00
@yodhcn 用我的 minio 实例试了下,创建存储桶的时候直接选要不要加密即可,不加密的话用 sftp 可以看到正常的文件结构。
hyqCrystal
2023-03-13 13:48:24 +08:00
现在做的这个项目本打算用 minio 现在非要用 nfs

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

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

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

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

© 2021 V2EX