跳到正文

基于 Docker 与 WebDAV 搭建 Zotero 私人同步云

4
2026-11-02

前言

作为一名技术书籍阅读者和笔记爱好者,Zotero 无疑是文献和书籍管理的利器。然而,官方免费账户仅提供 300MB 的附件存储空间。面对动辄几十上百 MB 的 PDF/EPUB 技术巨著,升级官方存储或者寻找第三方网盘都不够优雅。

最完美的方案,就是利用自己闲置的服务器,通过 WebDAV 协议搭建一个专属的附件同步服务。这样既能保证数据隐私,又能享受无上限的存储空间。

本文记录了在宝塔面板 + Docker 环境下,从零搭建 WebDAV 并最终升级为 HTTPS 加密域名访问的完整踩坑过程。

【环境准备】

  • 服务器:阿里云 ECS(Alibaba Cloud Linux 3)

  • 环境:Docker、Docker Compose、宝塔面板(已运行 Halo 博客、Gitea 等服务)

  • 域名:已备案域名(如 howier.top),并解析了一个子域名 zotero.howier.top 指向服务器公网 IP。

第一步:Docker 部署 Zotero WebDAV 服务

为了避免复杂的配置,我们采用专为 Zotero 设计的轻量级镜像 gzurowski/zotero-dav。

1. 解决网络问题

国内服务器直接拉取 Docker Hub 镜像大概率会超时。需要先配置镜像加速器,修改 /etc/docker/daemon.json:

{

  "registry-mirrors": [

    "https://docker.xuanyuan.me",

    "https://docker.1ms.run",

    "https://docker.m.daocloud.io"

  ]

}

重启 Docker:sudo systemctl daemon-reload && sudo systemctl restart docker。

(注:如果服务器上有其他容器,重启 Docker 会导致它们短暂掉线,建议提前确保所有容器都有 restart: unless-stopped 策略)

2. 编写 Docker Compose 文件

在服务器的 /opt/zotero-webdav 目录下创建 docker-compose.yml。

⚠️ 端口避坑:如果你的服务器上 Nginx 已经占用了 8080(比如我的 Halo 博客就在用),务必将其映射为其他端口,这里我们选择 8081。

services:

zotero:

image: gzurowski/zotero-dav

container_name: zotero-webdav

restart: unless-stopped

ports:

- "8081:80" # 宿主机 8081 映射到容器 80

environment:

- ZOTERO_USER=myuser

- ZOTERO_PASS=mysecretpassword

volumes:

- zotero-data:/var/lib/dav/data

volumes:

zotero-data:

运行 sudo docker compose up -d,容器即可在后台运行。

3. 本地验证

使用 curl 进行 WebDAV 连通性测试:

curl -u myuser:mysecretpassword -X PROPFIND http://127.0.0.1:8081/zotero/ -v

如果返回 207 Multi-Status,说明服务端已完全就绪。

第二步:安全升级,配置 HTTPS 与反向代理

为什么不能直接用 IP:8081?

1. HTTP 明文传输极不安全,且容易被运营商干扰。

2. 客户端(特别是移动端)由于安全策略,强制要求 WebDAV 必须走 HTTPS。

3. 默认的 30 秒网络超时,在 HTTP 环境下极易报错 Request timed out。

因此,我们需要用宝塔面板的 Nginx 为它套上一层域名和 SSL。

1. 解析域名:在 DNS 处添加 A 记录,将 zotero.howier.top 指向服务器。

2. 新建站点:在宝塔面板新建纯静态站点 zotero.howier.top。

3. 申请证书:在站点设置中申请 Let's Encrypt 免费证书并开启强制 HTTPS。

4. 配置反向代理:添加反向代理,目标 URL 填 http://127.0.0.1:8081。(注意:这里千万不要带 /zotero/ 路径)。

⚠️ 413 Payload Too Large 踩坑

在网页端测试同步时,可能会遇到 HTTP 413 错误。这是因为 Nginx 默认限制了客户端上传文件的大小(通常只有 1MB)。需要在站点的 Nginx 配置文件的 server {} 块中添加:

client_max_body_size 0; # 0 表示不限制大小

保存后重载 Nginx,大文件即可顺畅传输。

第三步:Zotero 客户端与移动端配置

经过上述配置,我们的私有云地址已经变成了:https://zotero.howier.top/zotero/

在 Zotero 桌面端的“编辑 → 设置 → 同步 → 文件同步”中选择 WebDAV,填入:

· URL:https://zotero.howier.top/zotero/ (结尾的 /zotero/ 绝对不能少,否则 404)

· 用户名 和 密码:Docker 配置中的值。

点击“验证服务器”,秒过。之后你的所有附件都会加密同步到你自己的服务器上。

iOS 和 Android 的 Zotero 客户端同样填入此地址,即可完美同步附件。

进阶:与 Obsidian 打通(ZotFlow 插件)

如果你有在 Obsidian 中阅读书籍并写笔记的习惯,可以安装 ZotFlow 插件。它能让你在 Obsidian 里直接打开 Zotero 的 PDF 并做双向标注同步。

本地书籍阅读优化:

如果你在 Zotero 里存了大量书籍(如 1GB 以上),不希望 ZotFlow 再次从 WebDAV 下载:

1. 在 Zotero 设置中,将“链接附件的根目录”设为你本地的书籍文件夹。

2. 在 ZotFlow 设置中,将 Linked Attachment Base Directory 设为同一个路径。

3. ZotFlow 就会直接读取本地文件,实现零延迟阅读!