diff --git a/AGENTS.md b/AGENTS.md index 04c8aca..c84a069 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -27,7 +27,7 @@ verified, tried, and decided belongs in the commit message and the PR body. ## This repo - **`finish-upgrade` must stay behind the web daemon and must fail open.** A rejected oneshot fn never reaches `EXIT_SUCCESS`, which both blocks `long-running-tasks` (gated on it) and makes the SDK re-invoke it on a backoff — `occ upgrade` in a loop. Every step inside is individually guarded for that reason. -- **`guardUpstreamUpgrade` stays ahead of `versionGraph` in `setupInit`.** The graph advances the data version and runs the 0.3.5.x layout migration, and neither is undone on a volume StartOS could not snapshot — a package migrated from 0.3.5.x has none until its next boot. +- **`guardUpstreamUpgrade` stays ahead of `versionGraph` in `setupInit`.** The graph advances the data version, which is not undone on a volume StartOS could not snapshot — a package migrated from 0.3.5.x has none until its next boot. - **The upstream version upgrade belongs in init, not at daemon start.** Init is snapshotted, so a failed migration rolls the update back; at daemon start an interrupted one strands the instance on "Update needed — use the command line updater" permanently, because the entrypoint only compares deployed code to image code and never re-checks what the DB acknowledged. - **Renaming an action abandons its task's replay key, and nothing reaps it.** The key defaults to `[package-id]:[action-id]`, so the `create-admin-user` → `get-admin-credentials` rename stranded `nextcloud:create-admin-user` — and because the old action id no longer resolves, `recheck_tasks` cannot read its input and the task's `active` flag freezes wherever it last sat. A task with no `when` clause is only removed by _running_ it, which an unresolvable id makes impossible. Rename an action with a live task and you owe a `sdk.action.clearTask(effects, '')` in the same release. - **Long-running `occ` work must be queued, never run inline in an action handler** — it would block past the action timeout. Adding one means matching entries in `OCC_ARGS`, `TASK_NOTICE`, and a conditional health check, all keyed off `ACTION_IDS`. diff --git a/UPDATING.md b/UPDATING.md index 895eebd..77e6f5c 100644 --- a/UPDATING.md +++ b/UPDATING.md @@ -22,7 +22,7 @@ curl -fsSL "https://hub.docker.com/v2/repositories/library/postgres/tags?page_si | jq -r '.results[].name' | grep -E '^17.*alpine' | head ``` -Current pin: `postgres:17-alpine` in `startos/manifest/index.ts` (`images.postgres.source.dockerTag`). Changing the major also means changing `PG_MAJOR` in `startos/versions/from035x.ts`, which the 0.3.5x migration compares against the cluster's `PG_VERSION`. +Current pin: `postgres:17-alpine` in `startos/manifest/index.ts` (`images.postgres.source.dockerTag`). **Valkey** ([valkey/valkey](https://hub.docker.com/r/valkey/valkey) on Docker Hub): @@ -37,10 +37,11 @@ Current pin: `valkey/valkey:9-alpine` in `startos/manifest/index.ts` (`images.va **Nextcloud** — bump the `NEXTCLOUD_VERSION` `ARG` default in `nextcloud.Dockerfile` to the new patch version (e.g. `32.0.9` → `32.0.10`). The `-apache` suffix is appended by the `FROM` line; don't include it in the ARG value. -A **major** bump (e.g. `33.0.8` → `34.0.3`) needs four more checks: +A **major** bump (e.g. `33.0.8` → `34.0.3`) needs five more checks: - Diff `core/shipped.json` between the two tags and add whatever the new major appends to `defaultEnabled` and `alwaysEnabled` to the `defaultApps` list in `startos/actions/maintenance/disableUnstableApps.ts`. `occ app:disable` exits non-zero on an `alwaysEnabled` app, and the action runs under `execFail`, so one missing id breaks the recovery action a locked-out user is told to run. - Check `$OC_VersionCanBeUpgradedFrom` in the new tag's `version.php`. Nextcloud upgrades one major at a time, so every version the registry still lists must be within one major of the new image — `guardUpstreamUpgrade` in `startos/init/bootstrapNextcloud.ts` refuses the rest before the version graph runs. +- Move the version graph's floor to the previous major: `startos/versions/` declares only `current` and a `.0.0:0` floor whose `up` is `IMPOSSIBLE`. A floor left a major lower lets `canMigrateFrom` accept installs the guard then refuses, so StartOS offers them this release instead of the previous major's. - Diff `config/config.sample.php` between the two tags against the keys `startos/fileModels/config.php.ts` models, and against the defaults the README and `instructions.md` quote. - Re-check the new major's system requirements page for the supported PostgreSQL and PHP versions. diff --git a/nextcloud.Dockerfile b/nextcloud.Dockerfile index afcf3d6..c82d432 100644 --- a/nextcloud.Dockerfile +++ b/nextcloud.Dockerfile @@ -1,4 +1,4 @@ -ARG NEXTCLOUD_VERSION=34.0.4 +ARG NEXTCLOUD_VERSION=35.0.1 FROM nextcloud:${NEXTCLOUD_VERSION}-apache RUN apt-get update \ diff --git a/package-lock.json b/package-lock.json index 4a1d188..0a44428 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1621,7 +1621,7 @@ } }, "node_modules/filebrowser-startos": { - "resolved": "git+ssh://git@github.com/Start9Labs/filebrowser-startos.git#77539bc3940cc99ff9f5c1f52024f32474f357c4", + "resolved": "git+ssh://git@github.com/Start9Labs/filebrowser-startos.git#a0ab415cd88c46b6cd21c543ec5abe3a77fdf65f", "dependencies": { "@start9labs/start-sdk": "2.0.9" } @@ -1661,7 +1661,7 @@ } }, "node_modules/nextexplorer-startos": { - "resolved": "git+ssh://git@github.com/Start9Labs/nextexplorer-startos.git#d8588c6874e0f7e5ca1e160dc58e1fcf06c0ef59", + "resolved": "git+ssh://git@github.com/Start9Labs/nextexplorer-startos.git#c0539454628fffa7873841cbd286b20174acd33b", "dependencies": { "@start9labs/start-sdk": "2.0.9", "filebrowser-startos": "github:Start9Labs/filebrowser-startos#next" diff --git a/package.json b/package.json index 37ace15..cbf0b51 100644 --- a/package.json +++ b/package.json @@ -22,8 +22,5 @@ "tabWidth": 2, "semi": false, "singleQuote": true - }, - "overrides": { - "@start9labs/start-sdk": "$@start9labs/start-sdk" } } diff --git a/startos/actions/maintenance/disableUnstableApps.ts b/startos/actions/maintenance/disableUnstableApps.ts index c9591e9..86ffbf0 100644 --- a/startos/actions/maintenance/disableUnstableApps.ts +++ b/startos/actions/maintenance/disableUnstableApps.ts @@ -73,6 +73,7 @@ export const disableUnstableApps = sdk.Action.withoutInput( 'serverinfo', 'settings', 'sharebymail', + 'sharing', 'support', 'survey_client', 'suspicious_login', diff --git a/startos/i18n/dictionaries/default.ts b/startos/i18n/dictionaries/default.ts index 07ddbfb..04e2bb7 100644 --- a/startos/i18n/dictionaries/default.ts +++ b/startos/i18n/dictionaries/default.ts @@ -16,9 +16,6 @@ const dict = { // bootstrapNextcloud.ts 'Display your admin password so you can administer your Nextcloud instance': 8, - // v32.0.5.0.ts - 'Admin password could not be recovered from migration. Please reset it.': 9, - // setConfig.ts Configure: 10, 'Basic configuration options for your Nextcloud instance': 11, @@ -198,9 +195,6 @@ const dict = { 'Creating the database': 161, 'Migrating the database': 162, - // versions/from035x.ts: 0.3.5x migration progress - 'Updating file permissions': 134, - // disableUnstableApps.ts: per-app outcome report 'Partially Successful': 137, 'No non-default apps were enabled.': 138, diff --git a/startos/i18n/dictionaries/translations.ts b/startos/i18n/dictionaries/translations.ts index 9aa3d30..35c8cf6 100644 --- a/startos/i18n/dictionaries/translations.ts +++ b/startos/i18n/dictionaries/translations.ts @@ -11,7 +11,6 @@ export default { 6: 'WebDAV', 7: 'Direcciones para sincronización WebDAV', 8: 'Muestre su contraseña de administrador para poder administrar su instancia de Nextcloud', - 9: 'No se pudo recuperar la contraseña de administrador durante la migración. Por favor, restablézcala.', 10: 'Configurar', 11: 'Opciones básicas de configuración para su instancia de Nextcloud', 12: 'Idioma predeterminado', @@ -139,7 +138,6 @@ export default { 133: 'Copiando los archivos de la aplicación', 161: 'Creando la base de datos', 162: 'Migrando la base de datos', - 134: 'Actualizando permisos de archivos', 135: 'Retransmitir las llamadas de Talk a través de Coturn', 136: 'Retransmita las llamadas de Talk a través del servicio Coturn para que se establezcan cuando ambas partes están detrás de NAT o de un cortafuegos restrictivo. Requiere que la aplicación Talk esté instalada en Nextcloud y que Coturn esté instalado y en ejecución con su propio dominio público; hasta que ambos lo estén, las llamadas recurren a una conexión directa.', 137: 'Parcialmente correcto', @@ -171,7 +169,6 @@ export default { 6: 'WebDAV', 7: 'Adressen für WebDAV-Synchronisation', 8: 'Zeigen Sie Ihr Admin-Passwort an, um Ihre Nextcloud-Instanz verwalten zu können', - 9: 'Das Admin-Passwort konnte bei der Migration nicht wiederhergestellt werden. Bitte setzen Sie es zurück.', 10: 'Konfigurieren', 11: 'Grundlegende Konfigurationsoptionen für Ihre Nextcloud-Instanz', 12: 'Standardsprache', @@ -299,7 +296,6 @@ export default { 133: 'Anwendungsdateien werden kopiert', 161: 'Datenbank wird erstellt', 162: 'Datenbank wird migriert', - 134: 'Dateiberechtigungen werden aktualisiert', 135: 'Talk-Anrufe über Coturn weiterleiten', 136: 'Talk-Anrufe über den Coturn-Dienst weiterleiten, damit sie auch zustande kommen, wenn beide Seiten hinter NAT oder einer restriktiven Firewall sitzen. Erfordert, dass die Talk-App in Nextcloud installiert ist und dass Coturn installiert ist, läuft und eine eigene öffentliche Domain hat; bis beides zutrifft, fallen Anrufe auf eine Direktverbindung zurück.', 137: 'Teilweise erfolgreich', @@ -331,7 +327,6 @@ export default { 6: 'WebDAV', 7: 'Adresy do synchronizacji WebDAV', 8: 'Wyświetl hasło administratora, aby móc zarządzać swoją instancją Nextcloud', - 9: 'Nie udało się odzyskać hasła administratora podczas migracji. Proszę je zresetować.', 10: 'Konfiguracja', 11: 'Podstawowe opcje konfiguracji instancji Nextcloud', 12: 'Domyślny język', @@ -459,7 +454,6 @@ export default { 133: 'Kopiowanie plików aplikacji', 161: 'Tworzenie bazy danych', 162: 'Migrowanie bazy danych', - 134: 'Aktualizowanie uprawnień plików', 135: 'Przekazuj połączenia Talk przez Coturn', 136: 'Przekazuj połączenia Talk przez usługę Coturn, aby zestawiały się, gdy obie strony są za NAT-em lub restrykcyjną zaporą. Wymaga zainstalowanej w Nextcloud aplikacji Talk oraz zainstalowanego i uruchomionego Coturn z własną domeną publiczną; dopóki nie ma obu, połączenia wracają do trybu bezpośredniego.', 137: 'Częściowo pomyślnie', @@ -491,7 +485,6 @@ export default { 6: 'WebDAV', 7: 'Adresses pour la synchronisation WebDAV', 8: 'Affichez votre mot de passe administrateur pour pouvoir administrer votre instance Nextcloud', - 9: "Le mot de passe administrateur n'a pas pu être récupéré lors de la migration. Veuillez le réinitialiser.", 10: 'Configurer', 11: 'Options de configuration de base pour votre instance Nextcloud', 12: 'Langue par défaut', @@ -619,7 +612,6 @@ export default { 133: "Copie des fichiers de l'application", 161: 'Création de la base de données', 162: 'Migration de la base de données', - 134: 'Mise à jour des permissions des fichiers', 135: 'Relayer les appels Talk via Coturn', 136: "Relayer les appels Talk via le service Coturn pour qu'ils aboutissent lorsque les deux parties sont derrière un NAT ou un pare-feu restrictif. Nécessite que l'application Talk soit installée dans Nextcloud et que Coturn soit installé et démarré avec un domaine public qui lui est propre ; tant que ce n'est pas le cas, les appels se rabattent sur une connexion directe.", 137: 'Partiellement réussi', diff --git a/startos/init/bootstrapNextcloud.ts b/startos/init/bootstrapNextcloud.ts index 5c090af..bb43e91 100644 --- a/startos/init/bootstrapNextcloud.ts +++ b/startos/init/bootstrapNextcloud.ts @@ -184,14 +184,6 @@ function readNextcloudVersions(effects: T.Effects) { * daemon start via the entrypoint, where an interrupted run stranded the * instance on "Update needed — use the command line updater". * - * This is the **upstream application** upgrade, triggered by the bundled - * Nextcloud release being newer than the deployed one — not to be confused with - * the one-time **StartOS layout** migration in - * [`../versions/from035x.ts`](../versions/from035x.ts), which is driven by the - * package version graph. Both run during init; `versionGraph` precedes - * `bootstrapNextcloud` in `sdk.setupInit`, so the 0.3.5x migration has always - * finished before this starts. - * * `NEXTCLOUD_UPDATE=1` makes the stock entrypoint perform the upgrade with a * no-op command (`true`) and exit, so it never binds a port. `runUntilSuccess` * brings up Postgres + Valkey (occ upgrade talks to both), runs the upgrade to diff --git a/startos/versions/current.ts b/startos/versions/current.ts index b270b46..31bf419 100644 --- a/startos/versions/current.ts +++ b/startos/versions/current.ts @@ -1,13 +1,93 @@ import { IMPOSSIBLE, VersionInfo } from '@start9labs/start-sdk' export const current = VersionInfo.of({ - version: '34.0.4:5', + version: '35.0.1:0', releaseNotes: { - en_US: `Fixes a crash after installing or updating an app on aarch64 servers that left Nextcloud unreachable until it was restarted. Moving a large Nextcloud from StartOS 0.3.5 no longer fails partway through the migration.`, - es_ES: `Corrige un fallo tras instalar o actualizar una aplicación en servidores aarch64 que dejaba Nextcloud inaccesible hasta reiniciarlo. Migrar una instalación grande de Nextcloud desde StartOS 0.3.5 ya no falla a mitad de la migración.`, - de_DE: `Behebt einen Absturz nach dem Installieren oder Aktualisieren einer App auf aarch64-Servern, der Nextcloud bis zu einem Neustart unerreichbar machte. Die Migration einer großen Nextcloud-Installation von StartOS 0.3.5 bricht nicht mehr mittendrin ab.`, - pl_PL: `Naprawia awarię po zainstalowaniu lub zaktualizowaniu aplikacji na serwerach aarch64, po której Nextcloud był niedostępny do czasu ponownego uruchomienia. Migracja dużej instalacji Nextcloud ze StartOS 0.3.5 nie kończy się już błędem w trakcie.`, - fr_FR: `Corrige un plantage après l'installation ou la mise à jour d'une application sur les serveurs aarch64, qui rendait Nextcloud inaccessible jusqu'à son redémarrage. La migration d'une installation Nextcloud volumineuse depuis StartOS 0.3.5 n'échoue plus en cours de route.`, + en_US: `Updated Nextcloud to 35.0.1 — a major upgrade from the Nextcloud 34 series. + +**New in Nextcloud 35** + +- Sharing has a unified dialog and sidebar, with share status and clearer password and expiration guidance. +- Photos adds search, trip memories, a map, slideshows, EXIF editing and a redesigned timeline. +- Text adds inline comments and footnotes. +- Office adds document previews and navigation actions. + +**Worth knowing** + +- A server still on Nextcloud 33 is offered the Nextcloud 34 release first; once it is installed, this update follows. Nextcloud upgrades only one major version at a time. +- Apps installed from the Nextcloud app store may need compatible updates and can be disabled during the upgrade. +- The update migrates the database schema, so it can take longer than a maintenance release. +- Nextcloud Desktop clients older than 3.3.50 are no longer supported. + +[Full release notes](https://github.com/nextcloud-releases/server/releases/tag/v35.0.1)`, + es_ES: `Nextcloud se ha actualizado a la versión 35.0.1, una actualización mayor desde la serie Nextcloud 34. + +**Novedades de Nextcloud 35** + +- El uso compartido tiene un cuadro de diálogo y una barra lateral unificados, con el estado de los recursos compartidos e indicaciones más claras sobre contraseñas y vencimiento. +- Fotos incorpora búsqueda, recuerdos de viajes, un mapa, presentaciones, edición de EXIF y una cronología rediseñada. +- Texto incorpora comentarios en línea y notas al pie. +- Office incorpora vistas previas de documentos y acciones de navegación. + +**Conviene saber** + +- A un servidor que todavía utiliza Nextcloud 33 se le ofrece primero la versión con Nextcloud 34; una vez instalada, aparece esta actualización. Nextcloud solo actualiza una versión mayor cada vez. +- Las aplicaciones instaladas desde la tienda de Nextcloud pueden necesitar actualizaciones compatibles y podrían desactivarse durante la actualización. +- La actualización migra el esquema de la base de datos, por lo que puede tardar más que una versión de mantenimiento. +- Los clientes de Nextcloud Desktop anteriores a la versión 3.3.50 ya no son compatibles. + +[Notas completas de la versión](https://github.com/nextcloud-releases/server/releases/tag/v35.0.1)`, + de_DE: `Nextcloud wurde auf 35.0.1 aktualisiert — ein Hauptversionssprung von der Nextcloud-Reihe 34. + +**Neu in Nextcloud 35** + +- Freigaben haben einen einheitlichen Dialog und eine einheitliche Seitenleiste mit Freigabestatus und klareren Hinweisen zu Kennwörtern und Ablaufdaten. +- Fotos bietet Suche, Reiseerinnerungen, eine Karte, Diashows, EXIF-Bearbeitung und eine neu gestaltete Zeitleiste. +- Text bietet Inline-Kommentare und Fußnoten. +- Office bietet Dokumentvorschauen und Navigationsaktionen. + +**Wissenswert** + +- Einem Server, der noch Nextcloud 33 verwendet, wird zuerst die Nextcloud-34-Version angeboten; sobald sie installiert ist, folgt dieses Update. Nextcloud aktualisiert immer nur um eine Hauptversion. +- Aus dem Nextcloud App Store installierte Apps benötigen möglicherweise kompatible Updates und können während des Upgrades deaktiviert werden. +- Das Update migriert das Datenbankschema und kann daher länger dauern als eine Wartungsversion. +- Nextcloud-Desktop-Clients vor Version 3.3.50 werden nicht mehr unterstützt. + +[Vollständige Versionshinweise](https://github.com/nextcloud-releases/server/releases/tag/v35.0.1)`, + pl_PL: `Zaktualizowano Nextcloud do wersji 35.0.1 — jest to aktualizacja główna z serii Nextcloud 34. + +**Nowości w Nextcloud 35** + +- Udostępnianie ma ujednolicone okno dialogowe i panel boczny, ze stanem udostępnień oraz jaśniejszymi wskazówkami dotyczącymi haseł i dat wygaśnięcia. +- Zdjęcia zyskują wyszukiwanie, wspomnienia z podróży, mapę, pokazy slajdów, edycję EXIF i przeprojektowaną oś czasu. +- Tekst zyskuje komentarze w tekście i przypisy dolne. +- Office zyskuje podglądy dokumentów i akcje nawigacyjne. + +**Warto wiedzieć** + +- Serwer, który nadal używa Nextcloud 33, otrzyma najpierw wydanie z Nextcloud 34; po jego zainstalowaniu pojawi się ta aktualizacja. Nextcloud aktualizuje się tylko o jedną wersję główną naraz. +- Aplikacje zainstalowane ze sklepu Nextcloud mogą wymagać zgodnych aktualizacji i mogą zostać wyłączone podczas aktualizacji. +- Aktualizacja migruje schemat bazy danych, więc może potrwać dłużej niż wydanie konserwacyjne. +- Klienty Nextcloud Desktop starsze niż 3.3.50 nie są już obsługiwane. + +[Pełne informacje o wydaniu](https://github.com/nextcloud-releases/server/releases/tag/v35.0.1)`, + fr_FR: `Nextcloud a été mis à jour vers la version 35.0.1, une mise à niveau majeure depuis la série Nextcloud 34. + +**Nouveautés de Nextcloud 35** + +- Le partage bénéficie d'une boîte de dialogue et d'une barre latérale unifiées, avec l'état des partages et des indications plus claires sur les mots de passe et les dates d'expiration. +- Photos propose désormais la recherche, les souvenirs de voyage, une carte, des diaporamas, la modification des données EXIF et une chronologie repensée. +- Texte propose désormais les commentaires intégrés et les notes de bas de page. +- Office propose désormais des aperçus de documents et des actions de navigation. + +**Bon à savoir** + +- Un serveur encore sous Nextcloud 33 se voit d'abord proposer la version avec Nextcloud 34 ; une fois celle-ci installée, cette mise à jour suit. Nextcloud ne franchit qu'une version majeure à la fois. +- Les applications installées depuis la boutique Nextcloud peuvent nécessiter des mises à jour compatibles et être désactivées pendant la mise à niveau. +- La mise à jour migre le schéma de la base de données et peut donc prendre plus de temps qu'une version de maintenance. +- Les clients Nextcloud Desktop antérieurs à la version 3.3.50 ne sont plus pris en charge. + +[Notes de version complètes](https://github.com/nextcloud-releases/server/releases/tag/v35.0.1)`, }, migrations: { up: async () => {}, diff --git a/startos/versions/from035x.ts b/startos/versions/from035x.ts deleted file mode 100644 index 1732198..0000000 --- a/startos/versions/from035x.ts +++ /dev/null @@ -1,427 +0,0 @@ -/** - * The one-time StartOS 0.3.5x → 0.4.0 data migration. - * - * This is the **StartOS layout** migration: it converts what 0.3.5.1 left on - * disk into the layout the 0.4.0 package expects — Postgres cluster location, - * `config.yaml` → `config.php`, and file permissions. The version graph invokes - * `migrations.up` on every update into the current version, from any older one; - * the `config.yaml` marker is what makes this a no-op on an instance that never - * ran on 0.3.5x. - * - * Do not confuse it with the **upstream application** upgrade in - * [`../init/bootstrapNextcloud.ts`](../init/bootstrapNextcloud.ts), which runs - * Nextcloud's own `occ upgrade` whenever the bundled Nextcloud release is newer - * than the deployed one. The two are independent and answer to different - * triggers, but both run during init, in that order — `versionGraph` precedes - * `bootstrapNextcloud` in `sdk.setupInit`, so everything here has finished - * before the upstream upgrade starts. - */ - -import { SubContainer, T, YAML } from '@start9labs/start-sdk' -import { readFile, rm, stat } from 'fs/promises' -import { cp } from 'node:fs/promises' -import { resetAdmin } from '../actions/maintenance/resetAdmin' -import { configPhp } from '../fileModels/config.php' -import { storeJson } from '../fileModels/store.json' -import { i18n } from '../i18n' -import { manifest } from '../manifest' -import { sdk } from '../sdk' -import { - NEXTCLOUD_PATH, - NEXTCLOUD_VOLUME_HOST, - PGDATA, - POSTGRES_PATH, - locales, - nextcloudMount, - phoneRegions, -} from '../utils' - -const POSTGRES_VOLUME_HOST = '/media/startos/volumes/db' as const -const START9_PATH = '/media/startos/volumes/main/start9' as const - -/** - * Structural view of the `PhaseHandle` returned by a migration's - * `progress.addPhase` — the SDK bundles `@start9labs/start-core` as a nested - * dependency, so the type itself isn't importable from a package. - */ -type ProgressPhase = { - setUnits(units: 'steps'): void - setDone(done: number): void -} - -/** - * Progress tracker handed to `migrations.up`. Only `addPhase` is used here. - */ -type MigrationProgress = { - addPhase( - name: string, - contribution?: number | null, - ): ProgressPhase & { start(): void; complete(): void } -} - -const exists = (p: string) => - stat(p).then( - () => true, - () => false, - ) - -const PGDATA_NOT_EMPTY = - 'Nextcloud cannot move its PostgreSQL database into place because the destination directory already holds files. Nothing has been changed and your data is still on disk. Please contact Start9 support. Do NOT uninstall the package — that would delete your files as well.' - -/** - * Remove the empty `PGDATA` shell the Postgres entrypoint leaves behind, so the - * `mv` that follows moves the cluster into place rather than inside it. Absent - * is the normal case; holding anything is not. `exec` does not throw and the - * two outcomes are indistinguishable from its exit code, so check directly. - */ -const clearPgdataShell = async (sub: SubContainer) => { - await sub.exec(['rmdir', PGDATA], { user: 'root' }) - if (await exists(`${POSTGRES_VOLUME_HOST}/data`)) - throw new Error(PGDATA_NOT_EMPTY) -} - -/** - * Where a Postgres cluster may be found, relative to the `db` volume root: - * `data` if a previous run already relocated it, `17/main` or `15/main` if it - * is still in the 0.3.5x Debian layout. - */ -const PG_LOCATIONS = ['data', '17/main', '15/main'] as const - -/** Major version of the postgres image; see `PG_MAJOR` in UPDATING.md. */ -const PG_MAJOR = '17' as const - -/** 0.3.5x's own `pg_upgrade` 15 → 17 touched this only once it succeeded. */ -const PG_UPGRADE_MARKER = `${POSTGRES_VOLUME_HOST}/.pg17_upgrade_complete` - -type Cluster = { at: (typeof PG_LOCATIONS)[number]; major: string } - -/** Major version that wrote the cluster at `dir`, or '' if there isn't one. */ -const clusterVersion = (dir: string) => - readFile(`${dir}/PG_VERSION`, 'utf-8').then( - (v) => v.trim(), - () => '', - ) - -/** - * The real cluster and the major version that wrote it, or `null` if there - * isn't one. - * - * Identified by `PG_VERSION`, never by the directory existing. The Postgres - * entrypoint runs `mkdir -p "$PGDATA"` in `docker_create_db_directories` - * *before* it checks whether the database is initialized and bails, so every - * start against an unmigrated volume leaves an empty `data/` behind, which used - * to read as "already relocated" — the move was skipped, the migration reported - * success, and it deleted the 0.3.5x marker on its way out. - */ -const findCluster = async (): Promise => { - for (const at of PG_LOCATIONS) { - const major = await clusterVersion(`${POSTGRES_VOLUME_HOST}/${at}`) - if (major) return { at, major } - } - return null -} - -/** True if this instance holds Nextcloud application data worth preserving. */ -const hasNextcloudData = () => - exists(`${NEXTCLOUD_VOLUME_HOST}/config/config.php`) - -const relocatePostgresFrom035x = async ( - effects: T.Effects, - from: (typeof PG_LOCATIONS)[number], -) => { - if (from === 'data') return // already in the canonical location - - const pgMounts = sdk.Mounts.of().mountVolume({ - volumeId: 'db', - mountpoint: POSTGRES_PATH, - readonly: false, - subpath: null, - }) - - await sdk.SubContainer.withTemp( - effects, - { imageId: 'postgres' }, - pgMounts, - 'pg-migrate', - async (sub) => { - // Move the cluster from the 0.3.5x Debian layout to the canonical Docker - // path. `from` is known to hold a real cluster, and PGDATA is known not - // to — the caller established both via PG_VERSION. - await clearPgdataShell(sub) - await sub.execFail(['mv', `${POSTGRES_PATH}/${from}`, PGDATA], { - user: 'root', - }) - await sub.execFail( - ['rm', '-rf', `${POSTGRES_PATH}/${from.split('/')[0]}`], - { - user: 'root', - }, - ) - await sub.execFail( - ['chown', '-R', 'postgres:postgres', POSTGRES_PATH], - { user: 'root' }, - null, - ) - await sub.exec(['rm', '-f', `${PGDATA}/postmaster.pid`], { - user: 'postgres', - }) - }, - ) -} - -type OldConfig = { - 'default-locale': string - 'default-phone-region': string - maintenance_window_start: number -} - -const importConfigFrom035x = async (effects: T.Effects, config: OldConfig) => { - await cp(configPhp.path, `${configPhp.path}.bak`) - - // 0.3.5 stored these as free text; anything unrecognised is left unset so - // the shape supplies its default. - const known = (table: T, v: string) => - v in table ? (v as keyof T) : undefined - - await configPhp.merge(effects, { - default_locale: known(locales, config['default-locale']), - default_phone_region: known(phoneRegions, config['default-phone-region']), - maintenance_window_start: config.maintenance_window_start, - 'overwrite.cli.url': undefined, - 'htaccess.RewriteBase': undefined, - }) - - const adminPassword: string | undefined = ( - await readFile(`${START9_PATH}/password.dat`, 'utf-8').catch( - () => undefined, - ) - )?.trim() - if (adminPassword) { - await storeJson.merge(effects, { adminPassword }) - } else { - await sdk.action.createOwnTask(effects, resetAdmin, 'critical', { - reason: i18n( - 'Admin password could not be recovered from migration. Please reset it.', - ), - }) - } -} - -const repairPermissionsFrom035x = async ( - effects: T.Effects, - phase: ProgressPhase, -) => { - await sdk.SubContainer.withTemp( - effects, - { imageId: 'nextcloud' }, - nextcloudMount, - 'upgrade-sub', - async (sub) => { - // Fix permissions on Nextcloud app files (everything except data/). - // In 0.3.5.1, the upstream Docker entrypoint set group=root. In 0.4.0, - // the group is www-data. We need ug+rw so the owner and group can - // read/write, and o-rwx so other users (including dependent services - // not in the www-data group) cannot access app internals. - // The data/ directory is excluded here and handled separately below. - await sub.execFail( - [ - 'find', - NEXTCLOUD_PATH, - '-path', - `${NEXTCLOUD_PATH}/data`, - '-prune', - '-o', - '-exec', - 'chmod', - 'ug+rw,o-rwx', - '{}', - '+', - ], - { user: 'root' }, - null, - ) - // occ must be executable for Nextcloud CLI operations - await sub.execFail(['chmod', 'u+x', `${NEXTCLOUD_PATH}/occ`], { - user: 'root', - }) - - // Fix permissions on user data files (data/). - // - // The data directory can be enormous (2TB+), so we cannot use a single - // recursive find or chmod -R — both accumulate inode metadata for the - // entire tree in memory and get OOM-killed (SIGKILL) in the - // memory-constrained migration subcontainer. - // - // Strategy: walk the directory tree from TypeScript, processing one - // directory at a time. For each directory: - // 1. find -maxdepth 1 -print0 | xargs -0 -n 5000 chmod ... - // Streams the immediate children through xargs in batches of 5000, - // so neither find nor chmod ever holds more than one directory's - // listing in memory. - // 2. find -maxdepth 1 -mindepth 1 -type d -print0 - // Lists only the immediate subdirectories so we can recurse into - // them one at a time. Uses -print0 / split('\0') to handle - // filenames with spaces or special characters. - // - // This keeps peak memory proportional to the largest single directory, - // not the total file count. - // - // Progress is a bare count of directories processed, with no total: - // establishing a total means a second full metadata walk of the tree, - // which on a multi-terabyte instance costs about as much as the work - // itself. A count that keeps climbing answers the question the user - // actually has — is this alive — without paying for a percentage. - // Reported on the same 100-directory cadence as the log line, since every - // update pushes to the OS and this loop runs many times a second. - let dirCount = 0 - phase.setUnits('steps') - const chmodDir = async (dir: string) => { - dirCount++ - if (dirCount % 100 === 0) { - console.info( - `chmod migration: processed ${dirCount} directories, current: ${dir}`, - ) - phase.setDone(dirCount) - } - await sub.execFail( - [ - 'sh', - '-c', - `find "$1" -maxdepth 1 -print0 | xargs -0 -n 5000 chmod ug+rw,o-rwx`, - '_', - dir, - ], - { user: 'root' }, - null, - ) - const { stdout } = await sub.execFail( - [ - 'find', - dir, - '-maxdepth', - '1', - '-mindepth', - '1', - '-type', - 'd', - '-print0', - ], - { user: 'root' }, - null, - ) - const subdirs = stdout - .toString() - .split('\0') - .filter((s) => s.length > 0) - for (const subdir of subdirs) { - await chmodDir(subdir) - } - } - await chmodDir(`${NEXTCLOUD_PATH}/data`) - phase.setDone(dirCount) - }, - ) -} - -/** - * Relocate PGDATA from a previous 0.4.0 beta's path (`17/docker` → `data`). - * Independent of the 0.3.5x work above — a beta tester has no `config.yaml`. - */ -const relocatePostgresFromBeta = async (effects: T.Effects) => { - // Same PG_VERSION test as findCluster, and for the same reason: keying off - // the directory would both miss the real cluster and let `mv` run against an - // existing PGDATA, which moves the source *inside* it (data/docker) rather - // than into place. - if (!(await clusterVersion(`${POSTGRES_VOLUME_HOST}/17/docker`))) return - if (await clusterVersion(`${POSTGRES_VOLUME_HOST}/data`)) return - - const pgMounts = sdk.Mounts.of().mountVolume({ - volumeId: 'db', - subpath: null, - mountpoint: POSTGRES_PATH, - readonly: false, - }) - await sdk.SubContainer.withTemp( - effects, - { imageId: 'postgres' }, - pgMounts, - 'pg-relocate', - async (sub) => { - await clearPgdataShell(sub) - await sub.execFail(['mv', `${POSTGRES_PATH}/17/docker`, PGDATA], { - user: 'root', - }) - await sub.execFail(['rm', '-rf', `${POSTGRES_PATH}/17`], { - user: 'root', - }) - }, - ) -} - -/** - * The migration body for `current`'s `migrations.up`. A no-op on an instance - * that never ran on 0.3.5x, apart from the beta PGDATA relocation. - */ -export const migrateFrom035x = async ( - effects: T.Effects, - progress: MigrationProgress, -) => { - // config.yaml on the main volume is the 0.3.5x marker. - const configYaml: OldConfig | undefined = await readFile( - `${START9_PATH}/config.yaml`, - 'utf-8', - ).then(YAML.parse, () => undefined) - - if (configYaml) { - // Refuse to go any further without a real cluster to migrate. Everything - // below this point is destructive-by-omission: it rewrites config, walks - // the whole data tree, and finally deletes the 0.3.5x marker, after which - // this migration can never run again. Completing any of that without - // having moved a database is how an instance ends up permanently - // un-migratable. - const cluster = await findCluster() - if (!cluster) { - throw new Error( - (await hasNextcloudData()) - ? 'Nextcloud could not find its PostgreSQL database. Your files are still on disk and are not affected, but without the database Nextcloud cannot start, and the update cannot continue. Restore this service from a StartOS backup. Do NOT uninstall the package — that would delete your files as well.' - : 'This Nextcloud package was configured on StartOS 0.3.5x but never started, so there is no data to migrate to 0.4.0. Please uninstall the Nextcloud package and reinstall it to set up a fresh 0.4.0 install.', - ) - } - // 0.3.5x upgraded its own cluster 15 → 17 in pg_upgrade's copy mode and - // reaped 15/main on the *next* launch, gated on the marker. So 15/main - // without the marker means that upgrade never finished, and any 17/main - // beside it is the empty initdb stub it left — which findCluster prefers. - if ( - (await clusterVersion(`${POSTGRES_VOLUME_HOST}/15/main`)) && - !(await exists(PG_UPGRADE_MARKER)) - ) { - throw new Error( - `Nextcloud's PostgreSQL 15 to ${PG_MAJOR} upgrade never finished on StartOS 0.3.5.x, so its database cannot be migrated to 0.4.0. Nothing has been changed and your files and database are still on disk. Please contact Start9 support. Do NOT uninstall the package — that would delete your files as well.`, - ) - } - if (cluster.major !== PG_MAJOR) { - throw new Error( - `Nextcloud found a PostgreSQL ${cluster.major} database, but this version of Nextcloud runs PostgreSQL ${PG_MAJOR}, so it cannot be migrated. Nothing has been changed and your files and database are still on disk. Please contact Start9 support. Do NOT uninstall the package — that would delete your files as well.`, - ) - } - await relocatePostgresFrom035x(effects, cluster.at) - await importConfigFrom035x(effects, configYaml) - // Weighted far above the steps around it: on a large instance this walk - // runs for hours while everything else here takes seconds. Without a phase - // the update UI sat on an unmoving bar for the whole run, which reads as a - // hang — and users cancelled, which is how an instance ends up - // half-migrated. - const permissions = progress.addPhase( - i18n('Updating file permissions'), - 100, - ) - permissions.start() - await repairPermissionsFrom035x(effects, permissions) - permissions.complete() - await rm(START9_PATH, { recursive: true }) - // Remove the stale config.php key from 0.3.5.1 - await configPhp.merge(effects, { 'htaccess.RewriteBase': undefined }) - } - - await relocatePostgresFromBeta(effects) -} diff --git a/startos/versions/index.ts b/startos/versions/index.ts index 8dcc149..b04baab 100644 --- a/startos/versions/index.ts +++ b/startos/versions/index.ts @@ -1,9 +1,8 @@ import { VersionGraph } from '@start9labs/start-sdk' import { current } from './current' -import { v_33_0_5_0 } from './v33.0.5.0' -import { v_33_0_8_2 } from './v33.0.8_2' +import { v_34_0_0_0 } from './v34.0.0.0' -export const priorVersions = [v_33_0_5_0, v_33_0_8_2] +export const priorVersions = [v_34_0_0_0] export const versionGraph = VersionGraph.of({ current, diff --git a/startos/versions/v33.0.8_2.ts b/startos/versions/v33.0.8_2.ts deleted file mode 100644 index 325870c..0000000 --- a/startos/versions/v33.0.8_2.ts +++ /dev/null @@ -1,112 +0,0 @@ -import { IMPOSSIBLE, VersionInfo } from '@start9labs/start-sdk' -import { sdk } from '../sdk' -import { migrateFrom035x } from './from035x' - -export const v_33_0_8_2 = VersionInfo.of({ - version: '33.0.8:2', - releaseNotes: { - en_US: `Fixed the periodic "Network error" disconnect/reconnect cycle in Nextcloud Desktop and other sync clients. Apache dropped idle connections after 5 seconds — sooner than the StartOS reverse proxy and sync clients expect to reuse them — so a routine timeout surfaced as a brief client disconnect and stray 408 entries in the service log. Apache now holds idle connections open longer than every layer in front of it, so they are closed from the client side instead. - -Nextcloud's built-in update check can no longer reach the upstream update server. Automatic checks were already off, but \`occ update:check\` bypassed that switch; the update-server address now points at a reserved name that cannot resolve. StartOS is what delivers Nextcloud updates here. - -Updated Nextcloud to 33.0.8 — a maintenance release of upstream fixes and security hardening. - -**Fixes** - -- Thumbnails work again for PDF, SVG, TIFF, HEIC, PSD and the other ImageMagick formats. Nextcloud 33.0.7 disabled those previews upstream; 33.0.8 restores them. -- Many sharing, file and encryption fixes — shares no longer break when a recipient or owner is missing, rejected shares stay rejected, and zero-byte encrypted files report the correct size. -- Security hardening: stricter host and IP validation, an updated code signing revocation list, and admin permission is now required for every system tag change. -- Cleared an abandoned internal task left behind by an older release, which on some servers could stop Nextcloud with no way to dismiss it. - -**New** - -- Federated calendar invitations can be accepted or declined. -- Password confirmation can be skipped for selected IP ranges. - -Full changelog: https://github.com/nextcloud-releases/server/releases/tag/v33.0.8`, - es_ES: `Corregido el ciclo periódico de desconexión y reconexión («Error de red») en Nextcloud Desktop y otros clientes de sincronización. Apache cerraba las conexiones inactivas a los 5 segundos —antes de lo que el proxy inverso de StartOS y los clientes de sincronización esperan reutilizarlas—, de modo que un tiempo de espera rutinario aparecía como una breve desconexión del cliente y entradas 408 sueltas en el registro del servicio. Apache ahora mantiene abiertas las conexiones inactivas más tiempo que todas las capas que tiene delante, de modo que se cierran desde el lado del cliente. - -La comprobación de actualizaciones integrada de Nextcloud ya no puede alcanzar el servidor de actualizaciones original. Las comprobaciones automáticas ya estaban desactivadas, pero \`occ update:check\` eludía ese ajuste; la dirección del servidor de actualizaciones apunta ahora a un nombre reservado que no puede resolverse. Aquí es StartOS quien entrega las actualizaciones de Nextcloud. - -Nextcloud actualizado a 33.0.8: una versión de mantenimiento con correcciones y refuerzos de seguridad de upstream. - -**Correcciones** - -- Las miniaturas vuelven a funcionar para PDF, SVG, TIFF, HEIC, PSD y los demás formatos de ImageMagick. Nextcloud 33.0.7 desactivó esas vistas previas en upstream; 33.0.8 las restaura. -- Numerosas correcciones de compartición, archivos y cifrado: los recursos compartidos ya no fallan cuando falta un destinatario o un propietario, los rechazados siguen rechazados y los archivos cifrados de cero bytes informan del tamaño correcto. -- Refuerzos de seguridad: validación más estricta de host e IP, lista de revocación de firma de código actualizada y ahora se requieren permisos de administrador para cualquier cambio de etiquetas del sistema. -- Se ha eliminado una tarea interna abandonada por una versión anterior que, en algunos servidores, podía detener Nextcloud sin forma de descartarla. - -**Novedades** - -- Las invitaciones a calendarios federados se pueden aceptar o rechazar. -- La confirmación de contraseña se puede omitir en determinados rangos de IP. - -Registro de cambios completo: https://github.com/nextcloud-releases/server/releases/tag/v33.0.8`, - de_DE: `Der periodische Verbindungsabbruch mit anschließender Wiederverbindung („Netzwerkfehler“) in Nextcloud Desktop und anderen Sync-Clients ist behoben. Apache trennte inaktive Verbindungen nach 5 Sekunden — früher, als der StartOS-Reverse-Proxy und die Sync-Clients sie wiederverwenden —, sodass ein routinemäßiger Timeout als kurze Client-Trennung samt vereinzelter 408-Einträge im Dienstprotokoll sichtbar wurde. Apache hält inaktive Verbindungen jetzt länger offen als jede vorgelagerte Schicht, sodass sie von der Client-Seite geschlossen werden. - -Die eingebaute Update-Prüfung von Nextcloud erreicht den Upstream-Update-Server nicht mehr. Automatische Prüfungen waren bereits deaktiviert, \`occ update:check\` umging diesen Schalter jedoch; die Adresse des Update-Servers verweist nun auf einen reservierten Namen, der nicht aufgelöst werden kann. Nextcloud-Updates liefert hier StartOS. - -Nextcloud auf 33.0.8 aktualisiert — eine Wartungsversion mit Fehlerkorrekturen und Sicherheitshärtungen aus dem Upstream. - -**Korrekturen** - -- Miniaturansichten funktionieren wieder für PDF, SVG, TIFF, HEIC, PSD und die übrigen ImageMagick-Formate. Nextcloud 33.0.7 hatte diese Vorschauen im Upstream deaktiviert; 33.0.8 stellt sie wieder her. -- Zahlreiche Korrekturen bei Freigaben, Dateien und Verschlüsselung — Freigaben brechen nicht mehr ab, wenn ein Empfänger oder Eigentümer fehlt, abgelehnte Freigaben bleiben abgelehnt, und verschlüsselte Dateien mit null Byte melden die richtige Größe. -- Sicherheitshärtung: strengere Host- und IP-Prüfung, aktualisierte Sperrliste für Code-Signaturen, und für jede Änderung an System-Tags sind nun Administratorrechte erforderlich. -- Eine von einer älteren Version zurückgelassene, verwaiste interne Aufgabe wurde entfernt; sie konnte Nextcloud auf manchen Servern anhalten, ohne dass sie sich schließen ließ. - -**Neu** - -- Einladungen zu föderierten Kalendern können angenommen oder abgelehnt werden. -- Die Passwortbestätigung kann für ausgewählte IP-Bereiche übersprungen werden. - -Vollständiges Änderungsprotokoll: https://github.com/nextcloud-releases/server/releases/tag/v33.0.8`, - pl_PL: `Naprawiono okresowy cykl rozłączania i ponownego łączenia („Błąd sieci”) w Nextcloud Desktop i innych klientach synchronizacji. Apache zamykał bezczynne połączenia po 5 sekundach — wcześniej, niż odwrotny serwer proxy StartOS i klienci synchronizacji oczekują ich ponownego użycia — więc rutynowy limit czasu objawiał się krótkim rozłączeniem klienta i pojedynczymi wpisami 408 w dzienniku usługi. Apache utrzymuje teraz bezczynne połączenia otwarte dłużej niż każda warstwa przed nim, dzięki czemu zamyka je strona klienta. - -Wbudowane sprawdzanie aktualizacji Nextcloud nie może już połączyć się z serwerem aktualizacji projektu źródłowego. Automatyczne sprawdzanie było już wyłączone, ale \`occ update:check\` omijał to ustawienie; adres serwera aktualizacji wskazuje teraz zastrzeżoną nazwę, której nie da się rozwiązać. Aktualizacje Nextcloud dostarcza tutaj StartOS. - -Zaktualizowano Nextcloud do 33.0.8 — wydanie konserwacyjne z poprawkami i wzmocnieniami bezpieczeństwa z upstreamu. - -**Poprawki** - -- Miniatury znów działają dla plików PDF, SVG, TIFF, HEIC, PSD i pozostałych formatów ImageMagick. Nextcloud 33.0.7 wyłączył te podglądy w upstreamie; 33.0.8 je przywraca. -- Wiele poprawek dotyczących udostępniania, plików i szyfrowania — udostępnienia nie psują się już przy brakującym odbiorcy lub właścicielu, odrzucone pozostają odrzucone, a zaszyfrowane pliki o zerowym rozmiarze podają prawidłowy rozmiar. -- Wzmocnienia bezpieczeństwa: ściślejsza weryfikacja hosta i adresu IP, zaktualizowana lista unieważnień podpisu kodu oraz wymóg uprawnień administratora przy każdej zmianie tagów systemowych. -- Usunięto porzucone zadanie wewnętrzne pozostawione przez starsze wydanie, które na niektórych serwerach mogło zatrzymać Nextcloud bez możliwości jego odrzucenia. - -**Nowości** - -- Zaproszenia do kalendarzy federacyjnych można zaakceptować lub odrzucić. -- Potwierdzanie hasła można pominąć dla wybranych zakresów adresów IP. - -Pełny dziennik zmian: https://github.com/nextcloud-releases/server/releases/tag/v33.0.8`, - fr_FR: `Correction du cycle périodique de déconnexion/reconnexion (« Erreur réseau ») dans Nextcloud Desktop et les autres clients de synchronisation. Apache fermait les connexions inactives au bout de 5 secondes — plus tôt que le proxy inverse de StartOS et les clients de synchronisation ne comptent les réutiliser —, si bien qu'un délai d'attente ordinaire se manifestait par une brève déconnexion du client et des entrées 408 isolées dans le journal du service. Apache garde désormais les connexions inactives ouvertes plus longtemps que chaque couche en amont, de sorte qu'elles sont fermées côté client. - -La vérification de mise à jour intégrée de Nextcloud ne peut plus joindre le serveur de mises à jour d'origine. Les vérifications automatiques étaient déjà désactivées, mais \`occ update:check\` contournait ce réglage ; l'adresse du serveur de mises à jour pointe désormais vers un nom réservé qui ne peut pas être résolu. Ici, c'est StartOS qui livre les mises à jour de Nextcloud. - -Nextcloud mis à jour vers 33.0.8 — une version de maintenance apportant des correctifs et des renforcements de sécurité en amont. - -**Correctifs** - -- Les miniatures fonctionnent à nouveau pour les PDF, SVG, TIFF, HEIC, PSD et les autres formats ImageMagick. Nextcloud 33.0.7 avait désactivé ces aperçus en amont ; 33.0.8 les rétablit. -- De nombreux correctifs de partage, de fichiers et de chiffrement — les partages ne cassent plus lorsqu'un destinataire ou un propriétaire est absent, les partages refusés le restent, et les fichiers chiffrés de zéro octet indiquent la bonne taille. -- Renforcements de sécurité : validation plus stricte des hôtes et des adresses IP, liste de révocation des signatures de code mise à jour, et droits d'administrateur désormais requis pour toute modification des étiquettes système. -- Suppression d'une tâche interne abandonnée par une version antérieure qui, sur certains serveurs, pouvait arrêter Nextcloud sans possibilité de l'écarter. - -**Nouveautés** - -- Les invitations aux agendas fédérés peuvent être acceptées ou refusées. -- La confirmation du mot de passe peut être ignorée pour certaines plages d'adresses IP. - -Journal des modifications complet : https://github.com/nextcloud-releases/server/releases/tag/v33.0.8`, - }, - migrations: { - up: async ({ effects, progress }) => { - // The action was renamed, so this task's replay key can never be cleared by running it. - await sdk.action.clearTask(effects, 'nextcloud:create-admin-user') - await migrateFrom035x(effects, progress) - }, - down: IMPOSSIBLE, - }, -}) diff --git a/startos/versions/v33.0.5.0.ts b/startos/versions/v34.0.0.0.ts similarity index 68% rename from startos/versions/v33.0.5.0.ts rename to startos/versions/v34.0.0.0.ts index d4f418d..c04d727 100644 --- a/startos/versions/v33.0.5.0.ts +++ b/startos/versions/v34.0.0.0.ts @@ -1,8 +1,8 @@ import { VersionInfo, IMPOSSIBLE } from '@start9labs/start-sdk' -// The graph's floor: Nextcloud upgrades one major at a time, so 32 must take a 33 release first. -export const v_33_0_5_0 = VersionInfo.of({ - version: '33.0.5:0', +// The graph's floor: Nextcloud upgrades one major at a time, so 33 must take a 34 release first. +export const v_34_0_0_0 = VersionInfo.of({ + version: '34.0.0:0', releaseNotes: '', migrations: { up: IMPOSSIBLE,