转自我的个人博客https://blognas.hwb0307.com,该文的内容更新仅在个人博客可见。欢迎关注!
前言
基于《Docker系列 搭建个人云盘服务nextcloud》,相信无论是在有/无443端口的Linux机子里均可成功安装Nextcloud。值得一提的是,Nextcloud是一个被频繁维护和更新的应用,而且Nextcloud官方也在积极维护着自己的镜像。一般而言,开发者是为修复bug、增加特性、提升安全性、提升性能等目的才会更新应用的;因此,在绝大多数情况下,成功升级Nextcloud基本上都是好处。
对于普通的docker应用,可以用下面的策略进行升级:
- 通过
docker-compose down
下线Stack - 删除应用对应的image
- 通过
docker-compose up -d
上线并拉取最新镜像(此时应该在docker-compose.yml里指定image版本号或latest
)
然而,Nextcloud不太可能通过该方法成功升级。此外,如果你是通过Docker安装Nextcloud,通过内置的升级通道也是不太可能成功的:
那么,我们是否应该升级Nextcloud?什么时候是最好的时机?本文结合我的一次跨版本Nextcloud升级和踩坑经验,讨论并总结一下如何升级Docker版Nextcloud。
是否升级?
这里我列举一些最近跨版本升级的代价:
- Nextcloud的封面重置为默认状态(下图是我重新换了一张):
- 某些插件不可用,比如onlyoffice等。
所有的数据都没有丢失,包括与联系人信息相关的CalDav应用。此外,个人觉得新版本的Nextcloud性能有所提升——可能是因为Nextcloud(25.x)使用了php8的原因;或者有其它我未曾了解的原因。
总的来说,这次大升级可谓有惊无险,收获满满。如果你Linux基础比较好,并且备份做好,建议在通读本文后一试。小白折腾要慎重 ヾ(≧∇≦*)ゝ
跨版本升级
这次我的升级过程是跨版本升级:23.0.0.10→25.0.2
。但是,如果你直接这样做,你会遇到一个不支持跨版本升级的Error,它通常包括但不限于下面的提示:
Exception: Updates between multiple major versions and downgrades are unsupported
因此,Nextcloud升级的过程是循序渐进的,即:先升级至相邻版本,然后逐步更新至latest版本。
那么如何确定中间版本呢?有三个技巧可以参考:
- Nextcloud changlog,上面会列举每次升级的细节,包括版本号:
- Nextcloud Dockerhub,上面往往会有大版本的最后/最新版本号:
- 版本号法。比如,23可以直升24,24可以直升25;但23不可以直升25。
我升级的版本路线为:23.0.0.10→23.0.12→24.0.8→25.0.2
,基本上是按上面的原则来确定版本号的,大家可参考。
关键数据
我在nextcloud的docker-compose.yml所在目录里运行:
tree -ha -L 2
可以看到下列文件结构:
通常来说,app
、cache
、db
在duplicati里都是同时备份的。但你要特别注意app
中的config
和data
文件夹,它们两个包含最重要的核心数据(配置、文件)。你在升级时,甚至可以只保留config
和data
文件夹;升级完成后Nextcloud的文件和配置也不会丢失。
一般步骤
- 做好备份,比如基于duplicati。
docker-compose down
下线应用。- 修改docker-compose.yml,将nextcloud镜像的版本号改成待升级的版本号:
docker-compose up -d
,静待镜像拉取完成。- 通过
docker logs -f nextcloud-app-1
之类的命令监测升级log
。 - 为节省磁盘空间,可以删除Nextcloud旧镜像。整个stack还包括redis和mariadb,它们的镜像维持原样即可。
升级报错
这里展示了一个比较完整的升级log
:
一般地,这里的速度是很慢的:
Initializing nextcloud <新版本号>...
Upgrading nextcloud from <旧版本号> ...
并且,每次更新的log都可能不太一样的。不一定会有successfull
字样,但一般不会有error
字样。
如果我们看到AH00094: Command line: 'apache2 -D FOREGROUND'
之类的日志,表明Nextcloud已经准备就绪了,你可以访问一下网站看看有什么提示。一般地,它还会让你确认一下更新,你就确认即可。
中途可能有其它错误,但这些错误一般不太可能涉及数据库;这种情况下基本没关系,可以重启页面试试。这里展示一个在网页升级的日志(不记得是哪一次升级了):
正在准备更新
设置日志级别为 调试
启用维护模式
修复日志 步骤: Repair MySQL collation
修复 信息: All tables already have the correct collation -> nothing to do
修复日志 步骤: Repair SQLite autoincrement
修复日志 步骤: Copy data from accounts table when migrating from ownCloud
修复日志 步骤: Drop account terms table when migrating from ownCloud
正在更新数据库结构
数据库已更新
修复日志 步骤: Repair MySQL collation
修复 信息: All tables already have the correct collation -> nothing to do
修复日志 步骤: Repair mime types
修复日志 步骤: Clean tags and favorites
修复 信息: 0 tags of deleted users have been removed.
修复 信息: 0 tags for delete files have been removed.
修复 信息: 0 tag entries for deleted tags have been removed.
修复 信息: 0 tags with no entries have been removed.
修复日志 步骤: Repair invalid shares
修复日志 步骤: Move .step file of updater to backup location
修复日志 步骤: Add move avatar background job
修复 信息: Repair step already executed
修复日志 步骤: Add preview cleanup background jobs
修复日志 步骤: Migrate oauth2_clients table to nextcloud schema
修复 信息: Update the oauth2_access_tokens table schema.
修复 信息: Update the oauth2_clients table schema.
修复日志 步骤: Fix potential broken mount points
修复 信息: No mounts updated
修复日志 步骤: Repair language codes
修复日志 步骤: Install new core bundle components
修复日志 步骤: Add log rotate job
修复日志 步骤: Clear frontend caches
修复 信息: Image cache cleared
修复 信息: SCSS cache cleared
修复 信息: JS cache cleared
修复日志 步骤: Clear every generated avatar on major updates
修复日志 步骤: Add preview background cleanup job
修复日志 步骤: Queue a one-time job to cleanup old backups of the updater
修复日志 步骤: Cleanup invalid photocache files for carddav
修复日志 步骤: Add background job to cleanup login flow v2 tokens
修复日志 步骤: Remove potentially over exposing share links
修复 信息: No need to remove link shares.
修复日志 步骤: Clear access cache of projects
修复日志 步骤: Reset generated avatar flag
修复日志 步骤: Keep legacy encryption enabled
修复日志 步骤: Check encryption key format
修复日志 步骤: Remove old dashboard app config data
修复日志 步骤: Add job to cleanup the bruteforce entries
修复日志 步骤: Queue a one-time job to check for user uploaded certificates
修复日志 步骤: Repair DAV shares
修复日志 步骤: Add background job to set the lookup server share state for users
开始代码完整性检查
发生错误。
必要情况下,可以docker-compose restart
重启该stack,甚至是重启整个VPS/NAS。我当时升级为25x版本时,可能NAS配置太差,一直卡着不动,我直接强行关机再启动NAS,后来一切如常。
整个过程可能会不太顺利。不要怕,只要data
和config
的数据不丢失,就可以苟住!
维护模式
升级Nextcloud的过程中,维护模式是很常见的。它通常有类似提示:
Nextcloud is in maintenance mode
有时候维护模式并不一定代表Nextcloud完全不能运行。你可以尝试关闭维护模式,自己调试一下网站,看是否可以正常登陆。你可以这样做:
- 方法1:进入Nextcloud的根目录,打开
/config/config.php
,将maintenance的值改为false后重启stack:
- 方法2:通过容器php关闭维护模式:
# 进入Nextcloud内部
docker exec -it -u www-data nextcloud-app-1 /bin/bash
# 关闭维护模式
php occ maintenance:mode --off
首选第1种方法,如果不行再试第2种。一般都可以成功关闭。
Nextcloud 25概览
更多Nextcloud Hub 3升级特性可见:Nextcloud Mail improvements
我2022-12-18升级的是的最新版Nextcloud镜像。大致如下:
- 主页
- 文件
- 图片:
- PicGo:我用PicGo上传了一下图片,功能不受影响。Nextcloud图床的相关教程见《Docker系列 深度使用nextcloud(三)Typora图床》。
- 管理后台:
UI重新设置了一下,感觉和23版本差别较小。
小结
如果你只是更新一个相邻的版本,其实也挺快的。如果你一直不更新Nextcloud,短期内问题也不大;但是从长期看,由于跨版本升级的不兼容性,更新越少越难;不更新就无法享受一些新特性(但对大多数人来说可能也没什么损失)。我开始时是在NAS里更新一个比较旧的Nextcloud版本,踩坑较多;但在VPS里较新版本里更新就较顺利。
对Nextcloud的家庭用户,我建议每半年或每年找一个空闲的时间更新一下Nextcloud。只要做好备份,基本上是稳的,绝大多数重要配置均不会丢失。建议技术较好、内心较强的小伙伴去折腾一下!
另外,根目录.htaccess
的配置内容可能在更新时会丢失,做好备份即可。
有什么问题,请评论区留言喔!
扩展阅读
- https://nextcloud.com/changelog:如果跨版本升级,需要根据这个nextcloud changelog一步步升级。
- https://hub.docker.com/_/nextcloud:官方Docker镜像
- Update to 13 - “Nextcloud is in maintenance mode” - ℹ️ Support - Nextcloud community
- HSTS on docker container? - ℹ️ Support / 📦 Appliances (Docker, Snappy, VM, NCP, AIO) - Nextcloud community
- The “Strict-Transport-Security” HTTP header is not set to at least “15552000” seconds. For enhanced security, it is recommended to enable HSTS - ℹ️ Support - Nextcloud community
- Updates between multiple major versions are unsupported - 📑 How to - Nextcloud community