Zotero的同步分为两层,条目数据同步和附件文件同步。条目数据走官方服务器,免费同步,而附件同步则要么走官方的付费同步,要么使用WebDAV同步(Zotero官方不建议通过网盘同步数据库)。
官方的同步价格高昂,所以笔者选择WebDAV同步方式。但是,走WebDAV也并不是免费的。笔者曾使用坚果云进行免费同步,但是由于坚果云免费版每月只有1GB上传/3GB下载配额,笔者有时迁移数据库则显得不太够用。因此,笔者选择自建WebDAV服务用于Zotero文件同步。当然,具体服务端的配置则是使用了Hermes Agent辅助配置。
基本原理与条件
本方案主要是在自有服务器中,通过Apache开一个WebDAV客户端,然后让Zotero走Tailscale进行读写。
正式开始前需要准备:
- 一台安装了Docker的服务器(NAS、云服务器甚至旧电脑)
- 一个 Tailscale 账号,服务器上安装好 tailscale 并登录
- 需要同步的电脑上装好 Zotero
配置方法
开启 Tailscale HTTPS
Tailscale 能给你的机器发一个 Let’s Encrypt 证书,这样 Zotero 连上来是 https:// 加密的,不需要自己买域名、配证书。
- 打开 Tailscale Admin Console → DNS 页
- 打开 MagicDNS(让每台设备有
xxx.ts.net域名) - 打开 HTTPS Certificates(Tailscale 自动签发和续期证书)
做完后,在服务器上执行 tailscale status 能看到类似:
100.x.y.z my-server your-server linux -机器名就是你的子域名前缀。
创建目录和配置文件
在服务器上建目录(路径随意,以下用 ~/zotero-webdav):
mkdir -p ~/zotero-webdav-build ~/zotero-webdav~/zotero-webdav-build/ 放构建文件(Dockerfile + 配置),~/zotero-webdav/ 是数据目录。
写Dockerfile
文件 ~/zotero-webdav-build/Dockerfile:
# 官方 Apache httpd WebDAV 服务器(零第三方代码)FROM httpd:2.4-bookworm
# 启用 WebDAV 和认证所需的模块(官方镜像自带,默认注释掉)RUN sed -i '/^#LoadModule dav_module/s/^#//' conf/httpd.conf \ && sed -i '/^#LoadModule dav_fs_module/s/^#//' conf/httpd.conf \ && sed -i '/^#LoadModule auth_basic_module/s/^#//' conf/httpd.conf \ && sed -i '/^#LoadModule authn_file_module/s/^#//' conf/httpd.conf \ && sed -i '/^#LoadModule authz_core_module/s/^#//' conf/httpd.conf \ && sed -i '/^#LoadModule authz_user_module/s/^#//' conf/httpd.conf
# 挂入 WebDAV 站点配置COPY dav.conf conf/extra/dav.confRUN echo 'Include conf/extra/dav.conf' >> conf/httpd.conf
# 数据目录(docker run 时挂载宿主目录)RUN mkdir -p /var/lib/dav/data && chown -R www-data:www-data /var/lib/dav
EXPOSE 80/tcp写 dav.conf(Apache 的 WebDAV 站点配置)
文件 ~/zotero-webdav-build/dav.conf:
# WebDAV 配置:/dav/ -> /var/lib/dav/data/# 认证方式必须用 Basic(Zotero 7/8 的 Digest 认证会报 Permission Denied)DavLockDB /var/lib/dav/DavLock
# Alias 不带尾斜杠,同时匹配 /dav 和 /dav/Alias /dav /var/lib/dav/data/
<Directory /var/lib/dav/data/> Dav On Options Indexes AuthType Basic AuthName "Zotero WebDAV" AuthUserFile /usr/local/apache2/user.passwd Require valid-user</Directory>构建镜像
cd ~/zotero-webdav-build && docker build -t zotero-webdav:local .创建登录账号密码
WebDAV 需要账号密码(Basic 认证),用 Apache 的 htpasswd 工具生成:
# 密码文件必须先创建(Docker 挂载不存在的文件会当成目录挂载,很坑)touch ~/zotero-webdav.passwd
# 创建用户 zotero,密码换成你自己的docker run --rm -v ~/zotero-webdav.passwd:/usr/local/apache2/user.passwd \ httpd:2.4-bookworm htpasswd -B -b /usr/local/apache2/user.passwd zotero 你的密码-B 表示用 bcrypt 加密存储,安全。以后想加用户、改密码,都重复这条命令。
修正数据目录权限
容器里的 Apache 以 www-data(uid 33)运行,宿主机挂载的数据目录必须匹配,否则容器写不进去:
# 用容器内 root 执行 chown,避免 sudodocker run --rm -v ~/zotero-webdav:/var/lib/dav/data \ httpd:2.4-bookworm chown -R 33:33 /var/lib/dav/data启动容器
docker run -d --name zotero-webdav --restart unless-stopped \ -p 127.0.0.1:8080:80 \ -v ~/zotero-webdav:/var/lib/dav/data \ -v ~/zotero-webdav.passwd:/usr/local/apache2/user.passwd \ zotero-webdav:local说明:
-p 127.0.0.1:8080:80:只绑定本机回环端口 8080,不暴露到局域网/公网--restart unless-stopped:服务器重启后容器自动恢复- 两个
-v:数据目录 + 密码文件
验证容器在跑:
docker ps | grep zotero-webdavcurl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8080/dav/# 返回401用 Tailscale 暴露服务
服务器上执行:
tailscale serve --bg --https=8443 http://127.0.0.1:8080- 用
8443端口是因为默认的 443 可能被其他服务占用 - 这条命令让 Tailscale 把
https://你的机器名.tailnet.ts.net:8443/转发到本地 8080 的容器
查看状态:
tailscale serve status看到类似输出即成功:
https://my-server.tailXXXX.ts.net:8443 (tailnet only)|-- / proxy http://127.0.0.1:8080现在用浏览器访问 https://你的机器名.ts.net:8443/dav/,会弹出账号密码框,输入刚才的 zotero / 密码,能看到目录列表。
Zotero 客户端配置
在每一台需要同步的电脑上:
- 打开 Zotero → 设置(Preferences)→ 同步(Sync)
- 先登录 Zotero 账号
- 在”文件同步”区域,把同步方式从”Zotero 存储”改成 WebDAV
- 填入:
- URL:
https://你的机器名.tailnet.ts.net:8443/dav/ - 用户名:
zotero - 密码: 刚才设的密码
- URL:
- 点 Verify Server,通过即可。