本人维护一个 Kubernetes 小集群,在上面运行 Nextcloud,可惜官方原版的 Nextcloud 容器镜像实在是不太好用。哪里不好用呢?
官方镜像的问题
官方镜像不是无状态的。Nextcloud 的文件实际存储在镜像中的/usr/src/nextcloud/,而 Web 根目录却是/var/www/html,后者挂载到了一个 Volume。每次启动容器时,都会把 Volume 中的版本号和镜像中的版本号做对比,如果镜像版本比较新或者 Volume 里面没有安装,则调用 rsync 拷贝/usr/src/nextcloud/到/var/www/html然后自动 migrate 数据库(危险!),否则什么都不做。这使得用户在不清空 Volume 的情况下无法降级,无法通过重建容器修复服务,更无法在不变动上游 nextcloud 版本号的情况下进行滚动更新。
Volume 的权限过于开放,为了能执行自动升级,给了 PHP 完全的写入权限。
需要容器内的 root 权限,无法在默认安全配置的 OpenShift 平台运行。
一些默认配置项不适合 Kubernetes 环境,比如会对一些目录的权限作检查,而你可能根本没有权限去控制 Kubernetes Persistent Volume 挂载目录的权限。能写就行了嘛!
简单"修"了一些小问题,详情见 GitHub 仓库页面。
背景
我在去年曾经给 Nextcloud 提过几个 issues (比如https://github.com/nextcloud/docker/issues/381),他们的开发者大概表示说:官方镜像这么设计是为了让个人或者简单部署时更容易,不是为“大型部署( larger installs )”设计的,建议自行修改镜像。
好吧。
Kube-nextcloud —— 针对 Kubernetes / OpenShift 平台优化(不想说 cloud-native )的 Nextcloud 发行版
最近在重建 kubernetes 集群后,专门抽了些时间修改了官方镜像的 Dockerfile,然后针对新的镜像写了 docker-compose 文件和 Kubernetes 的部署文件。鉴于修改后的镜像和部署文件运行良好,现把它开源共享出来,给需要的朋友们参考使用。
GitHub 链接: https://github.com/vfreex/kube-nextcloud
许可证:AGPLv3 (我也想用 Anti-996 License,但上游用的 AGPLv3 没得选择啊)
Git 仓库根目录下自带docker-compose.yaml,本地启动只需执行docker-compose up -d。Kubernetes 部署文件在deploy/下,Dockerfile 在/images下。