diff --git a/Containers/apache/Caddyfile b/Containers/apache/Caddyfile index 51a11604..bf0d1dff 100644 --- a/Containers/apache/Caddyfile +++ b/Containers/apache/Caddyfile @@ -51,6 +51,15 @@ http://{$APACHE_HOST}.nextcloud-aio:23973, # For Collabora callback and WOPI req } } + # EuroOffice + route /eurooffice/* { + uri strip_prefix /eurooffice + reverse_proxy {$EUROOFFICE_HOST}:80 { + header_up X-Forwarded-Host {http.request.hostport}/eurooffice + header_up X-Forwarded-Proto https + } + } + # Talk route /standalone-signaling/* { uri strip_prefix /standalone-signaling diff --git a/Containers/eurooffice/Dockerfile b/Containers/eurooffice/Dockerfile new file mode 100644 index 00000000..746a2ec7 --- /dev/null +++ b/Containers/eurooffice/Dockerfile @@ -0,0 +1,16 @@ +# syntax=docker/dockerfile:latest +FROM eurooffice/documentserver:latest + +# USER root is probably used + +COPY --chmod=775 healthcheck.sh /healthcheck.sh + +HEALTHCHECK --start-period=60s --retries=9 CMD /healthcheck.sh +LABEL com.centurylinklabs.watchtower.enable="false" \ + wud.watch="false" \ + org.opencontainers.image.title="EuroOffice for Nextcloud AIO" \ + org.opencontainers.image.description="EuroOffice Document Server for Nextcloud All-in-One" \ + org.opencontainers.image.url="https://github.com/nextcloud/all-in-one" \ + org.opencontainers.image.source="https://github.com/nextcloud/all-in-one" \ + org.opencontainers.image.vendor="Nextcloud" \ + org.opencontainers.image.documentation="https://github.com/nextcloud/all-in-one/blob/main/readme.md" diff --git a/Containers/eurooffice/healthcheck.sh b/Containers/eurooffice/healthcheck.sh new file mode 100644 index 00000000..a5afbf2b --- /dev/null +++ b/Containers/eurooffice/healthcheck.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +if [ "$AIO_LOG_LEVEL" = 'debug' ]; then + set -x +fi + +nc -z 127.0.0.1 80 || exit 1 diff --git a/Containers/nextcloud/entrypoint.sh b/Containers/nextcloud/entrypoint.sh index 07e0ae24..aa9d7ae2 100644 --- a/Containers/nextcloud/entrypoint.sh +++ b/Containers/nextcloud/entrypoint.sh @@ -896,6 +896,58 @@ else fi fi +# EuroOffice +if [ "$EUROOFFICE_ENABLED" = 'yes' ]; then + # Determine EuroOffice port based on host pattern + if echo "$EUROOFFICE_HOST" | grep -q "nextcloud-.*-eurooffice"; then + EUROOFFICE_PORT=80 + else + EUROOFFICE_PORT=443 + fi + + count=0 + while ! nc -z "$EUROOFFICE_HOST" "$EUROOFFICE_PORT" && [ "$count" -lt 90 ]; do + echo "Waiting for EuroOffice to become available..." + count=$((count+5)) + sleep 5 + done + if [ "$count" -ge 90 ]; then + bash /notify.sh "EuroOffice did not start in time!" "Skipping initialization and disabling eurooffice app." + php /var/www/html/occ app:disable eurooffice + else + # Install or enable EuroOffice app as needed + if ! [ -d "/var/www/html/custom_apps/eurooffice" ]; then + php /var/www/html/occ app:install eurooffice + elif [ "$(php /var/www/html/occ config:app:get eurooffice enabled)" != "yes" ]; then + php /var/www/html/occ app:enable eurooffice + elif [ "$SKIP_UPDATE" != 1 ]; then + php /var/www/html/occ app:update eurooffice + fi + + # Set EuroOffice configuration + php /var/www/html/occ config:system:set eurooffice editors_check_interval --value="0" --type=integer + php /var/www/html/occ config:system:set eurooffice jwt_secret --value="$EUROOFFICE_SECRET" + php /var/www/html/occ config:app:set eurooffice jwt_secret --value="$EUROOFFICE_SECRET" + php /var/www/html/occ config:system:set eurooffice jwt_header --value="AuthorizationJwt" + + # Adjust the EuroOffice host if using internal pattern + if echo "$EUROOFFICE_HOST" | grep -q "nextcloud-.*-eurooffice"; then + EUROOFFICE_HOST="$NC_DOMAIN/eurooffice" + export EUROOFFICE_HOST + fi + + php /var/www/html/occ config:app:set eurooffice DocumentServerUrl --value="https://$EUROOFFICE_HOST" + fi +else + # Remove EuroOffice app if disabled and removal is requested + if [ "$REMOVE_DISABLED_APPS" = yes ] && \ + [ -d "/var/www/html/custom_apps/eurooffice" ] && \ + [ -n "$EUROOFFICE_SECRET" ] && \ + [ "$(php /var/www/html/occ config:system:get eurooffice jwt_secret)" = "$EUROOFFICE_SECRET" ]; then + php /var/www/html/occ app:remove eurooffice + fi +fi + # Talk if [ "$TALK_ENABLED" = 'yes' ]; then set -x diff --git a/manual-install/latest.yml b/manual-install/latest.yml index 400141bd..4ba8fe26 100644 --- a/manual-install/latest.yml +++ b/manual-install/latest.yml @@ -4,6 +4,9 @@ services: nextcloud-aio-onlyoffice: condition: service_started required: false + nextcloud-aio-eurooffice: + condition: service_started + required: false nextcloud-aio-collabora: condition: service_started required: false @@ -40,6 +43,7 @@ services: - TALK_HOST=nextcloud-aio-talk - APACHE_PORT - ONLYOFFICE_HOST=nextcloud-aio-onlyoffice + - EUROOFFICE_HOST=nextcloud-aio-eurooffice - TZ=${TIMEZONE} - APACHE_MAX_SIZE - APACHE_MAX_TIME=${NEXTCLOUD_MAX_TIME} @@ -149,14 +153,17 @@ services: - TURN_SECRET - SIGNALING_SECRET - ONLYOFFICE_SECRET + - EUROOFFICE_SECRET - NEXTCLOUD_MOUNT - CLAMAV_ENABLED - CLAMAV_HOST=nextcloud-aio-clamav - ONLYOFFICE_ENABLED + - EUROOFFICE_ENABLED - COLLABORA_ENABLED - COLLABORA_HOST=nextcloud-aio-collabora - TALK_ENABLED - ONLYOFFICE_HOST=nextcloud-aio-onlyoffice + - EUROOFFICE_HOST=nextcloud-aio-eurooffice - UPDATE_NEXTCLOUD_APPS - TZ=${TIMEZONE} - TALK_PORT @@ -396,6 +403,31 @@ services: cap_drop: - NET_RAW + nextcloud-aio-eurooffice: + image: ghcr.io/nextcloud-releases/aio-eurooffice:latest + init: true + healthcheck: + start_period: 60s + test: /healthcheck.sh + interval: 30s + timeout: 30s + start_interval: 5s + retries: 9 + expose: + - "80" + environment: + - TZ=${TIMEZONE} + - JWT_ENABLED=true + - JWT_HEADER=AuthorizationJwt + - JWT_SECRET=${EUROOFFICE_SECRET} + volumes: + - nextcloud_aio_eurooffice:/var/lib/eurooffice:rw + restart: unless-stopped + profiles: + - eurooffice + cap_drop: + - NET_RAW + nextcloud-aio-imaginary: image: ghcr.io/nextcloud-releases/aio-imaginary:latest user: "65534" @@ -503,6 +535,8 @@ volumes: name: nextcloud_aio_nextcloud nextcloud_aio_onlyoffice: name: nextcloud_aio_onlyoffice + nextcloud_aio_eurooffice: + name: nextcloud_aio_eurooffice nextcloud_aio_redis: name: nextcloud_aio_redis nextcloud_aio_talk_recording: diff --git a/manual-install/sample.conf b/manual-install/sample.conf index ec42b95e..bf611e10 100644 --- a/manual-install/sample.conf +++ b/manual-install/sample.conf @@ -4,6 +4,7 @@ IMAGINARY_SECRET= # TODO! This needs to be a unique and good password! NC_DOMAIN=yourdomain.com # TODO! Needs to be changed to the domain that you want to use for Nextcloud. NEXTCLOUD_PASSWORD= # TODO! This is the password of the initially created Nextcloud admin with username "admin". ONLYOFFICE_SECRET= # TODO! This needs to be a unique and good password! +EUROOFFICE_SECRET= # TODO! This needs to be a unique and good password! RECORDING_SECRET= # TODO! This needs to be a unique and good password! REDIS_PASSWORD= # TODO! This needs to be a unique and good password! SIGNALING_SECRET= # TODO! This needs to be a unique and good password! @@ -17,6 +18,7 @@ COLLABORA_ENABLED="no" # Setting this to "yes" (with quotes) enables th FULLTEXTSEARCH_ENABLED="no" # Setting this to "yes" (with quotes) enables the option in Nextcloud automatically. IMAGINARY_ENABLED="no" # Setting this to "yes" (with quotes) enables the option in Nextcloud automatically. ONLYOFFICE_ENABLED="no" # Setting this to "yes" (with quotes) enables the option in Nextcloud automatically. +EUROOFFICE_ENABLED="no" # Setting this to "yes" (with quotes) enables the option in Nextcloud automatically. TALK_ENABLED="no" # Setting this to "yes" (with quotes) enables the option in Nextcloud automatically. TALK_RECORDING_ENABLED="no" # Setting this to "yes" (with quotes) enables the option in Nextcloud automatically. WHITEBOARD_ENABLED="no" # Setting this to "yes" (with quotes) enables the option in Nextcloud automatically. diff --git a/nextcloud-aio-helm-chart/templates/nextcloud-aio-apache-deployment.yaml b/nextcloud-aio-helm-chart/templates/nextcloud-aio-apache-deployment.yaml index 2d768356..1fb6db33 100755 --- a/nextcloud-aio-helm-chart/templates/nextcloud-aio-apache-deployment.yaml +++ b/nextcloud-aio-helm-chart/templates/nextcloud-aio-apache-deployment.yaml @@ -57,6 +57,8 @@ spec: value: nextcloud-aio-notify-push - name: ONLYOFFICE_HOST value: nextcloud-aio-onlyoffice + - name: EUROOFFICE_HOST + value: nextcloud-aio-eurooffice - name: TALK_HOST value: nextcloud-aio-talk - name: TZ diff --git a/nextcloud-aio-helm-chart/templates/nextcloud-aio-eurooffice-deployment.yaml b/nextcloud-aio-helm-chart/templates/nextcloud-aio-eurooffice-deployment.yaml new file mode 100644 index 00000000..9bca2d1e --- /dev/null +++ b/nextcloud-aio-helm-chart/templates/nextcloud-aio-eurooffice-deployment.yaml @@ -0,0 +1,73 @@ +{{- if eq .Values.EUROOFFICE_ENABLED "yes" }} +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: + kompose.version: 1.38.0 (a8f5d1cbd) + labels: + io.kompose.service: nextcloud-aio-eurooffice + name: nextcloud-aio-eurooffice + namespace: "{{ .Values.NAMESPACE }}" +spec: + replicas: 1 + selector: + matchLabels: + io.kompose.service: nextcloud-aio-eurooffice + strategy: + type: Recreate + template: + metadata: + annotations: + kompose.version: 1.38.0 (a8f5d1cbd) + labels: + io.kompose.service: nextcloud-aio-eurooffice + spec: + initContainers: + - name: init-volumes + image: ghcr.io/nextcloud-releases/aio-alpine:20260409_094910 + command: + - chmod + - "777" + - /nextcloud-aio-eurooffice + volumeMounts: + - name: nextcloud-aio-eurooffice + mountPath: /nextcloud-aio-eurooffice + containers: + - env: + - name: JWT_ENABLED + value: "true" + - name: JWT_HEADER + value: AuthorizationJwt + - name: JWT_SECRET + value: "{{ .Values.EUROOFFICE_SECRET }}" + - name: TZ + value: "{{ .Values.TIMEZONE }}" + image: ghcr.io/nextcloud-releases/aio-eurooffice:20260409_094910 + readinessProbe: + exec: + command: + - /healthcheck.sh + failureThreshold: 9 + initialDelaySeconds: 60 + periodSeconds: 30 + timeoutSeconds: 30 + livenessProbe: + exec: + command: + - /healthcheck.sh + failureThreshold: 9 + initialDelaySeconds: 60 + periodSeconds: 30 + timeoutSeconds: 30 + name: nextcloud-aio-eurooffice + ports: + - containerPort: 80 + protocol: TCP + volumeMounts: + - mountPath: /var/lib/eurooffice + name: nextcloud-aio-eurooffice + volumes: + - name: nextcloud-aio-eurooffice + persistentVolumeClaim: + claimName: nextcloud-aio-eurooffice +{{- end }} diff --git a/nextcloud-aio-helm-chart/templates/nextcloud-aio-eurooffice-persistentvolumeclaim.yaml b/nextcloud-aio-helm-chart/templates/nextcloud-aio-eurooffice-persistentvolumeclaim.yaml new file mode 100644 index 00000000..42d2622c --- /dev/null +++ b/nextcloud-aio-helm-chart/templates/nextcloud-aio-eurooffice-persistentvolumeclaim.yaml @@ -0,0 +1,18 @@ +{{- if eq .Values.EUROOFFICE_ENABLED "yes" }} +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + labels: + io.kompose.service: nextcloud-aio-eurooffice + name: nextcloud-aio-eurooffice + namespace: "{{ .Values.NAMESPACE }}" +spec: + {{- if .Values.STORAGE_CLASS }} + storageClassName: {{ .Values.STORAGE_CLASS }} + {{- end }} + accessModes: + - ReadWriteOnce + resources: + requests: + storage: {{ .Values.EUROOFFICE_STORAGE_SIZE }} +{{- end }} diff --git a/nextcloud-aio-helm-chart/templates/nextcloud-aio-eurooffice-service.yaml b/nextcloud-aio-helm-chart/templates/nextcloud-aio-eurooffice-service.yaml new file mode 100644 index 00000000..0a9ca93b --- /dev/null +++ b/nextcloud-aio-helm-chart/templates/nextcloud-aio-eurooffice-service.yaml @@ -0,0 +1,19 @@ +{{- if eq .Values.EUROOFFICE_ENABLED "yes" }} +apiVersion: v1 +kind: Service +metadata: + annotations: + kompose.version: 1.38.0 (a8f5d1cbd) + labels: + io.kompose.service: nextcloud-aio-eurooffice + name: nextcloud-aio-eurooffice + namespace: "{{ .Values.NAMESPACE }}" +spec: + ipFamilyPolicy: PreferDualStack + ports: + - name: "80" + port: 80 + targetPort: 80 + selector: + io.kompose.service: nextcloud-aio-eurooffice +{{- end }} diff --git a/nextcloud-aio-helm-chart/templates/nextcloud-aio-nextcloud-deployment.yaml b/nextcloud-aio-helm-chart/templates/nextcloud-aio-nextcloud-deployment.yaml index 1e502637..75b1d4e7 100755 --- a/nextcloud-aio-helm-chart/templates/nextcloud-aio-nextcloud-deployment.yaml +++ b/nextcloud-aio-helm-chart/templates/nextcloud-aio-nextcloud-deployment.yaml @@ -138,6 +138,12 @@ spec: value: nextcloud-aio-onlyoffice - name: ONLYOFFICE_SECRET value: "{{ .Values.ONLYOFFICE_SECRET }}" + - name: EUROOFFICE_ENABLED + value: "{{ .Values.EUROOFFICE_ENABLED }}" + - name: EUROOFFICE_HOST + value: nextcloud-aio-eurooffice + - name: EUROOFFICE_SECRET + value: "{{ .Values.EUROOFFICE_SECRET }}" - name: OVERWRITEPROTOCOL value: https - name: PHP_MAX_TIME diff --git a/nextcloud-aio-helm-chart/values.yaml b/nextcloud-aio-helm-chart/values.yaml index 7d7afcd3..e81146b9 100755 --- a/nextcloud-aio-helm-chart/values.yaml +++ b/nextcloud-aio-helm-chart/values.yaml @@ -4,6 +4,7 @@ IMAGINARY_SECRET: # TODO! This needs to be a unique and good password! NC_DOMAIN: yourdomain.com # TODO! Needs to be changed to the domain that you want to use for Nextcloud. NEXTCLOUD_PASSWORD: # TODO! This is the password of the initially created Nextcloud admin with username admin. ONLYOFFICE_SECRET: # TODO! This needs to be a unique and good password! +EUROOFFICE_SECRET: # TODO! This needs to be a unique and good password! RECORDING_SECRET: # TODO! This needs to be a unique and good password! REDIS_PASSWORD: # TODO! This needs to be a unique and good password! SIGNALING_SECRET: # TODO! This needs to be a unique and good password! @@ -17,6 +18,7 @@ COLLABORA_ENABLED: "no" # Setting this to "yes" (with quotes) enables t FULLTEXTSEARCH_ENABLED: "no" # Setting this to "yes" (with quotes) enables the option in Nextcloud automatically. IMAGINARY_ENABLED: "no" # Setting this to "yes" (with quotes) enables the option in Nextcloud automatically. ONLYOFFICE_ENABLED: "no" # Setting this to "yes" (with quotes) enables the option in Nextcloud automatically. +EUROOFFICE_ENABLED: "no" # Setting this to "yes" (with quotes) enables the option in Nextcloud automatically. TALK_ENABLED: "no" # Setting this to "yes" (with quotes) enables the option in Nextcloud automatically. TALK_RECORDING_ENABLED: "no" # Setting this to "yes" (with quotes) enables the option in Nextcloud automatically. WHITEBOARD_ENABLED: "no" # Setting this to "yes" (with quotes) enables the option in Nextcloud automatically. @@ -49,6 +51,7 @@ NEXTCLOUD_STORAGE_SIZE: 5Gi # You can change the size of the nextcloud vol NEXTCLOUD_DATA_STORAGE_SIZE: 5Gi # You can change the size of the nextcloud-data volume that default to 1Gi with this value NEXTCLOUD_TRUSTED_CACERTS_STORAGE_SIZE: 1Gi # You can change the size of the nextcloud-trusted-cacerts volume that default to 1Gi with this value ONLYOFFICE_STORAGE_SIZE: 1Gi # You can change the size of the onlyoffice volume that default to 1Gi with this value +EUROOFFICE_STORAGE_SIZE: 1Gi # You can change the size of the eurooffice volume that default to 1Gi with this value REDIS_STORAGE_SIZE: 1Gi # You can change the size of the redis volume that default to 1Gi with this value TALK_RECORDING_STORAGE_SIZE: 1Gi # You can change the size of the talk-recording volume that default to 1Gi with this value diff --git a/php/containers.json b/php/containers.json index df841f44..cdc7f15b 100644 --- a/php/containers.json +++ b/php/containers.json @@ -6,6 +6,7 @@ "documentation": "https://github.com/nextcloud/all-in-one/discussions/2105", "depends_on": [ "nextcloud-aio-onlyoffice", + "nextcloud-aio-eurooffice", "nextcloud-aio-collabora", "nextcloud-aio-talk", "nextcloud-aio-notify-push", @@ -47,6 +48,7 @@ "APACHE_PORT=%APACHE_PORT%", "AIO_LOG_LEVEL=%AIO_LOG_LEVEL%", "ONLYOFFICE_HOST=nextcloud-aio-onlyoffice", + "EUROOFFICE_HOST=nextcloud-aio-eurooffice", "TZ=%TIMEZONE%", "APACHE_MAX_SIZE=%APACHE_MAX_SIZE%", "APACHE_MAX_TIME=%NEXTCLOUD_MAX_TIME%", @@ -223,6 +225,7 @@ "TURN_SECRET=%TURN_SECRET%", "SIGNALING_SECRET=%SIGNALING_SECRET%", "ONLYOFFICE_SECRET=%ONLYOFFICE_SECRET%", + "EUROOFFICE_SECRET=%EUROOFFICE_SECRET%", "AIO_URL=%AIO_URL%", "AIO_LOG_LEVEL=%AIO_LOG_LEVEL%", "NC_AIO_VERSION=v%AIO_VERSION%", @@ -230,10 +233,12 @@ "CLAMAV_ENABLED=%CLAMAV_ENABLED%", "CLAMAV_HOST=nextcloud-aio-clamav", "ONLYOFFICE_ENABLED=%ONLYOFFICE_ENABLED%", + "EUROOFFICE_ENABLED=%EUROOFFICE_ENABLED%", "COLLABORA_ENABLED=%COLLABORA_ENABLED%", "COLLABORA_HOST=nextcloud-aio-collabora", "TALK_ENABLED=%TALK_ENABLED%", "ONLYOFFICE_HOST=nextcloud-aio-onlyoffice", + "EUROOFFICE_HOST=nextcloud-aio-eurooffice", "UPDATE_NEXTCLOUD_APPS=%UPDATE_NEXTCLOUD_APPS%", "TZ=%TIMEZONE%", "TALK_PORT=%TALK_PORT%", @@ -357,6 +362,7 @@ "secrets": [ "REDIS_PASSWORD", "ONLYOFFICE_SECRET", + "EUROOFFICE_SECRET", "RECORDING_SECRET" ], "restart": "unless-stopped", @@ -758,6 +764,50 @@ "NET_RAW" ] }, + { + "container_name": "nextcloud-aio-eurooffice", + "image_tag": "%AIO_CHANNEL%", + "display_name": "EuroOffice", + "image": "ghcr.io/nextcloud-releases/aio-eurooffice", + "init": true, + "healthcheck": { + "start_period": "60s", + "test": "/healthcheck.sh", + "interval": "30s", + "timeout": "30s", + "start_interval": "5s", + "retries": 9 + }, + "expose": [ + "80" + ], + "internal_port": "80", + "environment": [ + "AIO_LOG_LEVEL=%AIO_LOG_LEVEL%", + "LOG_LEVEL=%AIO_LOG_LEVEL%", + "TZ=%TIMEZONE%", + "JWT_ENABLED=true", + "JWT_HEADER=AuthorizationJwt", + "JWT_SECRET=%EUROOFFICE_SECRET%" + ], + "volumes": [ + { + "source": "nextcloud_aio_eurooffice", + "destination": "/var/lib/eurooffice", + "writeable": true + } + ], + "secrets": [ + "EUROOFFICE_SECRET" + ], + "restart": "unless-stopped", + "profiles": [ + "eurooffice" + ], + "cap_drop": [ + "NET_RAW" + ] + }, { "container_name": "nextcloud-aio-imaginary", "image_tag": "%AIO_CHANNEL%", diff --git a/php/public/containers-form-submit.js b/php/public/containers-form-submit.js index 778430cb..3c163cab 100644 --- a/php/public/containers-form-submit.js +++ b/php/public/containers-form-submit.js @@ -22,9 +22,11 @@ document.addEventListener("DOMContentLoaded", function () { // Office suite radio buttons const collaboraRadio = document.getElementById('office-collabora'); const onlyofficeRadio = document.getElementById('office-onlyoffice'); + const euroofficeRadio = document.getElementById('office-eurooffice'); const noneRadio = document.getElementById('office-none'); const collaboraHidden = document.getElementById('collabora'); const onlyofficeHidden = document.getElementById('onlyoffice'); + const euroofficeHidden = document.getElementById('eurooffice'); let initialOfficeSelection = null; optionsContainersCheckboxes.forEach(checkbox => { @@ -36,11 +38,13 @@ document.addEventListener("DOMContentLoaded", function () { }); // Store initial office suite selection - if (collaboraRadio && onlyofficeRadio && noneRadio) { + if (collaboraRadio && onlyofficeRadio && euroofficeRadio && noneRadio) { if (collaboraRadio.checked) { initialOfficeSelection = 'collabora'; } else if (onlyofficeRadio.checked) { initialOfficeSelection = 'onlyoffice'; + } else if (euroofficeRadio.checked) { + initialOfficeSelection = 'eurooffice'; } else { initialOfficeSelection = 'none'; } @@ -57,20 +61,28 @@ document.addEventListener("DOMContentLoaded", function () { }); // Check office suite changes and sync to hidden inputs - if (collaboraRadio && onlyofficeRadio && noneRadio && collaboraHidden && onlyofficeHidden) { + if (collaboraRadio && onlyofficeRadio && euroofficeRadio && noneRadio && collaboraHidden && onlyofficeHidden && euroofficeHidden) { let currentOfficeSelection = null; if (collaboraRadio.checked) { currentOfficeSelection = 'collabora'; collaboraHidden.value = 'on'; onlyofficeHidden.value = ''; + euroofficeHidden.value = ''; } else if (onlyofficeRadio.checked) { currentOfficeSelection = 'onlyoffice'; collaboraHidden.value = ''; onlyofficeHidden.value = 'on'; + euroofficeHidden.value = ''; + } else if (euroofficeRadio.checked) { + currentOfficeSelection = 'eurooffice'; + collaboraHidden.value = ''; + onlyofficeHidden.value = ''; + euroofficeHidden.value = 'on'; } else { currentOfficeSelection = 'none'; collaboraHidden.value = ''; onlyofficeHidden.value = ''; + euroofficeHidden.value = ''; } if (currentOfficeSelection !== initialOfficeSelection) { @@ -144,9 +156,10 @@ document.addEventListener("DOMContentLoaded", function () { handleTalkVisibility(); // Ensure talk-recording is correctly initialized // Add event listeners for office suite radio buttons - if (collaboraRadio && onlyofficeRadio && noneRadio) { + if (collaboraRadio && onlyofficeRadio && euroofficeRadio && noneRadio) { collaboraRadio.addEventListener('change', checkForOptionContainerChanges); onlyofficeRadio.addEventListener('change', checkForOptionContainerChanges); + euroofficeRadio.addEventListener('change', checkForOptionContainerChanges); noneRadio.addEventListener('change', checkForOptionContainerChanges); } diff --git a/php/public/disable-containers.js b/php/public/disable-containers.js index 41c5cfe1..fa322b19 100644 --- a/php/public/disable-containers.js +++ b/php/public/disable-containers.js @@ -27,6 +27,12 @@ document.addEventListener("DOMContentLoaded", function(event) { const onlyoffice = document.getElementById("office-onlyoffice"); onlyoffice.disabled = true; + // EuroOffice + const eurooffice = document.getElementById("office-eurooffice"); + if (eurooffice) { + eurooffice.disabled = true; + } + // Imaginary let imaginary = document.getElementById("imaginary"); imaginary.disabled = true; diff --git a/php/public/index.php b/php/public/index.php index eb2a7878..60b302ce 100644 --- a/php/public/index.php +++ b/php/public/index.php @@ -152,6 +152,7 @@ $app->get('/containers', function (Request $request, Response $response, array $ 'current_channel' => $dockerActionManager->GetCurrentChannel(), 'is_clamav_enabled' => $configurationManager->isClamavEnabled, 'is_onlyoffice_enabled' => $configurationManager->isOnlyofficeEnabled, + 'is_eurooffice_enabled' => $configurationManager->isEuroofficeEnabled, 'is_collabora_enabled' => $configurationManager->isCollaboraEnabled, 'is_talk_enabled' => $configurationManager->isTalkEnabled, 'borg_restore_password' => $configurationManager->borgRestorePassword, diff --git a/php/src/ContainerDefinitionFetcher.php b/php/src/ContainerDefinitionFetcher.php index e4625a24..8d0c74a3 100644 --- a/php/src/ContainerDefinitionFetcher.php +++ b/php/src/ContainerDefinitionFetcher.php @@ -74,6 +74,10 @@ readonly class ContainerDefinitionFetcher { if (!$this->configurationManager->isOnlyofficeEnabled) { continue; } + } elseif ($entry['container_name'] === 'nextcloud-aio-eurooffice') { + if (!$this->configurationManager->isEuroofficeEnabled) { + continue; + } } elseif ($entry['container_name'] === 'nextcloud-aio-collabora') { if (!$this->configurationManager->isCollaboraEnabled) { continue; @@ -190,6 +194,10 @@ readonly class ContainerDefinitionFetcher { if (!$this->configurationManager->isOnlyofficeEnabled) { continue; } + } elseif ($value === 'nextcloud-aio-eurooffice') { + if (!$this->configurationManager->isEuroofficeEnabled) { + continue; + } } elseif ($value === 'nextcloud-aio-collabora') { if (!$this->configurationManager->isCollaboraEnabled) { continue; diff --git a/php/src/Controller/ConfigurationController.php b/php/src/Controller/ConfigurationController.php index 8e351827..0fa7a2ba 100644 --- a/php/src/Controller/ConfigurationController.php +++ b/php/src/Controller/ConfigurationController.php @@ -81,12 +81,19 @@ readonly class ConfigurationController { if ($officeSuiteChoice === 'collabora') { $this->configurationManager->isCollaboraEnabled = true; $this->configurationManager->isOnlyofficeEnabled = false; + $this->configurationManager->isEuroofficeEnabled = false; } elseif ($officeSuiteChoice === 'onlyoffice') { $this->configurationManager->isCollaboraEnabled = false; $this->configurationManager->isOnlyofficeEnabled = true; + $this->configurationManager->isEuroofficeEnabled = false; + } elseif ($officeSuiteChoice === 'eurooffice') { + $this->configurationManager->isCollaboraEnabled = false; + $this->configurationManager->isOnlyofficeEnabled = false; + $this->configurationManager->isEuroofficeEnabled = true; } else { $this->configurationManager->isCollaboraEnabled = false; $this->configurationManager->isOnlyofficeEnabled = false; + $this->configurationManager->isEuroofficeEnabled = false; } $this->configurationManager->isClamavEnabled = isset($request->getParsedBody()['clamav']); $this->configurationManager->isTalkEnabled = isset($request->getParsedBody()['talk']); diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php index 108a0f4e..f7553d7a 100644 --- a/php/src/Data/ConfigurationManager.php +++ b/php/src/Data/ConfigurationManager.php @@ -98,6 +98,12 @@ class ConfigurationManager set { $this->set('isOnlyofficeEnabled', $value); } } + public bool $isEuroofficeEnabled { + // Type-cast because old configs could have 1/0 for this key. + get => (bool) $this->get('isEuroofficeEnabled', false); + set { $this->set('isEuroofficeEnabled', $value); } + } + public bool $isCollaboraEnabled { // Type-cast because old configs could have 1/0 for this key. get => (bool) $this->get('isCollaboraEnabled', true); @@ -1086,6 +1092,7 @@ class ConfigurationManager 'CLAMAV_ENABLED' => $this->isClamavEnabled ? 'yes' : '', 'TALK_RECORDING_ENABLED' => $this->isTalkRecordingEnabled ? 'yes' : '', 'ONLYOFFICE_ENABLED' => $this->isOnlyofficeEnabled ? 'yes' : '', + 'EUROOFFICE_ENABLED' => $this->isEuroofficeEnabled ? 'yes' : '', 'COLLABORA_ENABLED' => $this->isCollaboraEnabled ? 'yes' : '', 'TALK_ENABLED' => $this->isTalkEnabled ? 'yes' : '', 'UPDATE_NEXTCLOUD_APPS' => ($this->isDailyBackupRunning() && $this->areAutomaticUpdatesEnabled()) ? 'yes' : '', diff --git a/php/templates/includes/optional-containers.twig b/php/templates/includes/optional-containers.twig index b93ef57f..9e95e7e6 100644 --- a/php/templates/includes/optional-containers.twig +++ b/php/templates/includes/optional-containers.twig @@ -81,6 +81,37 @@ {% endif %} + + + {% if isAnyRunning == false %}