From 7a66942dd9f4ee3def223adf1dab38483d2456d0 Mon Sep 17 00:00:00 2001 From: Linus Gasser Date: Fri, 22 May 2026 17:52:45 +0200 Subject: [PATCH] Adding OnlyOffice compose This PR adds a compose.onlyoffice.yaml file and the corresponding configuration and description in README.md. --- .env.sample | 6 +++++ README.md | 18 +++++++++++++++ abra.sh | 1 + compose.onlyoffice.yaml | 48 ++++++++++++++++++++++++++++++++++++++++ onlyoffice-entrypoint.sh | 42 +++++++++++++++++++++++++++++++++++ 5 files changed, 115 insertions(+) create mode 100644 compose.onlyoffice.yaml create mode 100644 onlyoffice-entrypoint.sh diff --git a/.env.sample b/.env.sample index b015413..7b1f51a 100644 --- a/.env.sample +++ b/.env.sample @@ -32,3 +32,9 @@ LETS_ENCRYPT_ENV=production #SSO_CLIENT_SECRET_VERSION=v1 #SSO_JWT_ALG=RS256 #SSO_PLUGIN_VERSION=0.4.0 + +## Adding OnlyOffice to cryptpad +#COMPOSE_FILE="$COMPOSE_FILE:compose.onlyoffice.yaml" +## Enables installation of older onlyoffice versions so that older documents +## can also be loaded and converted. +#ONLYOFFICE_OLDEST=v6 diff --git a/README.md b/README.md index 6280da3..fd011ec 100644 --- a/README.md +++ b/README.md @@ -66,5 +66,23 @@ abra app secret insert YOURAPPDOMAIN sso_client_s v1 YOUR_CLIENT_SECRET Then deploy (or redeploy) to apply: `abra app deploy YOURAPPDOMAIN --force`. +## OnlyOffice + +OnlyOffice support is provided by `compose.onlyoffice.yaml`. Enable it by adding the compose file to your app config: + +``` +COMPOSE_FILE="compose.yml:compose.onlyoffice.yaml" +``` + +On the next deploy, an entrypoint wrapper (`onlyoffice-entrypoint.sh`) prepares the OnlyOffice config volume **before** CryptPad starts, then the app container runs `install-onlyoffice.sh` to download the OnlyOffice assets. Running the prep work inside the app container (rather than a separate init service) is necessary because Docker Swarm ignores `depends_on` at runtime — a sidecar init container would race the app. + +To support opening documents created with older OnlyOffice versions, set `ONLYOFFICE_OLDEST` in your app config. This writes (or updates) `oldest_needed_version` in `onlyoffice-conf/onlyoffice.properties`, which `install-onlyoffice.sh` reads to fetch older versions in addition to the latest: + +``` +ONLYOFFICE_OLDEST=v6 +``` + +If `ONLYOFFICE_OLDEST` is unset, `onlyoffice.properties` is left untouched (CryptPad's own default applies). Only the `oldest_needed_version` key is touched on each deploy, so any other entries in `onlyoffice.properties` are preserved. If you change `ONLYOFFICE_OLDEST` after the assets have already been downloaded, you may need to drop the `cryptpad_oo_dist` volume so `install-onlyoffice.sh` re-runs and pulls the additional versions. + [`abra`]: https://git.coopcloud.tech/coop-cloud/abra [`coop-cloud/traefik`]: https://git.coopcloud.tech/coop-cloud/traefik \ No newline at end of file diff --git a/abra.sh b/abra.sh index 2d69be7..814d000 100644 --- a/abra.sh +++ b/abra.sh @@ -4,3 +4,4 @@ export NGINX_CONF_VERSION=v1 export SSO_ENTRYPOINT_VERSION=v6 export SSO_JS_VERSION=v3 export APP_CONFIG_JS_VERSION=v1 +export ONLYOFFICE_ENTRYPOINT_VERSION=v1 diff --git a/compose.onlyoffice.yaml b/compose.onlyoffice.yaml new file mode 100644 index 0000000..d42228f --- /dev/null +++ b/compose.onlyoffice.yaml @@ -0,0 +1,48 @@ +version: "3.8" + +services: + init-onlyoffice-dirs: + image: busybox + user: root + command: + - sh + - -eu + - -c + - | + mkdir -p /cryptpad/www/common/onlyoffice/dist /cryptpad/onlyoffice-conf + chown -R 4001:4001 \ + /cryptpad/www/common/onlyoffice/dist \ + /cryptpad/onlyoffice-conf + exec tail -f /dev/null + volumes: + - cryptpad_oo_dist:/cryptpad/www/common/onlyoffice/dist + - cryptpad_oo_conf:/cryptpad/onlyoffice-conf/ + + app: + # onlyoffice-entrypoint.sh auto-chains through /sso-entrypoint.sh if + # compose.sso.yml is also loaded, so order of COMPOSE_FILE doesn't matter. + entrypoint: + - /onlyoffice-entrypoint.sh + - /cryptpad/docker-entrypoint.sh + environment: + - "CPAD_INSTALL_ONLYOFFICE=yes" + - ONLYOFFICE_OLDEST + volumes: + - cryptpad_oo_dist:/cryptpad/www/common/onlyoffice/dist + - cryptpad_oo_conf:/cryptpad/onlyoffice-conf/ + configs: + - source: onlyoffice_entrypoint + target: /onlyoffice-entrypoint.sh + mode: 0755 + deploy: + labels: + - "backupbot.backup.volumes.cryptpad_oo_dist=false" + +volumes: + cryptpad_oo_dist: + cryptpad_oo_conf: + +configs: + onlyoffice_entrypoint: + name: ${STACK_NAME}_onlyoffice_entrypoint_${ONLYOFFICE_ENTRYPOINT_VERSION} + file: onlyoffice-entrypoint.sh diff --git a/onlyoffice-entrypoint.sh b/onlyoffice-entrypoint.sh new file mode 100644 index 0000000..6ce6241 --- /dev/null +++ b/onlyoffice-entrypoint.sh @@ -0,0 +1,42 @@ +#!/bin/bash +set -e + +# OnlyOffice init — runs before the original CryptPad entrypoint. +# Ensures oldest_needed_version in onlyoffice.properties matches +# ONLYOFFICE_OLDEST before install-onlyoffice.sh / CryptPad reads it. + +CONF_DIR="/cryptpad/onlyoffice-conf" +PROPS="${CONF_DIR}/onlyoffice.properties" + +# Wait for init-onlyoffice-dirs to chown the volumes. Swarm ignores +# depends_on, so the init sidecar and this container start in parallel. +waited=0 +while [ ! -w "${CONF_DIR}" ]; do + if [ "${waited}" -ge 60 ]; then + echo "[onlyoffice-entrypoint] timed out waiting for ${CONF_DIR} to become writable" >&2 + exit 1 + fi + echo "[onlyoffice-entrypoint] waiting for ${CONF_DIR} to be writable (${waited}s)" + sleep 1 + waited=$((waited + 1)) +done + +if [ -n "${ONLYOFFICE_OLDEST:-}" ]; then + mkdir -p "${CONF_DIR}" + touch "${PROPS}" + if grep -q '^oldest_needed_version=' "${PROPS}"; then + sed -i "s|^oldest_needed_version=.*|oldest_needed_version=${ONLYOFFICE_OLDEST}|" "${PROPS}" + else + echo "oldest_needed_version=${ONLYOFFICE_OLDEST}" >> "${PROPS}" + fi + echo "[onlyoffice-entrypoint] oldest_needed_version=${ONLYOFFICE_OLDEST}" +else + echo "[onlyoffice-entrypoint] ONLYOFFICE_OLDEST unset, leaving ${PROPS} untouched" +fi + +# Chain through the SSO entrypoint if compose.sso.yml mounted it. +if [ -x /sso-entrypoint.sh ]; then + exec /sso-entrypoint.sh "$@" +fi + +exec "$@" -- 2.49.0