Docker系列 深度使用nextcloud(九) 硬盘挂载

转自我的个人博客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,通过内置的升级通道也是不太可能成功的

Docker系列 深度使用nextcloud(九) 硬盘挂载_第1张图片

那么,我们是否应该升级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,上面会列举每次升级的细节,包括版本号:

Docker系列 深度使用nextcloud(九) 硬盘挂载_第2张图片

  • Nextcloud Dockerhub,上面往往会有大版本的最后/最新版本号:

Docker系列 深度使用nextcloud(九) 硬盘挂载_第3张图片

  • 版本号法。比如,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

可以看到下列文件结构:

Docker系列 深度使用nextcloud(九) 硬盘挂载_第4张图片

通常来说,appcachedb在duplicati里都是同时备份的。但你要特别注意app中的configdata文件夹,它们两个包含最重要的核心数据(配置、文件)。你在升级时,甚至可以只保留configdata文件夹;升级完成后Nextcloud的文件和配置也不会丢失。

一般步骤

  • 做好备份,比如基于duplicati。
  • docker-compose down下线应用。
  • 修改docker-compose.yml,将nextcloud镜像的版本号改成待升级的版本号:

Docker系列 深度使用nextcloud(九) 硬盘挂载_第5张图片

  • 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,后来一切如常。

整个过程可能会不太顺利。不要怕,只要dataconfig的数据不丢失,就可以苟住

维护模式

升级Nextcloud的过程中,维护模式是很常见的。它通常有类似提示:

Nextcloud is in maintenance mode

有时候维护模式并不一定代表Nextcloud完全不能运行。你可以尝试关闭维护模式,自己调试一下网站,看是否可以正常登陆。你可以这样做:

  • 方法1:进入Nextcloud的根目录,打开/config/config.php,将maintenance的值改为false后重启stack:

Docker系列 深度使用nextcloud(九) 硬盘挂载_第6张图片

  • 方法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镜像。大致如下:

  • 主页

  • 文件

Docker系列 深度使用nextcloud(九) 硬盘挂载_第7张图片

  • 图片:

Docker系列 深度使用nextcloud(九) 硬盘挂载_第8张图片

  • PicGo:我用PicGo上传了一下图片,功能不受影响。Nextcloud图床的相关教程见《Docker系列 深度使用nextcloud(三)Typora图床》。

Docker系列 深度使用nextcloud(九) 硬盘挂载_第9张图片

  • 管理后台:

Docker系列 深度使用nextcloud(九) 硬盘挂载_第10张图片

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

你可能感兴趣的:(docker,nextcloud,docker,linux,容器)