webdav-server 是一个用 Go 写的 WebDAV 服务,单二进制,部署起来很省事。如果你平时需要在不同设备之间传文件,或者想给团队搭一个简单的文档共享,它比 FTP 好使——原生就能被 Finder、Windows 资源管理器挂载,兼容性没得说。
安装
最省心的装法是用 Go 工具链一把梭:
go install github.com/hacdias/webdav/v5@latest
要是环境里没有 Go,直接用 Docker 也行:
docker pull ghcr.io/hacdias/webdav:latest
至于选哪个,看你环境习惯。我自己的开发机上通常会直接 go install,生产环境为了隔离还是 Docker 方便些。
跑起来
配置文件一个 YAML 搞定。最基本的写法长这样:
address: 0.0.0.0
port: 6060
directory: /data
users:
- username: admin
password: "{bcrypt}$2y$10$zEP6oofmXFeHaeMfBNLnP.DO8m.H.Mwhd24/TOX2MWLxAExXi4qgi"
permissions: CRUD
permissions 用 CRUD 四个字母控制,对应创建、读取、更新、删除。密码可以用 bcrypt 哈希,也可以直接把明文放配置里(不推荐),或者用环境变量 {env} 语法引用,比如 password: "{env}MY_PASSWORD"。
然后用配置文件启动:
webdav --config config.yml
Docker 的话:
docker run -p 6060:6060 -v $(pwd)/config.yml:/config.yml -v $(pwd)/data:/data ghcr.io/hacdias/webdav -c /config.yml
6060 端口出来就能通过 WebDAV 客户端连了。
权限控制
webdav-server 支持按用户和路径细粒度控制权限。比如只让某个用户读 /public/docs,还可以用正则限制特定文件类型:
rules:
- path: /confidential
permissions: none
- path: /public/docs
permissions: R
- regex: "^.+\\.pdf$"
permissions: RU
"none" 直接屏蔽目录,比不给权限更干净。
实际跑团队共享时,场景会复杂一点。下面这个配置我常拿来用:
port: 8080
directory: /team-docs
users:
- username: manager
password: "{env}MANAGER_PASSWORD"
permissions: CRUD
directory: /team-docs/all
- username: developer
password: "{env}DEV_PASSWORD"
permissions: RU
directory: /team-docs/dev
- username: guest
password: "{env}GUEST_PASSWORD"
permissions: R
directory: /team-docs/public
这里每个用户直接锁定了各自的根目录,权限也分了三层。需要注意的是,directory 字段指定的是该用户看到的根,所以 admin 能看到 /team-docs/all,但 guest 只能看到 /team-docs/public。这是 webdav-server 比较灵活的地方。
融入现有环境
配合反向代理
生产环境一般不会裸跑,前面套个 Nginx 或者 Caddy 就能加上 HTTPS 和缓存:
location /webdav/ {
proxy_pass http://localhost:6060/;
proxy_set_header Destination $http_destination;
proxy_set_header Host $host;
}
这个配置里 Destination 头很重要,WebDAV 的 COPY、MOVE 操作依赖它,漏了会出幺蛾子。
做成系统服务
Linux 下用 systemd 写个服务,开机自启稳稳的:
[Unit]
Description=WebDAV Server
After=network.target
[Service]
Type=simple
User=webdav
ExecStart=/usr/local/bin/webdav --config /etc/webdav/config.yml
Restart=always
[Install]
WantedBy=multi-user.target
记得先用 useradd -r webdav 建个用户,数据和配置文件的权限要对。
客户端怎么连
- Windows: 资源管理器 -> 映射网络驱动器,地址填
http://server:6060 - macOS: Finder 里按
Cmd+K,地址填一下就能连 - Linux:
davfs2能直接挂载成文件系统 - 手机: 各种文件管理器基本都支持 WebDAV
有一个小坑:Windows 内置的 WebDAV 客户端对自签名证书和 HTTP 基本认证有时兼容不好,有条件还是上正式证书。
自动化备份
我偶尔会把这里当备份中转,配合 cron 和 webdav-client 用:
#!/bin/bash
# 每天凌晨把本地备份同步到 WebDAV
webdav-client --config backup-config.yml sync /local/backup /remote/backup
webdav-client 不是本项目的一部分,但类似的工具很多,挑个顺手就行。
安全提醒
- 永远不要在配置里写明文密码,就算测试环境也不建议开这个头。
- 生产环境一定配 TLS,不然中间人一抓一个准。
- 限制并发连接数,防止被单个客户端拖垮(配置文件里可以加
maxConnections字段)。 - 日志定期看一眼,异常访问通常比直觉来得早。
常见问题
碰到连接超时,先检查防火墙和端口转发;权限被拒的话,确认一下对应目录的系统权限和 SELinux(CentOS/RHEL 上常遇到);大文件传一半失败,可能是客户端或 Nginx 的超时断了,proxy_read_timeout 调大点试试。
性能方面,如果对速度有要求,数据目录放 SSD 效果明显;磁盘 IO 敏感的场景可以考虑加一下内存缓存(webdav-server 本身没内置,可以通过挂载 tmpfs 或者前面加 Varnish 这类缓存层解决)。
webdav-server 是个小而美的工具,依赖少,功能够用。用来替换老旧的 FTP 或者临时搭个共享盘,很合适。

