V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
yodhcn
V2EX  ›  程序员

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

  •  
  •   yodhcn ·
    yodhcn · Mar 12, 2023 · 5143 views
    This topic created in 1141 days ago, the information mentioned may be changed or developed.

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

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

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