上一篇写了 SSH 登录服务器和安装 1Panel 面板。
装好面板之后,服务器就不只是一个“能连上的机器”了,后面就可以开始放一些真正有用的小服务了。
这一篇先写一个比较轻量、但我觉得很实用的东西:WebDAV。
简单来说,WebDAV 可以理解成一个可以通过网络访问的文件目录。它不一定适合当完整网盘来用,但很适合做一些小型配置文件的同步。
比如多个设备之间同步软件设置、同步一些本地配置、保存小文件,都会比较方便。
这篇主要包括:
- 从零构建一个 WebDAV Docker 镜像
- 在 1Panel 上部署这个 Docker 服务
- 给 WebDAV 开启反向代理和 HTTPS
- 举几个 WebDAV 在同步配置中的实际用途
一、为什么要自己搭 WebDAV
其实 WebDAV 不一定要自己从零搭。
如果只是想要一个“能同步文件”的东西,也可以直接使用一些现成工具,比如:
AList
Nextcloud
SFTPGo
可挂载 WebDAV 的网盘服务
这些工具功能会更多,也更接近完整网盘。
但是这次我不想搞得太复杂,只需要一个能放配置文件的小空间,所以就直接用 Apache httpd 自己构建一个简单的 WebDAV 服务。
好处是比较轻量,结构也清楚。
缺点也很明显:它不是完整网盘,没有复杂的用户管理,也没有特别丰富的网页端功能。
所以它更适合用来同步配置文件,而不是拿来当大型文件存储。
二、准备 Dockerfile
先准备一个 Dockerfile,用 Apache httpd 开启 WebDAV 模块。
这里注意,下面的域名、用户名、密码都只是示例,实际使用时换成自己的。
FROM httpd:2.4
RUN sed -i \
-e 's/^#LoadModule dav_module/LoadModule dav_module/' \
-e 's/^#LoadModule dav_fs_module/LoadModule dav_fs_module/' \
-e 's/^#LoadModule auth_digest_module/LoadModule auth_digest_module/' \
-e 's/^#LoadModule auth_basic_module/LoadModule auth_basic_module/' \
-e 's/^#LoadModule authn_file_module/LoadModule authn_file_module/' \
/usr/local/apache2/conf/httpd.conf
RUN mkdir -p /usr/local/apache2/var /var/lib/dav/data \
&& printf '%s\n' \
'ServerName webdav.example.com' \
'' \
'DavLockDB "/usr/local/apache2/var/DavLock"' \
'' \
'Alias /dav "/var/lib/dav/data"' \
'' \
'<Directory "/var/lib/dav/data">' \
' Dav On' \
' Options Indexes FollowSymLinks' \
' IndexOptions Charset=utf-8' \
'' \
' AuthType Basic' \
' AuthName "WebDAV"' \
' AuthUserFile "/user.passwd"' \
'' \
' Require valid-user' \
'</Directory>' \
> /usr/local/apache2/conf/extra/webdav.conf \
&& echo 'Include conf/extra/webdav.conf' >> /usr/local/apache2/conf/httpd.conf
这里简单解释一下:
dav_module 和 dav_fs_module 是 WebDAV 相关模块。auth_basic_module 和 authn_file_module 用来做用户名密码验证。/var/lib/dav/data 是实际存放文件的目录。/dav 是 WebDAV 的访问路径。
也就是说,之后访问的地址大概会是:
https://webdav.example.com/dav/
当然,这里的 webdav.example.com 要换成自己的域名。
三、准备用户名和密码文件
上面的配置里有一行:
AuthUserFile "/user.passwd"
这说明 WebDAV 登录时会读取 /user.passwd 这个文件。
我们可以用 htpasswd 生成用户名和密码。
比如用户名是 webdav_user,可以执行:
docker run --rm httpd:2.4 htpasswd -Bbn webdav_user "这里换成你的强密码" > user.passwd
生成之后,会得到一个 user.passwd 文件。
这个文件后面需要挂载到容器里面。
这里建议密码尽量复杂一点,不要使用常用密码。因为 WebDAV 后面是要暴露到公网的,弱密码风险比较高。
四、准备 docker-compose.yml
接下来写一个 docker-compose.yml。
比如可以这样:
services:
webdav:
build: .
container_name: webdav
restart: unless-stopped
ports:
- "127.0.0.1:8088:80"
volumes:
- ./data:/var/lib/dav/data
- ./user.passwd:/user.passwd:ro
这里有几个地方需要注意。
第一,./data 是实际存放 WebDAV 文件的目录。
第二,./user.passwd 是刚刚生成的密码文件。
第三,端口这里写的是:
127.0.0.1:8088:80
意思是只把服务暴露在服务器本机的 8088 端口上,而不是直接暴露到公网。
之后我们会通过 1Panel 的反向代理访问它。
这样做的好处是:外部用户不能直接访问 服务器IP:8088,只能通过配置好的域名和 HTTPS 入口访问。
五、在 1Panel 中部署 Docker 服务
接下来进入 1Panel。
可以在“容器”或者“应用 / 编排”相关的位置,新建一个 Compose 项目。
大概流程是:
- 创建一个项目目录
- 上传或写入 Dockerfile
- 上传或写入 docker-compose.yml
- 上传 user.passwd 文件
- 创建 data 目录
- 启动 Compose 项目
如果一切正常,服务启动后,可以在容器列表里看到 webdav 容器。
如果启动失败,可以先看日志。
常见问题一般是:
Dockerfile 路径不对
user.passwd 没有挂载成功
data 目录权限不对
端口被占用
YAML 缩进写错
如果容器已经正常运行,理论上在服务器内部访问:
http://127.0.0.1:8088/dav/
就已经是 WebDAV 服务了。
不过外部还不能直接访问,因为我们还没有配置反代。
六、在 1Panel 中开启反向代理
接下来进入 1Panel 的“网站”功能。
如果还没有安装 OpenResty,需要先按提示安装。
然后新建网站,类型选择“反向代理”。
可以大概这样填写:
主域名:
webdav.example.com
代理地址:
http://127.0.0.1:8088
创建之后,再给这个网站申请 HTTPS 证书。
证书申请成功后,建议开启强制 HTTPS。
最终 WebDAV 的访问地址就是:
https://webdav.example.com/dav/
这里有一个容易踩坑的地方:
反代地址只需要写到端口,比如:
http://127.0.0.1:8088
不要把 /dav/ 也写到反代地址里。
因为 /dav/ 是 Apache WebDAV 自己配置出来的路径,客户端连接时再填完整路径即可。
七、测试 WebDAV 是否正常
配置完成后,可以先用浏览器打开:
https://webdav.example.com/dav/
浏览器会弹出用户名和密码验证。
输入刚刚设置的 WebDAV 用户名和密码,如果能看到目录列表,基本就说明服务正常了。
也可以用支持 WebDAV 的客户端测试。
如果出现连接失败,常见排查顺序是:
- 域名是否解析到服务器 IP
- 1Panel 反向代理是否创建成功
- HTTPS 证书是否正常
- WebDAV 容器是否正在运行
- 容器端口是否是
127.0.0.1:8088:80 - 用户名密码文件是否挂载正确
- 访问路径是否写成了
/dav/
很多时候不是 WebDAV 本身的问题,而是路径、反代、端口其中一个地方没对上。
八、WebDAV 可以用来同步什么
WebDAV 最大的用途,不一定是存大文件,而是同步“小而重要”的配置。
比如我现在比较倾向于把它当成一个私人配置同步空间。
1. 同步 Netcatty 的设置
上一篇写 SSH 的时候用到了 Netcatty。
如果多台电脑都在用 SSH 客户端,那么主机列表、终端配置、连接设置这些东西就有同步需求。
这时 WebDAV 就可以作为一个配置同步后端。
大致思路是:
在 Netcatty 里找到 Cloud Sync / WebDAV 相关设置
填入 WebDAV 地址
输入用户名和密码
测试连接
保存同步配置
WebDAV 地址类似:
https://webdav.example.com/dav/netcatty/
这里我建议不同软件使用不同目录,不要都堆在根目录下。
比如 Netcatty 单独放在 /dav/netcatty/,后面其他软件再开其他目录。
2. 同步 CC Switch 的配置
如果使用 CC Switch 管理一些模型服务商、CLI 配置、Provider 信息,也会有多设备同步的需求。
这类配置本身通常不大,但如果每台电脑都重新填一遍,会比较麻烦。
这时也可以给 CC Switch 单独开一个 WebDAV 目录:
https://webdav.example.com/dav/ccswitch/
这样多台设备之间就可以尽量保持同一套配置。
不过这里也要注意:如果配置里包含 token、key、服务商密钥之类的信息,一定要确认软件本身的同步方式是否安全,并且 WebDAV 密码也要足够强。
3. 同步梯子的本地设置
还有一些本地代理工具、订阅转换工具、规则配置,也可能会有跨设备同步需求。
比如:
节点分组规则
本地配置模板
订阅转换配置
规则集备份
自定义脚本
这类东西一般不大,但手动复制很烦。
可以放到类似这样的目录:
https://webdav.example.com/dav/proxy-config/
这样换电脑、重装系统,或者多设备共用时,就不用到处找配置文件了。
当然,涉及代理配置时也要注意,不要把敏感订阅链接、token、个人节点信息直接公开暴露。
WebDAV 是自己的同步空间,不是公开网盘。
九、几个安全建议
WebDAV 虽然方便,但毕竟是暴露到公网的服务,所以还是要稍微注意一下安全。
建议至少做到这几件事:
- 一定要开 HTTPS
- 不要使用弱密码
- 不要把端口直接暴露到公网,尽量走反向代理
- 不同软件尽量分目录存放
- 不要在里面放特别敏感、无法恢复的唯一文件
- 重要配置最好本地也留备份
另外,如果只是自己使用,不建议开放匿名访问。
上面的配置已经要求用户名和密码登录,一般个人使用就够了。
十、总结
到这里,一个简单的 WebDAV 服务就搭好了。
这次的思路大概是:
先用 Dockerfile 构建一个 Apache WebDAV 镜像
再用 1Panel 部署 Docker 服务
然后通过 1Panel 反向代理绑定域名和 HTTPS
最后把它作为小型配置同步空间使用
它不一定适合当完整网盘,但是很适合做“配置同步中转站”。
比如 SSH 客户端配置、CC Switch 配置、本地代理工具配置、一些小脚本和规则文件,都可以放在这里同步。
服务器折腾到这里,就已经不只是“开了一台机器”了,而是开始变成一个自己的小型基础设施。
后面如果继续写的话,可以再折腾一点更实际的东西,比如部署 Vaultwarden、搭个人网站、做文件管理,或者给这些服务统一配置 HTTPS 和反向代理。
反正服务器已经在那了,不多跑点东西总感觉亏了 x
