Compare commits

..
12 Commits
Author SHA1 Message Date
ineiti c52926e2f0 Update to latest release of nextcloud 35
Finally getting to the latest release of nextcloud.
MAINTENANCE.md requests that two maintainers install this
repo successfully on one of their main-servers.
2026-10-18 21:26:56 +02:00
dannygroenewegen da9c3c2419 chore: publish 15.0.0+34.0.5-fpm release 2026-10-18 12:27:04 +02:00
Linus Gasser 3d72f76acd Adding EuroOffice
This PR adds the EuroOffice integration to Nextcloud.
2026-10-18 12:22:35 +02:00
Linus Gasser 65668dcd1d Moving to version 34.0.5
Updates to the next major version.
EuroOffice comes in a next commit.
2026-10-18 12:05:35 +02:00
dannygroenewegen c57f6ab976 chore: publish 14.6.0+33-fpm release 2026-10-18 11:57:29 +02:00
Linus Gasser 920edc252d Rolling release of version 33
This is the rolling release of version 33 of nextcloud.
2026-10-17 14:08:40 +02:00
Linus Gasser 542e980be0 Revert "Moving to latest nextcloud 34 release"
This is so we can release a "rolling release" of
nextcloud version 33.
2026-10-17 14:05:07 +02:00
Linus Gasser 9d25f7ee3c Moving to latest nextcloud 34 release
This release adds the configuration and documentation to use
Euro-Office for nextcloud.
2026-10-08 07:39:16 +00:00
moritz d962af51f6 chore: publish 14.5.1+33.0.9-fpm release 2026-10-07 21:33:48 +02:00
moritz 6a0637493a fix: install_whiteboard for whiteboard 2.0.0 2026-10-07 21:29:17 +02:00
renovate-bot c02073abe1 chore(deps): update docker.elastic.co/elasticsearch/elasticsearch docker tag to v8.19.23 2026-10-06 09:19:59 +00:00
ineiti 931b403f3e Fixing Typo
@simon - I suppose it's a type to have `@msimon` - or is this on purpose?
2026-09-28 19:20:15 +00:00
18 changed files with 53 additions and 345 deletions
+2 -4
View File
@@ -69,12 +69,10 @@ DEFAULT_QUOTA="10 GB"
# APPS="$APPS onlyoffice"
# SECRET_ONLYOFFICE_JWT_VERSION=v1
# Euro-Office runs its own document server in this stack; EUROOFFICE_DOMAIN
# needs its own DNS record pointing at this host.
# COMPOSE_FILE="$COMPOSE_FILE:compose.eurooffice.yml"
# EUROOFFICE_DOMAIN=eurooffice.example.com
# EUROOFFICE_URL=https://euro-office.example.com
# APPS="$APPS eurooffice"
# SECRET_EUROOFFICE_JWT_VERSION=v1
# SECRET_EURO_JWT_VERSION=v1
# COMPOSE_FILE="$COMPOSE_FILE:compose.bbb.yml"
# BBB_URL=https://talk.example.org/bigbluebutton/ # trailing slash!
+17 -23
View File
@@ -5,7 +5,7 @@
Fully automated luxury Nextcloud via docker-swarm.
<!-- metadata -->
* **Maintainer**: [@dannygroenewegen](https://git.coopcloud.tech/dannygroenewegen), [@ineiti](https://git.coopcloud.tech/ineiti), [@javielico](https://git.coopcloud.tech/javielico), Local-IT: [@moritz](https://git.coopcloud.tech/moritz), [@msimon](https://git.coopcloud.tech/simon), [@carla](https://git.coopcloud.tech/carla)
* **Maintainer**: [@dannygroenewegen](https://git.coopcloud.tech/dannygroenewegen), [@ineiti](https://git.coopcloud.tech/ineiti), [@javielico](https://git.coopcloud.tech/javielico), Local-IT: [@moritz](https://git.coopcloud.tech/moritz), [@simon](https://git.coopcloud.tech/simon), [@carla](https://git.coopcloud.tech/carla)
* **Category**: Apps
* **Status**: 5
* **Image**: [`nextcloud`](https://hub.docker.com/_/nextcloud), 4, upstream
@@ -46,37 +46,31 @@ Then set the onlyoffice JWT secret from the onlyoffice installation:
### Euro-Office Integration
Euro-Office is the AGPL fork of OnlyOffice that powers "Nextcloud Office" from
Nextcloud 34 onwards. Like OnlyOffice it uses a client-side document-server
architecture, so a separate document server is required — but this overlay runs
that document server **inside the same stack**, so there is no external host to
manage. The browser talks to it directly, so it needs its own public HTTPS
domain (`EUROOFFICE_DOMAIN`) with a DNS record pointing at this host.
First, deploy the [Euro-Office Recipe](https://recipes.coopcloud.tech/euro-office),
and keep its JWT secret. Then configure your nextcloud instance with:
`abra app config <app-name>`
Enable the overlay and set the document server's domain:
Configure the following envs with the URL of the euro-office service:
```
COMPOSE_FILE="$COMPOSE_FILE:compose.eurooffice.yml"
EUROOFFICE_DOMAIN=eurooffice.example.com
APPS="$APPS eurooffice"
SECRET_EUROOFFICE_JWT_VERSION=v1
EUROOFFICE_URL=https://euro-office.example.com
SECRET_EURO_JWT_VERSION=v1
```
The overlay runs the document server with its own Postgres and RabbitMQ services
(the image's bundled Postgres is unreliable). The document server schema is
seeded into that Postgres automatically on first init (see
`eurooffice-createdb.sql`). The Postgres is internal-only and uses trust auth, so
the only secret to manage is the JWT; generate it, deploy, then wire up the
Nextcloud app:
Then set the euro-office JWT secret from the euro-office installation:
* `abra app secret generate -a <app-name>`
* `abra app deploy <app-name>`
* `abra app cmd <app-name> app install_eurooffice`
`abra app secret insert <app-name> euro_jwt v1 <jwt_secret>`
> Note: the document server needs ~4 GB RAM (8 GB for multi-user) and pulls the
> `ghcr.io/euro-office/documentserver` image, pinned to a semver tag
> (`v9.3.4-hotfix.1`). It is not tracked by Renovate, so upgrade it manually.
Now make sure that your nextcloud recipe is correctly deployed.
If it's a fresh install, deploy it, if Euro-Office is added after
the install, force-deploy it to update the configuration variables:
`abra app deploy -f <app-name>`
Once that is up and running, install the eurooffice plugin for nextcloud:
`abra app cmd <app-name> app install_eurooffice`
### BBB Integration
+9 -6
View File
@@ -6,8 +6,6 @@ export MY_CNF_VERSION=v6
export ENTRYPOINT_VERSION=v3
export ENTRYPOINT_WHITEBOARD_VERSION=v1
export ENTRYPOINT_TALK_VERSION=v1
export ENTRYPOINT_EUROOFFICE_VERSION=v3
export EUROOFFICE_CREATEDB_VERSION=v1
export CRONTAB_VERSION=v1
export PG_BACKUP_VERSION=v2
@@ -88,9 +86,8 @@ install_onlyoffice() {
install_eurooffice() {
install_apps eurooffice
set_app_config eurooffice DocumentServerUrl "https://${EUROOFFICE_DOMAIN}"
set_app_config eurooffice jwt_secret "$(cat /run/secrets/eurooffice_jwt)"
set_app_config eurooffice customizationForcesave true
set_app_config eurooffice DocumentServerUrl "$EUROOFFICE_URL"
set_app_config eurooffice jwt_secret "$(cat /run/secrets/euro_jwt)"
}
install_collabora() {
@@ -105,7 +102,13 @@ install_collabora() {
install_whiteboard() {
install_apps whiteboard
set_app_config whiteboard collabBackendUrl "https://${DOMAIN}/whiteboard"
set_app_config whiteboard jwt_secret_key "$(cat /run/secrets/whiteboard_jwt)"
printf '{"apps":{"whiteboard":{"jwt_secret_key":"%s"}}}' "$(cat /run/secrets/whiteboard_jwt)" >/tmp/whiteboard.json
run_occ "config:import /tmp/whiteboard.json"
rm -f /tmp/whiteboard.json
[ -n "$(run_occ 'config:app:get whiteboard jwt_secret_key')" ] || {
echo "whiteboard jwt_secret_key was not stored" >&2
return 1
}
}
+5 -110
View File
@@ -1,118 +1,13 @@
version: "3.8"
services:
app:
secrets:
- eurooffice_jwt
- euro_jwt
environment:
- EUROOFFICE_DOMAIN
eurooffice:
image: ghcr.io/euro-office/documentserver:v9.3.5
stdin_open: true
depends_on:
- eurooffice-db
- eurooffice-rabbitmq
networks:
- proxy
- internal
environment:
- JWT_ENABLED=true
- JWT_SECRET_FILE=/run/secrets/eurooffice_jwt
# Use external Postgres + RabbitMQ instead of the flaky bundled ones.
# (The all-in-one image ships an uncleanly-shut-down Postgres data dir
# whose crash recovery exceeds pg_ctl's start timeout -> restart loop.)
- DB_TYPE=postgres
- DB_HOST=eurooffice-db
- DB_PORT=5432
- DB_NAME=eurooffice
- DB_USER=eurooffice
- AMQP_URI=amqp://guest:guest@eurooffice-rabbitmq
volumes:
- eurooffice_data:/var/lib/euro-office
- eurooffice_config:/etc/euro-office
- eurooffice_logs:/var/log/euro-office
- eurooffice_fonts:/usr/share/fonts/custom
secrets:
- eurooffice_jwt
configs:
- source: entrypoint_eurooffice
target: /custom-entrypoint.sh
mode: 555
entrypoint: /custom-entrypoint.sh
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost/healthcheck"]
interval: 30s
timeout: 10s
retries: 10
start_period: 3m
deploy:
update_config:
failure_action: rollback
order: start-first
labels:
- "traefik.enable=true"
- "traefik.swarm.network=proxy"
- "traefik.http.services.${STACK_NAME}_eurooffice.loadbalancer.server.port=80"
- "traefik.http.routers.${STACK_NAME}_eurooffice.rule=Host(`${EUROOFFICE_DOMAIN}`)"
- "traefik.http.routers.${STACK_NAME}_eurooffice.entrypoints=web-secure"
- "traefik.http.routers.${STACK_NAME}_eurooffice.tls.certresolver=${LETS_ENCRYPT_ENV}"
- "traefik.http.routers.${STACK_NAME}_eurooffice.middlewares=${STACK_NAME}_eurooffice-fwdproto"
- "traefik.http.middlewares.${STACK_NAME}_eurooffice-fwdproto.headers.customRequestHeaders.X-Forwarded-Proto=https"
eurooffice-db:
image: postgres:16-alpine
networks:
- internal
environment:
- POSTGRES_DB=eurooffice
- POSTGRES_USER=eurooffice
# Internal-only DB holding transient editing state; trust auth on the
# private overlay network avoids managing a Swarm secret for it.
- POSTGRES_HOST_AUTH_METHOD=trust
volumes:
- eurooffice_db:/var/lib/postgresql/data
configs:
# Seed the document server schema on first init. The all-in-one image only
# creates its schema in the *bundled* Postgres; with an external DB the
# docservice starts against an empty DB, errors on missing task_result /
# doc_changes, never binds its port, and gets healthcheck-killed in a loop.
- source: eurooffice_createdb
target: /docker-entrypoint-initdb.d/createdb.sql
healthcheck:
test: ["CMD", "pg_isready", "-U", "eurooffice"]
interval: 30s
timeout: 10s
retries: 10
start_period: 1m
eurooffice-rabbitmq:
image: rabbitmq:4.3.6
networks:
- internal
healthcheck:
test: rabbitmq-diagnostics -q ping
interval: 30s
timeout: 10s
retries: 10
start_period: 1m
- EUROOFFICE_URL
secrets:
eurooffice_jwt:
euro_jwt:
external: true
name: ${STACK_NAME}_eurooffice_jwt_${SECRET_EUROOFFICE_JWT_VERSION}
volumes:
eurooffice_data:
eurooffice_config:
eurooffice_logs:
eurooffice_fonts:
eurooffice_db:
configs:
entrypoint_eurooffice:
name: ${STACK_NAME}_entrypoint_eurooffice_${ENTRYPOINT_EUROOFFICE_VERSION}
file: entrypoint.eurooffice.sh.tmpl
template_driver: golang
eurooffice_createdb:
name: ${STACK_NAME}_eurooffice_createdb_${EUROOFFICE_CREATEDB_VERSION}
file: eurooffice-createdb.sql
name: ${STACK_NAME}_euro_jwt_${SECRET_EURO_JWT_VERSION}
+1 -1
View File
@@ -9,7 +9,7 @@ services:
- MYSQL_PASSWORD_FILE=/run/secrets/db_password
db:
image: "mariadb:12.3.3"
image: "mariadb:12.3"
environment:
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
+1 -1
View File
@@ -2,7 +2,7 @@ version: "3.8"
services:
talk:
image: "nextcloud/aio-talk:20261014_095932"
image: "nextcloud/aio-talk:20251128_084214"
environment:
- NC_DOMAIN=${DOMAIN}
- TALK_HOST=${TALK_DOMAIN}
+2 -2
View File
@@ -1,7 +1,7 @@
version: "3.8"
services:
web:
image: nginx:1.31.7
image: nginx:1.31.6
depends_on:
- app
configs:
@@ -95,7 +95,7 @@ services:
failure_action: rollback
order: start-first
labels:
- "coop-cloud.${STACK_NAME}.version=16.2.0+35.0.2-fpm"
- "coop-cloud.${STACK_NAME}.version=15.0.0+34.0.5-fpm"
- "coop-cloud.${STACK_NAME}.timeout=${TIMEOUT}"
- "backupbot.backup=${ENABLE_BACKUPS:-true}"
- "backupbot.backup.volumes.redis=false"
-30
View File
@@ -1,30 +0,0 @@
#!/bin/bash
set -eu
# Read a Swarm secret file (<VAR>_FILE) into the plain env var the
# Euro-Office document server expects, then hand off to its own entrypoint.
file_env() {
local var="$1"
local fileVar="${var}_FILE"
local def="${2:-}"
if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then
echo >&2 "error: both $var and $fileVar are set (but are exclusive)"
exit 1
fi
local val="$def"
if [ "${!var:-}" ]; then
val="${!var}"
elif [ "${!fileVar:-}" ]; then
val="$(< "${!fileVar}")"
fi
export "$var"="$val"
unset "$fileVar"
}
file_env "JWT_SECRET"
exec /entrypoint.sh
-73
View File
@@ -1,73 +0,0 @@
--
-- Create schema onlyoffice
--
-- CREATE DATABASE onlyoffice ENCODING = 'UTF8' CONNECTION LIMIT = -1;
-- ----------------------------
-- Table structure for doc_changes
-- ----------------------------
CREATE TABLE IF NOT EXISTS "doc_changes" (
"tenant" varchar(255) COLLATE "default" NOT NULL,
"id" varchar(255) COLLATE "default" NOT NULL,
"change_id" int4 NOT NULL,
"user_id" varchar(255) COLLATE "default" NOT NULL,
"user_id_original" varchar(255) COLLATE "default" NOT NULL,
"user_name" varchar(255) COLLATE "default" NOT NULL,
"change_data" text COLLATE "default" NOT NULL,
"change_date" timestamp without time zone NOT NULL,
PRIMARY KEY ("tenant", "id", "change_id")
)
WITH (OIDS=FALSE);
-- ----------------------------
-- Table structure for task_result
-- ----------------------------
CREATE TABLE IF NOT EXISTS "task_result" (
"tenant" varchar(255) COLLATE "default" NOT NULL,
"id" varchar(255) COLLATE "default" NOT NULL,
"status" int2 NOT NULL,
"status_info" int4 NOT NULL,
"created_at" timestamp without time zone DEFAULT NOW(),
"last_open_date" timestamp without time zone NOT NULL,
"user_index" int4 NOT NULL DEFAULT 1,
"change_id" int4 NOT NULL DEFAULT 0,
"callback" text COLLATE "default" NOT NULL,
"baseurl" text COLLATE "default" NOT NULL,
"password" text COLLATE "default" NULL,
"additional" text COLLATE "default" NULL,
PRIMARY KEY ("tenant", "id")
)
WITH (OIDS=FALSE);
CREATE OR REPLACE FUNCTION merge_db(_tenant varchar(255), _id varchar(255), _status int2, _status_info int4, _last_open_date timestamp without time zone, _user_index int4, _change_id int4, _callback text, _baseurl text, OUT isupdate char(5), OUT userindex int4) AS
$$
DECLARE
t_var "task_result"."user_index"%TYPE;
BEGIN
LOOP
-- first try to update the key
-- note that "a" must be unique
IF ((_callback <> '') IS TRUE) AND ((_baseurl <> '') IS TRUE) THEN
UPDATE "task_result" SET last_open_date=_last_open_date, user_index=user_index+1,callback=_callback,baseurl=_baseurl WHERE tenant = _tenant AND id = _id RETURNING user_index into userindex;
ELSE
UPDATE "task_result" SET last_open_date=_last_open_date, user_index=user_index+1 WHERE tenant = _tenant AND id = _id RETURNING user_index into userindex;
END IF;
IF found THEN
isupdate := 'true';
RETURN;
END IF;
-- not there, so try to insert the key
-- if someone else inserts the same key concurrently,
-- we could get a unique-key failure
BEGIN
INSERT INTO "task_result"(tenant, id, status, status_info, last_open_date, user_index, change_id, callback, baseurl) VALUES(_tenant, _id, _status, _status_info, _last_open_date, _user_index, _change_id, _callback, _baseurl) RETURNING user_index into userindex;
isupdate := 'false';
RETURN;
EXCEPTION WHEN unique_violation THEN
-- do nothing, and loop to try the UPDATE again
END;
END LOOP;
END;
$$
LANGUAGE plpgsql;
+1
View File
@@ -0,0 +1 @@
Rolling release for nextcloud-33: the image is pinned to `nextcloud:33-fpm` (no minor/patch), so it follows the latest 33.x. This is the last release before moving to nextcloud-34.
@@ -1,13 +1,15 @@
Upgrades Nextcloud from 33.0.6 to 34.0.1 (major version upgrade).
Upgrades Nextcloud from 33 to 34 (major version upgrade).
IMPORTANT:
- Nextcloud does NOT support downgrades. Take a backup before deploying.
- Do not skip major versions: your instance must be on the latest 33.x before
upgrading to 34. If you are on 32.x, deploy 14.0.0+33.0.6-fpm first.
upgrading to 34.
- Use `check_major_upgrade` (`abra app cmd <app-name> app check_major_upgrade`)
to check whether an instance is ready to upgrade to the next Nextcloud
major version.
- Nextcloud does NOT support downgrades. Take a backup before deploying.
- After deploying, check the logs and run any pending repair/upgrade steps:
`abra app cmd <app> app run_occ '"app:update --all"'`
- Review app (plug-in) compatibility with Nextcloud 34 before upgrading; some
apps may need to be updated or temporarily disabled.
- PostgreSQL: Nextcloud 34 requires PostgreSQL >= 14 (the recipe already ships
pgautoupgrade 14). PostgreSQL 14 is now the minimum, so plan a bump to a newer
PostgreSQL before the next Nextcloud major.
- This release adds support for Euro-Office, see the README.md for instructions.
-25
View File
@@ -1,25 +0,0 @@
Adds an optional Euro-Office integration (compose.eurooffice.yml).
Euro-Office is the AGPL fork of OnlyOffice that powers "Nextcloud Office" from
Nextcloud 34 onwards. This overlay runs the Euro-Office document server inside
the stack, so there is no external document server to manage.
This change is additive: existing installs are unaffected unless you opt in.
To enable it (`abra app config <app>`):
- COMPOSE_FILE="$COMPOSE_FILE:compose.eurooffice.yml"
- EUROOFFICE_DOMAIN=eurooffice.example.com
- APPS="$APPS eurooffice"
- SECRET_EUROOFFICE_JWT_VERSION=v1
Then:
- Create a DNS record for EUROOFFICE_DOMAIN pointing at this host (the browser
talks to the document server directly over HTTPS).
- `abra app secret generate -a <app>`
- `abra app deploy <app>`
- `abra app cmd <app> app install_eurooffice`
Notes:
- The document server needs ~4 GB RAM (8 GB recommended for multi-user).
- The `ghcr.io/euro-office/documentserver` image currently only publishes a
`latest` tag (no semver pinning yet), so it is not tracked by Renovate.
-2
View File
@@ -1,2 +0,0 @@
Upgrade to latest nextcloud v34.0.2
Merge latest origin from coop-cloud/nextcloud:13.1.4
-3
View File
@@ -1,3 +0,0 @@
Upgrade to latest nextcloud v34.0.4, nginx 1.31.5, redis 8.8.2 and,
in the eurooffice overlay, euro-office/documentserver v9.3.4-hotfix.1
and rabbitmq 4.3.5.
-17
View File
@@ -1,17 +0,0 @@
Upgrades Nextcloud from 34.0.4 to 35.0.0 (major version upgrade).
Euro-Office (compose.eurooffice.yml) is already at the latest published
document server image, v9.3.4-hotfix.1 — no change needed there.
IMPORTANT:
- Nextcloud does NOT support downgrades. Take a backup before deploying.
- Do not skip major versions: your instance must be on the latest 34.x
(34.0.4) before upgrading to 35. If you are on an older 34.x, deploy
34.0.4 first.
- Nextcloud 35 drops support for MariaDB < 10.11 and MySQL < 8.4. This
recipe's mariadb overlay already runs MariaDB 12.3, so no action is
needed there.
- After deploying, check the logs and run any pending repair/upgrade steps:
`abra app cmd <app> app run_occ '"app:update --all"'`
- Review app (plug-in) compatibility with Nextcloud 35 before upgrading; some
apps may need to be updated or temporarily disabled.
-29
View File
@@ -1,29 +0,0 @@
Upgrades Nextcloud from 35.0.0 to 35.0.1 (patch release), and merges in a
batch of upstream coop-cloud/nextcloud recipe improvements:
- nginx bumped to 1.31.6.
- redis bumped to 8.10.2.
- Whiteboard overlay (compose.whiteboard.yml) bumped to v2.0.0 (major
version). If you use the whiteboard overlay, check the app still behaves
as expected after upgrading — this is a major version jump upstream.
- Postgres overlay now runs `pgautoupgrade/pgautoupgrade:17-debian` (up from
14) and no longer overrides `max_connections` via `-c`, since that flag
broke pgautoupgrade; the image's own healthcheck is used instead.
- MariaDB overlay sets `MARIADB_AUTO_UPGRADE=1` so minor/patch MariaDB
upgrades happen automatically on deploy.
- New optional metrics overlay (`compose.metrics.yml`): enables Nextcloud's
`/metrics` endpoint for Prometheus-style scraping. See README for how to
enable it.
- New `check_major_upgrade` abra.sh helper to sanity-check readiness before
a major Nextcloud upgrade (`abra app cmd <app> app check_major_upgrade`).
- `install_collabora` now runs `richdocuments:activate-config` so a fresh
Collabora install is actually activated.
- smtp overlay now also wires SMTP env/secrets into the `cron` service (it
was previously only applied to `app`).
- `AUTHENTIK_USER_PREFIX` documented in `.env.sample`.
IMPORTANT:
- Nextcloud does NOT support downgrades. Take a backup before deploying.
- If you use compose.postgres.yml, this recipe now runs Postgres major
version 17 via pgautoupgrade (auto-upgrading from whatever major you were
on); take a backup first.
-9
View File
@@ -1,9 +0,0 @@
Upgrades Nextcloud from 35.0.1 to 35.0.2 (patch release) and updates the
other images:
- nginx 1.31.7
- MariaDB overlay pinned to 12.3.3
- RabbitMQ 4.3.6 (Euro-Office overlay)
- Euro-Office documentserver v9.3.5
- Elasticsearch 8.19.23 (fulltextsearch overlay)
- Nextcloud Talk (aio-talk) 20261014_095932
+7 -4
View File
@@ -1,10 +1,13 @@
Upgrades Nextcloud from 32.0.11 to 33.0.6 (major version upgrade).
Upgrades Nextcloud from 34 to 35 (major version upgrade).
IMPORTANT:
- Do not skip major versions: your instance must be on the latest 34.x before
upgrading to 35.
- Use `check_major_upgrade` (`abra app cmd <app-name> app check_major_upgrade`)
to check whether an instance is ready to upgrade to the next Nextcloud
major version.
- Nextcloud does NOT support downgrades. Take a backup before deploying.
- Do not skip major versions: your instance must be on the latest 32.x before
upgrading to 33. If you are on an older 32.x, deploy 32.0.11 first.
- After deploying, check the logs and run any pending repair/upgrade steps:
`abra app cmd <app> app run_occ '"app:update --all"'`
- Review app (plug-in) compatibility with Nextcloud 33 before upgrading; some
- Review app (plug-in) compatibility with Nextcloud 35 before upgrading; some
apps may need to be updated or temporarily disabled.