关于对Docker拉起的Seafile配置Webdav服务的踩坑研究


标题: 为Seafile服务启用Webdav服务配置流程
创建日期: 2023-06-12
Tags: [软件/云服务器/宝塔面板,腾讯云,运维,seafile,云盘,webdav]
专辑: 云路
章节序号: 03
状态: 实践
来源: 社区不让放链接

学习总结:

这篇在实战中完成了Seafile服务器启用Webdav服务的流程,并对可能踩坑的各个环节予以说明。如果直接按照官方文档以Docker方式部署Seafile后再进行配置Webdav服务极有可能绕路踩坑。经过一个通宵数小时的研究,我才完成了相关的配置。我把这个过程写在这里,希望对入门的Seafile用户有所帮助。
必须声明,我不是专业的运维,只是一个业余玩家,很多猜想和解释未必正确,但无论如何,我完成了我的服务器配置。

为Seafile服务启用Webdav服务配置流程

若Seafile服务已经完成安装正常运行

那么需要在此基础上开启Webdav服务的流程如官网说明文档所示。
由于社区不支持放链接,对官方文档配置指南的内容引用在这里略过。

然而,这个描述指的是当nginx不在镜像当中,直接提供域解析时的方法。但使用docker运行的Seafile服务使用的Nginx是封装在镜像当中的。
服务器的实际运行过程为:
服务器收到端口A的请求,按照docker注册的端口映射,将A端口消息转发给Docker映射的端口B。
在本文的案例中,这里就是把81转发给了docker的80端口。
Docker检查自身正在运行的服务,哪个注册了端口B
发现是Seafile服务下的Nginx注册了端口B,消息转发给Nginx处理。
nginx就像处理普通的Web页面(80端口)请求一样,于是分析了请求地址,发现域是Seafdav(location /seafdav)
于是Nginx按照location /seafdav的配置,将消息转发给了本机的端口C
在上面的配置里,就是转发给自己的Docker大哥,并表示找到端口8080
然后Docker检查发现8080端口是Webdav服务注册的,于是转发给Webdav处理,完成消息传送。
如果按照官方文档的做法,配置完成Seafiledav.conf和seafile.Nginx.conf后,直接浏览器访问8080是会被拒绝的。因此此时服务器没有注册8080端口的映射
以上是第1个坑

如果此时从外部访问 服务器:端口C,则会收到可能会收到unexpected response 405 not allowed错误。百度搜索大部分说这是nginx不支持静态网页使用post方法,解决办法是修改Nginx配置,专门处理405情况。然而实际上问题不是在这里,而是上文提到的端口C没有被注册映射。如果照着这里去修改就是错的。
这是第2个坑

搞明白原因后,就知道解决办法是必须系统中注册一个端口,将消息映射给docker中的seafile中的Nginx服务。而此时docker镜像已经配置运行了,需要修改容器的配置文件,以便让Docker在加载容器时,向系统注册一个端口映射进行监听。而这个配置文件并不好找。
方法可以参考这里docker容器增加端口映射最佳实践(修改配置文件方式) (社区不让放链接),重点是找到hostconfig.json和config.v2.json。由于每个容器都有自己的文件夹,新手也可能会蒙。
这是第3个坑

修改hostconfig.json和config.v2.json后,反复实验还是失败。然后发现修改这东西需要先关闭Docker服务,否则文件是被锁定无法保存的。

这是第4个坑。

使用命令service docker stop 停止docker服务后,反复修改还是无法保存。然后发现开启了服务监控,一旦docker被终止了就自动重新拉起,服务没有被真正停止,所以文件无法修改保存。
这是第5个坑

解决好Docker服务的停止以后,开始修改容器配置文件。这一部非常不好操作,一是需要同步配合修改好webdav和nginx配置文件,端口逻辑顺序要对。我花了很大功夫才理清这个逻辑顺序。任何一处端口不正确都无法获得正确结果。然后格式要对,文本文件存储的Json没有校验功能。一旦修改错误,可能会对容器运行产生影响,比如容器消失之类的。
这是第6个坑

注意的是,如果安全按照官方文档,在使用docker-compose拉起Seafile镜像时,配置的端口映射为80:80,那么在第1个坑处就能看到正确的结果。但是,实际上由于服务器可能需要其他的Web服务,因此并不适宜直接由Docker注册80端口映射给seafile。比如,我就是配置为81:80,通过xx.xx.xx.xx:81来访问Seafile的网页。
而一旦最初配置不是80::80,就非常容易从第1个坑踩到第6个坑。所以其实这里是隐藏的第0个坑

值得注意的是,其实理清了原理之后,就会明白饶了很大的圈子。docker已经向服务器注册了81端口转发至80,并且由Seafile下的Nginx处理docker的80端口收到的消息,那么,浏览器访问xx.xx.xx.xx:81实际上就是等于访问了Nginx的80(而80端口就是正常的Web服务端口,可省略,等于xx.xx.xx.xx),此时nginx再按照网页访问的处理解析网址seafdav,按照配置转发给docker的8080,由docker转发给webdav处理即可。
所以如果在第1个坑时知道用xx.xx.xx.xx:81/seafdav来访问也能获得正确结果,但这让新手与官方文档提供的两种访问方式说明xx.xx.xx.xx:8080/seafdav和xx.xx.xx.xx/seafdav产生混淆,非常不容易想到。

经过重重踩坑后,我发现最方便的解决办法,实际上是通过在docker拉取镜像完成容器初始化配置的时候,就把端口映射做好。这样一来,整个过程只需要几分钟。

若Seafile服务尚未安装

采取以下步骤进行可以极大简化配置流程。

1. 在服务器安装宝塔面板,并完成宝塔面板的初始配置,登录宝塔面板。

2. 使用宝塔面板自带的docker管理功能安装Seafile镜像

2.1. 配置Docker-compose模板

在宝塔面板中选择【docker】,选择compose面板,添加compse模板,把seafile网站上提供的Compose.yml文件的内容复制进去。
然后对照修改yml文件中的以下选项:

  • MySQL root 用户的密码 (MYSQL_ROOT_PASSWORD and DB_ROOT_PASSWD)
  • 持久化存储 MySQL 数据的 volumes 目录 (volumes)
  • 持久化存储 Seafile 数据的 volumes 目录 (volumes)
  • 服务端口(Port=80:80,应当修改为81:80等其他端口,80端口已经被占用。)
  • 注意!这里强烈建议增加一个端口映射,直接将Webdav需要的端口映射配置到容器当中!
  • 在“- "81:80""下面增加一行:
	- "8083:8083"
  • 管理员用户名和密码
seafile:
...
environment:
...
- SEAFILE_ADMIN_EMAIL=me@example.com
- SEAFILE_ADMIN_PASSWORD=a_very_secret_password
- ...
  • 服务器域名。如果直接访问IP地址则应该是: SEAFILE_SERVER_HOSTNAME=xx.xx.xx.xx:81

2.2 加载镜像

在宝塔面板中选择【docker】,选择【添加容器】,选择【容器编排】,选择制定好的compose模板(即配置好的.yml文件)。运行。
如果运行正常,结束后docker中会增加3个容器,分别是Seafile-memcached,Seafile-mysql和Seafile。
【背景知识】

docker-compose教程(安装,使用, 快速入门)_pushiqiang的博客-CSDN博客(社区不让放链接)
Docker Compose 配置文件 docker-compose.yml 详解_BUG弄潮儿的博客-CSDN博客(社区不让放链接)
Docker 部署 Seafile 服务_seafile docker_晚熟的人_杜小杜的博客-CSDN博客(社区不让放链接)
mariaDB_百度百科 (baidu.com)(社区不让放链接)-

3. 配置开启Webdav服务

3.1 配置Webdav服务

找到Seafile的存储卷。按照上面的compose装载镜像的话,应该在/opt/seafile-data/seafile/conf下的seafdav.conf。
在宝塔面板中选择【文件】,找到文件双击打开编辑,配置以下参数即可:

	[WEBDAV]
	enabled = true
	port = 8083
	fastcgi = true
	share_name = /seafdav

enabled =true 表示开启Webdav服务
port =8083 是webdav服务的端口
fastcgi = true 表示启用fastcgi。注意,根据seafile社区一个答案指出,在Docker中运行的Seafile服务只能使用fastcgi方式。经测试并非如此。配置为fastcgi = false后依然在网页端和客户端上正常访问。Seafile官方文档说,7.1版本以后不再支持Fastcgi而必须使用Wsg。
share name = /seafdav 是用于指定调用Webdav的域,需要与nainx的配置关联起来。

3.2 配置nginx服务

编辑/opt/seafile-data/nginx/conf/seafile.nginx.conf文件,找到 location /seafdav域进行配置。
一般地,只需要修改:
proxy_pass的值为

proxy_pass http头://127.0.0.1:8083/seafdav;http头://127.0.0.1:8083/seafda

即可。

4. 开启服务器端口

在腾讯云的服务器控制面板【安全】选项卡中添加规则,添加允许端口8083,TCP协议。

5. 运行完整服务并测试

在宝塔控制面板中选择【docker】,对seafile服务进行重启。
在宝塔控制面板中选择【安全】,添加8083,如果看到状态为“正常”,表明端口已经启用监听。

在浏览器或客户端中访问 //xx.xx.xx.xx:8083/webdav/ 提示输入用户名和密码,表明服务已经运行成功。

尚未解决的问题

1. https问题

安卓在某个版本后,默认配置不允许向外发送未经加密的明文连接。软件可能会在运行中报错如:

CLEARTEXT communication to “ “ not permitted by network security policy

即是该问题。解决方法是要么服务器端提供Https服务(这是一个坑),要么修改安卓端的配置允许未加密明文连接(这是另一个坑)。

参考文献

社区不让放链接

docker 镜像中的nginx webdav配置默认是有的,直接配置开启就能使用

还是很麻烦,发现没法注销,而且根目录会识别不对,就是根目录下点击子目录会默认少加/seafdav 导致识别404 要手动加上/seafdav/xxx才能正常访问,不知道怎么能解决这个错误

1 个赞

今天也发现这个问题,还好只影响网页端

老哥您好,在您后部分的教程中
3.1 部分 share_name = /seafdav
5.0部分,访问 //xx.xx.xx.xx:8083/webdav/ 是否应该是访问 //xx.xx.xx.xx:8083/seafdav/

不知道,这文档写完以后基本上忘干净了。你自己试试呗,反正很简单。