搭建基于h5ai的文件共享空间:WebDAV篇

上篇文章介绍了如何用h5ai搭建资源存放箱,但是h5ai只能共享展示文件列表,并不具备管理文件的功能。

虽然可以通过SFTP上传和管理文件,域主自己也尝试了SSHFS-Win挂载VPS的目录,显然速度并不理想,其他的协议(如FTP、SMB)放在公网不安全、配置证书或VPN又相当麻烦,因此还是要搭建一个WebDAV服务。

关于上篇搭建h5ai的文章,请点击下方阅读:

搭建基于h5ai的文件共享空间:h5ai篇 – 景の域
最近重新弄了一下Minecraft的服务器,上次说到,HMCL启动器支持通过静态文件列表检查整合包完整性,实现自动更新的功能。
v1sta.xyz


Linux平台有许多WebDAV的服务端,Go、Rust等编写的二进制服务端,如Dave、Davrage,有PHP写的SabreDAV,有Docker运行的容器;一些私有云程序如Nextcloud、Rclone也内建了WebDAV的功能,甚至Nginx、Apache都可以通过模块支持简单的WebDAV协议……

域主在搭建WebDAV的时候,先后尝试了Dave和Davrage,下载了二进制文件,复制到 /usr/local 新建子目录,并用 ln -s/usr/bin 目录下创建软链接、自行编写Systemd Service系统服务,再用Nginx反代,但就是跑不起来……

[Unit]
Description=WebDAV Service
StartLimitIntervalSec=0
[Service]
Type=simple
Restart=always
RestartSec=1
User=root
ExecStart=/usr/bin/dave

Davrage可算作是Dave的改版,Dave使用yaml配置,而Davrage使用环境变量(Environment)运行,读取命令行参数或者env文件中的变量。

Davrage的更新时间比Dave晚一些。不过都卡在了用户验证的环节,而且没法被Windows系统自带的文件夹映射识别到……

[Unit]
Description=WebDAV Service
StartLimitIntervalSec=0
[Service]
Type=simple
Restart=always
RestartSec=1
User=root
ExecStart=/usr/bin/davrage
EnvironmentFile=/usr/local/davrage/env

尽管轻量小巧,既然不能用也不过是废柴一个(霖并感),逐放弃。


后来了解到了Rclone,虽然主要的功能是聚合挂载网络云盘映射到本地,但也可以运行兼容的WebDAV服务。

搭建WebDAV的过程中参考了这篇文章: Rclone搭建Webdav服务+Systemd保活+Nginx反代+CF加速一条龙 ,虽然也需要自己创建Systemd服务,至少可以正常运行了。

先创建单独的运行用户,通过wget下载rclone并解压,解压到用户目录下:

adduser webdav
su - webdav && mkdir rclone && cd rclone
wget https://downloads.rclone.org/rclone-current-linux-amd64.zip
unzip rclone-current-linux-amd64.zip && mv rclone-v1.62.0-linux-amd64/rclone ./ && rm -rf rclone-current-linux-amd64*

下面是Rclone的Systemd服务配置,需要指定运行参数、路径 (其中 [domain.ltd] 为网站目录的域名),并且单独创建htpasswd的密码文件。

[Unit]
Description=Rclone Webdav Service
After=network.target
[Service]
User=webdav
# Execute `systemctl daemon-reload` after ExecStart= is changed.
ExecStart=/home/webdav/rclone/rclone serve webdav /var/www/[domain.ltd]/htdocs --addr 127.0.0.1:5000 --htpasswd /home/webdav/rclone/htpasswd
[Install]
WantedBy=multi-user.target

在命令行中创建bcrypt格式的密码文件,其中 [username] 为用户名,可随意填写,随后根据交互式命令输入密码:

apt-get install apache2-utils
cd /home/webdav/rclone
touch htpasswd
htpasswd -B htpasswd [username]

保存以后重启一下systemd的daemon,再启用Rclone服务配置的自启动项:

systemctl daemon-reload
systemctl enable rclone
systemctl start rclone
systemctl status rclone

Nginx反代可以使用SSL,由于Rclone的WebDAV服务也附带一个简单的文件列表,建议配置额外的端口号或者子域名访问,不放在主要的443 server 配置中,避免安全性和配置冲突问题。

error_page 405 = @app;
location @app {
proxy_pass http://127.0.0.1:5000;
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 $http_host;
proxy_redirect off;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
location ~ .*\.(js|css)?$
{
expires 12h;
}
location ~ /.well-known {
allow all;
}
location / {
proxy_pass http://127.0.0.1:5000;
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 $http_host;
proxy_redirect off;
}

访问浏览器,输入webdav的地址,再输入访问的用户名和密码,即可访问rclone自带的索引列表界面:

使用资源管理器(Explorer)添加网络向导和映射网络驱动器也可以正常识别:

缩略图可以正常显示在映射启动器中:

至此,一个基于h5ai和WebDAV的文件共享空间,就搭建完成了。

不过也要想一个好名字……

让我这个域主,为这个共享空间命名吧,闭上眼随意思考一个名字来决定,它会暗示这个空间的存在感,也会暗示这个空间的能力……

文件!是文件的资源,让我为它命名,这个共享空间的名字是……

资源存放箱!File Carbinet 能力为列出文件资源的列表在站点上共享

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注