Linux下搭建WebDAV服务

jielahou大约 3 分钟

Zotero支持通过WebDAV进行同步,恰本人有多台设备,有同步的需求。想起来手头还有一些吃灰的机器,拿出来跑一下WebDAV好了。

查找了一些方案,有基于Apache、Nginx、Caddy的,也有单独一个二进制解决所有问题的。一直想玩玩Caddy但没时间,趁这段时间闲一些,折腾折腾得了。

下载二进制

进入官方下载页面,选择平台、架构后,搜索webdav插件并选中,此时Extra features会变成1。然后将其下载下来。

screenshot_20231125093708
screenshot_20231125093708

编写Caddyfile

我们需要一个配置文件来配置Caddy,这个文件对于Nginx来说是*.conf文件,对于Caddy来说就是Caddyfile。Caddyfile有自己的一套简洁清晰的格式。

为了提升使用体验,笔者提前准备了一个域名,并配了A/AAAA记录到服务器。这是因为Caddy可以帮我们自动申请SSL证书而无需任何手动配置,唯一要求就是咱们得提前把域名绑好。

Caddyfile格式速通

官方文档:Caddyfile Concepts — Caddy Documentation (caddyserver.com)open in new window

相关信息

如果想直接看写好的Caddyfile,请转到2.2节

Caddyfile structure
Caddyfile structure

我们只需关心Site block即可。Site block的基本格式为:

域名 {
  #...
}

由上图可知,Site block的内部可以包含Matcher DefinitionDirectives(指令),这里我们只关心Directives即可。

Directives是指定站点工作方式的功能性关键词,其后可以跟随参数。

Directives也可以有自己的子块(例如上面大蓝框里面的reverse_proxy),但一般情况下Directives子块里面不能再套Directives子块。

对于HTTP handler(处理HTTP请求)相关的Directives来说,这些Directives会打一套“组合拳”,而这一套组合拳是有顺序的。咱们写的Directives的处理顺序(例如上面图中先写了reverse_proxy,再写了file_server)和实际的处理顺序未必完全一致(除了在routehandlehandle_path等特殊块中)。Caddy默认是有一套顺序规则的,但由于webdav是第三方插件而不是官方插件,所以我们要手动指定webdavHTTP handler中的顺序。

生成密码

我们使用Caddy的basicauth模块来实现 有账户密码才能访问WebDAV 的功能。

basicauth模块要求我们提供 经过bcrypt加密后的密码,这里用python的bcrypt包来加密。假设密码明文为123456

import bcrypt
passwd="123456"
salt = bcrypt.gensalt(rounds=10)
hashed = bcrypt.hashpw(passwd.encode(), salt)
print(hashed)
# b'$2b$10$GdZwPjwlVpCaWP7KLpBhz.q1lTrUg6MytLARiyV5sr/xjxUwwbcOe'

print出来的结果$2b$10$GdZwPjwlVpCaWP7KLpBhz.q1lTrUg6MytLARiyV5sr/xjxUwwbcOe即为我们将填入配置的 加密后的密码。

编写Caddyfile

在第一步时,我们下载了二进制文件。现在,在这个二进制文件所在的目录下创建一个名为Caddyfile的文件,并写入配置。参考配置内容如下:

  • 假设我们的域名是abc.test.com
  • 假设我们要把/webdav目录拿来做WebDAV服务、存储WebDAV的文件
  • 假设我们要验证的用户名是hello,密码是123456
abc.test.com {
    root * /webdav
    route {
        basicauth {
            hello $2b$10$GdZwPjwlVpCaWP7KLpBhz.q1lTrUg6MytLARiyV5sr/xjxUwwbcOe
        }
        # 上文的密码为bcrypt加密后的密文而不是明文
        webdav
    }
}

对于Zotero:由于Zotero默认会使用zotero文件夹,所以,假设我们使用/webdav来提供WebDAV服务,我们最好提前创建好/webdav/zotero文件夹。

screenshot_20231125125557
screenshot_20231125125557

运行Caddy

先确认一下Caddy二进制所在的文件夹是不是有我们刚刚写好的Caddyfile

$ ls
Caddyfile  [Caddy二进制文件]
$ cat Caddyfile
abc.test.com {
    root * /webdav
    route {
        basicauth {
            hello $2b$10$GdZwPjwlVpCaWP7KLpBhz.q1lTrUg6MytLARiyV5sr/xjxUwwbcOe
        }
        webdav
    }
}

然后,直接运行二进制文件,传入参数run即可。

./[Caddy二进制文件] run

后记:在Zotero中添加同步

默认在顶栏编辑→首选项→同步是没有WebDAV选项的,必须先注册一个账户、登录了才有(即便是用自己的WebDAV而不是官方的服务)

接着填写域名、设置好的用户名、密码,Pass : )

screenshot_20231125130355
screenshot_20231125130355
Loading...