hacdias WebDAV 配置参数详解
hacdias/webdav v5.17.0 配置文件各字段详解,覆盖顶层参数、directory/directories 虚拟根、permissions/rules 权限体系、log/cors/listing 子配置、users 用户对象与 WD_ 环境变量映射。
hacdias WebDAV 配置参数详解
目标:系统梳理 hacdias/webdav v5.17.0 全部配置参数的含义、默认值与用法,帮助读者理解配置文件(YAML/JSON/TOML)结构并正确搭建多用户 + 权限 + TLS + CORS 的生产 WebDAV 服务。
hacdias/webdav 的配置可通过命令行 flags、环境变量(WD_ 前缀)、配置文件或默认值指定,优先级从高到低:flags > 环境变量 > 配置文件 > 默认值。
配置文件支持 YAML、JSON、TOML 三种格式,启动时若不指定 -c,会自动在 ./ 与 /etc/webdav/ 下查找 config.{json,toml,yaml,yml}。约定:顶层键用 camelCase,section 内键用 snake_case(注意此处 listing 等章节历史上有的用 snake_case)。
1. 顶层参数
# 监听地址,默认 0.0.0.0(所有网卡)
address: 0.0.0.0
# 监听端口,默认 6065
port: 6065
# 是否启用 TLS,默认 false
tls: false
# TLS 证书文件路径,默认 cert.pem
cert: cert.pem
# TLS 私钥文件路径,默认 key.pem
key: key.pem
# WebDAV URL 路径前缀,默认 /
prefix: /
# 调试日志,默认 false
debug: false
# 关闭内容嗅探(禁止根据文件内容推断 Content-Type),默认 false
noSniff: false
# 是否在可信反向代理之后。为 true 时日志使用 X-Forwarded-For 记录远端地址,默认 false
behindProxy: false
| 键 | 默认值 | 说明 |
|---|---|---|
address | 0.0.0.0 | 绑定地址 |
port | 6065 | 监听端口 |
tls | false | 是否启用 TLS |
cert | cert.pem | 证书路径 |
key | key.pem | 私钥路径 |
prefix | / | URL 前缀,如 /dav |
debug | false | 调试日志 |
noSniff | false | 禁止内容嗅探 |
behindProxy | false | 反向代理后是否信任 XFF |
2. 共享根目录:directory / directories
2.1 directory
默认共享根目录,用户未单独指定 directory 时使用它:
# 指向工作目录(裸机默认);compose 场景常见 /data
directory: /data
2.2 directories(多虚拟根)
用 directories 可暴露多个目录作为虚拟根条目(与同一作用域的 directory 互斥):
directories:
- media: /data/media # 虚拟挂载名 media → /data/media
- /data/archive # 无名字段:直接用路径作为条目标识
- name: backups # 显式命名
path: /data/backups
directories 每条有三种写法:
- media: /data/media:键为虚拟名,值为路径- /data/archive:裸路径- name: backups\n path: /data/backups:用name+path显式指定
directory与directories在同一作用域互斥,只能选其一。用户级的directory(见下)可覆盖全局的directory.
3. 权限:permissions / rules / rulesBehavior
3.1 permissions
用户默认权限,大小写不敏感。可能值组合:
C:Create(新建)R:Read(读)U:Update(更新)D:Delete(删除)
组合示例:RC(读+建)、CRUD(全部)。默认 R(只读)。
补充语义:
LOCK(加锁)算写操作:路径已存在需要U,不存在需要C。- 被覆盖也计权:
COPY/MOVE覆盖已存在文件需要U;覆盖已存在集合会清空其内容,需要D(作用于集合及其下所有路径)。
permissions: CRUD
3.2 rules
基于路径的细粒度权限规则,默认无。规则从后往前应用——即从列表末尾开始,第一个匹配请求的规则生效。
rules: []
rules 中每条的 permissions 可以是 none(完全禁止)或 C/R/U/D/CRUD 等组合。示例:
# 对 /some/file 完全禁权
- path: /some/file
permissions: none
# 允许在 /public/access/ 下全部操作
- path: /public/access/
permissions: CRUD
# 只允许读
- path: /docs/
permissions: R
rules 路径相对用户的根目录。
permissions: none等价于完全拒绝。
3.3 rulesBehavior
用户定义自己 rules 时,如何处理与全局规则的叠加:
overwrite(默认):用户有rules时覆盖全局规则,即全局规则对该用户不适用。append:用户rules追加到全局规则之后,对该用户先检查其自身规则,再检查全局规则。
rulesBehavior: overwrite
4. 日志:log
log:
# 日志格式:console | json,默认 console
format: console
# 是否启用彩色输出,默认 true;仅 format=console 生效
colors: true
# 日志输出目标,可多个,默认 ['stderr']
outputs:
- stderr
- /var/log/webdav.log
| 键 | 默认值 | 说明 |
|---|---|---|
log.format | console | console / json |
log.colors | true | 控制台彩色 |
log.outputs | [stderr] | 输出目标列表,可加文件路径 |
设置
format: json便于对接日志系统(Loki、ELK 等)。
5. CORS:cors
当 WebDAV 由浏览器前端调用、或需要跨域访问时配置:
cors:
# 是否启用 CORS 处理,默认 false
enabled: true
# 是否允许携带凭证,默认 false
credentials: true
# 允许 Private Network Access 预检请求,默认 false
allow_private_network: false
# 允许的主机,默认 ['*']
allowed_hosts:
- '*'
# 允许的请求头,默认含 Authorization/Content-Type/Content-Range/Depth/If/Lock-Token 等
allowed_headers:
- Authorization
- Content-Type
- Content-Range
- Depth
- If
- Lock-Token
- Overwrite
- TimeOut
- Translate
- X-Update-Range
# 允许的方法,默认含全部 WebDAV 方法
allowed_methods:
- COPY
- DELETE
- GET
- HEAD
- LOCK
- UNLOCK
- MKCOL
- MOVE
- OPTIONS
- PATCH
- POST
- PROPFIND
- PROPPATCH
- PUT
# 暴露给浏览器的响应头
exposed_headers: []
| 键 | 默认值 | 说明 |
|---|---|---|
cors.enabled | false | 是否启用 CORS |
cors.credentials | false | 允许携带 Cookie/凭证 |
cors.allow_private_network | false | 允许 PNA 预检 |
cors.allowed_hosts | ['*'] | 允许来源 |
cors.allowed_headers | 含 WebDAV 常用头 | 允许请求头 |
cors.allowed_methods | 全部 WebDAV 方法 | 允许方法 |
cors.exposed_headers | [] | 暴露响应头 |
WebDAV 使用自定义方法与头(PROPFIND、Depth、Destination、Lock-Token 等),跨域场景务必把所需方法/头加入允许列表。
6. HTML 目录列表:listing
对集合的 GET 请求,默认返回 PROPFIND XML;可改为渲染 HTML 目录列表:
listing:
# 启用 HTML 目录列表,默认 false
enabled: true
# 是否隐藏父目录(../)链接,默认 false
hide_parent_dir: false
# 是否显示 "Index of <path>" 标题;自定义 header 时忽略,默认 true
show_path: true
# 自定义页壳 header / footer(内联或从文件)
# header: "<!DOCTYPE html><html><head><title>WebDAV</title></head><body>"
# header_file: /etc/webdav/header.html
# footer: "</body></html>"
# footer_file: /etc/webdav/footer.html
排序:URL 参数 ?C=N|M|S 按名称/修改时间/大小排序,?O=A|D 升序/降序。
| 键 | 默认值 | 说明 |
|---|---|---|
listing.enabled | false | 启用 HTML 列表 |
listing.hide_parent_dir | false | 隐藏 ../ 链接 |
listing.show_path | true | 显示路径标题 |
listing.header_file / footer_file | 无 | 自定义页壳文件 |
7. 用户:users
定义用户列表后自动启用 HTTP Basic 认证;未定义任何用户则无认证。每个用户对象字段:
users:
# 管理员:明文密码 + 全权限
- username: admin
password: admin123
permissions: CRUD
# john:bcrypt 密码 + 专属目录
- username: john
password: "{bcrypt}$2y$10$zEP6oofmXFeHaeMfBNLnP.DO8m.H.Mwhd24/TOX2MWLxAExXi4qgi"
directory: /data/john
# 从环境变量注入用户名/密码
- username: "{env}ENV_USERNAME"
password: "{env}ENV_PASSWORD"
# 高级权限:规则覆盖
- username: basic
password: basic
permissions: CRUD
rules:
# 不能访问 {user}/some/file
- path: /some/file
permissions: none
# 可在 {user}/public/access/ 内 CRUD
- path: /public/access/
permissions: CRUD
用户字段详解
| 键 | 必填 | 说明 |
|---|---|---|
username | 是 | 用户名 |
password | 是 | 明文或 {bcrypt}...;支持 {env}VAR 从环境变量取 |
directory | 否 | 该用户专属根目录;不写用全局 directory |
permissions | 否 | 覆盖默认权限 |
rules | 否 | 覆盖/追加权限规则(依 rulesBehavior) |
password 写法
- 明文:
password: admin123 - bcrypt:
password: "{bcrypt}$2a$10$...",用webdav bcrypt <密码>生成(见安装篇)。 - 环境变量:
password: "{env}ENV_PASSWORD",程序运行时读取对应环境变量。
{env} 动态取值
username / password 均可写成 {env}ENV_VAR,从进程环境读取,避免敏感信息写死在配置文件中:
export ENV_USERNAME=demo
export ENV_PASSWORD=demo123
8. 环境变量映射(WD_ 前缀)
所有顶层配置项都可用环境变量覆盖,命名规则:WD_ + 配置项名全大写。例如:
WD_PORT=6066等价于port: 6066WD_ADDRESS=127.0.0.1等价于address: 127.0.0.1WD_TLS=true等价于tls: true
export WD_PORT=6065
export WD_ADDRESS=0.0.0.0
webdav -c /etc/webdav/config.yml
9. 配置文件优先级总结
flags(命令行) > 环境变量(WD_*) > 配置文件 > 内置默认值
--help 中 -a/-p/-c/-P/-t/--cert/--key 等 flag 优先级最高;未指定 flag 时看环境变量;再未设则看配置文件;最后落到默认值。
10. 权威示例:一份生产可用的配置
# /etc/webdav/config.yml
address: 0.0.0.0
port: 6065
tls: true
cert: /etc/webdav/cert.pem
key: /etc/webdav/key.pem
prefix: /
debug: false
noSniff: false
behindProxy: true
directory: /data
permissions: R
rulesBehavior: overwrite
log:
format: console
colors: true
outputs:
- stderr
cors:
enabled: true
credentials: true
allowed_hosts:
- '*'
listing:
enabled: true
hide_parent_dir: false
users:
- username: admin
password: "{bcrypt}$2a$10$Vytaibe9E8eRgXDGB9.DE.QqzsLrkUQsJ5QyukdIoiTXCTVVqwqdS"
permissions: CRUD
rules:
- path: /public/access/
permissions: CRUD
- username: bob
password: "{env}ENV_BOB_PASSWORD"
directory: /data/bob
permissions: CRUD
11. 常见问题
Q1:colors 与 colored 哪个对? 本项目 log 下颜色开关键为 colors(README 示例)。不同版本可能历史遗留 colored,以 webdav --help 与官方 README 为准。
Q2:全局 R、想让某个用户只能写某个目录? 设全局 permissions: R,该用户 permissions: CRUD + rules 限目录;或全局 CRUD + 用户 rules: [{path: /xxx, permissions: none}] 禁止。
Q3:directories 与 directory 能同时用吗? 不能,同一作用域下互斥。
Q4:环境变量传 true 的布尔值怎么写? WD_TLS=true、WD_DEBUG=false;字符串按原样拼接,如 WD_PREFIX=/dav.
12. 参考链接
- 官方 README(配置章节):
https://github.com/hacdias/webdav#configuration - 官方仓库:
https://github.com/hacdias/webdav - RFC 4918 WebDAV:
https://www.rfc-editor.org/rfc/rfc4918 - Docker 配置挂载:
https://hub.docker.com/r/hacdias/webdav