V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yodhcn
V2EX  ›  程序员

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

  •  
  •   yodhcn ·
    yodhcn · 2023-03-12 17:24:26 +08:00 · 4064 次点击
    这是一个创建于 626 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    24 条回复    2023-03-13 17:59:16 +08:00
    piku
        1
    piku  
       2023-03-12 17:26:18 +08:00 via Android   ❤️ 1
    为什么不搭一个私有云并开启 api 功能呢(比如 nextcloud
    shellus
        2
    shellus  
       2023-03-12 17:32:22 +08:00   ❤️ 1
    使用 minio 部署一个和阿里云 OSS 兼容的云储存服务,然后使用 OSS 挂载工具挂载为本地盘,既可以像云储存用法,也可以本地访问用法
    shellus
        3
    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
        4
    lovelylain  
       2023-03-12 17:36:29 +08:00 via Android   ❤️ 1
    喜欢折腾的话 nginx+node.js
    yodhcn
        5
    yodhcn  
    OP
       2023-03-12 17:40:30 +08:00
    @shellus #2 "使用 OSS 挂载工具挂载为本地盘,既可以像云储存用法,也可以本地访问用法" 这部分能详细说说吗?这种配置方式对应文档里的哪一部分?我对 minio 了解的不是很多
    0o0O0o0O0o
        6
    0o0O0o0O0o  
       2023-03-12 17:43:23 +08:00 via iPhone
    yodhcn
        7
    yodhcn  
    OP
       2023-03-12 17:45:33 +08:00
    @yodhcn #5 我还是误解了,就算使用挂载工具,minio 存储的实现也不是原生文件系统实现的。
    "nginx 和 apache 都可以借助模块来实现鉴权" 这我还是第一次了解
    yodhcn
        8
    yodhcn  
    OP
       2023-03-12 17:48:36 +08:00
    @yodhcn #7 主要还是怕自己部署的 minio 哪天出问题了,导致数据读不出来
    Kinnice
        9
    Kinnice  
       2023-03-12 17:54:51 +08:00 via Android
    话说你这个需求还用得着什么什么文件服务器? 基本随便找个顺手的语言一会儿就搞定了吧。

    怕 minio 出问题导致数据读不出来,minio 是低冗余且磁盘损坏高容忍,换句话说如果 minio 出问题读不出来,你自己搞的什么依赖操作系统文件系统的更别指望了。
    shellus
        10
    shellus  
       2023-03-12 18:24:25 +08:00   ❤️ 1
    ngx_http_auth_request_module
    @yodhcn
    KevinBlandy
        11
    KevinBlandy  
       2023-03-12 19:19:19 +08:00   ❤️ 1
    直接用 go 的 http.ServeContent 写一个吧,自动处理啥缓存,Range 请求。自己也方便控制权限。
    renmu
        12
    renmu  
       2023-03-12 19:21:50 +08:00 via Android   ❤️ 1
    直接 smb ,简单易用稳定
    yodhcn
        13
    yodhcn  
    OP
       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
        14
    forelegance  
       2023-03-13 01:00:39 +08:00
    @renmu 特别容易被攻击
    dann73580
        15
    dann73580  
       2023-03-13 04:19:10 +08:00   ❤️ 1
    其实我没懂,minio 不开加密的话本地是明文按照存储桶的结果保存的,完全不存在不好读取的情况,可以轻松进行备份。你的担忧是不存在的。
    lovelylain
        16
    lovelylain  
       2023-03-13 09:38:15 +08:00 via Android   ❤️ 1
    @yodhcn #13 auth_request 我也折腾过,用于文件分享感觉不如 X-Accel-Redirect 好用,具体好像是因为我把授权路径加密放到了 token 里,要在验证接口里解密出来用于下一步 rewrite ,没记错的话是解决了一半有其他问题没解决。我折腾文件分享的过程是 secure_link -> X-Accel-Redirect -> auth_request -> X-Accel-Redirect 。
    yodhcn
        17
    yodhcn  
    OP
       2023-03-13 10:32:16 +08:00 via Android
    @dann73580 请问你说的这个 minio 关闭加密,在文档的哪个部分有提到?怎么设置?
    yodhcn
        18
    yodhcn  
    OP
       2023-03-13 10:59:23 +08:00 via Android
    @dann73580 我正是需要这项配置,但我不知道在 Google 上该搜什么关键词
    dann73580
        19
    dann73580  
       2023-03-13 12:55:31 +08:00
    @yodhcn 用我的 minio 实例试了下,创建存储桶的时候直接选要不要加密即可,不加密的话用 sftp 可以看到正常的文件结构。
    hyqCrystal
        20
    hyqCrystal  
       2023-03-13 13:48:24 +08:00
    现在做的这个项目本打算用 minio 现在非要用 nfs
    lzrainchen
        21
    lzrainchen  
       2023-03-13 14:35:48 +08:00
    根据你的需求我个人觉得 filebrowser 比较符合你的需求,GitHub 上搜一下
    yodhcn
        22
    yodhcn  
    OP
       2023-03-13 14:40:52 +08:00
    @jobmailcn #16 我今天试了下 X-Accel-Redirect ,很方便。
    鉴权交给后端,具体的响应交给 Nginx ,我能不能这样理解?
    litguy
        23
    litguy  
       2023-03-13 17:14:32 +08:00
    对象存储自己的鉴权功能就可以,为啥非要 posix 兼容的文件方式呢
    lovelylain
        24
    lovelylain  
       2023-03-13 17:59:16 +08:00 via Android
    @yodhcn 是的,我一溜折腾下来,X-Accel-Redirect 是最适合文件分享需求的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1129 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 22:54 · PVG 06:54 · LAX 14:54 · JFK 17:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.