This page looks best with JavaScript enabled

外挂NTFS盘用Docker部署NextCloud+Caddy反向代理及一系列问题的解决

 ·   ·  ☕ 7 min read  ·  ✍️ oser

开始

私有网盘不用多说是大部分人都需要的东西,对比了几个开源的网盘,seafile,nextcloud,owncloud等,最终还是选择部署nextcloud,首先从文件保存上来说nextcloud是不分块的原始文件,可能牺牲了一定的安全性和大文件分块上传的能力,但随时读盘浏览文件这个需求对我来说更加的重要。

另外nextcloud强大的插件功能以及多平台支持的便利性还是非常领先好用的。

我在部署前至少两个需求是要满足的,一是扩展硬盘是NTFS格式,主要考虑到家人使用也可以方便的在Windows上导出和处理部分图片及数据,二是文件是未加密或分块可读的,这点在nextcloud上天然满足。NTFS盘就相对会有一些问题。

下面主要是记录备忘一下在自有服务器上部署的过程。

这篇文章不太会纯粹的敲命令告诉你怎么部署,主要讲一些方法论,知其然也要知其所以然

Docker和非Docker方式

如果不用docker,在ubuntu下可以直接用snap包管理安装和更新nextcloud,其他linux发行版我没试过,可能需要下载安装。

snap安装命令:

sudo snap install nextcloud

直接安装需要用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
  1. 在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,直接禁止掉检测目录权限问题
  1. 设置外部访问的可信域 'trusted_domains' => array ( 0 => 'xxx.yourdomain.xxx', ), 这里要填好自己申请的域名才能正常访问。

  2. Nextcloud在17版本以上(本文写时最高版本20)对主机名和协议头做了更严格的检测,导致了反向代理配置http到https转移的失败,表现为登陆后在登陆页面无法正常跳转,有这样问题的这里需要加入设置'overwriteprotocol' => 'https',

  3. 针对视频显示白板的问题,安装ffmpeg后开启视频的预览

    • 进入容器 sudo docker exec -it nextcloud bash
    • 安装ffmpeg apt install ffmpeg
    • config.php中加入配置项
    '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',
     ),
    
  4. 安装smbclient开启外挂存储

    • 在设置里面找到外部存储,外部存储可以挂载本地路径,支持SMB,WebDAV,FTP,SFTP等,甚至可以和其他部署的nextcloud组一个集群。
    • 可能提示有samba的问题,同样进入docker容器,安装smbclient并配置即可
apt install smbclient libsmbclient-dev
pecl install smbclient
docker-php-ext-enable 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版本,新老版本改变很大,配置不兼容,此配置仅供参考)

<your-collabora-domain> {
     proxy /loleaflet https://127.0.0.1:9980 {
       insecure_skip_verify
       transparent
     }
     proxy /hosting/discovery https://127.0.0.1:9980 {
       insecure_skip_verify
       transparent
     }
     proxy /lool https://127.0.0.1:9980 {
       insecure_skip_verify
       transparent
       websocket
     }
     proxy /hosting/capabilities https://127.0.0.1:9980 {
        insecure_skip_verify
        transparent
     }
 }

另外要说明的是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市场有很多有意思的东西:

  1. 多平台多浏览器同步收藏夹:安装Bookmarks插件,浏览器中安装floccus bookmarks sync插件,配置好后,在多平台上都可以同步起来,比如在桌面上用edge,chrome,firefox之类,手机上可以安装kiwi browser,都可以用这个插件来随时保持收藏夹同步。
  2. 发布静态页面网站:类似githubpages的东西,通过markdown来编译生成静态页面发布,这个叫做Pico CMS插件,可以自行研究一下怎么配置。
Share on

oser
WRITTEN BY
oser
愿我的狗子在天堂也能每天开心咧嘴笑