SSD Nodes Learn 🎉 VPS $5.50/月起
指南 Matt Connor作者: Matt Connor

自托管文件管理器对比:FileBrowser、Filestash、SFTPGo

对比 FileBrowser、Filestash、SFTPGo 和 Cloud Commander 的权限范围、分享链接、存储后端与身份验证,并说明 FileBrowser 将于 2026 年 9 月 1 日归档后如何安全运行。

什么是自托管文件管理器,它不是什么

自托管文件管理器是一个用于访问 VPS(虚拟专用服务器)现有目录树的网页。登录后,您看到的 /srv/files 与磁盘上的内容完全一致,您可以上传、重命名、下载文件,或将链接发送给他人。文件不会被复制到第二个系统中,因此您在浏览器中上传的文件,ls 会在一秒后显示出来。

搜索结果常常会将它与执行其他任务的软件混为一谈。同步工具会在每台设备上保留每个文件的副本,这正是自托管 Dropbox 替代方案的用途。对象存储根本没有目录树,而是使用存储桶和 API,因此运行 MinIO 提供 S3 兼容对象存储解决的是另一个问题。服务器管理面板管理的是整台机器,而不是文件;Cockpit 与 Webmin 对比讨论的就是这一类工具。

当同事需要从服务器获取一个 300 MB 的归档文件,或您想通过手机修正配置文件中的拼写错误时,就需要文件管理器。任务很小,因此所需工具也很简单。

阅读本文时,请始终记住一点。这是一个对文件系统具有读写权限、并监听某个端口的 Web 应用。下面的每个选择,本质上都是在决定该进程可以访问磁盘中的多少内容。

FileBrowser 已归档,因此安装前请先阅读本文

FileBrowser 是许多指南仍会推荐的 filebrowser/filebrowser 项目。其 README 现在开头有一则通知:

File Browser 将于 2026-09-01 归档。最后一个计划中的版本已经发布。此后不会再发布新版本,也不会再提供 bug 修复或安全修复。

Apache 2.0 许可证下的代码仍可运行,但安全修复会停止。与大多数同类软件相比,这一点影响更大,因为该软件的全部用途就是通过 HTTP 获取文件系统的写入权限。

维护者记录了如何继续运行该软件。无论选择哪种工具,都应遵循这些建议:不要将其直接暴露到互联网;将其放在负责终止 TLS(传输层安全)并执行自身身份验证的反向代理后面;保持命令执行器处于禁用状态;在容器中以非特权用户运行,并且只将计划提供服务的目录挂载到容器中。

README 中有一行内容比其他部分更重要。会话使用自包含的 JWT(JSON Web Token),而不是服务端标识符,因此无法撤销。泄露的会话令牌会一直有效,直到过期;修改密码也不会使其失效。如果继续使用 FileBrowser,前面的身份验证层才是真正承担安全职责的部分。

FileBrowser Quantum:仍在持续开发的分支

活跃开发已转移到 FileBrowser Quantum(gtsteffaniak/filebrowser),并以 gtstef/filebrowser 镜像发布。它使用单个 config.yaml 重新设计配置,不再采用旧版命令行参数与数据库设置的混合方式。文档中的快速试用命令如下:

docker run -d \
  -v $(pwd):/srv \
  -p 80:80 \
  gtstef/filebrowser:beta

该命令会在 http://localhost 提供当前目录,首次登录凭据为 admin / admin。在容器可从本机以外的位置访问前,请先修改该凭据。

如果要长期运行实例,请使用 Compose,挂载数据目录而不是单个数据库文件,并将端口绑定到 localhost:

services:
  filebrowser:
    image: gtstef/filebrowser:beta
    user: "1000:1000"
    volumes:
      - /srv/files:/folder
      - ./data:/home/filebrowser/data
    ports:
      - 127.0.0.1:8080:80
    restart: unless-stopped

配置文件位于 /home/filebrowser/data/config.yaml,数据库位于 /home/filebrowser/data/filebrowser.sqlite。2.0.0 版本更改了数据库格式,并会执行一次性迁移。这也是文档要求挂载目录的原因:挂载单个文件时,迁移没有位置写入新文件。config.yaml 中的路径是容器内路径,因此配置中的源路径应读取为 /folder,而不是 /srv/files。如果弄反,文件列表会为空且不会报错,因为该目录确实不存在。

该项目发布了 lateststable,大小约为 60 MB,内置 FFmpeg,可生成视频缩略图;还发布了 stable-slim,大小约为 15 MB,仅包含核心组件。这些是 2026 年 8 月安装页面上的数据。请固定所选标签。latest 会在不通知您的情况下发生变化,而文件管理器在运行中的容器内更改配置格式,会导致不必要的问题。

对于这项工作,它是小型工具中功能最强的一个。它支持通过包含和排除规则提供多个源,因此一个实例可以分别以不同范围暴露 /srv/media/srv/docs。共享链接带有过期时间,可以匿名访问,也可以限制为特定用户。身份验证支持 OIDC(OpenID Connect)、LDAP(轻量级目录访问协议)、带双因素认证的密码,以及代理请求头模式。该代理模式允许它通过 自托管的 Authentik 服务器接入单点登录(SSO),无需维护第二份用户列表。

Filestash:为现有存储提供统一界面

Filestash 的定位不同。它是连接后端的前端,支持的后端很多,包括 FTP、SFTP(SSH 文件传输协议)、S3、SMB、WebDAV、IPFS 以及大约另外 twenty 种后端。当文件不在运行该界面的服务器上时,它很适用。

mkdir -p /srv/filestash && cd /srv/filestash
curl -O https://downloads.filestash.app/latest/docker-compose.yml
docker compose up -d

镜像为 machines/filestash:latest。打开 http://your_domain:8334,首个界面会要求设置管理员密码。请立即设置,因为在此之前,任何发现该端口的人都可以访问管理控制台。

在基于 Filestash 构建方案前,先了解其身份模型。Filestash 通常不会维护用户数据库。凭据通过 Cookie 存储在浏览器中,这些 Cookie 已加密、经过身份验证,并设置为 HTTP only;除非使用共享功能,否则服务器端不会保存任何内容。使用共享功能时,Filestash 会保存凭据的持久化加密版本。这里的“用户”实际上是存储账户:身份由后端中的 SFTP 账户或 S3 密钥定义,而不是由 Filestash 定义。

这种设计简洁,但也有代价。定价页面显示,免费自托管层采用 AGPL v3(GNU Affero 通用公共许可证),最多支持 3 个用户;截至 August 2026,SSO(SAML、OIDC 和 LDAP)及基于角色的访问控制位于付费自托管层,起价为每月 $50。如果方案是“免费在公司 SSO 前部署 Filestash”,请在设计方案前先查看该页面。

SFTPGo:同时提供 Web 界面的协议服务器

SFTPGo 是这里功能最完整的软件,也是最常因错误理由而被推荐的软件。它支持通过本地文件系统、加密本地文件系统、兼容 S3 的对象存储、Google Cloud Storage、Azure Blob Storage 或其他 SFTP 服务器提供 SFTP、HTTP/S、FTP/S 和 WebDAV。

SFTPGo 发布了二进制文件、Debian 和 Ubuntu 软件包,以及容器镜像。当前的 APT 仓库配置行和签名密钥位于 SFTPGo 文档的安装页面。使用容器是最快的启动方式,将 tag 替换为所需版本:

docker run --name some-sftpgo -p 8080:8080 -p 2022:2022 -d "drakkan/sftpgo:tag"

SFTP 监听 2022,Web 界面监听 8080。请将 /srv/sftpgo 挂载为卷,否则重新创建容器时,账户及其文件会消失,因为用户主目录默认位于 /srv/sftpgo/data/<username>

SFTPGo 提供两个 Web 界面,二者的区别是大多数介绍文章都没有明确说明的部分。WebAdmin 位于 /web/admin,用于管理:您可以在其中创建用户、组、虚拟文件夹和事件规则,并设置配额、带宽限制及访问时间限制。WebClient 位于 /web/client,面向最终用户;用户可以在其中浏览文件、修改自己的凭据、设置双因素身份验证和创建共享。

这些共享功能是本次比较中最出色的功能。用户可以创建用于共享文件和文件夹的 HTTP/S 链接,限制下载和上传次数,使用密码保护共享,按源 IP 地址限制访问,并设置自动过期日期。

那么为什么要谨慎选择?它的核心是账户模型和协议服务器,而不是文件浏览体验。以下情况适合选择 SFTPGo:其他人需要带配额的真实账户;上传通过您无法控制的系统使用 SFTP 或 FTPS 到达;或者同一个存储桶必须显示在多个用户的主目录中。虚拟文件夹可以实现最后一种需求:它可以由本地磁盘、S3、GCS、Azure Blob、SFTP 或 HTTP 提供后端,挂载到多个账户,并在共享文件夹上为每个用户设置独立配额。如果您只是想通过 /srv/files 提供一个可浏览的页面,那么为此使用 SFTPGo 会引入大量不必要的组件。

还有两个值得了解的事实。Community 版采用 AGPL-3.0-only 并附带其他条款,同时提供商业许可的 Enterprise 版。开源版本支持 OIDC 登录,并可将身份提供商中的用户映射为 SFTPGo 管理员和用户,供两个 Web 界面使用。您还可以在 httpd 配置中使用 enable_web_client 全局关闭客户端界面,或者向某个用户的拒绝协议列表添加 HTTP,仅对该用户关闭客户端界面。这样,文件管理器可以只供一个人使用,而不会对所有用户开放。

Cloud Commander:双窗格和终端,供个人使用

Cloud Commander 是一款采用双窗格界面的 Node.js 管理器,使用 MIT 许可证,内置编辑器、控制台和终端。使用 npm i cloudcmd -g 全局安装,或运行已发布的容器:

docker run -it --rm -v ~:/root -v /:/mnt/fs -w=/root -p 8000:8000 coderaiser/cloudcmd

运行前先阅读该命令。-v /:/mnt/fs 会将整个主机文件系统挂载到容器中,示例 ~/.cloudcmd.json 会提供 "root": "/""auth": false"console": true。这意味着任何能够访问 8000 端口的人,都可以获取整块磁盘的内容,并在服务器上打开命令控制台。对于笔记本电脑,这是合理的默认配置;对于 VPS,则不合适。

缩小访问范围。容器会读取 /root/.cloudcmd.json。已发布的命令通过挂载主目录提供该文件,因此保留配置挂载,删除其余内容:

docker run -d --name cloudcmd \
  -v ~/.cloudcmd.json:/root/.cloudcmd.json \
  -v /srv/files:/srv/files \
  -w=/srv/files \
  -p 127.0.0.1:8000:8000 \
  coderaiser/cloudcmd

在该配置文件中,将 "root" 设置为 /srv/files,将 "auth" 设置为 true,并配置 "username""password";除非确实需要浏览器 shell 访问,否则将 "console""terminal" 设置为 false。命令行也有对应选项,包括 --root--auth--username--password--prefix

请明确它的适用范围。它只有一组凭据,不支持按用户限制范围、不支持配额,也不支持共享链接。这是个人工具,因此应像上面一样绑定到 localhost,再通过隧道访问:

ssh -L 8000:127.0.0.1:8000 you@your-vps

然后在自己的计算机上打开 http://127.0.0.1:8000。文件管理器不会直接暴露到公网,面向互联网的只有您已在 VPS 上 完成安全加固的 SSH daemon

为什么 Nextcloud 不适合完成这项任务

Nextcloud 是优秀的软件,但不适合完成这项任务。它是一个协作平台,由 PHP 应用、数据库、后台任务、桌面同步客户端和应用商店组成。为了通过 Web 界面查看 /srv/files 而运行 Nextcloud,对于这项小任务来说涉及的组件过多,而且存在一个具体的不匹配之处。Nextcloud 将文件元数据保存在数据库表中,而不是在每次请求时读取目录。因此,通过 rsync 或 cron 作业写入的文件,在扫描完成前可能不会显示在界面中,并出现 sudo -u www-data php occ files:scan --all。文件管理器会在加载页面时列出目录,因此不存在这个时间差。

将 Nextcloud 用于它擅长的功能:日历、联系人、同步,以及与需要桌面客户端的用户共享文件。在 VPS 上使用 Docker、TLS 和备份部署 Nextcloud介绍了这种配置。如果您已经在运行 Nextcloud,只需要查看现有目录,则启用 External Storage 应用即可,不要再做其他配置。向同一磁盘写入的第二个 Web 应用意味着又增加了一项需要修补的软件。

如何运行而不暴露整台服务器

绝不要将其指向 /。该进程可以读写其用户账户能够访问的所有内容,因此会话令牌被窃取后,攻击者获得的正是同等范围的文件系统访问权限。只提供一个目录,即 /srv/files,并专门为此创建该目录。

使用非 root 用户运行,并且只挂载它需要提供的内容。在 Compose 中,这意味着使用 user: "1000:1000",并为每个目录添加一个绑定挂载;对于它绝不需要写入的内容,使用 :ro

    volumes:
      - /srv/files:/folder
      - /srv/media:/media:ro

通常,这项修改会使目录浏览正常工作,但上传因 permission denied 而失败,因为容器内的用户 ID 不拥有容器外的目录。比较以下两项:docker exec filebrowser id 输出容器用户,ls -ln /srv/files 输出主机上的数字所有者。使用 sudo chown -R 1000:1000 /srv/files 修复。这与 Docker 镜像中的 PUID 和 PGID 要解决的是同一个所有权问题。

将发布的端口绑定到 localhost,即 127.0.0.1:8080:80,而不是 8080:80。Docker 会在 ufw 的规则之前写入自己的 netfilter 规则,因此即使 ufw deny 8080 处于启用状态,直接发布的端口仍可从互联网访问。前面放置反向代理以提供 TLS。使用普通 HTTP 时,会话 Cookie 会以明文形式在网络中传输,而该 Cookie 就等同于文件系统访问权限。如果您还不熟悉 Compose,VPS 上的 Docker Compose介绍了这些示例所假定的文件布局。

当应用自身的认证功能不够完善时,添加一层认证。对于单用户实例,在代理处启用 HTTP 基本认证即可。当涉及多名用户时,使用 OIDC,或通过身份提供商执行 forward auth,这样撤销某个账户后,可在所有位置撤销其访问权限。

关闭额外功能。任何提供 shell、命令运行器或浏览器内终端的文件管理器,实际上都在向持有有效会话的用户提供远程代码执行能力。FileBrowser 自己的指导建议保持命令运行器禁用,而 Cloud Commander 的示例配置会启用控制台。应有意决定是否启用,不要使用默认设置。

哪些问题会先出现,以及您将看到的错误

listen tcp :80: bind: permission denied Linux 将 1024 以下的端口保留给特权进程。FileBrowser Quantum 的文档配置使用端口 80,这在容器内没有问题,但二进制文件以非特权用户身份在主机上运行时会立即失败。在 config.yaml 中设置一个高于 1024 的端口,并让代理占用 443。

浏览正常,但上传失败。 列出目录需要 r-x,向目录写入则需要 w。Web 界面只会报告通用错误,因此应先检查文件系统,而不是先查看应用日志。

413 Request Entity Too Large 此错误来自 nginx,而不是文件管理器。默认的 client_max_body_size 为 1 MB,因此更大的上传会在代理层被拒绝,应用根本看不到请求。在 server 块中设置 client_max_body_size 4096m;,或者设置 0 以禁用检查。

上传的文件所属组不正确。 新文件归进程用户所有,与上级目录的设置无关,这会导致第二个服务无法读取同一目录树。为两个服务分配一个共享组,并使用 sudo chmod g+s /srv/files 为目录设置 setgid 位,使新文件继承目录的所属组。

直接访问端口时一切正常,但通过代理访问时失败。 应用在子路径下提供服务时,会根据必须显式配置的前缀生成链接。Cloud Commander 提供 --prefix 用于此目的。如果应用没有此类选项,请为应用分配独立的子域名,并代理根路径。

应运行哪种自托管文件管理器?

  • 只有一台 VPS、一个或两个目录,需要带过期时间的共享链接,之后可能还要接入 SSO:FileBrowser Quantum。
  • 文件位于其他位置,例如 S3 存储桶、SFTP 主机或通过 SMB 连接的 NAS,并且希望在一个 Web 界面中访问这些位置:Filestash,但需注意免费版的限制。
  • 其他用户需要账户、配额,以及通过 SFTP 或 FTPS 上传文件:SFTPGo。此时应将 Web 客户端视为实用的附加功能,而不是选择它的主要原因。
  • 需要带编辑器和终端的个人工具,通过 SSH 隧道访问,且绝不公开发布:Cloud Commander。
  • 已在运行 Nextcloud,并且有一个需要公开访问的现有目录:使用 External Storage 应用,完全不需要安装新软件。

无论选择哪种软件,部署方式都比具体选择更重要。使用一个目录、一个非 root 用户,将端口绑定到 localhost,并在前面配置身份验证。按这种方式配置的文件管理器只是便利工具。如果让同一软件指向 /,并使用共享密码,它就会变成一个带有友好界面的远程 shell。

FAQ

FileBrowser 在 2026 年是否仍可安全运行?

上游 filebrowser/filebrowser README 声明,File Browser 将于 2026-09-01 归档,此后不再发布新版本,也不再修复 bug 或安全问题。该代码仍可运行,但对文件系统具有写入权限且未打补丁的软件,风险会随着时间增加。如果继续使用,请遵循项目自身的建议:不要直接暴露到互联网;使用反向代理处理 TLS 和独立身份验证;保持禁用命令运行器;使用非特权容器,并且只挂载实际提供服务的目录。还要注意,其会话使用自包含的 JWT,而不是服务器端标识符,因此无法撤销;更改密码也不会使已签发的令牌失效。对于新安装,请使用 FileBrowser Quantum fork,其发布镜像为 gtstef/filebrowser,该项目仍在持续开发。

自托管文件管理器可以使用现有的 SSO 吗?

FileBrowser Quantum 支持 OIDC、LDAP 和代理请求头模式,因此可以置于现有身份提供商之后,无需维护第二份用户列表。SFTPGo 的 OpenID Connect 集成包含在开源构建中,可将身份提供商中的用户映射为 SFTPGo 管理员和用户,供 WebAdmin 和 WebClient 界面使用。需要特别关注 Filestash:截至 2026 年 8 月,其定价页面将 SSO(SAML、OIDC 和 LDAP)列在每月 $50 起的付费自托管层级中;免费层级标注为 AGPL v3,最多支持 3 个用户。如果应用完全不支持 SSO,可在反向代理处使用转发身份验证作为后备方案。这样可以保护登录页面,但不会改变应用内部的权限控制。

哪些软件可以生成会过期的共享链接?

SFTPGo 的实现最完整。用户可以从 WebClient 创建 HTTP/S 链接,并限制下载和上传次数、设置密码、按源 IP 地址限制访问,以及设置自动过期日期。FileBrowser Quantum 支持设置过期时间的共享链接,访问方式可以是匿名访问,也可以限制为指定用户;每个共享链接还可单独设置查看、编辑和上传权限。Filestash 也提供共享功能,而且这是唯一一种服务器会持久保存存储凭据加密副本的情况,因为浏览器会话结束后,该链接仍需继续工作。Cloud Commander 完全不支持共享链接。

如果只有我一个用户,将文件管理器指向 / 是否安全?

不安全,风险并不取决于你是否信任自己。该进程拥有其用户账户可访问的全部内容的读写权限。因此,任何能够进入该会话的路径、被窃取的 cookie、上传处理程序中未修复的 bug,或重复使用的密码,都可能进一步访问 /etc、你的 SSH 密钥以及每个服务的数据目录。应将挂载范围限制为一个目录:使用 /srv/files,而不是 /。Cloud Commander 受此影响最严重,因为其发布的 Docker 命令会将主机根目录挂载到 /mnt/fs,示例配置还会将 "root": "/" 设置为 "auth": false。在该容器监听 localhost 以外的任何地址之前,必须修改这两项。

#file-manager#filebrowser#sftpgo#自托管#存储