Ubuntu 22.04 安装 hacdias WebDAV 指南

在 Ubuntu 22.04 上通过官方二进制或 Go 源码编译两种方式安装 hacdias/webdav v5.17.0 单二进制 WebDAV 服务器,覆盖下载解压、权限配置、多用户认证、TLS 加密与 systemd 自启动与验证。

hacdias/webdavhacdias/webdav2026/10/06

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/