前言
Zotero 的同步服务是基于 Webdav 运行,默认端口为 80,由于这个端口通常会被占用,因此我们需要使用其他端口来部署。同时,在拥有 ipv6 公网 ip 的情况下,由于许多 Docker 在 bridge+ports 映射的模式下经常只能监听 ipv4 地址,而无法监听 ipv6 地址,因此我们使用自定义镜像的方法,将 Apache 的监听端口由 80 改为 20000,这样就可以在不开启 docker 全局 ipv6 服务的前提下,使得 Zotero 的同步服务支持 ipv6。
创建项目
首先选择一个位置创建 zotero_webdav 目录。在这个目录里创建 Dockerfile,内容填写
FROM bytemark/webdav
RUN sed -i 's/Listen 80/Listen 20000/g' /usr/local/apache2/conf/httpd.conf
然后手动 build 镜像,使用
sudo docker build -t zotero-webdav .
接下来创建 docker-compose.yml,以 host 模式运行,内容如下
services:
zotero:
image: zotero-webdav
container_name: zotero_webdav
restart: unless-stopped
network_mode: host
environment:
AUTH_TYPE: Basic
USERNAME: your_username
PASSWORD: your_password
volumes:
- /your_path/zotero:/var/lib/dav
挂载目录按需修改即可。
启动 docker
在自己的 NAS docker 服务中导入 compose 并且创建 zotero_webdav 服务,至此 docker 就创建完成了。接下来可以查看端口是否正确监听,以及开放防火墙对应端口并且设置端口转发。
在 Zotero 中,选择 Edit->Settings->Sync,找到 File Syncing,勾选 Sync attachment files in My Library using WebDAV,URL 选择 http,填写自己的 ip 或者 DDNS 的对应端口,以及 docker compose 中的用户名和密码即可。
第一次连接时,Zotero 会提示目录 does not exist. Do you want to create it now? 确认并继续即可,现在 Webdav 同步服务已经成功开启了。
配置 https
以上的步骤旨在配置 http 协议的 Zotero 同步服务,根据 Android 的限制,如果需要在 Android 设备上启用 Zotero Webdav 同步服务,则必须使用 https 协议。
在拥有托管到 Cloudflare 域名的情况下,我们可以使用 Cloudflare Tunnel 来利用子域名实现 https 服务。
首先进入 Cloudflare 控制台,创建 Tunnel,通过 Zero Trust → Networks → Tunnels → Create a tunnel 路径创建。
接下来在 NAS 中创建以下 cloudflared 的 docker
services:
cloudflared:
image: cloudflare/cloudflared:latest
container_name: cloudflared
restart: unless-stopped
network_mode: host
command: tunnel --no-autoupdate run --token YOUR_TOKEN
回到 Cloudflare Tunnel 页面,填写子域名为 zotero,域名则填写持有的域名,选择 HTTP,将 URL 改成
http://127.0.0.1:20000
此时登录浏览器,测试
https://zotero.your_domain/
如果能正常登录,则在 Zotero 中填写以下内容即可成功使用 https 同步
https://zotero.your_domain/zotero/

