WebDAV 是一种基于 HTTP 的文件共享协议,最初被设计用于多用户文档协作编辑的场景,也被广泛应用在基于互联网的文件存储、数据同步等网盘类应用场景。
手机端和 PC 端有大量的应用内置了对 WebDAV 的支持,比如知名的文献管理工具 Zotero、iPad 上流行的笔记工具 Notability、国产办公软件 WPS、跨平台 Markdown 笔记工具 Joplin、ES 文件管理器等等,这就意味着,只要拥有自己的 WebDAV 存储,就可以使用 WebDAV 来保存我们在这些软件上产生的文档数据。
为了避免混淆,有必要先厘清 WebDAV 相关的概念,如下图所示,WebDAV 分为服务器和客户端两个部分:
- WebDAV 服务器:蓝色云朵代表 WebDAV 服务器,用来响应客户端的连接和读写请求,存储数据。
- WebDAV 客户端:各种内置了 WebDAV 客户端的程序,运行在手机、平板或电脑中。
明白了 WebDAV 的架构组成,我们要做的就是配置一套属于自己的 WebDAV 服务器了,其实我们也可以把它叫做 WebDAV 共享,总之,我们要做的就是架构图中“蓝色云朵”的部分。
在过去,配置 WebDAV 共享通常要使用 Apache HTTP 服务或 Nginx 等 Web 服务器软件,由于不是开箱即用,需要额外加载或手动编译 WebDAV 模块,这在一定程度上增加了配置 WebDAV 的复杂度。
虽然一些 NAS 操作系统也会提供 WebDAV 共享配置功能,但受限于内网环境,配置的 WebDAV 共享难以发挥它基于互联网提供服务的优势。
如果你目前正在寻找更通用、更有效、更简单的 WebDAV 共享服务配置方案,JuiceFS 也许是你值得尝试的一种方案。
JuiceFS 是面向云的开源分布式文件系统,依托于对象存储和数据库,可以快速搭建一个具有弹性容量的高性能存储系统。JuiceFS 提供 POSIX、S3 API、HDFS API、Kubernetes CSI 驱动、Docker Volume Plugin、WebDAV 等丰富的访问接口,可以轻松接入各种应用。
接下来就为大家分享如何使用 JuiceFS 简单、快速的配置一个兼具空间弹性、安全性和实用性的 WebDAV 服务。
准备工作
本文介绍的 WebDAV 共享是 JuiceFS 提供的一种访问接口,是建立在 JuiceFS 文件系统之上的。因此在配置之前,需要先创建一个 JuiceFS 文件系统。
JuiceFS 文件系统由数据存储和元数据引擎两部分组成,其中,数据存储可以是各种云计算平台提供的对象存储服务,也可以是自建的 MinIO 或本地磁盘。元数据引擎用来存储文件的元数据信息,可以使用 Redis、MySQL、PostgreSQL 等基于网络的数据库,也可以使用 SQLite 或 BadgerDB 这种单机数据库。
为了让 WebDAV 共享能够通过互联网访问,接下来我们会在一台拥有固定公网 IPv4 地址的云服务器上进行创建。因为 WebDAV 是一处创建,即可通过 IP 地址或域名实现处处访问。因此,组成 JuiceFS 的数据存储和元数据引擎可以更加灵活的搭配,比如:
- 本地磁盘 + 单机数据库:当云服务器的本地磁盘可用空间足够时。
- 对象存储 + 单机数据库:需要更大容量存储空间时。
- 对象存储 + 网络数据库:既需要更大的存储空间,又有其他主机需要同时访问 JuiceFS 时。
云服务器
假设我们拥有一台配置如下的云服务:
- 系统:Ubuntu Server 22.04 AMD64
- CPU:1 核
- 内存:1 GB
- 硬盘:25 GB
- IP 地址:120.118.8.10(此为演示目的随机编写的 FAKE IP)
对于本文介绍的场景,任意一个云平台的入门级的云服务器即可满足需要,重点在于要有公网 IPv4 地址。
对象存储
假设我们准备了以下 Bucket:
- 存储类型:阿里云 OSS
- Bucket URL: https://myjfs.oss-cn-shanghai...
- Access Key: abcdefg
- Secret Key: gfedcba
对于本文介绍的场景,对象存储并不是必须的,如果云服务器的硬盘空间足够,完全可以使用硬盘作为 JuiceFS 的对象存储来使用。
数据库
对于本文介绍的场景,单机版数据库是最为简单易行的选择,这里我们使用单文件 SQLite 数据库。无需提前准备,在创建 JuiceFS 文件系统时会自动生成。
如果有需要,你也可以参照文档《如何设置元数据引擎》使用其他类型的数据库。
创建 JuiceFS 文件系统
安装客户端
curl -sSL https://d.juicefs.com/install | sh -
- 创建文件系统
以下是创建文件系统的两种方式,根据实际需要任选一种即可:
方式一:使用本地硬盘作为对象存储
juicefs format sqlite3://myjfs.db myjfs
方式二:使用对象存储服务(数据存储在对象存储)
juicefs format --storage oss \
--bucket https://myjfs.oss-cn-shanghai.aliyuncs.com \
--access-key abcdefg \
--secret-key gfedcba \
sqlite3://myjfs.db myjfs
部署 WebDAV 服务
准备好 JuiceFS 文件系统就可以开始配置 WebDAV 共享了,最简单的方式是不做任何设置,直接将 JuiceFS 存储以 WebDAV 接口形式开放出去。
sudo juicefs webdav sqlite3://myjfs.db 120.118.8.10:80
使用任何内置 WebDAV 客户端的软件访问 http://120.118.8.10 即可连接访问。
虽然很方便,但不难看出这种匿名访问的方式存在极大的安全隐患,首先,没有身份认证使得任何知道这个 IP 地址的人都可以直接通过 WebDAV 客户端读写我们的文件;其次,使用未加密的 HTTP 协议,通信过程很容易被窃听和攻击。我们非常有必要完善这两方面的缺陷,其实也很简单,解决第一个问题只需要为 WebDAV 设置身份认证,第二个问题只需要配置 SSL 证书启用 HTTPS 加密连接支持。
设置身份认证
JuiceFS v1.1(截至本文发表,此版本还未正式发布)及以上版本开始支持 WebDAV 身份认证和 SSL 证书功能,设置之前请先确认你的客户端版本,建议参考《手动编译 JuiceFS 客户端》自行编译 GitHub 仓库的 main 分支。
为 WebDAV 设置访问的用户名和密码非常简单,只需设置相应的环境变量即可:
export WEBDAV_USER=user
export WEBDAV_PASSWORD=mypassword
SSL 证书
为 WebDAV 启用 HTTPS 加密连接需要使用 SSL 证书,既可以使用 CA 机构签发的受信任的证书,也可以使用 OpenSSL 签发自签名证书。
CA 机构通常只为域名签发证书,因此你需要拥有域名并绑定到服务器 IP,免费证书签发工具有 certbot、acme.sh 等,使用这些工具向即可申请免费的 SSL 证书。
通过第三方 CA 证书机构申请签发证书是另外一个话题,这里简单起见,使用自签名证书来实现这个功能。
生成服务器私钥
openssl genrsa -out private.key 4096
- 生成证书签名请求(CSR)
这一步需要交互式的提供一系列信息。
openssl req -new -key private.key -out client.csr
- 使用 CSR 签发证书
openssl x509 -req -days 365 -in client.csr -signkey private.key -out client.crt
执行清理
rm client.csr
经过上述几个步骤,在当前目录中就有了 private.key 和 client.crt 这两个文件,接下来用它们运行 WebDAV 服务。
正式运行 WeDAV 服务
现在就可以结合上面的内容,运行带有基本身份认证功能,且具有 HTTPS 加密连接的 WebDAV 服务:
export WEBDAV_USER=user
export WEBDAV_PASSWORD=mypassword
sudo juicefs webdav --cert-file ./client.crt --key-file ./private.key sqlite3://myjfs.db 120.118.8.10:443
此时我们已经启用了 HTTPS 加密连接,在访问 WebDAV 时也要改用带有 https 的地址 https://120.118.8.10
,同时,需要输入用户名和密码才能成功连接。
另外,由于这里使用的是自签名证书,在访问时一些客户端可能会发出证书不可信的警告,忽略即可。
如果你已经为服务器绑定了域名,并且已经申请到了 SSL 证书,部署 WebDAV 的命令则应该做如下调整:
export WEBDAV_USER=user
export WEBDAV_PASSWORD=mypassword
sudo juicefs webdav --cert-file ./your-domain.crt --key-file ./your-domain.key sqlite3://myjfs.db www.your-domain.com:443
相应地,访问地址应也应该改成你的域名,例如:https://www.your-domain.com 。使用 CA 机构签发的证书,各种 WebDAV 客户端访问则不会发出警告,可以有效解决部分应用无法连接 WebDAV 服务的问题。
应用示例
以 ES 文件浏览器、Joplin 为例介绍如何配置使用自建的 WebDAV 服务同步文档数据。
注意:在某些应用中设置 WebDAV 时,如果确认地址和身份认证信息输入无误的情况下,程序仍然报告无法连接 WebDAV,这可能是因为程序不支持自签名证书,可以通过改用 CA 机构签发的可信证书来配置 WebDAV 服务来解决该问题。
ES 文件浏览器
ES 文件浏览器是移动端常用的第三方文件管理器,除了能够管理手机中的文件,还支持添加很多第三方的存储服务,其中就包括 WebDAV 存储。
只需在服务菜单中新增 WebDAV 类型的存储,参照下图填写地址、用户名和密码即可。
Joplin
Joplin 是开源的 Markdown 笔记软件,支持使用 WebDAV 同步文档。只需在同步设置中输入 WebDAV 的链接、用户名和密码即可。
需要注意的是,这里我们使用的是自签名证书,检查同步配置时 Joplin 会因此而报错。解决方法是展开高级选项,勾选“忽略 TLS 证书错误“,应用设置在尝试检查即可通过验证。
写在最后
与 FTP 类似,WebDAV 也是相对比较古老的文件共享协议,但它们至今仍被广泛的应用。信息技术领域永远没有最好的工具,只有最合适的工具。从功能上来说,WebDAV 可能没有专用的网盘客户端来的功能丰富,但 WebDAV 协议更通用和开放,可以直接在大量内置支持的应用程序上使用,不但可以保护自己的隐私,还能避免被特定的平台捆绑。
WebDAV 只是 JuiceFS 支持的众多访问接口中的一种,大家有兴趣可以进一步探索其他访问接口,比如以本地磁盘形式访问的 POSIX,以 S3 API 形式访问的 S3 网关,以及容器化访问方式的 Docker Volume Plugin、Kubernetes CSI 驱动等等。灵活搭配使用这些访问方式,可实现更加高效、灵活的云存储管理能力,相关的内容我们会在后续的文章中为大家做更多的分享。
如有帮助的话欢迎关注我们项目 Juicedata/JuiceFS 哟! (0ᴗ0✿)