如何使用 JuiceFS 创建 WebDAV 共享
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.aliyuncs.com
 - 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✿)
如何使用 JuiceFS 创建 WebDAV 共享的更多相关文章
- 事件日志ID 2511:服务器服务无法重新创建 <sharename> 共享关系,因为 <address> 目录已不再存在
		
服务器服务无法重新创建 QQMusicDownload 共享关系,因为 D:\QQMusic\QQMusicDownload 目录已不再存在.请运行 "net share QQMusicDo ...
 - Suse 创建NFS共享目录
		
Suse 创建NFS共享目录 服务端的配置: 1.编辑nfs服务的配置文件 /software/suse11 *(rw,sync,no_root_squash,no_all_squash) 凝视: / ...
 - FreeNAS:创建 CIFS 共享(权限)
		
第一部分:新建账户与指定数据集权限 简单起见,本教程主要介绍带基本身份验证的 CIFS 共享,即只有输入正确的用户名和密码才可以访问共享目录.关于创建匿名共享.多用户权限管理以及域控制器相关内容,我们 ...
 - 【Excle数据透视表】如何创建非共享缓存的数据透视表
		
一般情况下,利用同一个数据源创建多个数据表时,默认创建的是共享缓存的数据透视表.刷新一个数据透视表时会影响其他数据透视表的展示结果. 解决方案 创建非共享缓存的多个数据透视表 步骤一 单击工作表数据任 ...
 - VMware 虚拟机添加硬盘以及为新添加的硬盘创建Samba共享 (转)
		
一.为VMware虚拟机添加硬盘 1. 首先在VMware虚拟机的VM->Setting子菜单中为虚拟机添加一块15G大小的SCSI类型的硬盘(注意:如果原来为IDE硬盘,SCSI类型的硬盘可能 ...
 - 通过udev创建ASM共享磁盘(RAC)
		
OS:RedHat EL6.0 Oracle: Oracle 11gR2 在Oracle 11gR2,构建RAC时可以通过ASM创建asm disk,但是需要安装asmlib相关软件:对于RedH ...
 - 转://通过udev创建ASM共享磁盘(RAC)
		
OS:RedHat EL6.0 Oracle: Oracle 11gR2 在Oracle 11gR2,构建RAC时可以通过ASM创建asm disk,但是需要安装asmlib相关软件:对于RedH ...
 - python 进程创建和共享内容的方法
		
1.使用Pool来创建进程 from multiprocessing import Pool def f(n): return n*n if __name__=="__main__" ...
 - Kubernetes创建挂载共享存储的容器
		
原文链接:https://www.58jb.com/html/135.html 在上一次的Mysql容器中,已经使用过了配置宿主机目录挂载的方式,这样虽然方便但是不够安全:一般都是把数据存储在远程服务 ...
 - win7创建webdav
		
环境 win7+iis 构筑条件 存放路径:c:\Data 访问方式:192.168.x.xxx/webdav 用户名:yx 密码:yx 搭建顺序 1.添加iis.启动->控制面板->程序 ...
 
随机推荐
- 什么是ForkJoin?看这一篇就能掌握!
			
摘要:ForkJoin是由JDK1.7之后提供的多线程并发处理框架. 本文分享自华为云社区<[高并发]什么是ForkJoin?看这一篇就够了!>,作者: 冰 河. 在JDK中,提供了这样一 ...
 - 【题解】CF1714F Build a Tree and That Is It
			
题面传送门 解决思路 题目中虽然说是无根树,但我们可以钦定这棵树的根为节点 \(1\),方便构造,这是不 影响结果的. 以下记给定的三段长度为 \(a,b,c\). 先考虑无解的情况. 首先,给出的三 ...
 - C#自定义控件开发(1)
			
自定义控件可以用组件或者用户控件来开发,如果是基于基础控件,进行一些扩展,那么可以使用组件,其它的情况可以使用用户控件. 首先新建一个类库项目,然后添加一个组件,取名为ButtonExtend,再添加 ...
 - hwlog----types.go
			
// Copyright(C) 2021. Huawei Technologies Co.,Ltd. All rights reserved.// Package hwlog provides the ...
 - 视觉享受,兼顾人文观感和几何特征的字体「GitHub 热点速览 v.22.46」
			
GitHub 上开源的字体不在少数,但是支持汉字以及其他非英文语言的字体少之又少,记得上一个字体还是 霞鹜文楷,本周 B 站知名设计 UP 主开源了的得意黑体在人文观感和几何特征之间找到了美的平衡. ...
 - java.util.Date和java.util.Calendar
			
Date date = new Date();//分配初始化一个Date()对象 Calendar cal = Calendar.getInstance();//获取一个基于当前时间的日历 int d ...
 - combotree 的简单使用
			
一.前端 combotree HTML: <input id="201711281652407353448711985811" class="easyUI-comb ...
 - 【数据库】Postgresql/PG-编写函数实现字段对应加备注
			
〇.资料链接 一.背景 构建分区表时,删除了表的字段备注信息 1.查询语句 select c.relname 表名, cast ( obj_description (relfilenode, 'pg_ ...
 - .NET 6 基于IDistributedCache实现Redis与MemoryCache的缓存帮助类
			
本文通过IDistributedCache的接口方法,实现Redis与MemoryCache统一帮助类.只需要在配置文件中简单的配置一下,就可以实现Redis与MemoryCache的切换. 目录 I ...
 - TCP\UDP协议 socket模块
			
目录 传输层主要协议 TCP协议 三次握手 TCP协议反馈机制 四次挥手 洪水攻击 UDP协议 socket模块 socket代码简介 socket.socket() server.bind() se ...