Compare commits

..

24 Commits

Author SHA1 Message Date
copilot-swe-agent[bot]
8471d870eb Add EuroOffice support modeled after OnlyOffice implementation
Agent-Logs-Url: https://github.com/nextcloud/all-in-one/sessions/bd87016f-c321-49f1-93dd-d8baab660d3f

Co-authored-by: szaimen <42591237+szaimen@users.noreply.github.com>
2026-05-04 11:24:59 +00:00
Simon L.
99ea91c5ef increase to v13.0.1
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-05-04 10:49:10 +02:00
Simon L.
7b2de0683e fix harp container not starting anymore (#8048) 2026-05-04 10:48:29 +02:00
Simon L.
f7b677fb51 fix harp container not starting anymore
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-05-04 10:39:21 +02:00
Simon L.
ee8a5a185c mastercontainer: fix checking for AIO_LOG_LEVEL (#8035) 2026-05-04 10:36:45 +02:00
Simon L.
2b0cb13f35 aio-interface: fix Cross-Origin-* headers not being sent (#8046) 2026-05-04 10:36:22 +02:00
Zoey
a1eaea85ed fix Cross-Origin-* headers not being sent
Signed-off-by: Zoey <zoey@z0ey.de>
2026-05-03 22:34:27 +02:00
Simon L.
c545bffc53 mastercontainer: fix checking for AIO_LOG_LEVEL
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-04-30 16:07:48 +02:00
Simon L.
dc27f8078f nextcloud: update to 33.0.3 (#8032) 2026-04-30 11:22:32 +02:00
Simon L.
9f9846461e nextcloud: update to 33.0.3
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-04-30 11:19:13 +02:00
Simon L.
8e3141ab75 fix update-yaml script detail
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-04-29 18:41:12 +02:00
Simon L.
f060a334d3 collabora: fix log level info (#8030) 2026-04-29 17:59:10 +02:00
Simon L.
4417d1ca7a collabora: fix log level info
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-04-29 17:57:25 +02:00
Simon L.
cdc617d0b7 another fix for redis
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-04-29 17:31:35 +02:00
Simon L.
71dbf98d48 fix detail
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-04-29 17:06:32 +02:00
Simon L.
42e2d88b3e redis: fix log level (#8029) 2026-04-29 17:02:03 +02:00
Simon L.
4682355bfe redis: fix log level
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-04-29 17:01:14 +02:00
Simon L.
13ac536b68 nextcloud: overwrite the log level every start (#8028) 2026-04-29 15:02:35 +02:00
Simon L.
9b9b3b638d nextcloud: overwrite the log level every start
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-04-29 15:01:17 +02:00
Simon L.
7b6bda1f60 postgres: fix healthcheck (#8027) 2026-04-29 14:55:57 +02:00
Simon L.
764314524d caddy: revert being able to adjust the log level for it for now (#8021) 2026-04-29 14:55:21 +02:00
Simon L.
4910c3f012 postgres: fix healthcheck
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-04-29 14:54:36 +02:00
Simon L.
55790da3eb caddy: revert being able to adjust the log level for it for now
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-04-29 14:47:32 +02:00
Simon L.
4e8292b922 acme.Caddyfile: mute caddy warnings
Signed-off-by: Simon L. <szaimen@e.mail.de>
2026-04-28 21:38:41 +02:00
34 changed files with 393 additions and 46 deletions

View File

@@ -10,7 +10,7 @@
}
log {
level {$CADDY_LOG_LEVEL}
level ERROR
}
}
@@ -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

View File

@@ -9,8 +9,6 @@ if [ -z "$NC_DOMAIN" ]; then
exit 1
fi
CADDY_LOG_LEVEL="$(echo "$AIO_LOG_LEVEL" | tr '[:lower:]' '[:upper:]')"
export CADDY_LOG_LEVEL
if [ "$AIO_LOG_LEVEL" = 'debug' ]; then
export SUPERVISORD_STDOUT=/dev/stdout
else

View File

@@ -6,6 +6,8 @@ fi
if [ "$AIO_LOG_LEVEL" = "warn" ]; then
COLLABORA_LOG_LEVEL="warning"
elif [ "$AIO_LOG_LEVEL" = "info" ]; then
COLLABORA_LOG_LEVEL="notice"
else
COLLABORA_LOG_LEVEL="$AIO_LOG_LEVEL"
fi

View File

@@ -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"

View File

@@ -0,0 +1,7 @@
#!/bin/bash
if [ "$AIO_LOG_LEVEL" = 'debug' ]; then
set -x
fi
nc -z 127.0.0.1 80 || exit 1

View File

@@ -10,7 +10,7 @@
}
log {
level {$CADDY_LOG_LEVEL}
level ERROR
# We need to exclude the remote-host plugin from logging as it would spam the logs
# See https://github.com/nextcloud/all-in-one/pull/7006#issuecomment-4003238239
exclude http.matchers.remote_host

View File

@@ -18,9 +18,9 @@ header {
Referrer-Policy "no-referrer" # Tells the browser to never sent a Referer header. See https://developer.mozilla.org/de/docs/Web/HTTP/Reference/Headers/Referrer-Policy
X-Robots-Tag "noindex, nofollow" # Tells web crawlers to not index this page. See https://developer.mozilla.org/de/docs/Web/HTTP/Reference/Headers/X-Robots-Tag
Origin-Agent-Cluster "?1" # Isolates AIO from other same site pages. See https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Origin-Agent-Cluster
Cross-Origin-Opener-Policy "same-origin"; # AIO does not use any popup, still we can isolate its BCG if it is opened as a pop up by another page. See https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Cross-Origin-Opener-Policy
Cross-Origin-Embedder-Policy "require-corp"; # Harder rules for cross origin embeds. See https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Cross-Origin-Embedder-Policy
Cross-Origin-Resource-Policy "same-origin"; # Only allow the same origin to load resources. See https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/Cross-Origin_Resource_Policy
Cross-Origin-Opener-Policy "same-origin" # AIO does not use any popup, still we can isolate its BCG if it is opened as a pop up by another page. See https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Cross-Origin-Opener-Policy
Cross-Origin-Embedder-Policy "require-corp" # Harder rules for cross origin embeds. See https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Cross-Origin-Embedder-Policy
Cross-Origin-Resource-Policy "same-origin" # Only allow the same origin to load resources. See https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/Cross-Origin_Resource_Policy
# Permissions-Policy disables browser features that AIO does not use. Since there is no "deny all" option, all known features need to be listed explicitly. See https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Permissions-Policy
Permissions-Policy "accelerometer=(), ambient-light-sensor=(), aria-notify=(), attribution-reporting=(), autoplay=(), bluetooth=(), browsing-topics=(), camera=(), captured-surface-control=(), ch-ua-high-entropy-values=(), compute-pressure=(), cross-origin-isolated=(), deferred-fetch=(), deferred-fetch-minimal=(), display-capture=(), encrypted-media=(), fullscreen=(), gamepad=(), geolocation=(), gyroscope=(), hid=(), identity-credentials-get=(), idle-detection=(), local-fonts=(), local-network=(), local-network-access=(), loopback-network=(), magnetometer=(), microphone=(), midi=(), on-device-speech-recognition=(), otp-credentials=(), payment=(), picture-in-picture=(), private-state-token-issuance=(), private-state-token-redemption=(), publickey-credentials-create=(), publickey-credentials-get=(), screen-wake-lock=(), serial=(), storage-access=(), summarizer=(), usb=(), web-share=(), window-management=(), xr-spatial-tracking=()"

View File

@@ -9,7 +9,7 @@
}
log {
level {$CADDY_LOG_LEVEL}
level ERROR
# We need to exclude the remote-host plugin from logging as it would spam the logs
# See https://github.com/nextcloud/all-in-one/pull/7006#issuecomment-4003238239
exclude http.matchers.remote_host

View File

@@ -338,7 +338,7 @@ else
fi
# Log level logics
if [ -n "$AIO_LOG_LEVEL" ] && ! grep -q "^debug$\|^info$\|^warn$\|^error$"; then
if [ -n "$AIO_LOG_LEVEL" ] && ! echo "$AIO_LOG_LEVEL" | grep -q "^debug$\|^info$\|^warn$\|^error$"; then
print_red "AIO_LOG_LEVEL must be one of 'debug', 'info', 'warn' or 'error'.
It is set to '$AIO_LOG_LEVEL'".
exit 1
@@ -347,13 +347,11 @@ if [ -z "$AIO_LOG_LEVEL" ]; then
export AIO_LOG_LEVEL="warn"
fi
CADDY_LOG_LEVEL="$(echo "$AIO_LOG_LEVEL" | tr '[:lower:]' '[:upper:]')"
if [ "$AIO_LOG_LEVEL" = 'debug' ]; then
export SUPERVISORD_STDOUT=/dev/stdout
else
export SUPERVISORD_STDOUT=NONE
fi
export CADDY_LOG_LEVEL
# Check if ghcr.io is reachable
# Solves issues like https://github.com/nextcloud/all-in-one/discussions/5268

View File

@@ -8,7 +8,7 @@ ENV SOURCE_LOCATION=/usr/src/nextcloud
ENV REDIS_DB_INDEX=0
# AIO settings start # Do not remove or change this line!
ENV NEXTCLOUD_VERSION=33.0.2
ENV NEXTCLOUD_VERSION=33.0.3
ENV AIO_TOKEN=123456
ENV AIO_URL=localhost
# AIO settings end # Do not remove or change this line!

View File

@@ -671,6 +671,7 @@ fi
# Adjusting log files to be stored on a volume
echo "Adjusting log files..."
php /var/www/html/occ config:system:set upgrade.cli-upgrade-link --value="https://github.com/nextcloud/all-in-one/discussions/2726"
php /var/www/html/occ config:system:set loglevel --value="$NEXTCLOUD_LOG_LEVEL" --type=integer
if [ "$NEXTCLOUD_LOG_TYPE" = "errorlog" ]; then
php /var/www/html/occ config:system:set log_type --value="errorlog"
php /var/www/html/occ config:system:set log_type_audit --value="errorlog"
@@ -895,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

View File

@@ -14,6 +14,7 @@ RUN set -ex; \
bash \
openssl \
shadow \
netcat-openbsd \
grep; \
\
# We need to use the same gid and uid as on old installations

View File

@@ -6,6 +6,9 @@ fi
test -f "/mnt/data/backup-is-running" && exit 0
PGPASSWORD="$POSTGRES_PASSWORD" psql -h 127.0.0.1 -p 11000 -U "oc_$POSTGRES_USER" -d "$POSTGRES_DB" -c "select now()" && exit 0
# If database import is running, do not continue with the health check
if nc -z 127.0.0.1 11000; then
exit 0
fi
PGPASSWORD="$POSTGRES_PASSWORD" psql -h 127.0.0.1 -p 5432 -U "oc_$POSTGRES_USER" -d "$POSTGRES_DB" -c "select now()" || exit 1

View File

@@ -4,8 +4,11 @@ if [ "$AIO_LOG_LEVEL" = 'debug' ]; then
set -x
fi
if [ "$AIO_LOG_LEVEL" = "warn" ]; then
# Redis only supports [debug, verbose, notice, warning, nothing] as log level
if [ "$AIO_LOG_LEVEL" = "warn" ] || [ "$AIO_LOG_LEVEL" = "error" ]; then
REDIS_LOG_LEVEL="warning"
elif [ "$AIO_LOG_LEVEL" = "info" ]; then
REDIS_LOG_LEVEL="notice"
else
REDIS_LOG_LEVEL="$AIO_LOG_LEVEL"
fi

View File

@@ -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:

View File

@@ -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.

View File

@@ -100,7 +100,7 @@ sed -i 's|NC_DOMAIN=|NC_DOMAIN=yourdomain.com # TODO! Needs to be chang
sed -i 's|NEXTCLOUD_PASSWORD=|NEXTCLOUD_PASSWORD= # TODO! This is the password of the initially created Nextcloud admin with username "admin".|' sample.conf
sed -i 's|TIMEZONE=|TIMEZONE=Europe/Berlin # TODO! This is the timezone that your containers will use.|' sample.conf
sed -i 's|COLLABORA_SECCOMP_POLICY=|COLLABORA_SECCOMP_POLICY=--o:security.seccomp=true # Changing the value to false allows to disable the seccomp feature of the Collabora container.|' sample.conf
sed -i 's|AIO_LOG_LEVEL=|AIO_LOG_LEVEL=warning # Allows to adjust the global AIO log level. Valid values are debug, info, warn and error.|' sample.conf
sed -i 's|AIO_LOG_LEVEL=|AIO_LOG_LEVEL=warn # Allows to adjust the global AIO log level. Valid values are debug, info, warn and error.|' sample.conf
sed -i 's|FULLTEXTSEARCH_JAVA_OPTIONS=|FULLTEXTSEARCH_JAVA_OPTIONS="-Xms512M -Xmx512M" # Allows to adjust the fulltextsearch java options.|' sample.conf
sed -i 's|NEXTCLOUD_STARTUP_APPS=|NEXTCLOUD_STARTUP_APPS="deck twofactor_totp tasks calendar contacts notes" # Allows to modify the Nextcloud apps that are installed on starting AIO the first time. You can also disable apps by using a hyphen in front of them. E.g. "-app_api"|' sample.conf
sed -i 's|NEXTCLOUD_ADDITIONAL_APKS=|NEXTCLOUD_ADDITIONAL_APKS=imagemagick # This allows to add additional packages to the Nextcloud container permanently. Default is imagemagick but can be overwritten by modifying this value.|' sample.conf

View File

@@ -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

View File

@@ -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 }}

View File

@@ -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 }}

View File

@@ -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 }}

View File

@@ -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

View File

@@ -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

View File

@@ -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%",
@@ -892,7 +942,6 @@
"environment": [
"HP_SHARED_KEY=%HP_SHARED_KEY%",
"NC_INSTANCE_URL=https://%NC_DOMAIN%",
"HP_LOG_LEVEL=%COLLABORA_LOG_LEVEL%",
"HP_FRP_DISABLE_TLS=true",
"TZ=%TIMEZONE%"
],

View File

@@ -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);
}

View File

@@ -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;

View File

@@ -105,7 +105,6 @@ $app->post('/api/docker/restore', AIO\Controller\DockerController::class . ':Sta
$app->post('/api/docker/stop', AIO\Controller\DockerController::class . ':StopContainer');
$app->post('/api/docker/backup-reset-location', AIO\Controller\DockerController::class . ':DeleteBorgBackupConfig');
$app->post('/api/docker/prune', AIO\Controller\DockerController::class . ':SystemPrune');
$app->post('/api/docker/pull-images', AIO\Controller\DockerController::class . ':PullImages');
$app->get('/api/docker/logs', AIO\Controller\DockerController::class . ':GetLogs');
$app->post('/api/auth/login', AIO\Controller\LoginController::class . ':TryLogin');
$app->get('/api/auth/getlogin', AIO\Controller\LoginController::class . ':GetTryLogin');
@@ -153,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,

View File

@@ -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;

View File

@@ -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']);

View File

@@ -45,15 +45,15 @@ readonly class DockerController {
$this->dockerActionManager->ConnectContainerToNetwork($container);
}
private function PerformRecursiveImagePull(string $id, ?\Closure $addToStreamingResponseBody = null) : void {
private function PerformRecursiveImagePull(string $id) : void {
$container = $this->containerDefinitionFetcher->GetContainerById($id);
// Pull all dependencies first and then itself
foreach($container->dependsOn as $dependency) {
$this->PerformRecursiveImagePull($dependency, $addToStreamingResponseBody);
$this->PerformRecursiveImagePull($dependency);
}
$this->dockerActionManager->PullImage($container, true, $addToStreamingResponseBody);
$this->dockerActionManager->PullImage($container, true);
}
public function PullAllContainerImages(): void {
@@ -63,19 +63,6 @@ readonly class DockerController {
$this->PerformRecursiveImagePull($id);
}
public function PullImages(Request $request, Response $response, array $args) : Response {
// Get streaming response start and closure
$nonbufResp = $this->startStreamingResponse($response);
$addToStreamingResponseBody = $this->getAddToStreamingResponseBody($nonbufResp);
$id = self::TOP_CONTAINER;
$this->PerformRecursiveImagePull($id, $addToStreamingResponseBody);
// End streaming response
$this->finalizeStreamingResponse($nonbufResp);
return $nonbufResp;
}
public function GetLogs(Request $request, Response $response, array $args) : Response
{
$requestParams = $request->getQueryParams();

View File

@@ -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' : '',

View File

@@ -291,14 +291,6 @@
{% if has_update_available == true %}
{% if is_mastercontainer_update_available == false %}
<p>⚠️ Container updates are available. Click on <strong>Stop containers</strong> and <strong>Start and update containers</strong> to update them. You should consider creating a backup first.</p>
{% if isAnyRunning == true and isApacheStarting != true %}
<p>Alternatively, you can already pull the new images now while the containers are still running. Depending on your internet connection and image sizes, this can take a few minutes. The new images will automatically be used whenever the containers are recreated either manually via <strong>Stop containers</strong> + <strong>Start and update containers</strong>, or automatically via AIO's daily backup/update schedule.</p>
<form method="POST" action="api/docker/pull-images" target="overlay-log">
<input type="hidden" name="{{csrf.keys.name}}" value="{{csrf.name}}">
<input type="hidden" name="{{csrf.keys.value}}" value="{{csrf.value}}">
<input type="submit" value="Pull new images" />
</form>
{% endif %}
{% endif %}
{% else %}
{% if is_mastercontainer_update_available == false %}

View File

@@ -1 +1 @@
13.0.0
13.0.1

View File

@@ -81,6 +81,37 @@
{% endif %}
</label>
<input type="hidden" id="onlyoffice" name="onlyoffice" value="" data-initial-state="{% if is_onlyoffice_enabled == true %}true{% else %}false{% endif %}">
<input
type="radio"
id="office-eurooffice"
name="office_suite_choice"
value="eurooffice"
class="office-radio"
{% if is_eurooffice_enabled == true %}
checked="checked"
{% endif %}
>
<label class="office-card{{ isAnyRunning ? ' office-card-disabled' : '' }}" for="office-eurooffice">
<div class="office-card-header">
<h4>EuroOffice</h4>
<svg class="office-checkmark" width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="12" cy="12" r="10" fill="var(--color-nextcloud-blue)"/>
<path d="M7 12L10.5 15.5L17 9" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</div>
<ul class="office-features">
<li>Good Nextcloud integration</li>
<li>European alternative</li>
<li>Good performance</li>
<li>Good Microsoft compatibility</li>
</ul>
{% if isAnyRunning == false %}
<a href="https://www.eurooffice.org/" target="_blank" class="office-learn-more" data-stop-event-propagation="true">
Learn more
</a>
{% endif %}
</label>
<input type="hidden" id="eurooffice" name="eurooffice" value="" data-initial-state="{% if is_eurooffice_enabled == true %}true{% else %}false{% endif %}">
</div>
{% if isAnyRunning == false %}
<div class="office-none-card">
@@ -90,7 +121,7 @@
name="office_suite_choice"
value=""
class="office-radio"
{% if is_collabora_enabled == false and is_onlyoffice_enabled == false %}
{% if is_collabora_enabled == false and is_onlyoffice_enabled == false and is_eurooffice_enabled == false %}
checked="checked"
{% endif %}
>