前言
其实一直想写个docker版nextcloud的搭建教程,原因是每次重新部署的时候都要折腾很久,细节太多根本记不住,但是又因为实在是太麻烦,要写的话要写很多,实在是没什么心情和动力主动去折腾。不过这次机会终于来了,就在昨天,想着nextcloud好久没升级了,直接就docker pull linuxserver/nextcloud,然后就rebuild了,然后果不其然:
好吧,这也不是第一次了,linuxserver/nextcloud版本的升级如果跨了大版本就容易出各种问题,干脆趁这个机会把nextcloud也从macmini搬到inter mini主机算了,所以就有了这篇文章。
注:其实,部署nextcloud还是使用docker compose方式更简单,不过基于我以前说过的原因,为了利旧已有容器(mariadb,redis),我更喜欢使用docker run的方式,如果大家喜欢简单的话,更推荐docker compose的方式。
创建并初始化mariadb数据库
nextcloud需要使用数据库,可选的有SQLite、mariadb、PostgreSQL,大家可以根据自己的使用习惯来进行选择,我其他的应用mariadb用得的比较多,所以有现成的,就直接选择mariadb了(mysql也可以,但是有选择的情况下永远优先mariadb)。
因为我是采用docker run方式部署,所以需要手动创建mariadb数据库并进行初始化配置(如果有现成的mariadb就直接初始化即可),创建新mariadb数据库的流程建议如下:
新建public-net网桥(可选)
docker network create public-net
注:
这一步并不是必须的,但是因为在mariadb容器(还有后面的redis容器)和nextcloud容器里都需要引用public-net这一非默认bridge,从而达到nextcloud用容器名直接访问mariadb的目的,所以需要提前创建(如果有现成的其他非默认bridge也可以利旧)。
其实在nextcloud里用–link参数直接链接mariadb也能达到一样的目的,但是为了以后容器多了方便管理和运维(例如创建不同的bridge用以连接不同区域的容器),尽量不要使用–link参数,因为容器多了以后到处链接有可能把自己搞晕,不便于运维,所以最好从一开始就养成使用–net参数的良好习惯。
新建mariadb数据库(可选)
如果环境中没有mariadb数据库容器或者不想利旧已有的,则需要新建。
创建宿主机上需要挂载到mariadb容器中的目录
mkdir -p /docker/mariadb/db
创建mariadb容器
docker run格式搭建mariadb数据库的命令如下:
docker run --name=mariadb01 -d --restart=always \
--net=public-net \ #指定mariadb容器使用public-net bridge,需要和后面的nextcloud一样
-p 3306:3306 \ #映射宿主机的3306端口到容器的3306端口
-v /docker/mariadb/db:/var/lib/mysql \ # 挂载前面创建的宿主机目录到容器内部指定目录
-e MARIADB_ROOT_PASSWORD=123 \ #指定数据库root用户对应的密码,这个大家自行修改
mariadb:10.11
初始化mariadb数据库
具体请参考我另一篇文章:奇技淫巧系列 新建空数据库以及给对应用户赋予权限,下文中假定初始化后库名称、对应的用户名和密码均为”nextcloud”。
部署nextcloud
预部署nextcloud
先用最简单的命令创建nextcloud:
docker run --name=nextcloud -d linuxserver/nextcloud
然后将容器内部的config、app、data这三个目录拷贝到宿主机的/docker/nextcloud/目录中:
docker cp nextcloud:/config /docker/nextcloud
docker cp nextcloud:/app /docker/nextcloud
docker cp nextcloud:/data /docker/nextcloud
这么做的目的是将正常部署nextcloud所需要的这几个文件夹的内容先拷贝出来,因为如果直接用-v参数将宿主机上的空文件夹挂载到容器内部,容器根本就起不来。
删除容器:
docker stop nextcloud
docker rm nextcloud
正式部署nextcloud
docker格式命令如下:
docker run --name=nextcloud -d --restart=always \
--net=public-net \ #和mariadb容器连接在同一个bridge
-p 9010:80 \ #映射宿主机9010端口到容器的http 80端口,大家根据自己实际环境修改端口
-e TZ=Asia/chongqing \ #设置容器时区
-v /docker/nextcloud/app:/app \ #将前面3个从容器内部复制到宿主机的文件夹分别映射到容器内部的指定文件夹
-v /docker/nextcloud/data:/data \
-v /docker/nextcloud/config:/config \
linuxserver/nextcloud
注:还有两个参数-e PUID=xxx
和-e PGID=xxx
是可选参数,如果因-v
参数引发了权限问题可以考虑使用(如果没权限问题就不要用了,比如我,不用还好,用了容器直接访问不了。。),具体的PUID和PGID值由id username
命令获得,如下:
配置nextcloud
初始化nextcloud
使用http://宿主机IP:9010
访问nextcloud:
注:后续要正常安装推荐的app,需要有科学或者魔法的环境,否则就只能后面来手动安装。
初始化成功:
修改默认语言
搞定:
允许使用域名方式访问
nextcloud同wordpress一样,也是会锁定初始化时候使用的访问地址的,比如我们在上一节是用http://宿主机ip:9010
来初始化的,那当我们通过反向代理想要使用nextcloud.example.com
域名方式来访问的时候,就会出现以下情况:
它会告诉我们是使用不受信任的域名来访问的,解决办法就是修改config/config.php文件。
编辑宿主机文件/docker/nextcloud/config/www/nextcloud/config/config.php:
vim /docker/nextcloud/config/www/nextcloud/config/config.php
默认是红框中这样的:
这时候有下面两种格式的修改方式:
格式1
'trusted_domains' =>
array (
0 => '192.168.1.10:9010',
1 => 'nextcloud.example.com',
),
格式2
'trusted_domains' =>
[
'192.168.1.10:9010',
'nextcloud.example.com'
],
注意:格式2′nextcloud.example.com‘ 后面没有,
而格式1有。
修改完成后保存config.php并重启nextcloud容器,即可使用域名方式登录。
注:反向代理的具体配置可以参考我的另外两篇文章:docker系列 使用docker基于NPM搭建自己的反向代理和linux面板系列 配置反向代理并使用非443端口进行发布。
使用redis优化nextcloud性能
其实到这里为止,nextcloud已经可以使用了,不过嘛,我们可以通过一些后续操作来优化nextcloud的性能,提高使用的体验。
部署redis容器:
docker run --name redis -d --restart=always --net=public-net -p 6379:6379 redis
编辑config.php文件,找到如下内容:
将红框中的
APCu
改为Redis
并添加redis缓存服务器:
'memcache.locking' => '\\OC\\Memcache\\Redis', #将文件锁改为redis缓存文件锁
'redis' => #指定redis缓存服务器的地址和端口
array (
'host' => 'redis',
'port' => 6379,
),
如下图:
保存修改后重启nextcloud容器即可。
安全与优化警告
在管理设置的概览里面,会有一些安全警告:
这些警告并不影响使用(其实,如果你以前使用源码方式部署过nextcloud,就会知道,这点警告真心不算什么。。。),只不过,作为强迫症患者,看着真心不爽啊,还是尽量解决吧。
1、
这2个可以通过在config.php文件中添加以下配置来解决:
'default_phone_region' => 'CN',
'mail_smtpmode' => 'smtp',
'mail_smtphost' => 'smtp.163.com',
'mail_sendmailmode' => 'smtp',
'mail_smtpport' => '587',
'mail_smtpsecure' => 'ssl',
'mail_from_address' => 'abcd', #假设邮箱地址为[email protected]
'mail_domain' => '163.com',
'mail_smtpauth' => 1,
'mail_smtpname' => 'abcd',
'mail_smtppassword' => 'xxxxxxxxxxxxxxxx', #163邮箱授权码,不是邮箱登录密码
注:邮箱部分也可以在”基本设置”-“电子邮件服务器”里进行设置:
2、
这是因为我们映射的是nextcloud容器的http 80端口,而我们又是使用https通过反向代理的方式来访问nextcloud,所以导致nextcloud比较混乱,需要告诉nextcloud将反向代理的地址加入可信代理名单,可以通过在config.php文件中添加以下配置来解决:
'trusted_proxies' =>
array ( 0 => '192.168.1.1', #假设192.168.1.1是反向代理的IP地址
),
3、
如果是以源码方式部署的nextcloud,解决这个报错需要在部署的web server里修改配置文件,不过我们这是使用docker方式部署的,不用纠结,直接禁止检测即可,这个可以通过在config.php文件中添加如下配置解决:
'check_for_working_wellknown_setup' => false,
4、
修改config.php文件,添加如下配置:
'maintenance_window_start' => 1,
5、
如果nextcloud是采用的nginx进行源码部署并在nginx上进行的ssl解密,要解决这个问题只需要在nginx的配置文件里添加如下内容即可:
add_header Strict-Transport-Security "max-age=15552000";
如果采用了cdn,比如cloudflare或者国内其他CDN供应商,需要启用HSTS并设置过期时间至少为
6个月
或者15552000秒
。
cloudflare:
腾讯云CDN:
注:一旦启用了HSTS并且设置了过期时间,那么在这段时间之内,浏览器只会使用https进行访问,如果网站改回http,将导致无法访问。
6、
这个据说是一个bug,如果非要解决,以前的解决方式是在容器里运行apt命令安装:
docker exec --user root -it nextcloud /bin/bash -c 'apt update && apt install -y libmagickcore-6.q16-6-extra'
不过嘛,最新版本的nextcloud(我现在是28.0.3)里连apt命令都没有了。。我也只有忍了,暂时只能这样了,遗憾的是留了1个尾巴。
重启nextcloud,最终结果如下:
另:既然开启了HSTS,就肯定要测个等级了,附上测试网站SSL安全等级的网址,有兴趣的朋友可以做个测试玩:
https://www.ssllabs.com/ssltest/
关于linuxserver/nextcloud升级
以下是linuxserver上关于nextcloud升级的官方说法的翻译(原文链接如下:https://docs.linuxserver.io/images/docker-nextcloud/):
“更新 Nextcloud 的方法是调用新镜像并用它重新创建容器。
一次只能升级一个主要版本。例如,如果要从 14 版升级到 16 版,就必须先从 14 版升级到 15 版,然后再从 15 版升级到 16 版。
由于所有数据都存储在 /config 和 /data 卷中,因此不会丢失任何数据。启动脚本会检查卷中的版本和已安装的 docker 版本。如果发现不匹配,它就会自动启动升级程序。”
但是实际上来讲,我是不会经常去升级nextcloud版本的,等忽然哪天想起来,肯定是起码隔了一个大版本,这时候如果采用一般容器的习惯性升级方式:先pull镜像,然后rebuild,翻车的概率很大(就像我这次为啥要重装nextcloud~~~),所以最好是在容器内部升级:
不过如果你要问我为啥不用nextcloud的官方镜像,而要用linuxserver/nextcloud版本的,我都有点忘记原因了,印象中是当时觉得好像linuxserver/nextcloud版本的文件组织方式好一些,dockerhub上对命令参数的说明更对我胃口,nextcloud官方的我看着头大,后来用惯了就懒得换了。。。大家也可以尝试直接使用官方镜像,而如果使用linuxserver/nextcloud版本的,想升级的时候一定要注意。
客户端设置
nextcloud另一个强大之处在于支持多平台客户端:
不过要想正常使用多平台客户端的前提是nextcloud有公网域名,比如前面提到”nextcloud.example.com”,下面就以mac版nextcloud客户端设置过程为例演示如何添加已有公网域名的nextcloud服务器,跟着如下步骤操作即可:
成功:
其他平台客户端设置方式类似,我就不一一赘述了。
以后只要将需要多平台同步的文件往本地nextcloud文件夹里一丢,比如我的obsidian工作目录,那么在任何其他平台上打开obsidian,都能看到一样的内容了。
如果想mac电脑上写作,在ipad或者ios上也能打开,需要通过icloud中转一下,比如定时同步本地nextcloud里obsidian文件夹到icloud,然后ios和ipad的obsidian工作目录设置为icloud里的文件夹即可。
后话
其实,以上只是nextcloud最基本的功能而已,nextcloud可玩的地方很多,这些都是通过其应用来实现的(需要使用科学或者魔法,否则只能想办法下载离线包自己安装):
比如可以通过安装音乐播放器并扫描外置存储上的无损音乐,直接变成一个在线音乐播放器;可以通过安装onlyoffice插件与onlyoffice容器搭配实现在线多格式文档编辑(参看:docker系列 为nextcloud部署onlyoffice容器);可以支持多用户并将nextcloud打造成一个小型门户,管理员可以给其他用户发送公告,可以实现流程化管理;可以和诸多世界上常用的各种软件进行整合;可以允许用户自行用邮箱注册等等,具体nextcloud的应用大家可以搜索网上的,太多了实在讲不完。
另:终于补上了docker版nextcloud的搭建教程了,写着太辛苦了。
我部署了这个nextcloud,卡的飞起。根本不能流畅使用,我的体验很糟糕。不知道该如何优化访问速度。蹲一下
你是使用什么方式部署的呢?docker方式吗?
大佬,linuxserver版的nextcloud怎么换头像显示中文的字体,官方版本会设置,linuxserver版不知道在哪里了
官方版本是:
字体上传到/AppData/nextcloud/config/www/nextcloud/core/fonts/SourceHanSerifSC-Bold.otf
修改文件/AppData/nextcloud/config/www/nextcloud/lib/private/Avatar/Avatar.php
我还真没研究过linuxserver版的nextcloud。。。