5分钟上手:从零搭建个人 WebDAV 服务器的实战教程
5分钟上手:从零搭建个人 WebDAV 服务器的实战教程
【免费下载链接】webdavA simple and standalone WebDAV server.项目地址: https://gitcode.com/gh_mirrors/we/webdav
webdav 是一个用 Go 语言编写的独立 WebDAV 服务器。部署之后,你把服务器上的一个目录挂载成个人云存储,手机、电脑就能同步文件,或者搭一块家庭共享盘。全文按"装好 → 验证 → 配置 → 权限 → 加固 → 服务化"的顺序推进,每一步都有可直接复制的命令。
🏠 WebDAV 服务器解决什么问题
场景一:手机拍了大量照片,想传到家里的机器上自动备份,但不想依赖商业网盘的容量和审核。场景二:全家共用一个 U 盘传电影,你想换成一块放在 NAS 或 VPS 上的共享目录。这两种情况都只需要一台能联网的机器,加上一个支持 WebDAV 的客户端,而这个项目就是那个服务器端。
🚀 WebDAV 服务器安装命令:Docker 三条命令跑起来
先准备一个存放共享文件的目录data,再写一个配置文件config.yml(第 4 节会逐项解释)。下面这条命令在后台启动容器,把 6065 端口映射出去,并把配置和文件目录挂进去:
docker run -d --name webdav \ -p 6065:6065 \ -v $(pwd)/config.yml:/config.yml:ro \ -v $(pwd)/data:/data \ ghcr.io/hacdias/webdav -c /config.yml看到docker ps里出现 webdav 容器且状态是 Up,就算启动成功。不用 Docker 的话也可以选别的路:macOS 上brew install webdav,或执行git clone https://gitcode.com/gh_mirrors/we/webdav进入目录后go build自己编译,两种方式装完效果相同。
✅ 验证 WebDAV 服务器是否跑通
装完别急着配,先用 curl 发一个 WebDAV 协议自带的 PROPFIND 请求,确认认证和协议层都正常:
curl -i -u admin:admin -X PROPFIND http://127.0.0.1:6065/响应头里出现HTTP/1.1 207 Multi-Status且正文是 XML,说明服务已就绪;换个错误密码会收到 401。更直观的验证是:macOS 里按⌘K选"连接服务器",填入webdav://127.0.0.1:6065,Windows 里直接把这个地址设为网络驱动器,能列出目录就算真正打通了。
⚙️ webdav 配置项说明:config.yml 怎么写
配置文件支持 YAML、JSON、TOML 三种格式,选你顺手的即可。下面这份是最小可用配置,改完保存后重启容器或进程生效:
address: 0.0.0.0 port: 6065 directory: /data behindProxy: false users: - username: admin password: admin permissions: CRUD启动日志里出现监听 6065 端口的信息,且不再报配置错误,就是配置被正确读入的标志。各项含义如下:
| 配置项 | 含义 | 说明 |
|---|---|---|
address | 监听地址 | 0.0.0.0表示外部 IP 也能访问,仅本机可用127.0.0.1 |
port | 服务端口 | 建议选 1024 以上,避免和常见服务冲突 |
directory | 共享根目录 | 用户能看到的文件都在这里,填绝对路径更稳 |
users | 账号列表 | 一旦定义了用户,Basic 认证自动开启;每个用户还可以单独指定目录和权限 |
permissions | 该用户的默认权限 | 不写时全局默认只有 R(只读) |
behindProxy | 是否藏在反向代理后 | 接了 Nginx 等代理必须设为true,否则日志里的客户端 IP 会是代理的地址 |
另外两个常用项:log.format可以切成json便于落盘分析,cors.enabled设为true才能让浏览器里的前端应用直接调它。
🔐 webdav 权限怎么设置:CRUD 四个字母的含义
权限用四个字母表示,可以任意组合,比如RC表示"能读、能新建,不能改不能删":
- C:Create,在目录里新建文件和文件夹
- R:Read,列出目录、下载文件
- U:Update,覆盖写入已有文件
- D:Delete,删除文件
全局给个默认值,再对特定路径追加规则,是更贴近实际的做法。下面这份规则的含义是:默认只读;/movies/这个文件夹可以增删改查;所有.mkv电影文件只许读。规则从列表末尾往前匹配,第一条命中的规则生效:
permissions: R rules: - path: /movies/ permissions: CRUD - regex: "^.+.mkv$" permissions: R改完权限后用对应账号再连一次:在/movies/里建文件夹成功、对.mkv文件保存被拒绝,说明规则按预期工作了。
🛡️ 上线前安全清单:密码、Fail2Ban 与防火墙
对外网开放之前,把下面四件事过一遍。
1. 把密码从明文里挪走。密码有三档可选:明文只适合本地测试,上线前必须换掉;生产环境推荐 Bcrypt,用自带的命令生成哈希:
webdav bcrypt '你的密码'命令会打印一行$2y$10$...形式的哈希,把它填进配置即完成加密,例如:password: "{bcrypt}$2y$10$..."。第三档是环境变量,账号密码整体不进配置文件:password: "{env}ENV_PASSWORD",适合密码由外部系统注入的场景。
2. 给登录加 Fail2Ban,自动封掉暴力破解的 IP。先在filter.d/webdav.conf里加匹配规则,让 Fail2Ban 能从日志里认出失败的登录并提取 IP:
[INCLUDES] before = common.conf [Definition] failregex = ^.*invalid password\s*\{.*"remote_address":\s*"<HOST>:\d+"\s*\} ^.*invalid username\s*\{.*"remote_address":\s*"<HOST>:\d+"\s*\} ignoreregex =再在jail.d/webdav.conf里声明要监控的服务,端口和日志路径换成你自己的值:
[webdav] enabled = true port = 6065 filter = webdav logpath = /var/log/webdav.log banaction = iptables-allports ignoreself = false执行sudo systemctl restart fail2ban,再用sudo fail2ban-client status webdav看到 jail 处于 running 状态,防护就算挂上了。
3. 用防火墙收窄来源。如果这个盘只给家庭网络用,就只放行内网段:
sudo ufw allow from 192.168.1.0/24 to any port 6065 proto tcp命令执行完ufw status里出现这条规则即生效,其余 IP 直接进不来,和 Fail2Ban 形成两层。
4. 顺手把日志落成 JSON。把log.format设为json、outputs指向日志文件,Fail2Ban 和事后排查都靠它。debug排查完就关掉,别长期开着,日志级别越高开销越大。
🌐 WebDAV 服务器和 Nginx 反向代理怎么配
代理层最容易踩的坑是头信息没转发全,导致 COPY、MOVE 这类操作报 502。下面这段 Nginx 配置把这些头补齐,记得把example.com换成你实际访问的域名,改完nginx -s reload:
location / { proxy_pass http://127.0.0.1:6065; proxy_set_header X-Real-IP $remote_addr; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_redirect off; # 让 COPY / MOVE 正常工作:把 Destination 里的域名剥掉,只留路径 set $dest $http_destination; if ($http_destination ~ "^https://example.com(?<path>(.+))") { set $dest /$path; } proxy_set_header Destination $dest; }同时记得把 webdav 配置里的behindProxy改成true。之后通过域名访问、重命名和移动文件都不再报 502,代理层就调通了。
📦 把 webdav 注册为 systemd 系统服务
裸跑进程重启服务器就没了。下面这段服务文件让它开机自启、挂掉自动拉起,保存为/etc/systemd/system/webdav.service:
[Unit] Description=WebDAV After=network.target [Service] Type=simple User=root ExecStart=/usr/bin/webdav --config /opt/webdav.yml Restart=on-failure [Install] WantedBy=multi-user.target执行sudo systemctl daemon-reload && sudo systemctl enable --now webdav,systemctl status webdav显示 active (running),服务化完成。
日常维护记住两件事就够了:升级版本时重新编译二进制或拉新镜像再重启服务,别拖着旧版本跑;日志按天滚动,磁盘别塞满。
这个项目适合手里有一台闲置机器或廉价 VPS、又不想为文件同步付订阅费的人。它就是一个单文件可执行程序,不依赖数据库,内存占用很低。配置上支持 YAML、JSON、TOML,认证和权限都能按目录和文件后缀细分。剩下的工作,就是照着上面的清单把配置改完、重启服务。
【免费下载链接】webdavA simple and standalone WebDAV server.项目地址: https://gitcode.com/gh_mirrors/we/webdav
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
