Ubuntu 22.04 安装 hacdias WebDAV 指南
在 Ubuntu 22.04 上通过官方二进制或 Go 源码编译两种方式安装 hacdias/webdav v5.17.0 单二进制 WebDAV 服务器,覆盖下载解压、权限配置、多用户认证、TLS 加密与 systemd 自启动与验证。
Ubuntu 22.04 安装 hacdias WebDAV 指南
目标:在 Ubuntu 22.04 服务器上,通过官方编译好的 Go 单二进制包(或 Go 源码编译)安装 hacdias/webdav v5.17.0 独立 WebDAV 服务器,实现文件共享、多用户认证(明文/ bcrypt)、细粒度权限(C/R/U/D)、目录隔离与 TLS 加密,并配置 systemd 随系统自启动。
hacdias/webdav 是一个用 Go 编写的、单静态二进制的开源 WebDAV 服务器,无运行时依赖、无需 Java/解释器/数据库,一个可执行文件即可对外提供基于 HTTP 1.1/2 的 WebDAV 文件存取服务。支持完整 WebDAV 方法(MKCOL/PUT/GET/COPY/MOVE/DELETE/PROPFIND/PROPPATCH/LOCK/UNLOCK),内置多用户认证、HTML 目录列表、CORS、细粒度权限规则与 TLS。
本章以 Ubuntu 22.04 LTS(jammy)为目标系统,经 wget 下载官方二进制即可完成安装。
1. 版本选型与下载
- 官方仓库:
https://github.com/hacdias/webdav - 官方下载页(Releases):
https://github.com/hacdias/webdav/releases - 本项目撰写时最新稳定版为 v5.17.0,x86_64 文件名
linux-amd64-webdav.tar.gz。
版本核实命令:
webdav version。架构与文件名对应:linux-amd64-webdav.tar.gz(x86_64)、linux-arm64-webdav.tar.gz(ARM64,如树莓派)。
确认架构后获取最新版本号(可选):
uname -m
# x86_64 → linux-amd64-webdav.tar.gz
curl -s https://api.github.com/repos/hacdias/webdav/releases/latest | grep tag_name
# "tag_name": "v5.17.0"
2. 基础环境准备
安装下载工具并创建目录:
sudo apt-get update
sudo apt-get install -y wget tar gzip
mkdir -p /usr/local/src /etc/webdav /data
/usr/local/src:存放下载包与解压内容/etc/webdav:配置文件目录/data:WebDAV 默认共享根目录
3. 下载并安装 WebDAV
cd /usr/local/src
wget https://github.com/hacdias/webdav/releases/download/v5.17.0/linux-amd64-webdav.tar.gz
若下载慢或失败,可在命令前加代理:
export http_proxy=http://<代理>:<端口> https_proxy=https://<代理>:<端口>。GitHub 在内网环境可能需要代理。
解压并查看内容:
tar xzf linux-amd64-webdav.tar.gz
ls -la
# total ...
# -rw-r--r-- 1 1001 1001 1097 ... LICENSE
# -rw-r--r-- 1 1001 1001 16781 ... README.md
# -rwxr-xr-x 1 1001 1001 12398752 ... webdav
安装到 /usr/local/bin 并验证:
sudo install -m 755 webdav /usr/local/bin/webdav
webdav version
# WebDAV version: 5.17.0
查看 --help:
webdav --help
实测输出:
If you don't set "config", it will look for a configuration file called
config.{json, toml, yaml, yml} in the following directories:
- ./
- /etc/webdav/
The precedence of the configuration values are as follows:
- flags
- environment variables
- configuration file
- defaults
Usage:
webdav [flags]
webdav [command]
Available Commands:
bcrypt Generate a bcrypt encrypted password
completion Generate the autocompletion script for the specified shell
help Help about any command
version Print the version number
Flags:
-a, --address string address to listen on (default "0.0.0.0")
--cert string path to TLS certificate (default "cert.pem")
-c, --config string config file path
-h, --help help for webdav
--key string path to TLS key (default "key.pem")
-p, --port int port to listen on (default 6065)
-P, --prefix string URL path prefix (default "/")
-t, --tls enable TLS
Use "webdav [command] --help" for more information about a command.
启动时若不指定
-c,程序将自动在./与/etc/webdav/下查找config.{json,toml,yaml,yml}。配置优先级:命令行 flags > 环境变量 > 配置文件 > 默认值。
4. 生成用户密码(bcrypt)
webdav bcrypt secret123
# $2a$10$Vytaibe9E8eRgXDGB9.DE.QqzsLrkUQsJ5QyukdIoiTXCTVVqwqdS
bcrypt 选项:-c, --cost(默认 10),cost 越高越慢越安全:
webdav bcrypt --help
# Generate a bcrypt encrypted password
# Usage:
# webdav bcrypt [flags]
# Flags:
# -c, --cost int cost used to generate password, higher cost leads to slower verification times (default 10)
# -h, --help help for bcrypt
5. 编写配置文件
在 /etc/webdav/config.yml 写入完整配置。下面示例覆盖 HT、目录列表、多用户(admin 全权限 / bob 独立目录 / readonly 受限)、TLS 关闭:
# /etc/webdav/config.yml
address: 0.0.0.0
port: 6065
# TLS:这里先关闭,后续步骤再开启
tls: false
cert: /etc/webdav/cert.pem
key: /etc/webdav/key.pem
# URL 前缀,默认 /
prefix: /
# 调试日志
debug: false
# 默认共享根目录
directory: /data
# 默认权限
permissions: CRUD
# HTML 目录列表
listing:
enabled: true
users:
# 管理员:全权限
- username: admin
password: admin123
permissions: CRUD
# 普通用户:bcrypt 密码,专属目录 /data/bob
- username: bob
password: "{bcrypt}$2a$10$Vytaibe9E8eRgXDGB9.DE.QqzsLrkUQsJ5QyukdIoiTXCTVVqwqdS"
directory: /data/bob
permissions: CRUD
# 只读用户:默认 R,但不能读 /secret.txt
- username: readonly
password: readonly123
rules:
- path: /secret.txt
permissions: none
密码可明文(
password: admin123)或 bcrypt(password: "{bcrypt}$2a$10$...")。生产建议 bcrypt。directory指定该用户专属根目录;不写则用全局/data。rules从后往前匹配,最后一个匹配生效。
6. 启动 WebDAV 服务
cd /data
webdav -c /etc/webdav/config.yml
确认监听:
sudo ss -tlnp | grep 6065
# LISTEN 0 ... :::6065 ... 2510/webdav
7. 验证功能
# 未认证 → 401
curl -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1:6065/
# 401
# 错误密码 → 401
curl -s -o /dev/null -w "%{http_code}\n" -u admin:wrong http://127.0.0.1:6065/
# 401
# OPTIONS → 查看 Allow / DAV 头
curl -s -u admin:admin123 -X OPTIONS -i http://127.0.0.1:6065/
# HTTP/1.1 200 OK
# Allow: OPTIONS, LOCK, DELETE, PROPPATCH, COPY, MOVE, UNLOCK, PROPFIND
# DAV: 1, 2, sabredav-partialupdate
# PROPFIND 列目录
curl -s -u admin:admin123 -X PROPFIND -H "Depth: 0" http://127.0.0.1:6065/
# PUT 上传
curl -s -u admin:admin123 -o /dev/null -w "%{http_code}\n" \
-T /etc/hostname http://127.0.0.1:6065/hostname.txt
# 201
# GET 下载
curl -s -u admin:admin123 http://127.0.0.1:6065/hostname.txt
# <你的主机名>
# DELETE 删除
curl -s -u admin:admin123 -o /dev/null -w "%{http_code}\n" \
-X DELETE http://127.0.0.1:6065/hostname.txt
# 204
再验证多用户目录隔离与 rules:
mkdir -p /data/bob
echo "bob secret" > /data/bob/bob.txt
echo "top secret" > /data/secret.txt
# admin 可见共享根下所有条目
curl -s -u admin:admin123 -X PROPFIND -H "Depth: 1" http://127.0.0.1:6065/ | grep -o "<D:href>[^<]*</D:href>"
# <D:href>/</D:href>
# <D:href>/secret.txt</D:href>
# <D:href>/docs/</D:href>
# <D:href>/bob/</D:href>
# ...
# readonly 访问被禁止的 /secret.txt → 403
curl -s -u readonly:readonly123 -o /dev/null -w "%{http_code}\n" \
-X PROPFIND -H "Depth: 0" http://127.0.0.1:6065/secret.txt
# 403
DIRB bob用户使用 bcrypt 密码secret123(对应第 4 步生成的哈希)。用户名密码务必与配置一致,否则返回 401。
8. 配置 TLS(HTTPS)
生成自签名证书:
cd /etc/webdav
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout key.pem -out cert.pem -subj "/CN=webdav.local"
以 HTTPS 启动(端口 6066):
webdav -c /etc/webdav/config.yml -p 6066 -t \
--cert /etc/webdav/cert.pem --key /etc/webdav/key.pem
验证:
curl -sk -u admin:admin123 -o /dev/null -w "%{http_code}\n" https://127.0.0.1:6066/
# 200
-k忽略自签校验;正式证书则无需-k。也可在配置文件中设tls: true并固定cert/key,直接webdav -c即为 HTTPS。
9. 配置 systemd 自启动
⚠️ 需在带 systemd 的真实 Ubuntu 机器上执行。精简/最小化系统若以非 systemd 作为 PID 1,请先切换为完整 systemd 环境或使用真机。
创建隔离运行用户并授权数据目录:
sudo useradd -r -s /sbin/nologin -d /data webdav
sudo chown -R webdav:webdav /data
创建服务单元:
sudo tee /etc/systemd/system/webdav.service >/dev/null <<'EOF'
[Unit]
Description=WebDAV Server (hacdias/webdav)
After=network.target
[Service]
Type=simple
User=webdav
Group=webdav
ExecStart=/usr/local/bin/webdav -c /etc/webdav/config.yml
Restart=on-failure
WorkingDirectory=/data
[Install]
WantedBy=multi-user.target
EOF
启动并设置开机自启:
sudo systemctl daemon-reload
sudo systemctl enable webdav
sudo systemctl start webdav
sudo systemctl status webdav
# ● webdav.service - WebDAV Server (hacdias/webdav)
# Active: active (running)
10. 以 Go 源码方式安装(替代方案)
Ubuntu 上还可直接用 Go 工具链编译安装(需已安装 Go,如 apt install golang-go):
# 安装 Go(如未安装)
sudo apt-get install -y golang-go
# 直接用 go install 拉取并安装(会放到 $HOME/go/bin/webdav)
go install github.com/hacdias/webdav/v5@latest
# 或克隆源码本地编译
git clone https://github.com/hacdias/webdav.git /usr/local/src/webdav
cd /usr/local/src/webdav
go build -o webdav .
sudo install -m 755 webdav /usr/local/bin/webdav
webdav version
# WebDAV version: 5.17.0
go install github.com/hacdias/webdav/v5@latest默认安装到$(go env GOPATH)/bin(通常是~/go/bin)。若想直接进 PATH,可将其加入~/.bashrc。
11. 常见问题
Q1:权限 R 导致写操作 403? 预期行为,改 permissions: CRUD。
Q2:GitHub 下载慢/失败? 加代理 export http_proxy=... https_proxy=...,或走镜像。
Q3:Error: unknown flag: --version? 用 webdav version(子命令)。
Q4:bob 用户登录 401? 确认用户名/密码与配置一致;bcrypt 密码要带 {bcrypt} 前缀。
12. 卸载
sudo rm -f /usr/local/bin/webdav
sudo systemctl stop webdav 2>/dev/null
sudo systemctl disable webdav 2>/dev/null
sudo rm -f /etc/systemd/system/webdav.service
sudo rm -rf /etc/webdav
# 按需清理共享数据
# sudo rm -rf /data
13. 参考链接
- 官方仓库:
https://github.com/hacdias/webdav - Releases:
https://github.com/hacdias/webdav/releases - WebDAV 规范(RFC 4918):
https://www.rfc-editor.org/rfc/rfc4918 - SabreDAV partial update:
https://sabre.io/dav/partialupdate/