Compare commits
47
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c52926e2f0 | ||
|
|
da9c3c2419 | ||
|
|
3d72f76acd
|
||
|
|
65668dcd1d
|
||
|
|
c57f6ab976 | ||
|
|
920edc252d | ||
|
|
542e980be0 | ||
|
|
9d25f7ee3c | ||
|
|
d962af51f6 | ||
|
|
6a0637493a
|
||
|
|
c02073abe1 | ||
|
|
931b403f3e | ||
|
|
a3959eb859 | ||
|
|
41e3e2bb33 | ||
|
|
1af9dc1ace | ||
|
|
2071a7dc2f | ||
|
|
b3c7aef2a9 | ||
|
|
70f8ab4b56 | ||
|
|
0ba186b408 | ||
|
|
445715e409 | ||
|
|
e715938ebb | ||
|
|
12109fb122 | ||
|
|
5b393d6194
|
||
|
|
2a2357142e
|
||
|
|
f9203e5d7f
|
||
|
|
d811dfa1cb | ||
|
|
ea487f93dd | ||
|
|
1a43b8fe4f | ||
|
|
768531d1a2
|
||
|
|
1d6ec8cf38
|
||
|
|
131054d234 | ||
|
|
785931c0de | ||
|
|
a7f5ec8506 | ||
|
|
5990c68f23
|
||
|
|
fb511d8d07 | ||
|
|
d019c23843 | ||
|
|
59beed36a7 | ||
|
|
d3afccfca9 | ||
|
|
257a7ac3a1 | ||
|
|
d2560c9304
|
||
|
|
364e3088f7 | ||
|
|
d40797dbda | ||
|
|
65e13ff3f3 | ||
|
|
fd01844b8f | ||
|
|
72562871ea | ||
|
|
bac93fd4a5 | ||
|
|
c0683807bb |
+9
-5
@@ -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!
|
||||
@@ -86,11 +84,14 @@ DEFAULT_QUOTA="10 GB"
|
||||
|
||||
# COMPOSE_FILE="$COMPOSE_FILE:compose.authentik.yml"
|
||||
# APPS="$APPS sociallogin"
|
||||
# AUTHENTIK_USER_PREFIX=authentik
|
||||
# AUTHENTIK_DOMAIN=authentik.example.com
|
||||
# SECRET_AUTHENTIK_SECRET_VERSION=v1
|
||||
# SECRET_AUTHENTIK_ID_VERSION=v1
|
||||
|
||||
# Only change this if you've configured your authentik instance to use a non-default user prefix.
|
||||
# If you're unsure, this should match the redirect_uri in authentik's nextcloud provider.
|
||||
# AUTHENTIK_USER_PREFIX=authentik
|
||||
|
||||
#COMPOSE_FILE="$COMPOSE_FILE:compose.fulltextsearch.yml"
|
||||
#SECRET_ELASTICSEARCH_PASSWORD_VERSION=v1
|
||||
|
||||
@@ -114,3 +115,6 @@ DEFAULT_QUOTA="10 GB"
|
||||
#HSTS_ENABLED=1
|
||||
# Uncomment this line to add the `preload` part
|
||||
#HSTS_PRELOAD=1
|
||||
|
||||
# Metrics
|
||||
# COMPOSE_FILE="$COMPOSE_FILE:compose.metrics.yml"
|
||||
|
||||
+35
-1
@@ -38,7 +38,7 @@ In order to meet these responsibilities each maintainer:
|
||||
## Release cadence
|
||||
|
||||
The intent is to **track Nextcloud's own release schedule** rather than invent
|
||||
our own. In practice this means:
|
||||
our own. In practice this means the following regarding new **nextcloud** releases:
|
||||
|
||||
- **Patch releases (e.g. `32.0.x`)**: published to this recipe shortly after
|
||||
upstream, ideally within 1 week. `chore(deps)` opens the PRs; a maintainer
|
||||
@@ -63,6 +63,40 @@ our own. In practice this means:
|
||||
- **Co-installed components** (Talk HPB, OnlyOffice, Whiteboard, etc.) are
|
||||
bumped alongside or shortly after the matching Nextcloud release.
|
||||
|
||||
## Semver versioning within this recipe
|
||||
|
||||
The recipe version itself is updated according to the following semver
|
||||
rules, following
|
||||
[How are recipes versioned](https://docs.coopcloud.tech/maintainers/handbook/#how-are-recipes-versioned):
|
||||
These describe the minimum required bump for a given kind of change.
|
||||
The actual impact of any change (an image update or, e.g. a compose or config change)
|
||||
should always be considered, and the recipe version can always be bumped higher
|
||||
than the guideline below to match the impact of the change.
|
||||
|
||||
- For updates of the image in the app container (nextcloud), we match the
|
||||
recipe version bump to at least the image version bump.
|
||||
- Other containers in this recipe are considered dependencies of the app container
|
||||
unless they expose additional functionality directly.
|
||||
- For image updates of dependency containers, we judge the recipe version bump
|
||||
from the perspective of the app itself, but a minor or major update of a
|
||||
dependent container is always reflected by at least a minor recipe version bump
|
||||
to indicate a substantial update under the hood.
|
||||
|
||||
Temporary exception:
|
||||
- In the past, there have been issues with upgrades from database containers
|
||||
(before the `pgautoupgrade` image and `MARIADB_AUTO_UPGRADE` setting).
|
||||
We continue treating a major update of a database container (postgresql, mariadb)
|
||||
as a major recipe bump until that database has had two consecutive major upgrades
|
||||
with no issues reported, building trust in its automatic upgrade.
|
||||
Once that trust is established for a given database, we continue with the
|
||||
default guidelines above.
|
||||
|
||||
WARNING:
|
||||
When moving to a new major version of a dependency, the maintainer needs to make
|
||||
sure that the version is supported!
|
||||
Example: in June 2026, MariaDB got updated to version 12, but nextcloud suggests
|
||||
only up to version 11.8 for best performance.
|
||||
|
||||
## Pull Requests
|
||||
|
||||
A pull request can be merged once it is approved by at least one maintainer.
|
||||
|
||||
@@ -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)
|
||||
* **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, which currently only publishes a
|
||||
> `latest` tag (no semver / Renovate pinning yet).
|
||||
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
|
||||
|
||||
@@ -163,6 +157,21 @@ To disable dashboard app (since it is so corporate):
|
||||
|
||||
- Configure a `defaultapp` in your `config.php` or use [apporder](https://apps.nextcloud.com/apps/apporder)
|
||||
|
||||
## Metrics
|
||||
|
||||
Since Version 33, Nextcloud offers a /metrics endpoint (see [here](https://docs.nextcloud.com/server/stable/admin_manual/configuration_monitoring/index.html)).
|
||||
Its configured via alloys label-based auto-discovery provided by the updated
|
||||
[monitoring-stack](https://git.coopcloud.tech/coop-cloud/monitoring-ng).
|
||||
|
||||
To enable, uncomment
|
||||
```
|
||||
COMPOSE_FILE="$COMPOSE_FILE:compose.metrics.yml"
|
||||
```
|
||||
and run `configure_metrics`:
|
||||
```
|
||||
abra app cmd <domain> app configure_metrics
|
||||
```
|
||||
|
||||
## Upgrading Nextcloud
|
||||
|
||||
Upgrading Nextcloud can be a hair raising experiance. They
|
||||
|
||||
@@ -1,13 +1,11 @@
|
||||
#!/bin/bash
|
||||
|
||||
export FPM_TUNE_VERSION=v5
|
||||
export NGINX_CONF_VERSION=v8
|
||||
export NGINX_CONF_VERSION=v9
|
||||
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() {
|
||||
@@ -99,12 +96,19 @@ install_collabora() {
|
||||
# important for security reaosns
|
||||
# https://docs.nextcloud.com/server/latest/admin_manual/office/configuration.html#wopi-settings
|
||||
set_app_config richdocuments wopi_allowlist "$COLLABORA_ALLOWLIST"
|
||||
run_occ "richdocuments:activate-config"
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -204,6 +208,10 @@ upgrade_mariadb() {
|
||||
mariadb-upgrade -p`cat /run/secrets/db_root_password`
|
||||
}
|
||||
|
||||
configure_metrics() {
|
||||
run_occ "config:system:set openmetrics_allowed_clients 0 --value='10.0.0.0/8'"
|
||||
}
|
||||
|
||||
# Checks whether this instance looks ready to update to the next Nextcloud
|
||||
# major version.
|
||||
#
|
||||
|
||||
+5
-110
@@ -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.2
|
||||
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.2
|
||||
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}
|
||||
|
||||
@@ -2,7 +2,7 @@ version: "3.8"
|
||||
|
||||
services:
|
||||
elasticsearch:
|
||||
image: "docker.elastic.co/elasticsearch/elasticsearch:8.19.20"
|
||||
image: "docker.elastic.co/elasticsearch/elasticsearch:8.19.23"
|
||||
environment:
|
||||
- cluster.name=docker-cluster
|
||||
- bootstrap.memory_lock=true
|
||||
@@ -29,7 +29,7 @@ services:
|
||||
mode: 0600
|
||||
|
||||
searchindexer:
|
||||
image: nextcloud:34.0.2-fpm
|
||||
image: nextcloud:35.0.2-fpm
|
||||
volumes:
|
||||
- nextcloud:/var/www/html/
|
||||
- nextapps:/var/www/html/custom_apps:cached
|
||||
|
||||
@@ -17,6 +17,7 @@ services:
|
||||
- MYSQL_ROOT_PASSWORD_FILE=/run/secrets/db_root_password
|
||||
- MAX_DB_CONNECTIONS=${MAX_DB_CONNECTIONS:-100}
|
||||
- INNODB_BUFFER_POOL_SIZE=${INNODB_BUFFER_POOL_SIZE:-1G}"
|
||||
- MARIADB_AUTO_UPGRADE=1
|
||||
configs:
|
||||
- source: my_tune
|
||||
target: /etc/mysql/conf.d/my-tune.cnf
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
version: "3.8"
|
||||
services:
|
||||
web:
|
||||
environment:
|
||||
- METRICS_ENABLED=true
|
||||
deploy:
|
||||
labels:
|
||||
- "prometheus.io/scrape=true"
|
||||
@@ -13,6 +13,19 @@ services:
|
||||
- MAIL_FROM_ADDRESS
|
||||
- MAIL_DOMAIN
|
||||
|
||||
cron:
|
||||
secrets:
|
||||
- smtp_password
|
||||
environment:
|
||||
- SMTP_AUTHTYPE
|
||||
- SMTP_HOST
|
||||
- SMTP_SECURE
|
||||
- SMTP_NAME
|
||||
- SMTP_PORT
|
||||
- SMTP_PASSWORD_FILE=/run/secrets/smtp_password
|
||||
- MAIL_FROM_ADDRESS
|
||||
- MAIL_DOMAIN
|
||||
|
||||
secrets:
|
||||
smtp_password:
|
||||
external: true
|
||||
|
||||
@@ -6,7 +6,7 @@ services:
|
||||
- whiteboard_jwt
|
||||
|
||||
whiteboard:
|
||||
image: ghcr.io/nextcloud-releases/whiteboard:v1.5.9
|
||||
image: ghcr.io/nextcloud-releases/whiteboard:v2.0.0
|
||||
deploy:
|
||||
labels:
|
||||
- traefik.enable=true
|
||||
|
||||
+5
-5
@@ -1,7 +1,7 @@
|
||||
version: "3.8"
|
||||
services:
|
||||
web:
|
||||
image: nginx:1.31.3
|
||||
image: nginx:1.31.6
|
||||
depends_on:
|
||||
- app
|
||||
configs:
|
||||
@@ -48,7 +48,7 @@ services:
|
||||
start_period: 5m
|
||||
|
||||
app:
|
||||
image: nextcloud:34.0.2-fpm
|
||||
image: nextcloud:35.0.2-fpm
|
||||
depends_on:
|
||||
- db
|
||||
configs:
|
||||
@@ -95,7 +95,7 @@ services:
|
||||
failure_action: rollback
|
||||
order: start-first
|
||||
labels:
|
||||
- "coop-cloud.${STACK_NAME}.version=15.1.0+34.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"
|
||||
@@ -109,7 +109,7 @@ services:
|
||||
start_period: 15m
|
||||
|
||||
cron:
|
||||
image: nextcloud:34.0.2-fpm
|
||||
image: nextcloud:35.0.2-fpm
|
||||
volumes:
|
||||
- nextcloud:/var/www/html/
|
||||
- nextapps:/var/www/html/custom_apps:cached
|
||||
@@ -125,7 +125,7 @@ services:
|
||||
|
||||
|
||||
cache:
|
||||
image: redis:8.8.1-alpine
|
||||
image: redis:8.10.2-alpine
|
||||
networks:
|
||||
- internal
|
||||
volumes:
|
||||
|
||||
@@ -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
|
||||
@@ -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;
|
||||
@@ -184,5 +184,16 @@ http {
|
||||
location / {
|
||||
try_files $uri $uri/ /index.php$request_uri;
|
||||
}
|
||||
|
||||
{{ if env "METRICS_ENABLED" }}
|
||||
location = /metrics {
|
||||
include fastcgi_params;
|
||||
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
|
||||
fastcgi_param SCRIPT_NAME /index.php;
|
||||
fastcgi_param REQUEST_URI /metrics;
|
||||
fastcgi_param HTTP_HOST {{ env "DOMAIN" }};
|
||||
fastcgi_pass php-handler;
|
||||
}
|
||||
{{ end }}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
Update pgautoupgrade to postgresql v17
|
||||
@@ -0,0 +1 @@
|
||||
add option to scrape native /metrics endpoint via alloys auto-discovery
|
||||
@@ -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.
|
||||
@@ -0,0 +1,15 @@
|
||||
Upgrades Nextcloud from 33 to 34 (major version upgrade).
|
||||
|
||||
IMPORTANT:
|
||||
- Do not skip major versions: your instance must be on the latest 33.x before
|
||||
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.
|
||||
|
||||
- This release adds support for Euro-Office, see the README.md for instructions.
|
||||
+7
-8
@@ -1,14 +1,13 @@
|
||||
Upgrades Nextcloud from 33 to 34.0.2 (major version upgrade).
|
||||
Upgrades Nextcloud from 34 to 35 (major version upgrade).
|
||||
|
||||
IMPORTANT:
|
||||
- Check your current version is up-to-date with
|
||||
`abra app cmd <app-name> app check_major_upgrade` before updating to this version
|
||||
- The abra versions 15.0.0 and 15.1.0 have been yanked, so 15.2.0 is the first
|
||||
version for nextcloud-34, and it includes the Euro-Office integration!
|
||||
- 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 33.x before
|
||||
upgrading to 34.0.2. If you are on an older 33.x, deploy 33.0.7 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 34.0.2 before upgrading; some
|
||||
- Review app (plug-in) compatibility with Nextcloud 35 before upgrading; some
|
||||
apps may need to be updated or temporarily disabled.
|
||||
|
||||
+2
-1
@@ -5,5 +5,6 @@
|
||||
],
|
||||
"extends": [
|
||||
"config:base"
|
||||
]
|
||||
],
|
||||
"reviewers": ["moritz","simon","carla"]
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user