1. 唠嗑
聊到「私人网盘」,大部分人第一反应都是 Nextcloud、Seafile 这种「全家桶」——文件、日历、联系人、笔记、视频会议,功能丰富,大而全,但是比较吃机器的配置,VPS 性能差点儿的(比如 1G 内存的),像 Nextcloud 可能都跑不动。
很多时候我们的需求其实非常朴素:
「我能不能在 Mac 的 Finder 里直接打开 VPS 上的某个目录,像本地文件夹一样拖拖拽拽?」
答案是可以,而且根本不用上 Nextcloud,一个轻量级的 WebDAV 服务就够了。
2. hacdias/webdav 简介
今天咕咕给大家介绍的 hacdias/webdav 就是这种「需求小但精准」的代表作——Go 写的独立 WebDAV 服务器,整个程序就一个二进制文件,配置文件用 YAML,跑起来内存占用几十兆。
这个作者也是之前和大家介绍的 File Browser 项目的作者。
它能干什么?
- 把 VPS 上的某个目录通过 WebDAV 协议暴露出来
- 支持多用户、多目录、多权限(CRUD 自由组合)
- 支持 bcrypt 哈希密码(不用让明文密码裸奔)
- 反代友好(配合 Nginx Proxy Manager 体验非常丝滑)
- 没有 Web 界面、没有数据库、没有花里胡哨的功能
适合的场景包括:
- Obsidian / Joplin / Logseq 这类笔记软件的云端同步
- KeePass / KeePassXC 数据库远程同步
- 手机相册备份目标盘
- 多设备共享一个工作目录
- 摆脱 iCloud / OneDrive / Dropbox 的容量焦虑
部署完之后,Mac、Windows、iPhone、Android,以及 Obsidian、Joplin、KeePassXC 这种支持 WebDAV 的应用都能直接挂上来用。
可以让你告别云盘焦虑!
3. 相关地址
官方 GitHub 地址:https://github.com/hacdias/webdav (目前 5.5k 个 star,欢迎大家去给项目点星星!)
当然如果你想自己用 docker 搭建一个,那我们就继续往下!
4. 搭建环境
- 服务器:咕咕这边用的香港的 莱卡云服务器,虽然 1 核 512M 都够用,重点看磁盘大小和带宽,但是因为用的 docker 搭建,还是建议服务器内存 1G 以上,当然你也可以选择其他 高性价比的服务器。
- 系统:Debian 11 (DD 脚本 非必需 DD,用原来的系统也 OK,之后教程都是用 Debian 或者 Ubuntu 搭建~)
- 安装好 Docker、Docker-compose(相关脚本)
- 【必需】域名一枚,并做好解析到服务器上(域名购买、域名解析 视频教程)
- 【非必需】提前安装好宝塔面板海外版本 aapanel,并安装好 Nginx(安装地址)
- 【非必需本教程选用】安装好 Nginx Proxy Manager(相关教程)
5. 搭建视频(过俩周补充 = =)
5.1 YouTube
视频地址:
5.2 哔哩哔哩
哔哩哔哩:
6. 搭建方式
6.1 安装 Docker 与 Nginx Proxy Manager
可以直接参考这篇内容:
https://blog.laoda.de/archives/nginxproxymanager/
6.2 创建安装目录
创建一下安装的目录:
sudo -i
mkdir -p /root/data/docker_data/webdav
cd /root/data/docker_data/webdav
接着我们来编辑下docker-compose.yml
vim docker-compose.yml
services:
webdav:
image: hacdias/webdav:latest
container_name: webdav
restart: unless-stopped
ports:
- "6065:6065" # 左边的端口可以换成 vps 上没有用过的端口
volumes:
- ./config.yml:/config.yml:ro
- ./data:/data
其中的左边的6065可以改成服务器上没有用过的端口。
修改完成之后,可以在英文输入法下,按 i 修改,完成之后,按一下 esc,然后 :wq 保存退出。
生成 bcrypt 密码
为了不让明文密码裸奔在配置文件里,我们用 bcrypt 哈希一下密码。Debian / Ubuntu 上一行命令搞定:
apt install -y apache2-utils
htpasswd -nbBC 12 "" '你想用的密码' | tr -d ':' | sed 's/\$2y/\$2a/'
会输出一串长这样的玩意儿:
$2a$12$8gsX8AKtD3EMdmksoqSDLAIEMEMMrSbKx/q0GG
把它整段复制下来,待会儿要塞到 config.yml 里。
如果你嫌麻烦,明文密码也是合法配置——把
config.yml设成chmod 600也能挡住一般场景。但既然多花一行命令的事儿,咕咕还是建议哈希一下。
写 config.yml
vim config.yml
贴入:
address: 0.0.0.0
port: 6065
prefix: /
# 反代后面一定要打开,让 webdav 信任 X-Forwarded-* 头
behindProxy: true
# 全局默认权限(被下方 users 覆盖)
permissions: none
directory: /data
users:
- username: gugu
password: "{bcrypt}$2a$12$你刚才生成的那一长串"
directory: /data/gugu
permissions: CRUD
# 想再加一个只读访客?解开注释即可
# - username: guest
# password: "{bcrypt}$2a$12$xxx"
# directory: /data/public
# permissions: R
关于
permissions这一栏:C = Create(创建)、R = Read(读取)、U = Update(更新)、D = Delete(删除)。给自己用就CRUD全开,分享给朋友的访客号建议只给R。
保存退出,给配置文件上锁:
chmod 600 config.yml
mkdir -p data
6.3 查看端口是否被占用
查看端口是否被占用(以 6065 为例),输入:
lsof -i:6065 #查看 6065 端口是否被占用,如果被占用,重新自定义一个端口
如果啥也没出现,表示端口未被占用,我们可以继续下面的操作了~
如果出现:
-bash: lsof: command not found
运行:
apt install lsof #安装 lsof
如果端口没有被占用(被占用了就修改一下端口,比如改成 8381,注意 docker 命令行里和防火墙都要改)
6.4 启动 webdav
cd /root/data/docker_data/webdav
docker compose up -d # 注意,老版本用户用 docker-compose up -d
docker compose logs -f
镜像非常小,等待拉取好镜像,出现 Created的字样之后,
如果日志里看到类似:
Listening on 0.0.0.0:6065
并且没有报错,那就说明跑起来了。Ctrl+C 退出日志查看,容器还在后台老老实实工作。
这时候你已经可以在浏览器里访问 http://你的 VPS-IP:6065 试试,输入用户名密码会看到一个空空荡荡的目录列表,说明服务正常。
但是我们部署在公网一定要考虑使用反向代理工具配置 SSL!
不用域名直接 IP 访问也不是不行,但 Mac 的 Finder 在 HTTP 下挂 WebDAV 会自动降级成只读,套上 HTTPS 才能愉快地读写。所以域名 + HTTPS 是强烈推荐的。
做反向代理前,你需要一个域名!
namesilo 上面 xyz 后缀的域名一年就 7 块钱,可以年抛。(冷知识,namesilo 上 6 位数字的 xyz 续费永远都是 0.99 美元 = =)
如果想要长期使用,还是建议买 com 后缀的域名,更加正规一些,可以输入 laodade 来获得 1 美元的优惠(不知道现在还有没有)
namesilo 自带隐私保护,咕咕一直在用这家,价格也是这些注册商里面比较低的,关键是他家不像其他家域名注册商,没有七七八八的套路!(就是后台界面有些丑 古老 = =)
【域名购买】Namesilo 优惠码和域名解析教程(附带服务器购买推荐和注意事项)
我们接着往下看!
7. 反向代理
7.1 利用 Nginx Proxy Manager
在添加反向代理之前,确保你已经完成了域名解析,不会的可以看这个:域名一枚,并做好解析到服务器上(域名购买、域名解析 视频教程) (名称改成你自己想要的域名前缀即可)

之后,登陆 Nginx Proxy Manager(不会的看这个:安装 Nginx Proxy Manager(相关教程))
注意:
Nginx Proxy Manager(以下简称 NPM)会用到
80、443端口,所以本机不能占用(比如原来就有 Nginx)
打开你的 NPM 后台,新建一个 Proxy Host:
Details 标签页:
- Domain Names:填你的域名,比如
webdav.example.com - Scheme:
http - Forward Hostname / IP:填你 VPS 的内网 IP,或者直接
宿主机 IP - Forward Port:
6065 - Cache Assets:关
- Block Common Exploits:⚠️ 一定要关! NPM 这个开关会拦掉一些 WebDAV 的 HTTP 方法(比如
PROPFIND、MKCOL、PROPPATCH),不关你客户端会一直 405 报错,搞得你怀疑人生 - Websockets Support:打开
注意填写对应的
域名、IP和端口,按文章来的话,应该是6065
IP 填写:
如果 Nginx Proxy Manager 和 webdav 在同一台服务器上,可以在终端输入:
ip addr show docker0
查看对应的 Docker 容器内部 IP。
否则直接填 webdav 所在的服务器 IP 就行。
SSL 标签页:
- SSL Certificate:选
Request a new SSL Certificate,签个 Let's Encrypt - Force SSL:打开
- HTTP/2 Support:打开
- HSTS Enabled:可选
Advanced 标签页:
加上这段 nginx 配置(这段非常关键,没它传大文件会断开):
client_max_body_size 0;
proxy_request_buffering off;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
保存。
然后访问域名就可以访问了!
7.2 利用宝塔面板(应该类似,没具体尝试)
发现还是有不少小伙伴习惯用宝塔面板,这边也贴一个宝塔面板的反代配置:
直接新建一个站点,不要数据库,不要 php,纯静态即可。
然后打开下面的配置,修改 Nginx 的配置。
代码如下:
location / {
proxy_pass http://127.0.0.1:6065/; # 注意改成你实际使用的端口
rewrite ^/(.*)$ /$1 break;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade-Insecure-Requests 1;
proxy_set_header X-Forwarded-Proto https;
}
此方法对 90% 的反向代理都能生效,然后就可以用域名来安装访问了。
有同学可能会问,为什么不直接用宝塔自带的反向代理功能。
也可以,不过咕咕自己之前遇到过当有多个网站需要反代的时候,在这边设置会报错的情况 = =
所以后来就不用了,直接用上面的方法来操作了。
8. 使用教程
在 Mac 上挂载
打开 Finder,按 ⌘K(或者菜单栏 → 前往 → 连接服务器),输入:
https://webdav.example.com
回车,会弹出登录框,填你在 config.yml 里设置的用户名 + 原始密码(注意不是 bcrypt 哈希!)。点连接,VPS 上的目录就会以网络盘的形式出现在 Finder 侧边栏。
到这里你就可以拖拖拽拽了——复制、改名、双击打开、新建文件夹,全都和本地操作没差。
不过你本地到服务器的连接速度也很重要,像我测试的时候用的是美国的机器,反代用的香港,本地在上海操作,就会没有那么的丝滑。
如果用美国线路优化的 VPS,就会丝滑很多。
我还测试了上海的服务器,就和本地操作没差别了。

8.1 更新 webdav
这个项目后续会持续有更新,所以提供一个更新的方式。
cd /root/data/docker_data/webdav
docker compose pull
docker compose up -d # 请不要使用 docker compose stop 来停止容器,因为这么做需要额外的时间等待容器停止;docker compose up -d 直接升级容器时会自动停止并立刻重建新的容器,完全没有必要浪费那些时间。
docker image prune # prune 命令用来删除不再使用的 docker 对象。删除所有未被 tag 标记和未被容器使用的镜像
提示:
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N]
输入 y
利用 Docker 搭建的应用,更新非常容易~
8.2 卸载 webdav
同样进入安装页面,先停止所有容器。
cd /root/data/docker_data/webdav
docker compose down
cd ..
rm -rf /root/data/docker_data/webdav # 完全删除
可以卸载得很干净。
9. 使用问题
一个不得不吐槽的问题
Mac 自带的 Finder WebDAV 客户端……怎么说呢,残废。具体表现:
- 传大文件容易卡死或者超时
- 偶尔莫名其妙断连,得重新挂载
- 会自动生成一堆
.DS_Store、._xxx这类隐藏文件污染目录 - 写入速度比读取慢得多
- 偶尔会把刚创建的文件「藏起来」让你看不到,刷新一下又出来了

如果你只是偶尔传几个文档应付一下没问题。但想当主力网盘用,我搜索了一下,网络上推荐了几个第三方客户端:
- Mountain Duck(付费,约 $39 一次性)—— 真正把 WebDAV 挂成本地盘符,Finder 里和访问 iCloud Drive 几乎没差,支持离线缓存、上传队列、智能同步
- Cyberduck(免费)—— Mountain Duck 同公司出品,但只能「打开」不能「挂载」,操作起来更像 FTP 客户端
- rclone mount(免费,命令行)—— 不嫌折腾的话稳定性和性能都很好,还能加 VFS 缓存提速
大家有用到好用的客户端也欢迎在评论区分享交流!
安全小贴士
WebDAV 暴露在公网上,几条小建议:
config.yml一定chmod 600,避免被同机器的其他用户读到你的哈希- NPM 里给这个 host 加 IP 白名单,或者套一层 Cloudflare Access、Authelia 之类的二次认证,公网裸奔风险还是不小的
- fail2ban 也可以装一下,防止有人暴力试密码
- 重要数据用 rclone 同步一份到 Backblaze B2 或 Cloudflare R2 —— hacdias/webdav 本身没有版本管理,删了就真的删了。B2 的 5GB 免费额度对小型笔记同步绰绰有余
- VPS 快照定期开起来,多花不了几块钱,关键时刻能救命
大家使用上还有什么心得或者问题,欢迎评论区交流~
10. 结尾
祝大家用得开心,有问题可以去 GitHub 提 Issues,也可以在评论区互相交流探讨。
同时,有能力给项目做贡献的同学,也欢迎积极加入到 项目 中来,贡献自己的一份力量!
最后,感谢作者 @Henrique Dias 的辛苦付出,让我们能用到这么优秀的项目!欢迎大家都去给这个项目点个 star。
参考资料
官方 GitHub:https://github.com/hacdias/webdav
评论区