目 录CONTENT

文章目录

【好玩儿的Docker项目】十分钟搭建一个「极简私人网盘」——hacdias/webdav,让你可以像逛本地文件夹一样逛 VPS

咕咕
2026-05-07 / 0 评论 / 0 点赞 / 18 阅读 / 0 字
温馨提示:
部分素材来自网络,若不小心影响到您的利益,请联系我们删除。
广告 广告

1. 唠嗑

聊到「私人网盘」,大部分人第一反应都是 Nextcloud、Seafile 这种「全家桶」——文件、日历、联系人、笔记、视频会议,功能丰富,大而全,但是比较吃机器的配置,VPS 性能差点儿的(比如 1G 内存的),像 Nextcloud 可能都跑不动。

很多时候我们的需求其实非常朴素:

「我能不能在 Mac 的 Finder 里直接打开 VPS 上的某个目录,像本地文件夹一样拖拖拽拽?」

答案是可以,而且根本不用上 Nextcloud,一个轻量级的 WebDAV 服务就够了。

2. hacdias/webdav 简介

今天咕咕给大家介绍的 hacdias/webdav 就是这种「需求小但精准」的代表作——Go 写的独立 WebDAV 服务器,整个程序就一个二进制文件,配置文件用 YAML,跑起来内存占用几十兆。

这个作者也是之前和大家介绍的 File Browser 项目的作者。

671776cf97b39dc312016575eb5d85d2.png

旧文回顾:手把手教你搭建私人离线下载神器 Aria2,搭配 Rclone+Filebrowser 自动上传至网盘

它能干什么?

  • 把 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

在添加反向代理之前,确保你已经完成了域名解析,不会的可以看这个:域名一枚,并做好解析到服务器上域名购买、域名解析 视频教程) (名称改成你自己想要的域名前缀即可)

68bfcaff11811fa6f3e6b24e6cfc09ce.png

之后,登陆 Nginx Proxy Manager(不会的看这个:安装 Nginx Proxy Manager相关教程))

注意:

Nginx Proxy Manager(以下简称 NPM)会用到 80443 端口,所以本机不能占用(比如原来就有 Nginx)

打开你的 NPM 后台,新建一个 Proxy Host

Details 标签页:

  • Domain Names:填你的域名,比如 webdav.example.com
  • Schemehttp
  • Forward Hostname / IP:填你 VPS 的内网 IP,或者直接 宿主机 IP
  • Forward Port6065
  • Cache Assets:关
  • Block Common Exploits:⚠️ 一定要关! NPM 这个开关会拦掉一些 WebDAV 的 HTTP 方法(比如 PROPFINDMKCOLPROPPATCH),不关你客户端会一直 405 报错,搞得你怀疑人生
  • Websockets Support:打开

注意填写对应的 域名IP端口,按文章来的话,应该是 6065

IP 填写:

如果 Nginx Proxy Manager 和 webdav 在同一台服务器上,可以在终端输入:

ip addr show docker0

查看对应的 Docker 容器内部 IP。

否则直接填 webdav 所在的服务器 IP 就行。

c3aecaf3e776af727e4f835a2eb9ac3e.png

SSL 标签页:

  • SSL Certificate:选 Request a new SSL Certificate,签个 Let's Encrypt
  • Force SSL:打开
  • HTTP/2 Support:打开
  • HSTS Enabled:可选
14e4edadd58f306888abf7c346ae47b4.png

Advanced 标签页:

加上这段 nginx 配置(这段非常关键,没它传大文件会断开):

client_max_body_size 0;
proxy_request_buffering off;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
42cec3c76a3939e01e14aa6b390f363a.png

保存。

然后访问域名就可以访问了!

7.2 利用宝塔面板(应该类似,没具体尝试)

发现还是有不少小伙伴习惯用宝塔面板,这边也贴一个宝塔面板的反代配置:

直接新建一个站点,不要数据库,不要 php,纯静态即可。

然后打开下面的配置,修改 Nginx 的配置。

image-20220819150345725 image-20220819150542867

代码如下:

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% 的反向代理都能生效,然后就可以用域名来安装访问了。

有同学可能会问,为什么不直接用宝塔自带的反向代理功能。

image-20220819150730128

也可以,不过咕咕自己之前遇到过当有多个网站需要反代的时候,在这边设置会报错的情况 = =

所以后来就不用了,直接用上面的方法来操作了。

8. 使用教程

在 Mac 上挂载

打开 Finder,按 ⌘K(或者菜单栏 → 前往 → 连接服务器),输入:

3e5d1bd55bb2b633169ec5221a86e5e3.png d75accde7480572ed2e8f91b92ab9ca9.png 35d5d96cb1dbf545631b5ca36dd11d2b.png
https://webdav.example.com

回车,会弹出登录框,填你在 config.yml 里设置的用户名 + 原始密码(注意不是 bcrypt 哈希!)。点连接,VPS 上的目录就会以网络盘的形式出现在 Finder 侧边栏。

到这里你就可以拖拖拽拽了——复制、改名、双击打开、新建文件夹,全都和本地操作没差。

不过你本地到服务器的连接速度也很重要,像我测试的时候用的是美国的机器,反代用的香港,本地在上海操作,就会没有那么的丝滑。

如果用美国线路优化的 VPS,就会丝滑很多。

我还测试了上海的服务器,就和本地操作没差别了。

53c457e49583dce57c236dafc41689fd.png

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 这类隐藏文件污染目录
  • 写入速度比读取慢得多
  • 偶尔会把刚创建的文件「藏起来」让你看不到,刷新一下又出来了

3fe696e38a9355115c4bc04af0fa76ae.png

如果你只是偶尔传几个文档应付一下没问题。但想当主力网盘用,我搜索了一下,网络上推荐了几个第三方客户端:

  • Mountain Duck(付费,约 $39 一次性)—— 真正把 WebDAV 挂成本地盘符,Finder 里和访问 iCloud Drive 几乎没差,支持离线缓存、上传队列、智能同步
  • Cyberduck(免费)—— Mountain Duck 同公司出品,但只能「打开」不能「挂载」,操作起来更像 FTP 客户端
  • rclone mount(免费,命令行)—— 不嫌折腾的话稳定性和性能都很好,还能加 VFS 缓存提速

大家有用到好用的客户端也欢迎在评论区分享交流!

安全小贴士

WebDAV 暴露在公网上,几条小建议:

  1. config.yml 一定 chmod 600,避免被同机器的其他用户读到你的哈希
  2. NPM 里给这个 host 加 IP 白名单,或者套一层 Cloudflare Access、Authelia 之类的二次认证,公网裸奔风险还是不小的
  3. fail2ban 也可以装一下,防止有人暴力试密码
  4. 重要数据用 rclone 同步一份到 Backblaze B2 或 Cloudflare R2 —— hacdias/webdav 本身没有版本管理,删了就真的删了。B2 的 5GB 免费额度对小型笔记同步绰绰有余
  5. VPS 快照定期开起来,多花不了几块钱,关键时刻能救命

大家使用上还有什么心得或者问题,欢迎评论区交流~

10. 结尾

祝大家用得开心,有问题可以去 GitHub 提 Issues,也可以在评论区互相交流探讨。

同时,有能力给项目做贡献的同学,也欢迎积极加入到 项目 中来,贡献自己的一份力量!

最后,感谢作者 @Henrique Dias 的辛苦付出,让我们能用到这么优秀的项目!欢迎大家都去给这个项目点个 star。

参考资料

官方 GitHub:https://github.com/hacdias/webdav

0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin
广告 广告

评论区