上篇文章介绍了如何用h5ai搭建资源存放箱,但是h5ai只能共享展示文件列表,并不具备管理文件的功能。
虽然可以通过SFTP上传和管理文件,域主自己也尝试了SSHFS-Win挂载VPS的目录,显然速度并不理想,其他的协议(如FTP、SMB)放在公网不安全、配置证书或VPN又相当麻烦,因此还是要搭建一个WebDAV服务。
关于上篇搭建h5ai的文章,请点击下方阅读:
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 能力为列出文件资源的列表在站点上共享