前言
如果你看过《Docker系列 深度使用nextcloud(十)升级nextcloud》,就会发现升级Nextcloud可能会碰到很多复杂情况。最近我将Nextcloud从旧NAS里迁移至PVE的Openmediavault虚拟机时,发现迁移Nextcloud也可能会遇到很多问题。因此,这里我简单做一个备忘录,同时也希望对有这种需求的小伙伴提个醒,遇事不用慌!
这里的Nextcloud迁移是基于《Docker系列 搭建个人云盘服务nextcloud》安装的Docker版Nextcloud。如果你用的是其它方法安装Nextcloud,参考价值可能比较有限。
准备工作
暂停应用
(可选)进入旧NAS里面,关闭Nextcloud的Stack。具体的做法是去到docker-compose.yml
所在的Nextcloud根目录并运行docker-compose down
。我当时备份的时候并没有执行这一步;不过暂时下线Stack后再迁移应该是最安全的方法。
拷贝目录
由于Nextcloud的数据库和某些文件夹的用户(组)比较复杂,为了避免复制遗漏,我建议使用root用户通过scp的方法复制整个根目录到新的位置。
首先,我们进入新NAS,定义一个docker目录,比如:
work=/docker/
创建并进入目录:
mkdir -p $work && cd $work
接着,进入旧NAS的shell,将旧NAS的Nextcloud根目录(比如/oldnas/docker/nextcloud
)通过scp复制到新NAS里。具体的命令类似:
# scp -r -p -P <新NAS的SSH端口号> <旧NAS Nextcloud根目录> <新NAS用户名>@<新NAS IP地址>:/docker/
scp -r -p -P 22 /oldnas/docker/nextcloud [email protected]:/docker/
这个过程可能会输入新NAS的该用户的密码,输入即可。用rsync(比如文章《如何在 Linux 中使用 rsync 传输文件》)也可以,并且可以挂后台,Nextcloud体积太大的小伙伴可以试试。印象中是这样用:
# rsync -a -P <新NAS的SSH端口号> <旧NAS Nextcloud根目录> <新NAS用户名>@<新NAS IP地址>:/docker/
rsync -a -P /oldnas/docker/nextcloud [email protected]:/docker/
bg # 放入后台。
disown %1# 将这个作业忽略HUP信号
这样即便是关闭了当前的Shell,进程也不会终止。
无论scp或者rsync都要按需要改好端口号、文件夹等参数。
Image版本号
拷贝目录的时候,我们新开一个旧NAS的Shell并观察数据库和Nextcloud的镜像版本。如果新/旧NAS里的nextcloud/mariadb的版本相差太远,可能会导致Nextcloud无法在新NAS中正常使用。比如,我在迁移时就发现mariadb的最新版(10.11-rc)与10.6.5是不相兼容的——如果你在10.6.5的数据结构里强行使用10.11-rc的mariadb会出现clash错误。我暂时也不知道怎么升级到最新数据库,推测类似于nextcloud升级那样逐步升级,或者是利用phpmyadmin或mysqldump命令等方法将数据备份好再重新导入新数据库。
Nextcloud的镜像版本号可以在Portainer里面找。很多人安装镜像时会缺省标签或用latest
的标签安装,所以还是要点击进去看:
找到Image layers
这一项,定位至ENV NEXTCLOUD_VERSION
这个字段,上面有版本号:
Mariadb也一样,如果标签是latest
,就点进去找到ENV MARIADB_VERSION
字样。我这里提示它的版本号是10.6.5
:
另外,你最好在dockerhub里面核实一下镜像具体的版本号。比如,我最终确定两个镜像为:nextcloud:25.0.2
和mariadb:10.6.5-focal
。你在新版的docker-compose.yml里记得修改为这两个tag再进行安装。
Redis的版本号似乎不重要。可能是因为Redis完全是个辅助,并不永久地保存数据和数据结构。
修改config.php
拷贝Nextcloud根目录完成后,如果你有修改域名的需求(比如我就暂时保留原来的Stack,换一个全新的域名),需要去新NAS的Nextcloud目录里修改config.php文件:
vim $work/app/config/config.php
下面的操作是Vim里进行。比如,我们将所有的旧域名(比如oldnextcloud.hwb0307.top
)改为新域名(newnextcloud.hwb0307.top
),旧的443端口(1234
)改为新的443端口(4567
):
:1,$s/oldnextcloud.hwb0307.top:1234/newnextcloud.hwb0307.top:4567/g
:1,$s/oldnextcloud.hwb0307.top/newnextcloud.hwb0307.top/g
新旧域名按自己的实际情况修改即可。
如果你在旧NAS里曾经添加过proxy,最好先注释/删除proxy,或更换成可以在新NAS里生效的proxy:
这样Nextcloud就不会因为网络连接异常而产生许多bug。
修改文件权限
更改nextcloud对应的文件夹(比如$work/app
)权限即可:
sudo chown -R 33:33 $work/app
可能不是必须的。
添加后台作业
我们在《Docker系列 搭建个人云盘服务nextcloud》里也介绍过,不要忘记新NAS里还没有它噢!
我们打开crontab:
vim /etc/crontab
加入定时任务:
# run nextcloud cron task every 5 min。 这个nextcloud-app-1要按实际情况修改
*/5 * * * * root docker exec -u 33 nextcloud-app-1 php -f /var/www/html/cron.php 2>&1 /dev/null
上线Nextcloud
前面的工作完成后,直接cd $work && docker-compose up -d
上线Nextcloud即可:
完美!
Onlyoffice
如果你使用Onlyoffice的话,需要在管理--ONLYOFFICE
里修改ONLYOFFICE Docs地址,否则Onlyoffice的使用会有bug:
一般是从https://旧域名:旧端口号/apps/documentserver_community
改为https://新域名:新端口号/apps/documentserver_community
。
如果你在修改之后不小心出现类似这种bug:
onlyoffice Failed to connect to XXX: Connection refused (see https://curl.haxx.se/libcurl/c/libcurl-errors.html) for https://XXX/apps/documentserver_community/healthcheck)
这是Nextcloud与互联网的连接障碍所致。只要从数据库里删除错误设置的record即可:
# 格式为: docker exec <nextcloud的数据库name> mysql <nextcloud的数据库名> -p<$MYSQL_ROOT_PASSWORD> -e "delete from oc_appconfig where appid='onlyoffice' AND configkey='settings_error'"
docker exec nextcloud-db-1 mysql nextcloud -p123456789 -e "delete from oc_appconfig where appid='onlyoffice' AND configkey='settings_error'"
数据库丢失索引
如果在管理——概览——安全与设置警告
里:
看到类似下面的信息:
数据库丢失了一些索引。由于给大的数据表添加索引会耗费一些时间,因此程序没有自动对其进行修复。您可以在 Nextcloud 运行时通过命令行手动执行 "occ db:add-missing-indices" 命令修复丢失的索引。索引修复后会大大提高相应表的查询速度。
...
如它所描述的,就是数据库丢失了一些索引。你可以运行类似命令进行修复:
# 格式为:docker exec -u 33 <nextcloud容器name> /var/www/html/occ db:add-missing-indices
docker exec -u 33 nextcloud-app-1 /var/www/html/occ db:add-missing-indices
输出结果类似于:
Check indices of the share table.
Check indices of the filecache table.
Check indices of the twofactor_providers table.
Check indices of the login_flow_v2 table.
Check indices of the whats_new table.
Check indices of the cards table.
Check indices of the cards_properties table.
Check indices of the calendarobjects_props table.
Check indices of the schedulingobjects table.
Check indices of the oc_properties table.
Adding properties_pathonly_index index to the oc_properties table, this can take some time...
oc_properties table updated successfully.
Check indices of the oc_jobs table.
Adding job_lastcheck_reserved index to the oc_jobs table, this can take some time...
oc_properties table updated successfully.
Check indices of the oc_direct_edit table.
Adding direct_edit_timestamp index to the oc_direct_edit table, this can take some time...
oc_direct_edit table updated successfully.
Check indices of the oc_preferences table.
Adding preferences_app_key index to the oc_preferences table, this can take some time...
oc_properties table updated successfully.
Check indices of the oc_mounts table.
小结
这就是目前我迁移Nextcloud所遇到的问题和相应的解决方案。以后有新的发现再来更新。虽然Nextcloud的Bug挺多的,但好在官方文档和论坛支持不错,仔细找可以找到不少好方法。个人感觉还是WordPress那种商业软件优化得好一些 (ฅ´ω`ฅ)
扩展阅读
- 关于 NextCloud 备份迁移&更换域名的一点经验分享
- Using the occ command — Nextcloud latest Administration Manual latest documentation
---------------
完结,撒花!如果您点一下广告,可以养活苯苯😍😍😍
我上周日刚刚完成nextcloud版本更新,从25.0更新到27.0;耗时将近10小时。
各种乱七八糟的小问题,例如原来的账户用了二次验证,升级后就登入不了了;升级后的提升,登入次数过多等等。
真不容易
辛苦 ~ 我觉得1年升级4次左右应该差不多,基本不会落下太多版本
今天遇到个问题安装插件talk后,无法进入对话关于phone number的错误。
和我用的数据库为SQL5.74太老了有关么?
似乎找不到现有的解决教程
没安装过这个插件,不太了解噢!