本文适合有NAS/有公网服务器又用Zotero阅读论文的读者。事实上,使用ZotFile+iCloud应该也能实现同步功能,但是我感觉没有那么原生就没继续研究。如果没有NAS与公网服务器,可以衡量下开销,毕竟Zotero的20刀一年3G应该也够很多人用了,服务器和NAS一般来说还是比这个服务贵的。
文末更新了nginx一键配置脚本
开始之前
先说说下文要用到的技术栈以及文章内容:
- 云服务器+域名解析:读者自行完成,本文只做推荐不做解释;
- 服务器配置:本文提供一个通用的Guide;
- Apache2与WebDAV配置:本文提供粘贴可用的模板;
- HTTPS配置:本文提供通过
CertBot
进行验证的方式,也是一键配置; - Zotero配置:本文提供Guide;
总的来说,本文基本就是一个WebDAV配置的walkthrough guide。不过也可以使用坚果云提供的WebDAV服务,直接配置Zotero,就不需要折腾了。
PS:避雷阿里云盘的“WebDAV服务”,它不能上传,只能下载。
云服务器、域名解析与服务器配置
首先我们要完成的是云服务器+域名解析,其中域名不解析,有公网IP也够用。对于云服务器租赁,我使用的是阿里云+学生优惠,1年2核1G+30G SSD一共108元。
在完成云服务器租赁后,我们启动服务器,就可以进行服务器的配置了。我们先配置服务器环境:
$ sudo apt upgdate && sudo apt upgrade
然后就可以了。
Apache2与WebDAV配置
WebDAV是一个网络协议,所以不是一个专用的“软件”,而是会集成在各种服务中。
我们先安装Apache2:
$ sudo apt-get install -y apache2
然后再启动它的WebDAV服务:
$ cd ~$ sudo a2enmod dav$ sudo a2enmod dav_fs$ sudo systemctl restart apache2
接下来就是创建WebDAV所使用的目录路径(可自行更改)并修改权限:
$ sudo mkdir -p /var/www/webdav$ sudo chown -R www-data:www-data /var/www/webdav
然后我们为Zotero在WebDAV中创建一个账户(在此处账户名zotero)并设定密码,然后修改权限:
$ sudo htpasswd -c /etc/apache2/webdav.password zotero$ sudo chown root:www-data /etc/apache2/webdav.password$ sudo chmod 640 /etc/apache2/webdav.password
最后我们将以下内容写入/etc/apache2/sites-available/your.domain.com.conf
即可:
Alias /webdav /var/www/webdav<Location /webdav> Options Indexes DAV On AuthType Basic AuthName "webdav" AuthUserFile /etc/apache2/webdav.password Require valid-user</Location>
然后重启Apache2:sudo systemctl restart apache2
。
在这之后,我们访问http://your-ip:80/webdav
就能访问WebDAV服务了。
配置HTTPS(可选,苹果用户必选)
但是,如果你想用苹果移动设备(iPad、iPhone)上的zotero还是不能连接到这个WebDAV,因为他们只支持HTTPS访问。
那么我们继续。首先我们先安装CertBot以及它的Apache扩展:
$ sudo apt install certbot$ sudo apt install python3-certbot-apache
然后我们将上一节最后的/etc/apache2/sites-available/your.domain.com.conf
修改为如下所示:
<VirtualHost *:80> ServerName your.domain.com # 可选:如果你只想做验证,可以设置 DocumentRoot 为任何可访问路径 DocumentRoot /var/www/html
# 可选:也可以把所有请求重定向到 HTTPS # RewriteEngine On # RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]</VirtualHost>
然后添加HTTPS相关配置在/etc/apache2/sites-available/your.domain.com-le-ssl.conf
中(高亮部分记得修改):
<IfModule mod_ssl.c><VirtualHost *:443> ServerName your.domain.com
Alias /webdav /var/www/webdav <Location /webdav> Options Indexes DAV On AuthType Basic AuthName "webdav" AuthUserFile /etc/apache2/webdav.password Require valid-user </Location>
SSLEngine on Include /etc/letsencrypt/options-ssl-apache.conf SSLCertificateFile /etc/letsencrypt/live/your.domain.com/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/your.domain.com/privkey.pem
# 可选:强制 HTTP 重定向到 HTTPS RewriteEngine on RewriteCond %{HTTPS} !=on RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R=301,L]</VirtualHost></IfModule>
这之后,启用有关Apache模块并重启:
$ sudo a2enmod ssl$ sudo a2enmod rewrite$ sudo systemctl restart apache2
最后,我们使用CertBot进行HTTPS证书生成以及配置:
$ sudo certbot --apache -d your.domain.com
在Zotero中配置WebDAV
打开设置>同步>文件同步
,将同步方式从Zotero
更改成WebDAV
,然后按需输入相关配置:
配置好后点击右上角的同步即可通过WebDAV进行同步。
至此我们完成了全部配置。
Nginx 一键配置脚本
#!/usr/bin/env bashset -euo pipefail
# ======= 配置参数(修改这里) =======PATH_DIR="/srv/dav"URL_PREFIX="webdav"DAV_USER=""DAV_PASS=""SERVER_NAME="_"ENABLE_AUTOINDEX="on"# ====================================
if [[ $EUID -ne 0 ]]; then echo "请使用 root 运行:sudo bash $0" exit 1fi
# -------- 安装 nginx + dav-ext --------apt-get updateDEBIAN_FRONTEND=noninteractive apt-get install -y nginx nginx-extras apache2-utils libnginx-mod-http-dav-ext
# -------- 准备数据目录 --------mkdir -p "$PATH_DIR"NGINX_USER="www-data"id nginx &>/dev/null && NGINX_USER="nginx"chown -R "$NGINX_USER":"$NGINX_USER" "$PATH_DIR"chmod -R 775 "$PATH_DIR"
# -------- 创建 BasicAuth --------HTPASSWD="/etc/nginx/.htpasswd"HASH=$(openssl passwd -apr1 "$DAV_PASS")if [[ -f "$HTPASSWD" ]]; then if grep -q "^${DAV_USER}:" "$HTPASSWD"; then sed -i.bak "s#^${DAV_USER}:.*#${DAV_USER}:${HASH}#g" "$HTPASSWD" else echo "${DAV_USER}:${HASH}" >> "$HTPASSWD" fielse echo "${DAV_USER}:${HASH}" > "$HTPASSWD"fichmod 640 "$HTPASSWD"chown root:"$NGINX_USER" "$HTPASSWD" || true
# -------- 写入 Nginx 配置 --------CONF_DIR="/etc/nginx/sites-available"CONF_PATH="$CONF_DIR/webdav_${URL_PREFIX}.conf"ENABLED_DIR="/etc/nginx/sites-enabled"
mkdir -p "$CONF_DIR" "$ENABLED_DIR"
cat > "$CONF_PATH" <<NGXserver { listen 80; server_name ${SERVER_NAME};
client_max_body_size 0; client_body_temp_path /var/cache/nginx/client_temp;
sendfile on; proxy_read_timeout 600s; proxy_send_timeout 600s;
location = /${URL_PREFIX} { return 301 /${URL_PREFIX}/; }
location /${URL_PREFIX}/ { alias ${PATH_DIR}/;
# DAV 基础操作 dav_methods PUT DELETE MKCOL COPY MOVE; create_full_put_path on; dav_access user:rw group:rw all:r;
# ★ 扩展 DAV 操作:Zotero 必须(PROPFIND + OPTIONS) dav_ext_methods PROPFIND OPTIONS;
# 可选:支持锁(多数客户端不需要) # dav_ext_lock_zone zone=davlocks:10m; # dav_ext_lock zone=davlocks;
# 基本认证 auth_basic "WebDAV"; auth_basic_user_file ${HTPASSWD};
autoindex ${ENABLE_AUTOINDEX}; }}NGX
ln -sf "$CONF_PATH" "/etc/nginx/sites-enabled/$(basename "$CONF_PATH")"
# -------- 测试配置并重载 --------nginx -tsystemctl reload nginx
echo "✅ WebDAV + dav-ext 配置完成!"echo "📁 本地目录:${PATH_DIR}"echo "🌐 WebDAV 地址:http://${SERVER_NAME}/${URL_PREFIX}/"echo "👤 用户名/密码:${DAV_USER} / ${DAV_PASS}"
cat <<TEST
📦 测试命令(PROPFIND):curl -u '${DAV_USER}:${DAV_PASS}' -X PROPFIND -H "Depth: 1" \ --data '<propfind xmlns="DAV:"><allprop/></propfind>' \ http://${SERVER_NAME}/${URL_PREFIX}/
📚 Zotero 设置:WebDAV URL: http://${SERVER_NAME}/${URL_PREFIX}/用户名: ${DAV_USER}密码: ${DAV_PASS}
⚠️ 如果还有 405,请确保:1. dav-ext 模块已启用: ls /etc/nginx/modules-enabled | grep dav_ext2. 配置文件中有: dav_ext_methods PROPFIND OPTIONS;3. 重启 Nginx: sudo systemctl reload nginxTEST