外挂NTFS盘用Docker部署NextCloud+Caddy反向代理及一系列问题的解决
开始
私有网盘不用多说是大部分人都需要的东西,对比了几个开源的网盘,seafile,nextcloud,owncloud等,最终还是选择部署nextcloud,首先从文件保存上来说nextcloud是不分块的原始文件,可能牺牲了一定的安全性和大文件分块上传的能力,但随时读盘浏览文件这个需求对我来说更加的重要。
另外nextcloud强大的插件功能以及多平台支持的便利性还是非常领先好用的。
我在部署前至少两个需求是要满足的,一是扩展硬盘是NTFS格式,主要考虑到家人使用也可以方便的在Windows上导出和处理部分图片及数据,二是文件是未加密或分块可读的,这点在nextcloud上天然满足。NTFS盘就相对会有一些问题。
下面主要是记录备忘一下在自有服务器上部署的过程。
这篇文章不太会纯粹的敲命令告诉你怎么部署,主要讲一些方法论,知其然也要知其所以然
Docker和非Docker方式
如果不用docker,在ubuntu下可以直接用snap包管理安装和更新nextcloud,其他linux发行版我没试过,可能需要下载安装。
snap安装命令:
|
|
直接安装需要用nextcloud.occ脚本配置一些参数选项,需要配置的参数有管理帐户,密码,可信域等,具体网上有不少资料可以搜索参考。
如果你的80端口被占用了,理论上用snap set nextcloud ports.http=8080
可以改非80的监听端口,但我试过貌似没生效。
所以主要还是详细说一下docker下部署nextcloud的一些问题及优化。
- docker pull最新版本
sudo docker pull nextcloud
- 映射到本地路径和端口号
sudo docker run -d --name nextcloud -p <your-port>:80 -v <your-path>:/var/www/html nextcloud
- 在浏览器中打开http://local:your-port,直接按步骤创建一个管理员帐户就ok了,默认是sqlite数据库,一般家庭用的话不会有太大的性能问题,如果有有性能需求的,可以用mysql,这个可以自行找资料设置,后期如果想换数据库,sqlite的数据也可以迁移到mysql上。
- 修改配置,还要解决几个无法使用的可能问题,首先要找到docker映射路径下的config/config.php
- 在ntfs格式存储的配置中会有如下的类似报错
错误
你的数据目录可被其他用户读取
请更改权限为 0770 以避免其他用户查看目录.
nextcloud是利用操作系统本身的机制来保证数据隔离的安全性
这样的问题是由ntfs下无法正常支持linux的权限机制。
以如下命令来挂载硬盘,可以解决root用户运行的容器下权限的问题,但是却给我们普通用户访问带来了障碍
sudo mount /dev/sd(x) /mnt/nextcloud -t ntfs -o umask=007,uid=0,gid=0
所以推荐改config.php的$CONFIG的array配置中加入'check_data_directory_permissions' => false,直接禁止掉检测目录权限问题
-
设置外部访问的可信域
'trusted_domains' => array ( 0 => 'xxx.yourdomain.xxx', ),
这里要填好自己申请的域名才能正常访问。 -
Nextcloud在17版本以上(本文写时最高版本20)对主机名和协议头做了更严格的检测,导致了反向代理配置http到https转移的失败,表现为登陆后在登陆页面无法正常跳转,有这样问题的这里需要加入设置
'overwriteprotocol' => 'https',
-
针对视频显示白板的问题,安装ffmpeg后开启视频的预览
- 进入容器
sudo docker exec -it nextcloud bash
- 安装ffmpeg
apt install ffmpeg
- config.php中加入配置项
1 2 3 4 5 6 7 8 9 10 11 12 13
'enabledPreviewProviders' => array ( 0 => 'OC\\Preview\\PNG', 1 => 'OC\\Preview\\JPEG', 2 => 'OC\\Preview\\GIF', 3 => 'OC\\Preview\\HEIC', 4 => 'OC\\Preview\\BMP', 5 => 'OC\\Preview\\XBitmap', 6 => 'OC\\Preview\\MP3', 7 => 'OC\\Preview\\TXT', 8 => 'OC\\Preview\\MarkDown', 9 => 'OC\\Preview\\Movie', ),
- 进入容器
-
安装smbclient开启外挂存储
- 在设置里面找到外部存储,外部存储可以挂载本地路径,支持SMB,WebDAV,FTP,SFTP等,甚至可以和其他部署的nextcloud组一个集群。
- 可能提示有samba的问题,同样进入docker容器,安装smbclient并配置即可
|
|
Caddy反向代理及配置Collabora协作文档
Collabora是一个很强大的在线文档,支持ms office文档格式,并且可以多人在线协作,这里说个题外话,nextcloud的应用商店因为众所周知的原因国内是访问不了的,所以我们一般用离线安装,离线安装也很简单,在nextcloud商店下载对应的安装包,离线解压到nextcloud/apps路径下,管理员账户再应用中启用对应的应用即可。我们对Collabora Online应用就可以这样来安装。
Collabora麻烦的地方在于光装个应用包并不能正常运行使用,还得部署一个自有的服务端。目前只看到有docker部署的方式。docker上的image对应的有一个collabora/code。
以下命令创建一个容器(密码域名需要自己修改):
sudo docker run -t -d -p 9980:9980 -e "domain=www\\.<yourdomain>\\.<xxx>" -e "username=admin" -e "password=123" --cap-add MKNOD collabora/code
创建好容器,需要配置一下反向代理,网上能搜索到的千篇一律的都是用nginix的配置,由于我是用caddy v1版本做的反向代理,这里给出caddy配置的方法(现在caddy已经到v2版本,新老版本改变很大,配置不兼容,此配置仅供参考)
|
|
另外要说明的是caddy v1得支持websocket插件,命令 caddy -plugins
如果other plugins中存在http.websocket就ok。
BTW,collabora的后台监控是这个地址 https://<your-collabora-domain>/loleaflet/dist/admin/admin.html
局域内网做域名劫持优化访问速度
我是以frp创建隧道的映射端口到内网的主机方式来访问nextcloud的,一般来这样操作也挺好用,但是为了规避备案等一系列麻烦的事,只能用国外的服务器,所以访问的延时还是比较高的。 为了达到低延时,高带宽的效果,其实如果在内网做一下域名劫持的话,接上家里的wifi以后,访问速度会有非常大的提升。(当然出了家里的网络,速度还是一个鸟样。) 域名劫持怎么做,这是个问题。
- 如果你有一个正常点的路由
恭喜你,先把内网主机的MAC地址和IP绑定,找到域名解析,DNS解析,自定义host此类名称之类的设置,简单的把域名和主机IP绑定即可。
- 如果你不幸像我一样用着tplink等路由这种功能半残的便宜货(无自定义host功能)
一个解决思路是可以从DHCP服务器来着手,如果DHCP服务器不能选DNS服务器的话,那就真的没办法了。 DHCP解析的DNS服务器可以指定内网一台可以提供dns server服务的主机,一般来说安装dnsmasq解析比较简单(如果指定nextcloud主机安装dnsmasq做dns server至少在ubuntu下可能会存在一些dns缓存问题,所以我没这么做)。 我在内网接了一台刷了潘多拉固件的旁路由,正好支持dnsmasq。设置如下:
打开dnsmasq.conf配置,加入如下配置项(注意域名和ip都是要自己填的啊,<>内都是代指)
listen-address=0.0.0.0
address=/<your-domain>/<ip-host>
address=/<your-collabora-domain>/<ip-host>
server=/#/119.29.29.29#53
最后一项server是DNSPod的DNS服务,换其他的DNS服务也一样。
再外网的端口转发加入下面的配置
然后主路由的DNS Server填入旁路由的IP即可
通过这样的方式,我们内网接入的app或者网页登陆都会走局域网,可以大大加快我们的访问速度
- collabora office的进一步优化
尝试在nextcloud主机上,在/etc/hosts中,把nextcloud的域名和collabora office的域名改为127.0.0.1,强制访问本机即可加速。
其他有意思的事
nextcloud的app市场有很多有意思的东西:
- 多平台多浏览器同步收藏夹:安装Bookmarks插件,浏览器中安装floccus bookmarks sync插件,配置好后,在多平台上都可以同步起来,比如在桌面上用edge,chrome,firefox之类,手机上可以安装kiwi browser,都可以用这个插件来随时保持收藏夹同步。
- 发布静态页面网站:类似githubpages的东西,通过markdown来编译生成静态页面发布,这个叫做Pico CMS插件,可以自行研究一下怎么配置。