如何使用 JuiceFS 创建 WebDAV 共享?

2023-01-13
Herald Yu

WebDAV 是一种基于 HTTP 的文件共享协议,最初被设计用于多用户文档协作编辑的场景,也被广泛应用在基于互联网的文件存储、数据同步等网盘类应用场景。

手机端和 PC 端有大量的应用内置了对 WebDAV 的支持,比如知名的文献管理工具 Zotero、iPad 上流行的笔记工具 Notability、国产办公软件 WPS、跨平台 Markdown 笔记工具 Joplin、ES 文件管理器等等,这就意味着,只要拥有自己的 WebDAV 存储,就可以使用 WebDAV 来保存我们在这些软件上产生的文档数据。

为了避免混淆,有必要先厘清 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 的数据存储和元数据引擎可以更加灵活的搭配,比如:

  1. 本地磁盘 + 单机数据库:当云服务器的本地磁盘可用空间足够时。
  2. 对象存储 + 单机数据库:需要更大容量存储空间时。
  3. 对象存储 + 网络数据库:既需要更大的存储空间,又有其他主机需要同时访问 JuiceFS 时。

云服务器

假设我们拥有一台配置如下的云服务:

  • 系统:Ubuntu Server 22.04 AMD64
  • CPU:1 核
  • 内存:1 GB
  • 硬盘:25 GB
  • IP 地址:120.118.8.10(此为演示目的随机编写的 FAKE IP

对于本文介绍的场景,任意一个云平台的入门级的云服务器即可满足需要,重点在于要有公网 IPv4 地址。

对象存储

假设我们准备了以下 Bucket:

对于本文介绍的场景,对象存储并不是必须的,如果云服务器的硬盘空间足够,完全可以使用硬盘作为 JuiceFS 的对象存储来使用。

数据库

对于本文介绍的场景,单机版数据库是最为简单易行的选择,这里我们使用单文件 SQLite 数据库。无需提前准备,在创建 JuiceFS 文件系统时会自动生成。

如果有需要,你也可以参照文档《如何设置元数据引擎》使用其他类型的数据库。

创建 JuiceFS 文件系统

1. 安装客户端

curl -sSL https://d.juicefs.com/install | sh -

2. 创建文件系统

以下是创建文件系统的两种方式,根据实际需要任选一种即可:

方式一:使用本地硬盘作为对象存储

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 证书机构申请签发证书是另外一个话题,这里简单起见,使用自签名证书来实现这个功能。

1. 生成服务器私钥

openssl genrsa -out private.key 4096

2. 生成证书签名请求(CSR)

这一步需要交互式的提供一系列信息。

openssl req -new -key private.key -out client.csr

3. 使用 CSR 签发证书

openssl x509 -req -days 365 -in client.csr -signkey private.key -out client.crt

4. 执行清理

rm client.csr

经过上述几个步骤,在当前目录中就有了 private.keyclient.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 类型的存储,参照下图填写地址、用户名和密码即可。

ES 文件管理器 WebDAV 设置
ES 文件管理器 WebDAV 设置

Joplin

Joplin 是开源的 Markdown 笔记软件,支持使用 WebDAV 同步文档。只需在同步设置中输入 WebDAV 的链接、用户名和密码即可。

需要注意的是,这里我们使用的是自签名证书,检查同步配置时 Joplin 会因此而报错。解决方法是展开高级选项,勾选“忽略 TLS 证书错误“,应用设置在尝试检查即可通过验证。

Joplin webdav 同步设置
Joplin webdav 同步设置

写在最后

与 FTP 类似,WebDAV 也是相对比较古老的文件共享协议,但它们至今仍被广泛的应用。信息技术领域永远没有最好的工具,只有最合适的工具。从功能上来说,WebDAV 可能没有专用的网盘客户端来的功能丰富,但 WebDAV 协议更通用和开放,可以直接在大量内置支持的应用程序上使用,不但可以保护自己的隐私,还能避免被特定的平台捆绑。

WebDAV 只是 JuiceFS 支持的众多访问接口中的一种,大家有兴趣可以进一步探索其他访问接口,比如以本地磁盘形式访问的 POSIX,以 S3 API 形式访问的 S3 网关,以及容器化访问方式的 Docker Volume Plugin、Kubernetes CSI 驱动等等。灵活搭配使用这些访问方式,可实现更加高效、灵活的云存储管理能力,相关的内容我们会在后续的文章中为大家做更多的分享。

相关博客

JuiceFS v1.0 Beta2 发布|进一步提升稳定性

2022-03-10 Juicedata
这是 JuiceFS v1.0 正式发布前的第二个 beta 版本,共有 16 位社区伙伴贡献了 150+ 次提交 🎉。本次更新以 Bug 修复和稳定性提升为主,辅以大量的文档更新和测试用例优化。