042 - Automatic Major Upgrades¶
User Story¶
As an operator upgrading a long-running host across several major versions of its applications, I want every deploy to detect the version that the existing data was written by and to step through every mandatory intermediate version on its own, or to stop loudly where no forward path exists, so that one deploy brings old data to the pinned version without manual upgrade stops, silent downgrades or stale code and asset volumes.
Acceptance Criteria¶
[ ]
svc-db-postgresdetects the major version of an existing cluster fromPG_VERSION, in the volume root, inpgdata/and in<major>/docker, without any inventory value.[ ]
svc-db-postgresupgrades an older cluster major by major withpg_upgrade --linkin an upgrade image that carries the old and the new server binaries and the extension packages the role declares, and starts the pinned major on the upgraded data.[ ]
svc-db-postgreskeeps a reflink copy of the old data directory before the firstpg_upgrade --linkwhere the filesystem supports reflinks, and otherwise stops with a message that names the missing backup confirmation.[ ] A compose deploy of
svc-db-postgreson a PostgreSQL 17 volume in each of the three layouts ends on the pinned major with every database and role intact.[ ]
web-app-nextclouddetects the installed version fromversion.phpin its code volume and upgrades one major at a time up to the pinned version.[ ] A compose deploy of
web-app-nextcloudon data written by Nextcloud 31 ends on the pinned major, andocc statusreports it.[ ]
web-app-peertubedetects the version the existing data was written by without any inventory value and runs everydist/scripts/migrations/peertube-X.Y.jsabove that version up to the pinned version, in order, after the server migrations finished.[ ]
web-app-peertubereplaces the image-seededpeertube_assetsvolume whenever the deployed version changes.[ ] A compose deploy of
web-app-peertubeon data written by 7.3.0 ends on the pinned version, serves the client of the pinned version and keeps uploaded videos playable.[ ]
web-app-openprojectdetects the schema stage of an existing database and passes through every major the upstream requires between it and the pinned major.[ ] A compose deploy of
web-app-openprojecton a database written by 15.x ends on the pinned major with the seeder exiting 0.[ ]
web-app-moodledetects the release in its code volume and passes through every intermediate release that Moodle requires before the pinned release.[ ] A compose deploy of
web-app-moodleon a code volume below the pinned release’s minimum upgrade source ends on the pinned release.[ ]
web-app-joomladetects the core version in its code volume and updates the core up to the pinned major, including the database schema.[ ] A compose deploy of
web-app-joomlaon a 5.x code volume ends on the pinned major with SSO enabled.[ ]
web-app-blueskystops with a message naming both versions when the PDS data carries migrations the pinned image does not know.[ ]
web-app-confluenceandweb-app-jirastop with a message naming both build numbers when the home directory was written by a newer build than the pinned image.[ ]
web-app-mediawikireplaces the image-seededmediawiki_extensionsvolume and reinstalls its add-on extensions whenever the MediaWiki version changes.[ ] A compose deploy switches an existing
web-app-matrixfromflavor: composeon Synapse 1.144.0 toflavor: ansiblewith the same signing key id, the old media readable and Synapse running as uid 991.[ ] Every new mechanism has unit tests, and
make testpasses.