升级 openSUSE Leap 15.1 后升级 Nextcloud

之前配置家庭服务器的时候使用了 openSUSE Leap 15.0 做操作系统。安装家庭云系统 Nextcloud 的时候看到软件源里面有就直接安装了。前些天升级系统到了 openSUSE Leap 15.1。然后就发现 Nextcloud 没法工作了。因为 openSUSE Leap 15.0 中最新的是 Nextcloud 13 而 openSUSE Leap 15.1 中的是 Nextcloud 15(目前的稳定版本是 16.0.1),而 Nextcloud 的政策是不支持跨两个或两个以上的大版本升级。

最后没有办法,采用了一位网友报告的方法,修改 Nextcloud 安装的源文件中的 lib/private/Updater.php,绕过了版本检查,强制执行了手动升级。幸好没什么大碍。同时我也干脆不再使用 openSUSE Leap 官方源中的 Nextcloud 安装而是直接使用了 Nextcloud 官方的安装包并参考 Nextcloud 16 的官方文档进行了配置。这个过程中还是有些细节需要记录下来,下面是大致的步骤记录。

升级和查错

升级 openSUSE Leap 到 15.1 的时候我并不知道会有 Nextcloud 这样的问题。升级完成后访问 Nextcloud 资源就总是被提示服务器内部错误。系统的 Apache2 日志之类的地方也看不到具体有什么错误提示。

编辑 Nextcloud 的配置文件 config/config.php 并在其配置的末尾添加 'debug' => true,之后再访问 Nextcloud 就能看到需要升级的提示。

然而官方并不支持从 Nextcloud 13 到 Nextcloud 15 的升级。然后我从 Nextcloud 下载 14.0.0 版本的 Nextcloud 覆盖了 Leap 15.1 中的 Nextcloud 安装并试图升级。也不知道是不是因为有过之前尝试升级到 Nextcloud 15 的错误,反正到 14.0.0 的升级可以进行,但是总以错误告终。

不得已,只好进行下面的手动升级了。我先升级到了 Nextcloud 15 随后又自动升级到了 16.0.1。

备份原来的安装并清除 Nextcloud 软件包

参考 Nextcloud 官方文档的备份指导,先进入维护模式,然后备份 config 文件夹和 data 文件夹。当然因为我将 data 放在了另外的位置,所以其实并不需要备份 data 文件夹。管它呢,反正也不费事。

cd /srv/www/htdocs/nextcloud/
sudo -u wwwrun php occ maintenance:mode --on
rsync -Aavx /srv/www/htdocs/nextcloud/ /home/cnzhx/nextcloud-dirbkp_`date +"%Y%m%d"`/
mysqldump --single-transaction -h [localhost] -u [ncuser] -p[ncuserpasswd] nextcloud > /home/cnzhx/nextcloud-sqlbkp_`date +"%Y%m%d"`.bak

为了方便还原,在当前文件夹再备份一份源文件,

cp -r /srv/www/htdocs/nextcloud /srv/www/htdocs/nextcloud.old

备份 /etc/apache2 下面 vhosts.d 或者 conf.d 中的 Nextcloud 虚拟主机配置文件,然后清除从 Leap 源安装的 Nextcloud,

cp /etc/apache2/conf.d/nextcloud.conf /etc/apache2/conf.d/nextcloud.conf.bak
cp /etc/apache2/vhosts.d/nextcloud.conf /etc/apache2/vhosts.d/nextcloud.conf.bak
zypper remove nextcloud

这个会完全清除 /srv/www/htdocs/nextcloud 文件夹及其内容(config 和 data 似乎会保留,不过反正我们已经备份过了)以及 Nextcloud 的虚拟主机配置文件。

下载并安装新版本的 Nextcloud

直接从 Nextcloud 官方下载。我是安装了 Nextcloud 15.0 版本。但是我琢磨着也许可能应该可以直接安装当前最新的 Nextcloud 16.0.1 版本。

cd /srv/www/htdocs/
wget https://download.nextcloud.com/server/releases/nextcloud-15.0.0.zip -O nc15.zip

暂停服务器程序,

systemctl stop apache2 mysql

解压缩下载的安装包到指定位置,然后从 nextcloud.old 文件夹中复原原来的配置和数据文件们,

unzip /srv/www/htdocs/nc15.zip -d /srv/www/htdocs
cp -r /srv/www/htdocs/nextcloud.old/config /srv/www/htdocs/nextcloud/
cp -r /srv/www/htdocs/nextcloud.old/data /srv/www/htdocs/nextcloud/

检查是否有不在新安装中的第三方工具(3rdparty)或者应用程序(apps)以及主题(themes)。在网上看到了一个很好的方法但是忘记记录网址了。依次执行下面的语句并检查新安装中有没有缺少的子文件夹,(我不需要检查 themes 文件夹)

vimdiff <(ls nextcloud/3rdparty |sort) <(ls nextcloud.old/3rdparty |sort)
vimdiff <(ls nextcloud/apps |sort) <(ls nextcloud.old/apps |sort)

如果有的话记录下来然后批量复制到新安装里面。例如,

for i in calendar contacts files_antivirus files_reader mail notes tasks ; do cp -r nextcloud.old/apps/$i nextcloud/apps ; done
for i in .gitignore guzzle mcnetic mikemccabe natxet paragonie rackspace ; do cp -r nextcloud.old15/3rdparty/$i nextcloud/3rdparty ; done

然后恢复权限和所有者,

chown -R wwwrun:www /srv/www/htdocs/nextcloud
cd /srv/www/htdocs/
find nextcloud/ -type d -exec chmod 750 {} \;
find nextcloud/ -type f -exec chmod 640 {} \;

修改源文件强制升级

按照 amo13 的方法修改。先备份,然后查找需要修改的位置,再编辑 lib/private/Updater.php

cd /srv/www/htdocs/nextcloud
cp lib/private/Updater.php lib/private/Updater.php.bak
grep -n 'return isset' lib/private/Updater.php

对于 Nextcloud 16.0.1 来说,上面语句返回的结果是,

grep -n 'return isset' lib/private/Updater.php
198: return isset($allowedPreviousVersions[$currentVendor][$majorMinor])
204: return isset($allowedPreviousVersions[$currentVendor][$majorMinor]) ||

也就是在 198 和 204 行的位置。编辑 lib/private/Updater.php 将其中两处检查的语句改为始终返回真(true)。即,将,

return isset($allowedPreviousVersions[$currentVendor][$majorMinor]) && (version_compare($oldVersion, $newVersion, '<=') || $this->config->getSystemValue('debug', false));

和,

return isset($allowedPreviousVersions[$currentVendor][$majorMinor]) || isset($allowedPreviousVersions[$currentVendor][$oldVersion]);

都改为,

return true;

检查并恢复 /etc/apache2 下面 vhosts.d 或者 conf.d 中的 Nextcloud 虚拟主机配置文件。确认无误后重启网页服务器和数据库服务器,

systemctl restart apache2 mysql

现在可以执行 Nextcloud 升级了,然后将模式修改为正常,

cd /srv/www/htdocs/nextcloud/
sudo -u wwwrun php occ upgrade
sudo -u wwwrun php occ maintenance:mode --off

现在应该可以正常访问 Nextcloud 了。

其它问题

首先,Nextcloud 的 baseurl 需要处理一下。以前是在 mydomain.tld/nextcloud/ 下,现在访问的时候总是自动跳转到 mydomain.tld/。根据 Git 上的一个评论,在 config/config.php 中增加一个参数 'overwritewebroot' => /nextcloud, 即可。不过需要刷新 .htaccess 配置之后才能生效,

sudo -u wwwrun php /srv/www/htdocs/nextcloud/occ maintenance:update:htaccess

还有个可能的问题,可能会碰到升级的时候提示说有个错误,就是数据库中 oc_users 表中的列 uid_lower 已经存在。解决办法就是直接清除这个列。用到的指令如下,

mysql -u [nc_user] -p[password]
show databases;
use nextcloud;
show tables;
SHOW COLUMNS FROM [table name];
ALTER TABLE oc_users DROP uid_lower;

最后一个问题就是,登录进入 Nextcloud 之后,查看设置中的概况,会发现有不少需要修复的小问题。这里就不细说了。©

本文发表于水景一页。永久链接:<https://cnzhx.net/blog/update-nextcloud-after-upgrading-to-opensuse-leap-15-1/>。转载请保留此信息及相应链接。

时间过去太久,评论已关闭。
如果您有话要说,请到讨论区留言并给出此文章链接。
谢谢您的理解 :-)