使用docker搭建nextcloud私有云盘
1. docker国内镜像配置
Docker的国内镜像源的资源站也比较丰富:
- Docker中国区官方镜像: https://registry.docker-cn.com
- 网易:http://hub-mirror.c.163.com
- ustc:https://docker.mirrors.ustc.edu.cn
- 中国科技大学:https://docker.mirrors.ustc.edu.cn
- 阿里云: https://cr.console.aliyun.com/
| |
重启docker服务:
| |
检查镜像信息:
| |
2. 下载nextcloud镜像
参考dockerhub nextcloud官方镜像 https://hub.docker.com/_/nextcloud/ 。
| |
3. docker运行nextcloud
创建目录用于持久化,在服务器空间比较大的盘下面创建一个目录用于存储nextcloud的数据。
| |
查看当前系统已经占用了哪些端口,确定8080端口没有被占用。
注意,下面执行创建容器时,在做目录映射时,-v nextcloud:/var/www/html处忘记使用绝对路径,导致nextcloud数据被挂载到/var/lib/docker/volumes目录下的nextcloud/_data目录下。后面需要修改成正确的本地路径。
| 此处需要注意的是,后期重新挂载时,会影响你的配置数据,你设置的应用、以及上传的数据可能会丢失,所以在初次挂载时,需要特别注意,路径使用绝对路径,并选择一个合适的路径!!! |
运行命令docker run -d -name nextcloud -p 8080:80 -v nextcloud:/var/www/html nextcloud创建nextcloud服务:
| |
查看端口情况:
| |
放行端口:
| |
4. 在浏览器中访问nextcloud
在浏览器中输入http://hellogitlab.com:8080/,可以正常打开nextcloud页面:

创建一个管理员账号:

并点击安装完成。
等一会儿后,nextcloud安装完成!安装完成后就可以正常使用nextcloud了,你的私有云盘基本配置成功了。
待优化的点:
- 现在网站使用的
http方式传输,需要更新为https方式传输。 - 配置数据库。
- 增加redis缓存。
- 设置视频缩略图。
- 自制docker镜像。
5. 配置域名解析并申请证书
在腾讯DNS解析界面增加一条新的域名解析:

等待一段时间后,使用ping命令来测试子域名是否解析成功:
| |
可以看到,能够正常ping通,说明解析正常。
再在腾讯云SSL证书界面 https://console.cloud.tencent.com/ssl 为新的域名nextcloud.hellogitlab.com申请一个免费证书。
证书申请成功后,过一会腾讯云就会颁发证书成功,并在域名解析中添加一条TXT记录。我们下载证书文件,并解压。
将解压后的Nginx文件夹中的两个文件上传到服务器端。

文件上传后,存放在/etc/pki/nginx目录下:
| |
6. 安装nginx
直接使用命令yum install nginx -y即可。
| |
查看ngInx版本信息:
| |
配置nginx.conf文件,为了不与我们的博客系统冲突,我们使用444端口作为nextcloud.hellogitlab.com域名的https使用的端口。
配置如下:
| |
最终配置的nginx.conf如上上所。注意其中:
| |
这两行证书的路径要与上一步上传到服务器端的路径保证一致。
另外,proxy_pass http://127.0.0.1:8080; 这一行是对8080端口数据进行转发,转发到上面定义444端口上来。
测试配置有效性:
| |
可以看到httpd和nginx服务都正常启动。
| |
防火墙放行444端口,并关闭8080端口。
| |
7. 配置nextcloud config.php文件
| |
注意,34行加上1 => 'nextcloud.hellogitlab.com',对自己的域名进行授信。41行`‘overwriteprotocol’ => ‘https’,设置自动跳转。
重启nextcloud容器:
| |
在浏览器中访问新的域名:


8. 邮件通知配置
使用postmaster账号登陆企业邮箱,创建一个企业邮箱的通知账号用户notice@hellogitlab.com,然后在nextcloud设置个人信息中配置自己的电子邮箱,然后在管理基本设置界面,设置一下电子邮件服务器,按下图方式设置:

设置完成后,点击发送电子邮件按钮,查看一下自己的邮箱中是否会收到测试邮件通知,过一会儿收到邮件通知:

说明邮件通知配置成功!
9. 更新国内源
nextcloud使用的是debian buster系统,我们更新其为国内源,方便安装程序。我们使用腾讯云。
| |
执行以下命令:
| |
10. 设置缩略图
使用时会发现,Nextcloud 上传的视频不能生成缩略图。其实 Nextcloud 本身支持生成视频缩略图,需要安装 ffmpeg 并修改配置:
| |
修改/var/www/html/config/config.php配置文件,添加:
| |
查看最后几行内容:
| |

修改后,重启nextcloud容器:
| |
然后再在nextcloud中可以看到视频已经的缩略图了。

11. 手动下载app-以music音乐为例
nextcloud有非常多好用的app,你可以在nextcloud App Store上面去看一下!下面列一些好用的应用:
- External sites 外部站点,可以在nextcloud中链接到外部网站。
- passwords密码管理,自动生成密码,并管理你的密码,再也不用记一大堆密码了。可配合手机端的
Passwords应用使用。 - Bookmarks书签管理,可以同步不同浏览器之间的书签同步,需要安装浏览器插件应用
floccus。可配置手机端的nextBookmark应用使用。 - Brute-force settings白名单设置。
下载链接:
| |
在nextcloud应用界面点击下载并启用时,会经常下载不成功。我们通过手动下载安装app。
nextcloud App Store: https://apps.nextcloud.com/

在右上角的搜索框输入music,并按回车搜索,点击进入到第一个搜索结果中:

在Music详情页面,下方有一个Downloads列表,我们选择一个下载版本,右键复制链接地址:

进入到nextcloud容器中,并切换到apps目录:
| |
解压:
| |
修改权限:
| |
修改权限后,在应用界面可以看到Music应用:

我们点击启用按钮,此时让输入授权密码,输入你的密码,并确认即可。
上传一首歌曲到nextcloud,然后点击页面顶部的音乐图标,就可以打开音乐界面,可以看到刚才上传的音乐了:

点击播放按钮就可以听音乐🎵了!
12. 优化定时任务cron
使用cron去执行后台任务:在设置中将设置从ajax调整到cron,然后在宿主机建立crontab任务。

首先在容器中查看一下cron.php文件路径:
| |
尝试执行同步命令:
| |
发现不能以root账号执行,我们需要使用www-data用户执行。我们退出容器,在容器外执行命令:
| |
在界面上可以看到同步成功了:

在宿主机上面添加一个定时任务:
| |
这样宿主机每5分钟就会同步执行一次。
13. 手动添加文件到nextcloud用户目录,不显示处理
把自己本地的文件复制到nextcloud相应的用户目录中,nextcloud中并不会显示。我们测试一下:
| |
此时在nextcloud上面并没有显示:

这时,我们应该更新一下数据库数据,需要手动执行以下命令(注意,是在宿主机上面执行!!),nextcloud才会将数据添加进数据库里:
| |
此时,刷新一下nextcloud页面,可以看到,刚才手动添加的文件已经正常显示了:

为了不每次手动添加文件时,都需要执行该命令,我们在宿主机上面也可以添加一个定时任务:
| |
当然,定时任务可以不用配置。因为这种通过手动添加的场景相对比较少。
14. 增加redis缓存
通过使用内存作为数据缓存的话,可以提高nextcloud的性能,以加web端的访问速度,并且nextcloud支持多个内存缓存后端,如APCu、Redis、Memcached。
我们以Redis作为数据缓存。
下载redis镜像:
| |
在Redis官网下载一份redis安装程序,并解压,修改其中的redis.conf配置文件。
创建本地持久化目录:
| |
注意以下需要关注的配置:
| |
启动redis:
| |
参数解释:
| |
如果你启动过程中redis一直重启,有可能就是你的daemoniz配置成了daemonize yes,导致redis在后台运行。而docker容器必须要有一个前台进程才能留存否则容器会自动退出。
查看运行情况:
| |
我们在宿主机上安装一下redis工具,使用命令行连接redis容器:
| |
说明能够正常写入数据到redis中。
配置nextcloud的缓存,参考官方指导:

配置config.php文件:
| |
配置后重启nextcloud容器,然后打开nextcloud浏览器。
在后台检查一下redis是否增加了新的key值:
| |
可以看到,已经生成了非常多的缓存数据了。说明配置成功了!
可以明显感觉到网站速度变快了!
15. 配置正确的目录挂载
由于前面的操作疏忽,挂载nextcloud目录时,使用了相对路径。我们需要将nextcloud数据存放在正确位置,修改nextcloud的目录挂载属性。我们将设置本地挂载目录为/dockerdata/nextcloud/data。
首先创建本地挂载目录:
| |
为了便于后面对json字符串进行处理,我们安装一下jq软件:
| |
为了便于我们快速的docker容器运行信息,我们可以创建一个快捷命令,在~/.bashrc文件中添加以下内容:
| |
添加完成后,查看~/.bashrc内容:
| |
使用命令source ~/.bashrc使快捷命令生效:
| |
然后就可以使用快捷命令查看docker单个容器的运行信息了,如我们要查看nextcloud容器的运行情况:
| |
记住上面nextcloud容器的id号89a04170593a。
为了修改nextcloud的目录挂载,现在我们先停止nextcloud容器。
| |
我们先使用docker inspect获取容器的元数据,元数据比较多,我们使用jq命令过滤一下:
| |
我们同时获取了nextcloud和redis-server两个容器的挂载信息元数据,redis-server的挂载使用的绝对路径,是正确的路径,我们需要参数redis-server的数据来配置一下nextcloud的挂载信息,修改后nextcloud的挂载信息应该是这样的:
| |
我们切换的docker容器的配置目录:
| |
可以看到该目录下面有多个文件夹,我们需要根据nextcloud的容器id切换到对应的目录下,前面已经确定nextcloud容器的id是89a04170593a,我们进入到文件夹名以该id信息开头的目录下:
| |
目录下面的config.v2.json和hostconfig.json是我们需要修改的配置文件。
我们查看一下配置文件信息:
| |
作为对照,我们看一下redis-server配置文件信息,此处只列出我们关心的内容:
| |
为了便于修改,我们使用jq命令将美化的数据写入到临时文件中,然后再在临时文件中进行修改,修改完成后再写入到正式配置文件中。
| |
我们参考redis-server的数据对nextcloud容器的配置文件进行修改,我们在临时文件中进行修改。
修改前,new_config.v2.json关于挂载点的信息:

我们使用vim进行修改,修改后挂载点的信息如下:

然后我们生成压缩后的配置写入到正式文件:
| |
同样修改一下hostconfig.json文件,这个只需要Bind处:
修改前:

修改后:

然后我们生成压缩后的配置写入到正式文件:
| |
重启docker服务,并启动nextcloud容器:
| |
查看一下nextcloud的挂载点元数据信息:
| |
可以看到,与预期的结果一样,说明配置正确!
然后看一下,本地挂载点目录数据是否有了:
| |
这样可以看到,数据已经挂载过来了。说明配置正确。
| 此处需要注意的是,虽然重新挂载了,但原来设置的应用、以及上传的数据都不存在了,所以在初次挂载时,需要特别注意,路径使用绝对路径!!! |
16. 创建postgresql数据库
此处不详细介绍,请参考我的另一章文章 docker配置postgresql数据库
在其中创建了nextcloud数据库,用户ncadmin,将授予ncadmin对数据库nextcloud的管理权限。
17. 数据迁移(!迁移失败!)
官方文档 Converting database typehttps://docs.nextcloud.com/server/20/admin_manual/configuration_database/db_conversion.html 提到可以将SQLite数据库转换成性能更好的MySQL, MariaDB or PostgreSQL数据库,考虑到后期我需要搭建本地的GitLab私有仓库,而GitLab后台也是用的PostgreSQL,因此我将nextcloud的数据迁移到PostgreSQL数据库中。
最好的方式是在开始运行容器时,增加--link postgres-server:pg方式连接到postges-server容器。
我们尝试转换一下,看看行不行。
| |
执行发现转换失败:


报以下异常:
| |
参考:Syntax Error on db:convert-type when converting any DB to ->PostgreSQL | NC 20
说是要禁用 text应用,并删除-app-apps`参数。

我们在已启用的应用管理界面禁用text应用,并将--all-apps参数去掉后,再尝试一次。执行命令docker exec --user www-data nextcloud php occ db:convert-type --port="5432" --password="securepasswd" --clear-schema pgsql ncadmin hellogitlab.com nextcloud。
| |
等了好久没有反应,按Ctrl + C终止程序,放弃此方法!
数据迁移失败!!!
因此,我计划重新运行容器,~~并在容器运行命令中加上数据库--link参数,~~然后再重新配置nextcloud环境。
| 此处需要注意的是,“docker link 过时不再用了?那容器互联、服务发现怎么办"一文中不建议使用`--link`参数,而使用`--network`参数,暂时不会,忽略此方法! |
我们直接通过配置环境变量来连接数据库。
18. 通过配置环境变量文件来运行nextcloud
在dockerhub nextcloud官方镜像中,提到我们可以通过配置环境变量来自动配置nextcloud。

如前面我们测试的,我们需要使用Redis作缓存、postgresql作数据库、SMTP外部邮箱配置,另外,可以在在环境变量中配置nextcloud的管理员账号和密码。
我们列一下:
| |
这些变量差不多覆盖了我们需要设置的内容。
我们尝试写一个配置文件.nextcloud.env,并运行centos容器,打印出环境变量;
| |
可以看到能够正常获取环境变量。
相应的,我们也可以通过这种方式为nextcloud提供环境变量。
我们先进入到Postgresql中删除之前迁移失败时生成的nextcloud数据表,并重新授权。
删除数据库:
| |
再重新创建数据库,并授权:
| |
这样数据库准备好了。将旧的nextcloud容器删除掉,然后重新运行一个新的nextcloud容器。
删除旧的nextcloud容器,并删除目录挂载数据:
| |
重新运行容器:
| |
运行:
| |
查看日志:
| |
打开nextcloud链接地址 https://nextcloud.hellogitlab.com:444/,页面提示通过不被信任的域名访问异常:

查看配置文件,可知config.php中域名配置异常:
| |
说明我们配置文件中可信域名配置错误。
我们安装一下vim后,然后使用vim编辑一下config.php配置文件,更新后查看可信域名信息:
| |
退出容器命令行,然后重启容器:
| |
再次打开web页面:

页面正常显示。
我们输入一下登陆用户名和密码,看看能不能登陆进去。此时可以正常登陆进入到nextcloud页面,说明配置正确!
我们在概览页面可以看到有数据库丢失了一些索引的警告:

我们不用关闭容器,直接运行以下命令:
| |
刷新页面,这样概览页面就不会显示警告了!

自定义的环境配置文件如下:
| |
最终生成的配置文件如下:
| |
19. 手机客户端多次登陆出现请求过多的问题
多次手机登陆后,有可能手机客户端被拦截住:

参考 https://help.nextcloud.com/t/cannot-login-too-many-requests/100905/16 运行以下命令:
docker exec --user www-data nextcloud php occ security:bruteforce:reset <IP> 其中IP是被拦截的IP,可以在设置-日志界面查看到被拦截的IP地址信息。
执行命令:
| |
重新使用手机客户端则可以正常登陆!
也可以将表中的数据删除掉:
| |
20. 定制Docker镜像,编写自己的dockerfile
待补充。
需要做的事情:
| |
自制镜像示例,参考https://engr-z.com/278.html:

21. 照片自动上传
在手机客户端可以设置照片自动上传,并设置文件名格式,默认的文件名中包含空格,我不喜欢文件名上包含空格,改成不带空格的格式,设置如下图:

说明:
markdown字体标红处理方法:<font color='red'> text </font>
效果: text
设置背景色:<table><tr><td bgcolor=#54FF9F>背景色的设置是按照十六进制颜色值:#54FF9F</td></tr></table>
效果:
| 背景色的设置是按照十六进制颜色值:#54FF9F |
参考:
- 使用docker-compose搭建Nextcloud个人云盘并开启https教程
- Centos 7.6搭建Nextcloud 17.0.0个人云盘详细教程
- 企业邮箱通过SMTP程序进行发信
- 企业邮箱postmaster管理员账号更改密码方法
- Debian 10 Buster 国内常用镜像源
- 基于Nextcloud打造个人工作台
- 定制优化Nextcloud镜像
- NextCloud Background jobs
- Docker安装nextcloud以及遇到的一下问题和优化方法
- MySQL与PostgreSQL哪个更好
- Docker redis
- 最详细的docker中安装并配置redis
- Docker 自定义配置运行redis自动退出
- nextcloud Memory caching
- nextcloud config PostgreSQL database
- 使用docker搭建基于Postgresql的Nextcloud
- nextcloud Converting database type
- nextcloud 切换数据库 mysql->PostgreSQL(sqlite->mysql同理) 遇到的一些问题 Docker版
- [docker link 过时不再用了?那容器互联、服务发现怎么办?
- Cannot login: Too Many Requests
