自建轻量化网盘与 WebDAV:用 dufs 替代重量级方案
你是否想过在家庭服务器或 VPS 上搭一个网盘,却发现 Nextcloud 太重、ownCloud 太臃肿,而 Samba 又只能在内网用?本文介绍一个用 Rust 编写的极简文件服务器 dufs,它同时提供 Web 文件管理和 WebDAV 协议支持,一条命令即可启动,Docker 部署也只需几行配置。
为什么需要一个轻量化网盘
常见的文件共享需求其实很朴素:
- 手机想访问电脑上的某个文件
- 局域网内给同事传个大文件
- 在外面想远程访问家里的资料
- 给备份工具(Rclone、Restic)提供一个 WebDAV 目标
如果你用过 Nextcloud 或 ownCloud,大概会感受到:为了实现这些简单的需求,你得维护一套 LAMP/LEMP 环境、一个数据库、定期的安全更新——这还没算上 PHP 带来的性能开销。对于个人或小团队来说,这套方案过于沉重。
另一方面,python3 -m http.server 倒是轻量,但只能下载、不能上传,更别提搜索和权限控制了。
dufs 刚好填补了这个空白:一个 Rust 编写的单二进制文件服务器,同时提供 Web UI 和 WebDAV 协议,支持上传、搜索、权限控制,甚至可以用 curl 完成所有操作。
dufs 是什么
dufs 是一个用 Rust 编写的轻量级文件服务器,核心特性:
| 能力 | 说明 |
|---|---|
| 静态文件服务 | 浏览器直接查看和下载文件 |
| 文件上传 | 拖拽上传文件和文件夹 |
| 文件管理 | 在线创建、编辑、搜索、删除 |
| 目录打包下载 | 整个文件夹下载为 ZIP |
| 断点续传 | 支持大文件的分块上传/下载 |
| 权限控制 | 基于账号的路径级读写权限 |
| WebDAV 协议 | 可作为网络磁盘挂载 |
| HTTPS | 内置 TLS 证书支持 |
| curl 友好 | 所有操作均可通过 curl 完成 |
| 健康检查 | 内置 /__dufs__/health 端点 |
一个二进制、零依赖、默认端口 5000,dufs 一条命令即可启动。
WebDAV:被低估的协议
WebDAV(Web Distributed Authoring and Versioning)是 HTTP 的扩展协议,在标准 HTTP 方法(GET、PUT、DELETE)基础上增加了 PROPFIND、MKCOL、COPY、MOVE 等方法,使得客户端可以像操作本地文件系统一样操作远程文件。
为什么 WebDAV 重要
- 系统级挂载:Windows、macOS、Linux 原生支持将 WebDAV 映射为网络驱动器,文件管理器直接访问
- 应用生态丰富:大量笔记软件(Joplin)、备份工具(Rclone、Restic、Duplicati)、同步工具原生支持 WebDAV
- 跨平台:不依赖特定客户端,任何支持 WebDAV 的软件都能对接
- HTTP 基础:走标准 HTTP/HTTPS 端口,穿透防火墙和代理天然友好
各平台 WebDAV 客户端
| 平台 | 客户端 | 说明 |
|---|---|---|
| Windows | 资源管理器(原生) | 映射网络驱动器,但有 50MB 默认文件大小限制 |
| Windows | RaiDrive(免费) | 体验最好,支持 WebDAV/SFTP/FTP,像本地磁盘一样使用 |
| Windows | ExpanDrive / NetDrive | 商业软件,稳定性更好 |
| macOS | Finder(原生) | 「连接服务器」输入地址即可,但大文件和重连体验一般 |
| macOS | ExpanDrive / NetDrive | 使用 File Provider API,更稳定 |
| Linux | davfs2 | mount -t davfs 挂载,但项目已不太活跃 |
| Linux | RaiDrive CLI | 支持 Debian/RHEL/Alpine 等发行版 |
| 移动端 | 各平台 WebDAV App | iOS/Android 均有大量 WebDAV 客户端 |
💡 Windows 原生 WebDAV 的坑:默认 50MB 文件大小限制需要改注册表(
FileSizeLimitInBytes),且使用 HTTPS 时证书验证较严格。推荐用 RaiDrive 替代。
权限控制与鉴权
dufs 的权限模型设计得简洁但够用,核心是 账号 + 路径 + 权限 三元组:
鉴权方式
dufs 同时支持 Basic Auth 和 Digest Auth,默认使用 Digest Auth(更安全,密码不在网络中明文传输)。
# Digest Auth(默认)
curl --user admin:pass123 --digest http://your-server:5000/
# Basic Auth
curl --user admin:pass123 http://your-server:5000/
权限规则格式
-a "用户名:密码@/路径:权限"
:rw表示读写权限,不加则只读@/前面不写用户名密码表示匿名用户- 多条规则用
|分隔
实际场景示例
# 管理员:完全读写权限
-a "admin:secretpass@/:rw"
# 普通用户:只能读写 /share 目录
-a "user:userpass@/share:rw"
# 匿名用户:只读访问 /public 目录
-a "@/public"
# 组合:管理员全权 + 匿名只读
-a "admin:secretpass@/:rw|@/"
重要细节
账号权限受全局权限约束。如果 dufs 启动时没有开启 --allow-upload,即使账号被授予 :rw 权限,也无法上传。这意味着你可以用全局开关做硬性限制,用账号权限做细粒度控制。
dufs 还支持 哈希密码,避免在命令行或配置文件中暴露明文密码,对生产环境更友好。
和其他方案对比
| 特性 | dufs | Filebrowser | Nextcloud | Samba |
|---|---|---|---|---|
| 部署复杂度 | 一条命令 | Docker / 二进制 | LAMP + DB | 系统级安装 |
| 内存占用 | ~10MB | ~30MB | 512MB+ | ~50MB |
| Web UI | 简洁 | 完整 | 功能丰富 | 无 |
| WebDAV | 原生支持 | 不支持 | 支持 | 不支持 |
| 权限控制 | 路径级 | 用户级 | 完整 ACL | 系统用户级 |
| 文件编辑 | 在线编辑 | 在线编辑 | 在线编辑 + 协作 | 无 |
| 搜索 | 内置 | 内置 | 全文搜索 | 无 |
| 外网访问 | HTTP 直接 | 反代 | 反代 | 需 VPN |
| 适用场景 | 轻量共享 + WebDAV | 纯 Web 文件管理 | 团队协作 | 内网共享 |
选择建议:
- 需要团队协作、日历、联系人 → Nextcloud
- 只需要 Web 文件管理界面 → Filebrowser(本站也有部署教程)
- 需要轻量 + WebDAV + 文件管理 → dufs
- 纯内网共享、不需要外网访问 → Samba
我的用法
我的典型使用场景:
- 网盘替代:浏览器访问 dufs 的 Web UI 上传下载文件,手机和电脑通用
- WebDAV 挂载:Windows 上用 RaiDrive 把 dufs 挂载为本地磁盘,像操作本地文件一样操作远程文件
- 备份目标:Rclone 定期备份重要数据到 dufs 的 WebDAV 端口
- 临时共享:需要给同事传文件时,丢到 dufs 的共享目录,给个链接即可
具体部署方式见教程:Dufs 部署
总结
dufs 用最简单的方式覆盖了个人网盘的核心需求:文件管理 + WebDAV + 权限控制。对于不需要 Nextcloud 那种全家桶功能的用户来说,dufs 是一个非常优雅的选择——Rust 带来的低资源占用和单二进制部署,让维护成本几乎为零。
如果你的需求更复杂(多人协作、在线编辑、插件生态),Nextcloud 依然是更好的选择。但对于「我就是想简单存取文件、挂个网盘、做个备份目标」这个场景,dufs 值得一试。