diff --git a/.github/ISSUE_TEMPLATE/Bug_report.md b/.github/ISSUE_TEMPLATE/Bug_report.md
index 5d6cc059..aca2e718 100644
--- a/.github/ISSUE_TEMPLATE/Bug_report.md
+++ b/.github/ISSUE_TEMPLATE/Bug_report.md
@@ -37,5 +37,3 @@ labels: 0. Needs triage
#### Output of `sudo docker ps -a`
#### Other valuable info
-
-#### A picture of a cute animal
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
index f79c4ce2..7fe1067e 100644
--- a/.github/dependabot.yml
+++ b/.github/dependabot.yml
@@ -10,6 +10,8 @@ updates:
labels:
- 3. to review
- dependencies
+ cooldown:
+ default-days: 7
- package-ecosystem: composer
directory: "/php/"
schedule:
diff --git a/Containers/apache/Dockerfile b/Containers/apache/Dockerfile
index 0948fb25..9ccadfb8 100644
--- a/Containers/apache/Dockerfile
+++ b/Containers/apache/Dockerfile
@@ -88,4 +88,5 @@ CMD ["/usr/bin/supervisord", "-c", "/supervisord.conf"]
HEALTHCHECK CMD /healthcheck.sh
LABEL com.centurylinklabs.watchtower.enable="false" \
+ wud.watch="false" \
org.label-schema.vendor="Nextcloud"
diff --git a/Containers/borgbackup/Dockerfile b/Containers/borgbackup/Dockerfile
index 637d035c..97d6198b 100644
--- a/Containers/borgbackup/Dockerfile
+++ b/Containers/borgbackup/Dockerfile
@@ -24,5 +24,6 @@ ENTRYPOINT ["/start.sh"]
USER root
LABEL com.centurylinklabs.watchtower.enable="false" \
+ wud.watch="false" \
org.label-schema.vendor="Nextcloud"
ENV BORG_RETENTION_POLICY="--keep-within=7d --keep-weekly=4 --keep-monthly=6"
diff --git a/Containers/clamav/Dockerfile b/Containers/clamav/Dockerfile
index 196b109a..e81fb06e 100644
--- a/Containers/clamav/Dockerfile
+++ b/Containers/clamav/Dockerfile
@@ -33,5 +33,6 @@ VOLUME /var/lib/clamav
ENTRYPOINT ["/start.sh"]
CMD ["/usr/bin/supervisord", "-c", "/supervisord.conf"]
LABEL com.centurylinklabs.watchtower.enable="false" \
+ wud.watch="false" \
org.label-schema.vendor="Nextcloud"
HEALTHCHECK --start-period=60s --retries=9 CMD /healthcheck.sh
diff --git a/Containers/collabora-online/Dockerfile b/Containers/collabora-online/Dockerfile
index 72f79928..ec8b63f0 100644
--- a/Containers/collabora-online/Dockerfile
+++ b/Containers/collabora-online/Dockerfile
@@ -12,4 +12,5 @@ USER 1001
HEALTHCHECK --start-period=60s --retries=9 CMD /healthcheck.sh
LABEL com.centurylinklabs.watchtower.enable="false" \
+ wud.watch="false" \
org.label-schema.vendor="Nextcloud"
diff --git a/Containers/collabora/Dockerfile b/Containers/collabora/Dockerfile
index 50b6cfef..976360cb 100644
--- a/Containers/collabora/Dockerfile
+++ b/Containers/collabora/Dockerfile
@@ -11,4 +11,5 @@ USER 1001
HEALTHCHECK --start-period=60s --retries=9 CMD /healthcheck.sh
LABEL com.centurylinklabs.watchtower.enable="false" \
+ wud.watch="false" \
org.label-schema.vendor="Nextcloud"
diff --git a/Containers/docker-socket-proxy/Dockerfile b/Containers/docker-socket-proxy/Dockerfile
index 796c855a..62590f6f 100644
--- a/Containers/docker-socket-proxy/Dockerfile
+++ b/Containers/docker-socket-proxy/Dockerfile
@@ -19,4 +19,5 @@ COPY --chmod=664 haproxy.cfg /haproxy.cfg
ENTRYPOINT ["/start.sh"]
HEALTHCHECK CMD /healthcheck.sh
LABEL com.centurylinklabs.watchtower.enable="false" \
+ wud.watch="false" \
org.label-schema.vendor="Nextcloud"
diff --git a/Containers/domaincheck/Dockerfile b/Containers/domaincheck/Dockerfile
index 769c24ac..8122f315 100644
--- a/Containers/domaincheck/Dockerfile
+++ b/Containers/domaincheck/Dockerfile
@@ -18,4 +18,5 @@ ENTRYPOINT ["/start.sh"]
HEALTHCHECK CMD nc -z 127.0.0.1 $APACHE_PORT || exit 1
LABEL com.centurylinklabs.watchtower.enable="false" \
+ wud.watch="false" \
org.label-schema.vendor="Nextcloud"
diff --git a/Containers/fulltextsearch/Dockerfile b/Containers/fulltextsearch/Dockerfile
index ed0cafe9..ff1e923f 100644
--- a/Containers/fulltextsearch/Dockerfile
+++ b/Containers/fulltextsearch/Dockerfile
@@ -22,5 +22,6 @@ USER 1000:0
HEALTHCHECK --interval=10s --timeout=5s --start-period=1m --retries=5 CMD /healthcheck.sh
LABEL com.centurylinklabs.watchtower.enable="false" \
+ wud.watch="false" \
org.label-schema.vendor="Nextcloud"
ENV ES_JAVA_OPTS="-Xms512M -Xmx512M"
diff --git a/Containers/imaginary/Dockerfile b/Containers/imaginary/Dockerfile
index 11250a43..650c4c67 100644
--- a/Containers/imaginary/Dockerfile
+++ b/Containers/imaginary/Dockerfile
@@ -1,5 +1,5 @@
# syntax=docker/dockerfile:latest
-FROM golang:1.25.5-alpine3.23 AS go
+FROM golang:1.25.6-alpine3.23 AS go
ENV IMAGINARY_HASH=6a274b488759a896aff02f52afee6e50b5e3a3ee
@@ -43,4 +43,5 @@ ENTRYPOINT ["/start.sh"]
HEALTHCHECK CMD /healthcheck.sh
LABEL com.centurylinklabs.watchtower.enable="false" \
+ wud.watch="false" \
org.label-schema.vendor="Nextcloud"
diff --git a/Containers/mastercontainer/Dockerfile b/Containers/mastercontainer/Dockerfile
index d2019e49..2fea59d1 100644
--- a/Containers/mastercontainer/Dockerfile
+++ b/Containers/mastercontainer/Dockerfile
@@ -1,12 +1,12 @@
# syntax=docker/dockerfile:latest
# Docker CLI is a requirement
-FROM docker:29.1.4-cli AS docker
+FROM docker:29.1.5-cli AS docker
# Caddy is a requirement
FROM caddy:2.10.2-alpine AS caddy
# From https://github.com/docker-library/php/blob/master/8.4/alpine3.23/fpm/Dockerfile
-FROM php:8.4.16-fpm-alpine3.23
+FROM php:8.4.17-fpm-alpine3.23
EXPOSE 80
EXPOSE 8080
@@ -127,6 +127,7 @@ RUN set -ex; \
# hadolint ignore=DL3048
LABEL org.label-schema.vendor="Nextcloud" \
+ wud.watch="false" \
com.docker.compose.project="nextcloud-aio"
# hadolint ignore=DL3002
diff --git a/Containers/nextcloud/Dockerfile b/Containers/nextcloud/Dockerfile
index 6b6be7f8..c6d9bf7e 100644
--- a/Containers/nextcloud/Dockerfile
+++ b/Containers/nextcloud/Dockerfile
@@ -1,5 +1,5 @@
# syntax=docker/dockerfile:latest
-FROM php:8.3.29-fpm-alpine3.23
+FROM php:8.3.30-fpm-alpine3.23
ENV PHP_MEMORY_LIMIT=512M
ENV PHP_UPLOAD_LIMIT=16G
@@ -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=32.0.3
+ENV NEXTCLOUD_VERSION=32.0.5
ENV AIO_TOKEN=123456
ENV AIO_URL=localhost
# AIO settings end # Do not remove or change this line!
@@ -264,4 +264,5 @@ CMD ["/usr/bin/supervisord", "-c", "/supervisord.conf"]
HEALTHCHECK CMD /healthcheck.sh
LABEL com.centurylinklabs.watchtower.enable="false" \
+ wud.watch="false" \
org.label-schema.vendor="Nextcloud"
diff --git a/Containers/nextcloud/config/postgres.config.php b/Containers/nextcloud/config/postgres.config.php
index 71a657a7..0dc835cc 100644
--- a/Containers/nextcloud/config/postgres.config.php
+++ b/Containers/nextcloud/config/postgres.config.php
@@ -10,7 +10,7 @@ if (getenv('NEXTCLOUD_TRUSTED_CERTIFICATES_POSTGRES')) {
if (getenv('NEXTCLOUD_TRUSTED_CERTIFICATES_MYSQL')) {
$CONFIG = array(
'dbdriveroptions' => array(
- 'PDO::MYSQL_ATTR_SSL_CA' => '/var/www/html/data/certificates/ca-bundle.crt',
+ PDO::MYSQL_ATTR_SSL_CA => '/var/www/html/data/certificates/ca-bundle.crt',
),
);
}
diff --git a/Containers/nextcloud/entrypoint.sh b/Containers/nextcloud/entrypoint.sh
index 43432e6d..5f47a0f4 100644
--- a/Containers/nextcloud/entrypoint.sh
+++ b/Containers/nextcloud/entrypoint.sh
@@ -894,7 +894,9 @@ if [ -d "/var/www/html/custom_apps/spreed" ]; then
RECORDING_SERVERS_STRING="{\"servers\":[{\"server\":\"http://$TALK_RECORDING_HOST:1234/\",\"verify\":true}],\"secret\":\"$RECORDING_SECRET\"}"
php /var/www/html/occ config:app:set spreed recording_servers --value="$RECORDING_SERVERS_STRING"
else
- php /var/www/html/occ config:app:delete spreed recording_servers
+ if [ "$REMOVE_DISABLED_APPS" = yes ]; then
+ php /var/www/html/occ config:app:delete spreed recording_servers
+ fi
fi
fi
diff --git a/Containers/notify-push/Dockerfile b/Containers/notify-push/Dockerfile
index 029c93f2..425115c4 100644
--- a/Containers/notify-push/Dockerfile
+++ b/Containers/notify-push/Dockerfile
@@ -23,4 +23,5 @@ ENTRYPOINT ["/start.sh"]
HEALTHCHECK CMD /healthcheck.sh
LABEL com.centurylinklabs.watchtower.enable="false" \
+ wud.watch="false" \
org.label-schema.vendor="Nextcloud"
diff --git a/Containers/onlyoffice/Dockerfile b/Containers/onlyoffice/Dockerfile
index d028ccbc..13b4d456 100644
--- a/Containers/onlyoffice/Dockerfile
+++ b/Containers/onlyoffice/Dockerfile
@@ -8,4 +8,5 @@ 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.label-schema.vendor="Nextcloud"
diff --git a/Containers/postgresql/Dockerfile b/Containers/postgresql/Dockerfile
index 725b8042..56090f26 100644
--- a/Containers/postgresql/Dockerfile
+++ b/Containers/postgresql/Dockerfile
@@ -44,4 +44,5 @@ ENTRYPOINT ["/start.sh"]
HEALTHCHECK CMD /healthcheck.sh
LABEL com.centurylinklabs.watchtower.enable="false" \
+ wud.watch="false" \
org.label-schema.vendor="Nextcloud"
diff --git a/Containers/redis/Dockerfile b/Containers/redis/Dockerfile
index 7cc1ff84..cc9181ad 100644
--- a/Containers/redis/Dockerfile
+++ b/Containers/redis/Dockerfile
@@ -21,4 +21,5 @@ ENTRYPOINT ["/start.sh"]
HEALTHCHECK CMD /healthcheck.sh
LABEL com.centurylinklabs.watchtower.enable="false" \
+ wud.watch="false" \
org.label-schema.vendor="Nextcloud"
diff --git a/Containers/talk-recording/Dockerfile b/Containers/talk-recording/Dockerfile
index 65af7db4..8df5b89e 100644
--- a/Containers/talk-recording/Dockerfile
+++ b/Containers/talk-recording/Dockerfile
@@ -58,4 +58,5 @@ CMD ["python", "-m", "nextcloud.talk.recording", "--config", "/conf/recording.co
HEALTHCHECK CMD /healthcheck.sh
LABEL com.centurylinklabs.watchtower.enable="false" \
+ wud.watch="false" \
org.label-schema.vendor="Nextcloud"
diff --git a/Containers/talk/Dockerfile b/Containers/talk/Dockerfile
index fc5f0379..fb78f943 100644
--- a/Containers/talk/Dockerfile
+++ b/Containers/talk/Dockerfile
@@ -107,4 +107,5 @@ CMD ["supervisord", "-c", "/supervisord.conf"]
HEALTHCHECK CMD /healthcheck.sh
LABEL com.centurylinklabs.watchtower.enable="false" \
+ wud.watch="false" \
org.label-schema.vendor="Nextcloud"
diff --git a/Containers/watchtower/Dockerfile b/Containers/watchtower/Dockerfile
index cd5238ac..83bccc07 100644
--- a/Containers/watchtower/Dockerfile
+++ b/Containers/watchtower/Dockerfile
@@ -1,13 +1,13 @@
# syntax=docker/dockerfile:latest
-FROM golang:1.25.5-alpine3.23 AS go
+FROM golang:1.25.6-alpine3.23 AS go
-ENV WATCHTOWER_COMMIT_HASH=f6a7b29c312bec5f389a4fb52259919f0678800b
+ENV WATCHTOWER_COMMIT_HASH=f522ce27e1fbe4618da54833025a95be62aa838a
RUN set -ex; \
apk upgrade --no-cache -a; \
apk add --no-cache \
build-base; \
- go install github.com/nicholas-fedor/watchtower@$WATCHTOWER_COMMIT_HASH # v1.13.1
+ go install github.com/nicholas-fedor/watchtower@$WATCHTOWER_COMMIT_HASH # v1.14.0
FROM alpine:3.23.2
@@ -24,4 +24,5 @@ USER root
ENTRYPOINT ["/start.sh"]
LABEL com.centurylinklabs.watchtower.enable="false" \
+ wud.watch="false" \
org.label-schema.vendor="Nextcloud"
diff --git a/Containers/whiteboard/Dockerfile b/Containers/whiteboard/Dockerfile
index 37ba25e0..3a3c5542 100644
--- a/Containers/whiteboard/Dockerfile
+++ b/Containers/whiteboard/Dockerfile
@@ -1,6 +1,6 @@
# syntax=docker/dockerfile:latest
# Probably from this file: https://github.com/nextcloud/whiteboard/blob/main/Dockerfile
-FROM ghcr.io/nextcloud-releases/whiteboard:v1.5.1
+FROM ghcr.io/nextcloud-releases/whiteboard:v1.5.3
USER root
RUN set -ex; \
@@ -23,4 +23,5 @@ WORKDIR /tmp
ENTRYPOINT ["/start.sh"]
LABEL com.centurylinklabs.watchtower.enable="false" \
+ wud.watch="false" \
org.label-schema.vendor="Nextcloud"
diff --git a/local-instance.md b/local-instance.md
index 1da26280..8abbddb6 100644
--- a/local-instance.md
+++ b/local-instance.md
@@ -22,10 +22,11 @@ The normal way is the following:
**Hint:** You may have a look at [this video](https://youtu.be/zk-y2wVkY4c) for a more complete but possibly outdated example.
## 3. Use the ACME DNS-challenge
-You can alternatively use the ACME DNS-challenge to get a valid certificate for Nextcloud. Here is described how to set it up: https://github.com/nextcloud/all-in-one#how-to-get-nextcloud-running-using-the-acme-dns-challenge
+You can alternatively use the ACME DNS-challenge to get a valid certificate for Nextcloud. Here is described how to set it up using an external caddy reverse proxy: https://github.com/nextcloud/all-in-one#how-to-get-nextcloud-running-using-the-acme-dns-challenge
## 4. Use Cloudflare
If you do not have any control over the network, you may think about using Cloudflare Tunnel to get a valid certificate for your Nextcloud. However it will be opened to the public internet then. See https://github.com/nextcloud/all-in-one#how-to-run-nextcloud-behind-a-cloudflare-tunnel how to set this up.
## 5. Buy a certificate and use that
If none of the above ways work for you, you may simply buy a certificate from an issuer for your domain. You then download the certificate onto your server, configure AIO in [reverse proxy mode](./reverse-proxy.md) and use the certificate for your domain in your reverse proxy config.
+
diff --git a/nextcloud-aio-helm-chart/Chart.yaml b/nextcloud-aio-helm-chart/Chart.yaml
index 7d990549..6288a381 100755
--- a/nextcloud-aio-helm-chart/Chart.yaml
+++ b/nextcloud-aio-helm-chart/Chart.yaml
@@ -1,6 +1,6 @@
name: nextcloud-aio-helm-chart
description: A generated Helm Chart for Nextcloud AIO from Skippbox Kompose
-version: 12.4.0
+version: 12.5.0
apiVersion: v2
keywords:
- latest
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 6cdf8db8..e540791c 100755
--- a/nextcloud-aio-helm-chart/templates/nextcloud-aio-apache-deployment.yaml
+++ b/nextcloud-aio-helm-chart/templates/nextcloud-aio-apache-deployment.yaml
@@ -2,7 +2,7 @@ apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
- kompose.version: 1.37.0 (fb0539e64)
+ kompose.version: 1.38.0 (a8f5d1cbd)
labels:
io.kompose.service: nextcloud-aio-apache
name: nextcloud-aio-apache
@@ -17,7 +17,7 @@ spec:
template:
metadata:
annotations:
- kompose.version: 1.37.0 (fb0539e64)
+ kompose.version: 1.38.0 (a8f5d1cbd)
labels:
io.kompose.service: nextcloud-aio-apache
spec:
@@ -61,7 +61,7 @@ spec:
value: "{{ .Values.TIMEZONE }}"
- name: WHITEBOARD_HOST
value: nextcloud-aio-whiteboard
- image: ghcr.io/nextcloud-releases/aio-apache:20260114_114729
+ image: ghcr.io/nextcloud-releases/aio-apache:20260122_105751
readinessProbe:
exec:
command:
diff --git a/nextcloud-aio-helm-chart/templates/nextcloud-aio-apache-service.yaml b/nextcloud-aio-helm-chart/templates/nextcloud-aio-apache-service.yaml
index 404ee626..98e33a4d 100755
--- a/nextcloud-aio-helm-chart/templates/nextcloud-aio-apache-service.yaml
+++ b/nextcloud-aio-helm-chart/templates/nextcloud-aio-apache-service.yaml
@@ -2,7 +2,7 @@ apiVersion: v1
kind: Service
metadata:
annotations:
- kompose.version: 1.37.0 (fb0539e64)
+ kompose.version: 1.38.0 (a8f5d1cbd)
labels:
io.kompose.service: nextcloud-aio-apache
name: nextcloud-aio-apache
diff --git a/nextcloud-aio-helm-chart/templates/nextcloud-aio-clamav-deployment.yaml b/nextcloud-aio-helm-chart/templates/nextcloud-aio-clamav-deployment.yaml
index d7627802..57ec7739 100755
--- a/nextcloud-aio-helm-chart/templates/nextcloud-aio-clamav-deployment.yaml
+++ b/nextcloud-aio-helm-chart/templates/nextcloud-aio-clamav-deployment.yaml
@@ -3,7 +3,7 @@ apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
- kompose.version: 1.37.0 (fb0539e64)
+ kompose.version: 1.38.0 (a8f5d1cbd)
labels:
io.kompose.service: nextcloud-aio-clamav
name: nextcloud-aio-clamav
@@ -18,7 +18,7 @@ spec:
template:
metadata:
annotations:
- kompose.version: 1.37.0 (fb0539e64)
+ kompose.version: 1.38.0 (a8f5d1cbd)
labels:
io.kompose.service: nextcloud-aio-clamav
spec:
@@ -36,7 +36,7 @@ spec:
{{- end }}
initContainers:
- name: init-subpath
- image: ghcr.io/nextcloud-releases/aio-alpine:20260114_114729
+ image: ghcr.io/nextcloud-releases/aio-alpine:20260122_105751
command:
- mkdir
- "-p"
@@ -59,7 +59,7 @@ spec:
value: "{{ .Values.NEXTCLOUD_UPLOAD_LIMIT }}"
- name: TZ
value: "{{ .Values.TIMEZONE }}"
- image: ghcr.io/nextcloud-releases/aio-clamav:20260114_114729
+ image: ghcr.io/nextcloud-releases/aio-clamav:20260122_105751
readinessProbe:
exec:
command:
diff --git a/nextcloud-aio-helm-chart/templates/nextcloud-aio-clamav-service.yaml b/nextcloud-aio-helm-chart/templates/nextcloud-aio-clamav-service.yaml
index 8dc8597d..8b236093 100755
--- a/nextcloud-aio-helm-chart/templates/nextcloud-aio-clamav-service.yaml
+++ b/nextcloud-aio-helm-chart/templates/nextcloud-aio-clamav-service.yaml
@@ -3,7 +3,7 @@ apiVersion: v1
kind: Service
metadata:
annotations:
- kompose.version: 1.37.0 (fb0539e64)
+ kompose.version: 1.38.0 (a8f5d1cbd)
labels:
io.kompose.service: nextcloud-aio-clamav
name: nextcloud-aio-clamav
diff --git a/nextcloud-aio-helm-chart/templates/nextcloud-aio-collabora-deployment.yaml b/nextcloud-aio-helm-chart/templates/nextcloud-aio-collabora-deployment.yaml
index 7e86c402..cd4e1368 100755
--- a/nextcloud-aio-helm-chart/templates/nextcloud-aio-collabora-deployment.yaml
+++ b/nextcloud-aio-helm-chart/templates/nextcloud-aio-collabora-deployment.yaml
@@ -3,7 +3,7 @@ apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
- kompose.version: 1.37.0 (fb0539e64)
+ kompose.version: 1.38.0 (a8f5d1cbd)
labels:
io.kompose.service: nextcloud-aio-collabora
name: nextcloud-aio-collabora
@@ -16,7 +16,7 @@ spec:
template:
metadata:
annotations:
- kompose.version: 1.37.0 (fb0539e64)
+ kompose.version: 1.38.0 (a8f5d1cbd)
labels:
io.kompose.service: nextcloud-aio-collabora
spec:
@@ -36,9 +36,9 @@ spec:
- name: server_name
value: "{{ .Values.NC_DOMAIN }}"
{{- if contains "--o:support_key=" (join " " (.Values.ADDITIONAL_COLLABORA_OPTIONS | default list)) }}
- image: ghcr.io/nextcloud-releases/aio-collabora-online:20260114_114729
+ image: ghcr.io/nextcloud-releases/aio-collabora-online:20260122_105751
{{- else }}
- image: ghcr.io/nextcloud-releases/aio-collabora:20260114_114729
+ image: ghcr.io/nextcloud-releases/aio-collabora:20260122_105751
{{- end }}
readinessProbe:
exec:
diff --git a/nextcloud-aio-helm-chart/templates/nextcloud-aio-collabora-service.yaml b/nextcloud-aio-helm-chart/templates/nextcloud-aio-collabora-service.yaml
index ebe7bf3f..5c81ef3e 100755
--- a/nextcloud-aio-helm-chart/templates/nextcloud-aio-collabora-service.yaml
+++ b/nextcloud-aio-helm-chart/templates/nextcloud-aio-collabora-service.yaml
@@ -3,7 +3,7 @@ apiVersion: v1
kind: Service
metadata:
annotations:
- kompose.version: 1.37.0 (fb0539e64)
+ kompose.version: 1.38.0 (a8f5d1cbd)
labels:
io.kompose.service: nextcloud-aio-collabora
name: nextcloud-aio-collabora
diff --git a/nextcloud-aio-helm-chart/templates/nextcloud-aio-database-deployment.yaml b/nextcloud-aio-helm-chart/templates/nextcloud-aio-database-deployment.yaml
index 055ecd0a..be6a9c90 100755
--- a/nextcloud-aio-helm-chart/templates/nextcloud-aio-database-deployment.yaml
+++ b/nextcloud-aio-helm-chart/templates/nextcloud-aio-database-deployment.yaml
@@ -2,7 +2,7 @@ apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
- kompose.version: 1.37.0 (fb0539e64)
+ kompose.version: 1.38.0 (a8f5d1cbd)
labels:
io.kompose.service: nextcloud-aio-database
name: nextcloud-aio-database
@@ -17,7 +17,7 @@ spec:
template:
metadata:
annotations:
- kompose.version: 1.37.0 (fb0539e64)
+ kompose.version: 1.38.0 (a8f5d1cbd)
labels:
io.kompose.service: nextcloud-aio-database
spec:
@@ -35,7 +35,7 @@ spec:
{{- end }}
initContainers:
- name: init-subpath
- image: ghcr.io/nextcloud-releases/aio-alpine:20260114_114729
+ image: ghcr.io/nextcloud-releases/aio-alpine:20260122_105751
command:
- mkdir
- "-p"
@@ -64,7 +64,7 @@ spec:
value: nextcloud
- name: TZ
value: "{{ .Values.TIMEZONE }}"
- image: ghcr.io/nextcloud-releases/aio-postgresql:20260114_114729
+ image: ghcr.io/nextcloud-releases/aio-postgresql:20260122_105751
readinessProbe:
exec:
command:
diff --git a/nextcloud-aio-helm-chart/templates/nextcloud-aio-database-service.yaml b/nextcloud-aio-helm-chart/templates/nextcloud-aio-database-service.yaml
index 9451d908..45fdce3a 100755
--- a/nextcloud-aio-helm-chart/templates/nextcloud-aio-database-service.yaml
+++ b/nextcloud-aio-helm-chart/templates/nextcloud-aio-database-service.yaml
@@ -2,7 +2,7 @@ apiVersion: v1
kind: Service
metadata:
annotations:
- kompose.version: 1.37.0 (fb0539e64)
+ kompose.version: 1.38.0 (a8f5d1cbd)
labels:
io.kompose.service: nextcloud-aio-database
name: nextcloud-aio-database
diff --git a/nextcloud-aio-helm-chart/templates/nextcloud-aio-fulltextsearch-deployment.yaml b/nextcloud-aio-helm-chart/templates/nextcloud-aio-fulltextsearch-deployment.yaml
index df30e6a8..bed60a0c 100755
--- a/nextcloud-aio-helm-chart/templates/nextcloud-aio-fulltextsearch-deployment.yaml
+++ b/nextcloud-aio-helm-chart/templates/nextcloud-aio-fulltextsearch-deployment.yaml
@@ -3,7 +3,7 @@ apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
- kompose.version: 1.37.0 (fb0539e64)
+ kompose.version: 1.38.0 (a8f5d1cbd)
labels:
io.kompose.service: nextcloud-aio-fulltextsearch
name: nextcloud-aio-fulltextsearch
@@ -18,13 +18,13 @@ spec:
template:
metadata:
annotations:
- kompose.version: 1.37.0 (fb0539e64)
+ kompose.version: 1.38.0 (a8f5d1cbd)
labels:
io.kompose.service: nextcloud-aio-fulltextsearch
spec:
initContainers:
- name: init-volumes
- image: ghcr.io/nextcloud-releases/aio-alpine:20260114_114729
+ image: ghcr.io/nextcloud-releases/aio-alpine:20260122_105751
command:
- chmod
- "777"
@@ -54,7 +54,7 @@ spec:
value: basic
- name: xpack.security.enabled
value: "false"
- image: ghcr.io/nextcloud-releases/aio-fulltextsearch:20260114_114729
+ image: ghcr.io/nextcloud-releases/aio-fulltextsearch:20260122_105751
readinessProbe:
exec:
command:
diff --git a/nextcloud-aio-helm-chart/templates/nextcloud-aio-fulltextsearch-service.yaml b/nextcloud-aio-helm-chart/templates/nextcloud-aio-fulltextsearch-service.yaml
index ae759475..efe474b3 100755
--- a/nextcloud-aio-helm-chart/templates/nextcloud-aio-fulltextsearch-service.yaml
+++ b/nextcloud-aio-helm-chart/templates/nextcloud-aio-fulltextsearch-service.yaml
@@ -3,7 +3,7 @@ apiVersion: v1
kind: Service
metadata:
annotations:
- kompose.version: 1.37.0 (fb0539e64)
+ kompose.version: 1.38.0 (a8f5d1cbd)
labels:
io.kompose.service: nextcloud-aio-fulltextsearch
name: nextcloud-aio-fulltextsearch
diff --git a/nextcloud-aio-helm-chart/templates/nextcloud-aio-imaginary-deployment.yaml b/nextcloud-aio-helm-chart/templates/nextcloud-aio-imaginary-deployment.yaml
index d2fc1375..af15d4b3 100755
--- a/nextcloud-aio-helm-chart/templates/nextcloud-aio-imaginary-deployment.yaml
+++ b/nextcloud-aio-helm-chart/templates/nextcloud-aio-imaginary-deployment.yaml
@@ -3,7 +3,7 @@ apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
- kompose.version: 1.37.0 (fb0539e64)
+ kompose.version: 1.38.0 (a8f5d1cbd)
labels:
io.kompose.service: nextcloud-aio-imaginary
name: nextcloud-aio-imaginary
@@ -16,7 +16,7 @@ spec:
template:
metadata:
annotations:
- kompose.version: 1.37.0 (fb0539e64)
+ kompose.version: 1.38.0 (a8f5d1cbd)
labels:
io.kompose.service: nextcloud-aio-imaginary
spec:
@@ -38,7 +38,7 @@ spec:
value: "{{ .Values.IMAGINARY_SECRET }}"
- name: TZ
value: "{{ .Values.TIMEZONE }}"
- image: ghcr.io/nextcloud-releases/aio-imaginary:20260114_114729
+ image: ghcr.io/nextcloud-releases/aio-imaginary:20260122_105751
readinessProbe:
exec:
command:
diff --git a/nextcloud-aio-helm-chart/templates/nextcloud-aio-imaginary-service.yaml b/nextcloud-aio-helm-chart/templates/nextcloud-aio-imaginary-service.yaml
index a5fb3266..44a57006 100755
--- a/nextcloud-aio-helm-chart/templates/nextcloud-aio-imaginary-service.yaml
+++ b/nextcloud-aio-helm-chart/templates/nextcloud-aio-imaginary-service.yaml
@@ -3,7 +3,7 @@ apiVersion: v1
kind: Service
metadata:
annotations:
- kompose.version: 1.37.0 (fb0539e64)
+ kompose.version: 1.38.0 (a8f5d1cbd)
labels:
io.kompose.service: nextcloud-aio-imaginary
name: nextcloud-aio-imaginary
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 fe72d307..8b6e8211 100755
--- a/nextcloud-aio-helm-chart/templates/nextcloud-aio-nextcloud-deployment.yaml
+++ b/nextcloud-aio-helm-chart/templates/nextcloud-aio-nextcloud-deployment.yaml
@@ -2,7 +2,7 @@ apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
- kompose.version: 1.37.0 (fb0539e64)
+ kompose.version: 1.38.0 (a8f5d1cbd)
labels:
io.kompose.service: nextcloud-aio-nextcloud
name: nextcloud-aio-nextcloud
@@ -17,7 +17,7 @@ spec:
template:
metadata:
annotations:
- kompose.version: 1.37.0 (fb0539e64)
+ kompose.version: 1.38.0 (a8f5d1cbd)
labels:
io.kompose.service: nextcloud-aio-nextcloud
spec:
@@ -38,7 +38,7 @@ spec:
# AIO settings start # Do not remove or change this line!
initContainers:
- name: init-volumes
- image: ghcr.io/nextcloud-releases/aio-alpine:20260114_114729
+ image: ghcr.io/nextcloud-releases/aio-alpine:20260122_105751
command:
- chmod
- "777"
@@ -190,7 +190,7 @@ spec:
value: "{{ .Values.WHITEBOARD_ENABLED }}"
- name: WHITEBOARD_SECRET
value: "{{ .Values.WHITEBOARD_SECRET }}"
- image: ghcr.io/nextcloud-releases/aio-nextcloud:20260114_114729
+ image: ghcr.io/nextcloud-releases/aio-nextcloud:20260122_105751
{{- if eq (.Values.RPSS_ENABLED | default "no") "yes" }} # AIO-config - do not change this comment!
securityContext:
# The items below only work in container context
diff --git a/nextcloud-aio-helm-chart/templates/nextcloud-aio-nextcloud-service.yaml b/nextcloud-aio-helm-chart/templates/nextcloud-aio-nextcloud-service.yaml
index 18cf84d8..08ab70f2 100755
--- a/nextcloud-aio-helm-chart/templates/nextcloud-aio-nextcloud-service.yaml
+++ b/nextcloud-aio-helm-chart/templates/nextcloud-aio-nextcloud-service.yaml
@@ -2,7 +2,7 @@ apiVersion: v1
kind: Service
metadata:
annotations:
- kompose.version: 1.37.0 (fb0539e64)
+ kompose.version: 1.38.0 (a8f5d1cbd)
labels:
io.kompose.service: nextcloud-aio-nextcloud
name: nextcloud-aio-nextcloud
diff --git a/nextcloud-aio-helm-chart/templates/nextcloud-aio-notify-push-deployment.yaml b/nextcloud-aio-helm-chart/templates/nextcloud-aio-notify-push-deployment.yaml
index 5b05336e..c8e30d05 100755
--- a/nextcloud-aio-helm-chart/templates/nextcloud-aio-notify-push-deployment.yaml
+++ b/nextcloud-aio-helm-chart/templates/nextcloud-aio-notify-push-deployment.yaml
@@ -2,7 +2,7 @@ apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
- kompose.version: 1.37.0 (fb0539e64)
+ kompose.version: 1.38.0 (a8f5d1cbd)
labels:
io.kompose.service: nextcloud-aio-notify-push
name: nextcloud-aio-notify-push
@@ -17,7 +17,7 @@ spec:
template:
metadata:
annotations:
- kompose.version: 1.37.0 (fb0539e64)
+ kompose.version: 1.38.0 (a8f5d1cbd)
labels:
io.kompose.service: nextcloud-aio-notify-push
spec:
@@ -57,7 +57,7 @@ spec:
value: "6379"
- name: TZ
value: "{{ .Values.TIMEZONE }}"
- image: ghcr.io/nextcloud-releases/aio-notify-push:20260114_114729
+ image: ghcr.io/nextcloud-releases/aio-notify-push:20260122_105751
readinessProbe:
exec:
command:
diff --git a/nextcloud-aio-helm-chart/templates/nextcloud-aio-notify-push-service.yaml b/nextcloud-aio-helm-chart/templates/nextcloud-aio-notify-push-service.yaml
index 2b7bfccd..986d98d4 100755
--- a/nextcloud-aio-helm-chart/templates/nextcloud-aio-notify-push-service.yaml
+++ b/nextcloud-aio-helm-chart/templates/nextcloud-aio-notify-push-service.yaml
@@ -2,7 +2,7 @@ apiVersion: v1
kind: Service
metadata:
annotations:
- kompose.version: 1.37.0 (fb0539e64)
+ kompose.version: 1.38.0 (a8f5d1cbd)
labels:
io.kompose.service: nextcloud-aio-notify-push
name: nextcloud-aio-notify-push
diff --git a/nextcloud-aio-helm-chart/templates/nextcloud-aio-onlyoffice-deployment.yaml b/nextcloud-aio-helm-chart/templates/nextcloud-aio-onlyoffice-deployment.yaml
index 0e3a7fda..2bb79f19 100755
--- a/nextcloud-aio-helm-chart/templates/nextcloud-aio-onlyoffice-deployment.yaml
+++ b/nextcloud-aio-helm-chart/templates/nextcloud-aio-onlyoffice-deployment.yaml
@@ -3,7 +3,7 @@ apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
- kompose.version: 1.37.0 (fb0539e64)
+ kompose.version: 1.38.0 (a8f5d1cbd)
labels:
io.kompose.service: nextcloud-aio-onlyoffice
name: nextcloud-aio-onlyoffice
@@ -18,13 +18,13 @@ spec:
template:
metadata:
annotations:
- kompose.version: 1.37.0 (fb0539e64)
+ kompose.version: 1.38.0 (a8f5d1cbd)
labels:
io.kompose.service: nextcloud-aio-onlyoffice
spec:
initContainers:
- name: init-volumes
- image: ghcr.io/nextcloud-releases/aio-alpine:20260114_114729
+ image: ghcr.io/nextcloud-releases/aio-alpine:20260122_105751
command:
- chmod
- "777"
@@ -42,7 +42,7 @@ spec:
value: "{{ .Values.ONLYOFFICE_SECRET }}"
- name: TZ
value: "{{ .Values.TIMEZONE }}"
- image: ghcr.io/nextcloud-releases/aio-onlyoffice:20260114_114729
+ image: ghcr.io/nextcloud-releases/aio-onlyoffice:20260122_105751
readinessProbe:
exec:
command:
diff --git a/nextcloud-aio-helm-chart/templates/nextcloud-aio-onlyoffice-service.yaml b/nextcloud-aio-helm-chart/templates/nextcloud-aio-onlyoffice-service.yaml
index 6ff9afa1..5fc10b85 100755
--- a/nextcloud-aio-helm-chart/templates/nextcloud-aio-onlyoffice-service.yaml
+++ b/nextcloud-aio-helm-chart/templates/nextcloud-aio-onlyoffice-service.yaml
@@ -3,7 +3,7 @@ apiVersion: v1
kind: Service
metadata:
annotations:
- kompose.version: 1.37.0 (fb0539e64)
+ kompose.version: 1.38.0 (a8f5d1cbd)
labels:
io.kompose.service: nextcloud-aio-onlyoffice
name: nextcloud-aio-onlyoffice
diff --git a/nextcloud-aio-helm-chart/templates/nextcloud-aio-redis-deployment.yaml b/nextcloud-aio-helm-chart/templates/nextcloud-aio-redis-deployment.yaml
index 1ccebd79..28335e64 100755
--- a/nextcloud-aio-helm-chart/templates/nextcloud-aio-redis-deployment.yaml
+++ b/nextcloud-aio-helm-chart/templates/nextcloud-aio-redis-deployment.yaml
@@ -2,7 +2,7 @@ apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
- kompose.version: 1.37.0 (fb0539e64)
+ kompose.version: 1.38.0 (a8f5d1cbd)
labels:
io.kompose.service: nextcloud-aio-redis
name: nextcloud-aio-redis
@@ -17,7 +17,7 @@ spec:
template:
metadata:
annotations:
- kompose.version: 1.37.0 (fb0539e64)
+ kompose.version: 1.38.0 (a8f5d1cbd)
labels:
io.kompose.service: nextcloud-aio-redis
spec:
@@ -39,7 +39,7 @@ spec:
value: "{{ .Values.REDIS_PASSWORD }}"
- name: TZ
value: "{{ .Values.TIMEZONE }}"
- image: ghcr.io/nextcloud-releases/aio-redis:20260114_114729
+ image: ghcr.io/nextcloud-releases/aio-redis:20260122_105751
readinessProbe:
exec:
command:
diff --git a/nextcloud-aio-helm-chart/templates/nextcloud-aio-redis-service.yaml b/nextcloud-aio-helm-chart/templates/nextcloud-aio-redis-service.yaml
index af82a0bb..a6a9a0a5 100755
--- a/nextcloud-aio-helm-chart/templates/nextcloud-aio-redis-service.yaml
+++ b/nextcloud-aio-helm-chart/templates/nextcloud-aio-redis-service.yaml
@@ -2,7 +2,7 @@ apiVersion: v1
kind: Service
metadata:
annotations:
- kompose.version: 1.37.0 (fb0539e64)
+ kompose.version: 1.38.0 (a8f5d1cbd)
labels:
io.kompose.service: nextcloud-aio-redis
name: nextcloud-aio-redis
diff --git a/nextcloud-aio-helm-chart/templates/nextcloud-aio-talk-deployment.yaml b/nextcloud-aio-helm-chart/templates/nextcloud-aio-talk-deployment.yaml
index 8635a6ce..679dd66e 100755
--- a/nextcloud-aio-helm-chart/templates/nextcloud-aio-talk-deployment.yaml
+++ b/nextcloud-aio-helm-chart/templates/nextcloud-aio-talk-deployment.yaml
@@ -3,7 +3,7 @@ apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
- kompose.version: 1.37.0 (fb0539e64)
+ kompose.version: 1.38.0 (a8f5d1cbd)
labels:
io.kompose.service: nextcloud-aio-talk
name: nextcloud-aio-talk
@@ -16,7 +16,7 @@ spec:
template:
metadata:
annotations:
- kompose.version: 1.37.0 (fb0539e64)
+ kompose.version: 1.38.0 (a8f5d1cbd)
labels:
io.kompose.service: nextcloud-aio-talk
spec:
@@ -52,7 +52,7 @@ spec:
value: "{{ .Values.TURN_SECRET }}"
- name: TZ
value: "{{ .Values.TIMEZONE }}"
- image: ghcr.io/nextcloud-releases/aio-talk:20260114_114729
+ image: ghcr.io/nextcloud-releases/aio-talk:20260122_105751
readinessProbe:
exec:
command:
diff --git a/nextcloud-aio-helm-chart/templates/nextcloud-aio-talk-recording-deployment.yaml b/nextcloud-aio-helm-chart/templates/nextcloud-aio-talk-recording-deployment.yaml
index 2cfcaa53..8e631656 100755
--- a/nextcloud-aio-helm-chart/templates/nextcloud-aio-talk-recording-deployment.yaml
+++ b/nextcloud-aio-helm-chart/templates/nextcloud-aio-talk-recording-deployment.yaml
@@ -3,7 +3,7 @@ apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
- kompose.version: 1.37.0 (fb0539e64)
+ kompose.version: 1.38.0 (a8f5d1cbd)
labels:
io.kompose.service: nextcloud-aio-talk-recording
name: nextcloud-aio-talk-recording
@@ -18,7 +18,7 @@ spec:
template:
metadata:
annotations:
- kompose.version: 1.37.0 (fb0539e64)
+ kompose.version: 1.38.0 (a8f5d1cbd)
labels:
io.kompose.service: nextcloud-aio-talk-recording
spec:
@@ -44,7 +44,7 @@ spec:
value: "{{ .Values.RECORDING_SECRET }}"
- name: TZ
value: "{{ .Values.TIMEZONE }}"
- image: ghcr.io/nextcloud-releases/aio-talk-recording:20260114_114729
+ image: ghcr.io/nextcloud-releases/aio-talk-recording:20260122_105751
readinessProbe:
exec:
command:
diff --git a/nextcloud-aio-helm-chart/templates/nextcloud-aio-talk-recording-service.yaml b/nextcloud-aio-helm-chart/templates/nextcloud-aio-talk-recording-service.yaml
index 4410ed72..87fe0355 100755
--- a/nextcloud-aio-helm-chart/templates/nextcloud-aio-talk-recording-service.yaml
+++ b/nextcloud-aio-helm-chart/templates/nextcloud-aio-talk-recording-service.yaml
@@ -3,7 +3,7 @@ apiVersion: v1
kind: Service
metadata:
annotations:
- kompose.version: 1.37.0 (fb0539e64)
+ kompose.version: 1.38.0 (a8f5d1cbd)
labels:
io.kompose.service: nextcloud-aio-talk-recording
name: nextcloud-aio-talk-recording
diff --git a/nextcloud-aio-helm-chart/templates/nextcloud-aio-talk-service.yaml b/nextcloud-aio-helm-chart/templates/nextcloud-aio-talk-service.yaml
index 10d17177..65388792 100755
--- a/nextcloud-aio-helm-chart/templates/nextcloud-aio-talk-service.yaml
+++ b/nextcloud-aio-helm-chart/templates/nextcloud-aio-talk-service.yaml
@@ -4,7 +4,7 @@ apiVersion: v1
kind: Service
metadata:
annotations:
- kompose.version: 1.37.0 (fb0539e64)
+ kompose.version: 1.38.0 (a8f5d1cbd)
labels:
io.kompose.service: nextcloud-aio-talk
name: nextcloud-aio-talk-public
@@ -27,7 +27,7 @@ apiVersion: v1
kind: Service
metadata:
annotations:
- kompose.version: 1.37.0 (fb0539e64)
+ kompose.version: 1.38.0 (a8f5d1cbd)
labels:
io.kompose.service: nextcloud-aio-talk
name: nextcloud-aio-talk
diff --git a/nextcloud-aio-helm-chart/templates/nextcloud-aio-whiteboard-deployment.yaml b/nextcloud-aio-helm-chart/templates/nextcloud-aio-whiteboard-deployment.yaml
index 50dfc3c4..5788cfa0 100755
--- a/nextcloud-aio-helm-chart/templates/nextcloud-aio-whiteboard-deployment.yaml
+++ b/nextcloud-aio-helm-chart/templates/nextcloud-aio-whiteboard-deployment.yaml
@@ -3,7 +3,7 @@ apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
- kompose.version: 1.37.0 (fb0539e64)
+ kompose.version: 1.38.0 (a8f5d1cbd)
labels:
io.kompose.service: nextcloud-aio-whiteboard
name: nextcloud-aio-whiteboard
@@ -16,7 +16,7 @@ spec:
template:
metadata:
annotations:
- kompose.version: 1.37.0 (fb0539e64)
+ kompose.version: 1.38.0 (a8f5d1cbd)
labels:
io.kompose.service: nextcloud-aio-whiteboard
spec:
@@ -50,7 +50,7 @@ spec:
value: redis
- name: TZ
value: "{{ .Values.TIMEZONE }}"
- image: ghcr.io/nextcloud-releases/aio-whiteboard:20260114_114729
+ image: ghcr.io/nextcloud-releases/aio-whiteboard:20260122_105751
readinessProbe:
exec:
command:
diff --git a/nextcloud-aio-helm-chart/templates/nextcloud-aio-whiteboard-service.yaml b/nextcloud-aio-helm-chart/templates/nextcloud-aio-whiteboard-service.yaml
index 8c8cb5aa..299f1ec3 100755
--- a/nextcloud-aio-helm-chart/templates/nextcloud-aio-whiteboard-service.yaml
+++ b/nextcloud-aio-helm-chart/templates/nextcloud-aio-whiteboard-service.yaml
@@ -3,7 +3,7 @@ apiVersion: v1
kind: Service
metadata:
annotations:
- kompose.version: 1.37.0 (fb0539e64)
+ kompose.version: 1.38.0 (a8f5d1cbd)
labels:
io.kompose.service: nextcloud-aio-whiteboard
name: nextcloud-aio-whiteboard
diff --git a/nextcloud-aio-helm-chart/update-helm.sh b/nextcloud-aio-helm-chart/update-helm.sh
index f39d3035..9e5aba86 100755
--- a/nextcloud-aio-helm-chart/update-helm.sh
+++ b/nextcloud-aio-helm-chart/update-helm.sh
@@ -407,7 +407,7 @@ rm latest.yml
mv latest.yml.backup latest.yml
# Get version of AIO
-AIO_VERSION="$(grep 'Nextcloud AIO ' ../php/templates/containers.twig | grep -oP '[0-9]+.[0-9]+.[0-9]+')"
+AIO_VERSION="$(grep 'Nextcloud AIO ' ../php/templates/includes/aio-version.twig | grep -oP '[0-9]+.[0-9]+.[0-9]+')"
sed -i "s|^version:.*|version: $AIO_VERSION|" ../helm-chart/Chart.yaml
# Conversion of sample.conf
diff --git a/php/composer.lock b/php/composer.lock
index ce1ae80f..75e53dfe 100644
--- a/php/composer.lock
+++ b/php/composer.lock
@@ -3111,20 +3111,20 @@
},
{
"name": "league/uri",
- "version": "7.7.0",
+ "version": "7.8.0",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/uri.git",
- "reference": "8d587cddee53490f9b82bf203d3a9aa7ea4f9807"
+ "reference": "4436c6ec8d458e4244448b069cc572d088230b76"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/thephpleague/uri/zipball/8d587cddee53490f9b82bf203d3a9aa7ea4f9807",
- "reference": "8d587cddee53490f9b82bf203d3a9aa7ea4f9807",
+ "url": "https://api.github.com/repos/thephpleague/uri/zipball/4436c6ec8d458e4244448b069cc572d088230b76",
+ "reference": "4436c6ec8d458e4244448b069cc572d088230b76",
"shasum": ""
},
"require": {
- "league/uri-interfaces": "^7.7",
+ "league/uri-interfaces": "^7.8",
"php": "^8.1",
"psr/http-factory": "^1"
},
@@ -3138,11 +3138,11 @@
"ext-gmp": "to improve IPV4 host parsing",
"ext-intl": "to handle IDN host with the best performance",
"ext-uri": "to use the PHP native URI class",
- "jeremykendall/php-domain-parser": "to resolve Public Suffix and Top Level Domain",
- "league/uri-components": "Needed to easily manipulate URI objects components",
- "league/uri-polyfill": "Needed to backport the PHP URI extension for older versions of PHP",
+ "jeremykendall/php-domain-parser": "to further parse the URI host and resolve its Public Suffix and Top Level Domain",
+ "league/uri-components": "to provide additional tools to manipulate URI objects components",
+ "league/uri-polyfill": "to backport the PHP URI extension for older versions of PHP",
"php-64bit": "to improve IPV4 host parsing",
- "rowbot/url": "to handle WHATWG URL",
+ "rowbot/url": "to handle URLs using the WHATWG URL Living Standard specification",
"symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present"
},
"type": "library",
@@ -3197,7 +3197,7 @@
"docs": "https://uri.thephpleague.com",
"forum": "https://thephpleague.slack.com",
"issues": "https://github.com/thephpleague/uri-src/issues",
- "source": "https://github.com/thephpleague/uri/tree/7.7.0"
+ "source": "https://github.com/thephpleague/uri/tree/7.8.0"
},
"funding": [
{
@@ -3205,20 +3205,20 @@
"type": "github"
}
],
- "time": "2025-12-07T16:02:06+00:00"
+ "time": "2026-01-14T17:24:56+00:00"
},
{
"name": "league/uri-interfaces",
- "version": "7.7.0",
+ "version": "7.8.0",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/uri-interfaces.git",
- "reference": "62ccc1a0435e1c54e10ee6022df28d6c04c2946c"
+ "reference": "c5c5cd056110fc8afaba29fa6b72a43ced42acd4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/62ccc1a0435e1c54e10ee6022df28d6c04c2946c",
- "reference": "62ccc1a0435e1c54e10ee6022df28d6c04c2946c",
+ "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/c5c5cd056110fc8afaba29fa6b72a43ced42acd4",
+ "reference": "c5c5cd056110fc8afaba29fa6b72a43ced42acd4",
"shasum": ""
},
"require": {
@@ -3231,7 +3231,7 @@
"ext-gmp": "to improve IPV4 host parsing",
"ext-intl": "to handle IDN host with the best performance",
"php-64bit": "to improve IPV4 host parsing",
- "rowbot/url": "to handle WHATWG URL",
+ "rowbot/url": "to handle URLs using the WHATWG URL Living Standard specification",
"symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present"
},
"type": "library",
@@ -3281,7 +3281,7 @@
"docs": "https://uri.thephpleague.com",
"forum": "https://thephpleague.slack.com",
"issues": "https://github.com/thephpleague/uri-src/issues",
- "source": "https://github.com/thephpleague/uri-interfaces/tree/7.7.0"
+ "source": "https://github.com/thephpleague/uri-interfaces/tree/7.8.0"
},
"funding": [
{
@@ -3289,7 +3289,7 @@
"type": "github"
}
],
- "time": "2025-12-07T16:03:21+00:00"
+ "time": "2026-01-15T06:54:53+00:00"
},
{
"name": "netresearch/jsonmapper",
@@ -3455,16 +3455,16 @@
},
{
"name": "phpdocumentor/reflection-docblock",
- "version": "6.0.0",
+ "version": "6.0.1",
"source": {
"type": "git",
"url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
- "reference": "02600c041e7d0f4b7d1fe1d260565ec525472fa9"
+ "reference": "2f5cbed597cb261d1ea458f3da3a9ad32e670b1e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/02600c041e7d0f4b7d1fe1d260565ec525472fa9",
- "reference": "02600c041e7d0f4b7d1fe1d260565ec525472fa9",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/2f5cbed597cb261d1ea458f3da3a9ad32e670b1e",
+ "reference": "2f5cbed597cb261d1ea458f3da3a9ad32e670b1e",
"shasum": ""
},
"require": {
@@ -3514,9 +3514,9 @@
"description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
"support": {
"issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues",
- "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/6.0.0"
+ "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/6.0.1"
},
- "time": "2026-01-07T20:22:53+00:00"
+ "time": "2026-01-20T15:30:42+00:00"
},
{
"name": "phpdocumentor/type-resolver",
diff --git a/php/public/containers-form-submit.js b/php/public/containers-form-submit.js
index b7ffd2d8..abd3fc68 100644
--- a/php/public/containers-form-submit.js
+++ b/php/public/containers-form-submit.js
@@ -12,6 +12,14 @@ document.addEventListener("DOMContentLoaded", function () {
const optionsContainersCheckboxes = document.querySelectorAll("#options-form input[type='checkbox']");
const communityContainersCheckboxes = document.querySelectorAll("#community-form input[type='checkbox']");
+ // Office suite radio buttons
+ const collaboraRadio = document.getElementById('office-collabora');
+ const onlyofficeRadio = document.getElementById('office-onlyoffice');
+ const noneRadio = document.getElementById('office-none');
+ const collaboraHidden = document.getElementById('collabora');
+ const onlyofficeHidden = document.getElementById('onlyoffice');
+ let initialOfficeSelection = null;
+
optionsContainersCheckboxes.forEach(checkbox => {
initialStateOptionsContainers[checkbox.id] = checkbox.checked; // Use checked property to capture actual initial state
});
@@ -20,6 +28,17 @@ document.addEventListener("DOMContentLoaded", function () {
initialStateCommunityContainers[checkbox.id] = checkbox.checked; // Use checked property to capture actual initial state
});
+ // Store initial office suite selection
+ if (collaboraRadio && onlyofficeRadio && noneRadio) {
+ if (collaboraRadio.checked) {
+ initialOfficeSelection = 'collabora';
+ } else if (onlyofficeRadio.checked) {
+ initialOfficeSelection = 'onlyoffice';
+ } else {
+ initialOfficeSelection = 'none';
+ }
+ }
+
// Function to compare current states to initial states
function checkForOptionContainerChanges() {
let hasChanges = false;
@@ -30,6 +49,28 @@ document.addEventListener("DOMContentLoaded", function () {
}
});
+ // Check office suite changes and sync to hidden inputs
+ if (collaboraRadio && onlyofficeRadio && noneRadio && collaboraHidden && onlyofficeHidden) {
+ let currentOfficeSelection = null;
+ if (collaboraRadio.checked) {
+ currentOfficeSelection = 'collabora';
+ collaboraHidden.value = 'on';
+ onlyofficeHidden.value = '';
+ } else if (onlyofficeRadio.checked) {
+ currentOfficeSelection = 'onlyoffice';
+ collaboraHidden.value = '';
+ onlyofficeHidden.value = 'on';
+ } else {
+ currentOfficeSelection = 'none';
+ collaboraHidden.value = '';
+ onlyofficeHidden.value = '';
+ }
+
+ if (currentOfficeSelection !== initialOfficeSelection) {
+ hasChanges = true;
+ }
+ }
+
// Show or hide submit button based on changes
optionsFormSubmit.style.display = hasChanges ? 'block' : 'none';
}
@@ -82,6 +123,13 @@ document.addEventListener("DOMContentLoaded", function () {
// Initialize talk-recording visibility on page load
handleTalkVisibility(); // Ensure talk-recording is correctly initialized
+ // Add event listeners for office suite radio buttons
+ if (collaboraRadio && onlyofficeRadio && noneRadio) {
+ collaboraRadio.addEventListener('change', checkForOptionContainerChanges);
+ onlyofficeRadio.addEventListener('change', checkForOptionContainerChanges);
+ noneRadio.addEventListener('change', checkForOptionContainerChanges);
+ }
+
// Initial call to check for changes
checkForOptionContainerChanges();
checkForCommunityContainerChanges();
diff --git a/php/public/style.css b/php/public/style.css
index b4d5f8a5..bdc31a4c 100644
--- a/php/public/style.css
+++ b/php/public/style.css
@@ -28,7 +28,7 @@
--border-radius-large: 12px;
--default-font-size: 13px;
--checkbox-size: 16px;
- --max-width: 500px;
+ --max-width: 580px;
--container-top-margin: 20px;
--container-bottom-margin: 20px;
--container-padding: 2px;
@@ -37,9 +37,9 @@
--main-padding: 50px;
}
-/* Breakpoint calculation: 500px (max-width) + 100px (main-padding * 2) + 200px (additional space) = 800px
+/* Breakpoint calculation: 800px (max-width) + 100px (main-padding * 2) + 200px (additional space) = 1100px
Note: Unfortunately, it's not possible to calculate this dynamically using CSS variables in media queries */
-@media only screen and (max-width: 800px) {
+@media only screen and (max-width: 1100px) {
:root {
--container-top-margin: 50px;
--container-bottom-margin: 0px;
@@ -549,3 +549,155 @@ input[type="checkbox"]:disabled:not(:checked) + label {
#theme-toggle:not(:hover) #theme-icon {
opacity: 0.6; /* Slightly transparent */
}
+/* Office Suite Feature Cards */
+.office-suite-cards {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
+ gap: 16px;
+ margin: 20px 0;
+ align-items: stretch;
+}
+
+.office-radio {
+ display: none;
+}
+
+.office-card {
+ position: relative;
+ border: 2px solid var(--color-border-maxcontrast);
+ border-radius: var(--border-radius-large);
+ padding: 20px;
+ cursor: pointer;
+ transition: all 0.3s ease;
+ background-color: var(--color-main-background);
+ display: flex;
+ flex-direction: column;
+}
+
+.office-card:hover {
+ border-color: var(--color-primary-element);
+ box-shadow: 0 4px 12px rgba(0, 130, 201, 0.15);
+ transform: translateY(-2px);
+}
+
+#office-collabora:checked + .office-card,
+#office-onlyoffice:checked + .office-card {
+ border-color: var(--color-nextcloud-blue);
+ background: linear-gradient(135deg, rgba(0, 130, 201, 0.08) 0%, rgba(0, 130, 201, 0.02) 100%);
+}
+
+[data-theme="dark"] #office-collabora:checked + .office-card,
+[data-theme="dark"] #office-onlyoffice:checked + .office-card {
+ background: linear-gradient(135deg, rgba(0, 145, 242, 0.15) 0%, rgba(0, 145, 242, 0.03) 100%);
+}
+
+.office-card-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 16px;
+}
+
+.office-card h4 {
+ margin: 0;
+ height: 24px;
+ font-size: 18px;
+ font-weight: 600;
+ color: var(--color-main-text);
+}
+
+.office-checkmark {
+ flex-shrink: 0;
+ display: none;
+}
+
+#office-collabora:checked + .office-card .office-checkmark,
+#office-onlyoffice:checked + .office-card .office-checkmark {
+ display: block;
+}
+
+.office-features {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+}
+
+.office-features li {
+ position: relative;
+ padding-left: 20px;
+ margin-bottom: 4px;
+ font-size: var(--default-font-size);
+ line-height: 1.5;
+ color: var(--color-main-text);
+}
+
+.office-features li::before {
+ content: '•';
+ position: absolute;
+ left: 6px;
+ color: var(--color-nextcloud-blue);
+ font-weight: bold;
+}
+
+.office-checkbox {
+ position: absolute;
+ opacity: 0;
+ pointer-events: none;
+}
+
+.office-learn-more {
+ display: inline-flex;
+ align-items: center;
+ margin-top: 12px;
+ color: var(--color-primary-element);
+ text-decoration: none;
+ font-size: var(--default-font-size);
+ font-weight: 500;
+ transition: color 0.2s ease;
+}
+
+.office-learn-more:hover {
+ color: var(--color-primary-element-hover);
+}
+
+.office-learn-more svg {
+ transition: transform 0.2s ease;
+}
+
+.office-learn-more:hover svg {
+ transform: translateX(3px);
+}
+
+.office-none-card {
+ text-align: center;
+ margin: 12px 0 20px 0;
+}
+
+.office-none-label {
+ display: inline-flex;
+ align-items: center;
+ font-size: 13px;
+ color: var(--color-primary-element);
+ cursor: pointer;
+ opacity: 0.7;
+ transition: opacity 0.2s ease;
+ padding: 8px 12px;
+ border-radius: var(--border-radius);
+}
+
+.office-none-label:hover {
+ opacity: 1;
+ background-color: var(--color-primary-element-light);
+}
+
+#office-none:checked + .office-none-label {
+ opacity: 1;
+ font-weight: 600;
+}
+
+/* Responsive adjustments for mobile */
+@media only screen and (max-width: 800px) {
+ .office-suite-cards {
+ grid-template-columns: 1fr;
+ }
+}
\ No newline at end of file
diff --git a/php/src/Container/Container.php b/php/src/Container/Container.php
index baee1c00..6e5d2b54 100644
--- a/php/src/Container/Container.php
+++ b/php/src/Container/Container.php
@@ -5,121 +5,56 @@ namespace AIO\Container;
use AIO\Data\ConfigurationManager;
use AIO\Docker\DockerActionManager;
use AIO\ContainerDefinitionFetcher;
+use JsonException;
readonly class Container {
public function __construct(
- private string $identifier,
- private string $displayName,
- private string $containerName,
- private string $restartPolicy,
- private int $maxShutdownTime,
- private ContainerPorts $ports,
- private string $internalPorts,
- private ContainerVolumes $volumes,
- private ContainerEnvironmentVariables $containerEnvironmentVariables,
+ public string $identifier,
+ public string $displayName,
+ public string $containerName,
+ public string $restartPolicy,
+ public int $maxShutdownTime,
+ public ContainerPorts $ports,
+ public string $internalPorts,
+ public ContainerVolumes $volumes,
+ public ContainerEnvironmentVariables $containerEnvironmentVariables,
/** @var string[] */
- private array $dependsOn,
+ public array $dependsOn,
private string $uiSecret,
/** @var string[] */
- private array $devices,
- private bool $enableNvidiaGpu,
+ public array $devices,
+ public bool $enableNvidiaGpu,
/** @var string[] */
- private array $capAdd,
- private int $shmSize,
- private bool $apparmorUnconfined,
+ public array $capAdd,
+ public int $shmSize,
+ public bool $apparmorUnconfined,
/** @var string[] */
- private array $backupVolumes,
- private array $nextcloudExecCommands,
- private bool $readOnlyRootFs,
- private array $tmpfs,
- private bool $init,
- private string $imageTag,
- private AioVariables $aioVariables,
- private string $documentation,
+ public array $backupVolumes,
+ public array $nextcloudExecCommands,
+ public bool $readOnlyRootFs,
+ public array $tmpfs,
+ public bool $init,
+ public string $imageTag,
+ public AioVariables $aioVariables,
+ public string $documentation,
private DockerActionManager $dockerActionManager
) {
}
- public function GetIdentifier() : string {
- return $this->identifier;
- }
-
- public function GetDisplayName() : string {
- return $this->displayName;
- }
-
- public function GetContainerName() : string {
- return $this->containerName;
- }
-
- public function GetRestartPolicy() : string {
- return $this->restartPolicy;
- }
-
- public function GetImageTag() : string {
- return $this->imageTag;
- }
-
- public function GetReadOnlySetting() : bool {
- return $this->readOnlyRootFs;
- }
-
- public function GetInit() : bool {
- return $this->init;
- }
-
- public function GetShmSize() : int {
- return $this->shmSize;
- }
-
- public function isApparmorUnconfined() : bool {
- return $this->apparmorUnconfined;
- }
-
- public function GetMaxShutdownTime() : int {
- return $this->maxShutdownTime;
- }
-
public function GetUiSecret() : string {
return $this->dockerActionManager->GetAndGenerateSecretWrapper($this->uiSecret);
}
- public function GetTmpfs() : array {
- return $this->tmpfs;
- }
-
- public function GetDevices() : array {
- return $this->devices;
- }
-
- public function isNvidiaGpuEnabled() : bool {
- return $this->enableNvidiaGpu;
- }
-
- public function GetCapAdds() : array {
- return $this->capAdd;
- }
-
- public function GetBackupVolumes() : array {
- return $this->backupVolumes;
- }
-
- public function GetPorts() : ContainerPorts {
- return $this->ports;
- }
-
- public function GetInternalPort() : string {
- return $this->internalPorts;
- }
-
- public function GetVolumes() : ContainerVolumes {
- return $this->volumes;
- }
-
+ /**
+ * @throws JsonException
+ */
public function GetRunningState() : ContainerState {
return $this->dockerActionManager->GetContainerRunningState($this);
}
+ /**
+ * @throws JsonException
+ */
public function GetRestartingState() : ContainerState {
return $this->dockerActionManager->GetContainerRestartingState($this);
}
@@ -131,27 +66,4 @@ readonly class Container {
public function GetStartingState() : ContainerState {
return $this->dockerActionManager->GetContainerStartingState($this);
}
-
- /**
- * @return string[]
- */
- public function GetDependsOn() : array {
- return $this->dependsOn;
- }
-
- public function GetNextcloudExecCommands() : array {
- return $this->nextcloudExecCommands;
- }
-
- public function GetEnvironmentVariables() : ContainerEnvironmentVariables {
- return $this->containerEnvironmentVariables;
- }
-
- public function GetAioVariables() : AioVariables {
- return $this->aioVariables;
- }
-
- public function GetDocumentation() : string {
- return $this->documentation;
- }
}
diff --git a/php/src/ContainerDefinitionFetcher.php b/php/src/ContainerDefinitionFetcher.php
index 7b092e45..d7498047 100644
--- a/php/src/ContainerDefinitionFetcher.php
+++ b/php/src/ContainerDefinitionFetcher.php
@@ -25,7 +25,7 @@ readonly class ContainerDefinitionFetcher {
$containers = $this->FetchDefinition();
foreach ($containers as $container) {
- if ($container->GetIdentifier() === $id) {
+ if ($container->identifier === $id) {
return $container;
}
}
diff --git a/php/src/Controller/ConfigurationController.php b/php/src/Controller/ConfigurationController.php
index 45586f9c..b449db6a 100644
--- a/php/src/Controller/ConfigurationController.php
+++ b/php/src/Controller/ConfigurationController.php
@@ -76,24 +76,24 @@ readonly class ConfigurationController {
}
if (isset($request->getParsedBody()['options-form'])) {
- if (isset($request->getParsedBody()['collabora']) && isset($request->getParsedBody()['onlyoffice'])) {
- throw new InvalidSettingConfigurationException("Collabora and Onlyoffice are not allowed to be enabled at the same time!");
+ $officeSuiteChoice = $request->getParsedBody()['office_suite_choice'] ?? '';
+
+ if ($officeSuiteChoice === 'collabora') {
+ $this->configurationManager->SetCollaboraEnabledState(1);
+ $this->configurationManager->SetOnlyofficeEnabledState(0);
+ } elseif ($officeSuiteChoice === 'onlyoffice') {
+ $this->configurationManager->SetCollaboraEnabledState(0);
+ $this->configurationManager->SetOnlyofficeEnabledState(1);
+ } else {
+ $this->configurationManager->SetCollaboraEnabledState(0);
+ $this->configurationManager->SetOnlyofficeEnabledState(0);
}
+
if (isset($request->getParsedBody()['clamav'])) {
$this->configurationManager->SetClamavEnabledState(1);
} else {
$this->configurationManager->SetClamavEnabledState(0);
}
- if (isset($request->getParsedBody()['onlyoffice'])) {
- $this->configurationManager->SetOnlyofficeEnabledState(1);
- } else {
- $this->configurationManager->SetOnlyofficeEnabledState(0);
- }
- if (isset($request->getParsedBody()['collabora'])) {
- $this->configurationManager->SetCollaboraEnabledState(1);
- } else {
- $this->configurationManager->SetCollaboraEnabledState(0);
- }
if (isset($request->getParsedBody()['talk'])) {
$this->configurationManager->SetTalkEnabledState(1);
} else {
diff --git a/php/src/Controller/DockerController.php b/php/src/Controller/DockerController.php
index 27a06bc8..a924e61f 100644
--- a/php/src/Controller/DockerController.php
+++ b/php/src/Controller/DockerController.php
@@ -23,7 +23,7 @@ readonly class DockerController {
$container = $this->containerDefinitionFetcher->GetContainerById($id);
// Start all dependencies first and then itself
- foreach($container->GetDependsOn() as $dependency) {
+ foreach($container->dependsOn as $dependency) {
$this->PerformRecursiveContainerStart($dependency, $pullImage);
}
@@ -46,7 +46,7 @@ readonly class DockerController {
$container = $this->containerDefinitionFetcher->GetContainerById($id);
// Pull all dependencies first and then itself
- foreach($container->GetDependsOn() as $dependency) {
+ foreach($container->dependsOn as $dependency) {
$this->PerformRecursiveImagePull($dependency);
}
@@ -255,7 +255,7 @@ readonly class DockerController {
// We want to stop the Nextcloud container after 10s and not wait for the configured stop_grace_period
$this->dockerActionManager->StopContainer($container, $forceStopNextcloud);
}
- foreach($container->GetDependsOn() as $dependency) {
+ foreach($container->dependsOn as $dependency) {
$this->PerformRecursiveContainerStop($dependency, $forceStopNextcloud);
}
}
diff --git a/php/src/Docker/DockerActionManager.php b/php/src/Docker/DockerActionManager.php
index 67134576..1743c4a5 100644
--- a/php/src/Docker/DockerActionManager.php
+++ b/php/src/Docker/DockerActionManager.php
@@ -36,15 +36,15 @@ readonly class DockerActionManager {
}
private function BuildImageName(Container $container): string {
- $tag = $container->GetImageTag();
+ $tag = $container->imageTag;
if ($tag === '%AIO_CHANNEL%') {
$tag = $this->GetCurrentChannel();
}
- return $container->GetContainerName() . ':' . $tag;
+ return $container->containerName . ':' . $tag;
}
public function GetContainerRunningState(Container $container): ContainerState {
- $url = $this->BuildApiUrl(sprintf('containers/%s/json', urlencode($container->GetIdentifier())));
+ $url = $this->BuildApiUrl(sprintf('containers/%s/json', urlencode($container->identifier)));
try {
$response = $this->guzzleClient->get($url);
} catch (RequestException $e) {
@@ -64,7 +64,7 @@ readonly class DockerActionManager {
}
public function GetContainerRestartingState(Container $container): ContainerState {
- $url = $this->BuildApiUrl(sprintf('containers/%s/json', urlencode($container->GetIdentifier())));
+ $url = $this->BuildApiUrl(sprintf('containers/%s/json', urlencode($container->identifier)));
try {
$response = $this->guzzleClient->get($url);
} catch (RequestException $e) {
@@ -84,16 +84,16 @@ readonly class DockerActionManager {
}
public function GetContainerUpdateState(Container $container): VersionState {
- $tag = $container->GetImageTag();
+ $tag = $container->imageTag;
if ($tag === '%AIO_CHANNEL%') {
$tag = $this->GetCurrentChannel();
}
- $runningDigests = $this->GetRepoDigestsOfContainer($container->GetIdentifier());
+ $runningDigests = $this->GetRepoDigestsOfContainer($container->identifier);
if ($runningDigests === null) {
return VersionState::Different;
}
- $remoteDigest = $this->GetLatestDigestOfTag($container->GetContainerName(), $tag);
+ $remoteDigest = $this->GetLatestDigestOfTag($container->containerName, $tag);
if ($remoteDigest === null) {
return VersionState::Equal;
}
@@ -112,8 +112,8 @@ readonly class DockerActionManager {
return $runningState;
}
- $containerName = $container->GetIdentifier();
- $internalPort = $container->GetInternalPort();
+ $containerName = $container->identifier;
+ $internalPort = $container->internalPorts;
if ($internalPort === '%APACHE_PORT%') {
$internalPort = $this->configurationManager->GetApachePort();
} elseif ($internalPort === '%TALK_PORT%') {
@@ -134,7 +134,7 @@ readonly class DockerActionManager {
}
public function DeleteContainer(Container $container): void {
- $url = $this->BuildApiUrl(sprintf('containers/%s?v=true', urlencode($container->GetIdentifier())));
+ $url = $this->BuildApiUrl(sprintf('containers/%s?v=true', urlencode($container->identifier)));
try {
$this->guzzleClient->delete($url);
} catch (RequestException $e) {
@@ -166,17 +166,17 @@ readonly class DockerActionManager {
}
public function StartContainer(Container $container): void {
- $url = $this->BuildApiUrl(sprintf('containers/%s/start', urlencode($container->GetIdentifier())));
+ $url = $this->BuildApiUrl(sprintf('containers/%s/start', urlencode($container->identifier)));
try {
$this->guzzleClient->post($url);
} catch (RequestException $e) {
- throw new \Exception("Could not start container " . $container->GetIdentifier() . ": " . $e->getResponse()?->getBody()->getContents());
+ throw new \Exception("Could not start container " . $container->identifier . ": " . $e->getResponse()?->getBody()->getContents());
}
}
public function CreateVolumes(Container $container): void {
$url = $this->BuildApiUrl('volumes/create');
- foreach ($container->GetVolumes()->GetVolumes() as $volume) {
+ foreach ($container->volumes->GetVolumes() as $volume) {
$forbiddenChars = [
'/',
];
@@ -202,9 +202,9 @@ readonly class DockerActionManager {
public function CreateContainer(Container $container): void {
$volumes = [];
- foreach ($container->GetVolumes()->GetVolumes() as $volume) {
+ foreach ($container->volumes->GetVolumes() as $volume) {
// // NEXTCLOUD_MOUNT gets added via bind-mount later on
- // if ($container->GetIdentifier() === 'nextcloud-aio-nextcloud') {
+ // if ($container->identifier === 'nextcloud-aio-nextcloud') {
// if ($volume->name === $this->configurationManager->GetNextcloudMount()) {
// continue;
// }
@@ -228,7 +228,7 @@ readonly class DockerActionManager {
$requestBody['HostConfig']['Binds'] = $volumes;
}
- $aioVariables = $container->GetAioVariables()->GetVariables();
+ $aioVariables = $container->aioVariables->GetVariables();
foreach ($aioVariables as $variable) {
$config = $this->configurationManager->GetConfig();
$variable = $this->replaceEnvPlaceholders($variable);
@@ -238,9 +238,9 @@ readonly class DockerActionManager {
sleep(1);
}
- $envs = $container->GetEnvironmentVariables()->GetVariables();
+ $envs = $container->containerEnvironmentVariables->GetVariables();
// Special thing for the nextcloud container
- if ($container->GetIdentifier() === 'nextcloud-aio-nextcloud') {
+ if ($container->identifier === 'nextcloud-aio-nextcloud') {
$envs[] = $this->GetAllNextcloudExecCommands();
}
foreach ($envs as $key => $env) {
@@ -251,13 +251,13 @@ readonly class DockerActionManager {
$requestBody['Env'] = $envs;
}
- $requestBody['HostConfig']['RestartPolicy']['Name'] = $container->GetRestartPolicy();
+ $requestBody['HostConfig']['RestartPolicy']['Name'] = $container->restartPolicy;
- $requestBody['HostConfig']['ReadonlyRootfs'] = $container->GetReadOnlySetting();
+ $requestBody['HostConfig']['ReadonlyRootfs'] = $container->readOnlyRootFs;
$exposedPorts = [];
- if ($container->GetInternalPort() !== 'host') {
- foreach ($container->GetPorts()->GetPorts() as $value) {
+ if ($container->internalPorts !== 'host') {
+ foreach ($container->ports->GetPorts() as $value) {
$port = $value->port;
$protocol = $value->protocol;
if ($port === '%APACHE_PORT%') {
@@ -279,7 +279,7 @@ readonly class DockerActionManager {
if (count($exposedPorts) > 0) {
$requestBody['ExposedPorts'] = $exposedPorts;
- foreach ($container->GetPorts()->GetPorts() as $value) {
+ foreach ($container->ports->GetPorts() as $value) {
$port = $value->port;
$protocol = $value->protocol;
if ($port === '%APACHE_PORT%') {
@@ -314,7 +314,7 @@ readonly class DockerActionManager {
}
$devices = [];
- foreach ($container->GetDevices() as $device) {
+ foreach ($container->devices as $device) {
if ($device === '/dev/dri' && !$this->configurationManager->isDriDeviceEnabled()) {
continue;
}
@@ -325,7 +325,7 @@ readonly class DockerActionManager {
$requestBody['HostConfig']['Devices'] = $devices;
}
- if ($container->isNvidiaGpuEnabled() && $this->configurationManager->isNvidiaGpuEnabled()) {
+ if ($container->enableNvidiaGpu && $this->configurationManager->isNvidiaGpuEnabled()) {
$requestBody['HostConfig']['Runtime'] = 'nvidia';
$requestBody['HostConfig']['DeviceRequests'] = [
[
@@ -336,13 +336,13 @@ readonly class DockerActionManager {
];
}
- $shmSize = $container->GetShmSize();
+ $shmSize = $container->shmSize;
if ($shmSize > 0) {
$requestBody['HostConfig']['ShmSize'] = $shmSize;
}
$tmpfs = [];
- foreach ($container->GetTmpfs() as $tmp) {
+ foreach ($container->tmpfs as $tmp) {
$mode = "";
if (str_contains($tmp, ':')) {
$mode = explode(':', $tmp)[1];
@@ -354,9 +354,9 @@ readonly class DockerActionManager {
$requestBody['HostConfig']['Tmpfs'] = $tmpfs;
}
- $requestBody['HostConfig']['Init'] = $container->GetInit();
+ $requestBody['HostConfig']['Init'] = $container->init;
- $capAdds = $container->GetCapAdds();
+ $capAdds = $container->capAdd;
if (count($capAdds) > 0) {
$requestBody['HostConfig']['CapAdd'] = $capAdds;
}
@@ -368,19 +368,14 @@ readonly class DockerActionManager {
// Disable SELinux for AIO containers so that it does not break them
$requestBody['HostConfig']['SecurityOpt'] = ["label:disable"];
- if ($container->isApparmorUnconfined()) {
+ if ($container->apparmorUnconfined) {
$requestBody['HostConfig']['SecurityOpt'] = ["apparmor:unconfined", "label:disable"];
}
$mounts = [];
// Special things for the backup container which should not be exposed in the containers.json
- if (str_starts_with($container->GetIdentifier(), 'nextcloud-aio-borgbackup')) {
- // Disable seccomp policy if seccomp is enabled in the kernel to fix issues like https://github.com/nextcloud/all-in-one/issues/7308
- if (!$this->configurationManager->isSeccompDisabled()) {
- $requestBody['HostConfig']['SecurityOpt'] = ["apparmor:unconfined", "label:disable", "seccomp:unconfined"];
- }
-
+ if (str_starts_with($container->identifier, 'nextcloud-aio-borgbackup')) {
// Additional backup directories
foreach ($this->getAllBackupVolumes() as $additionalBackupVolumes) {
if ($additionalBackupVolumes !== '') {
@@ -389,7 +384,7 @@ readonly class DockerActionManager {
}
// Make volumes read only in case of borgbackup container. The viewer makes them writeable
- $isReadOnly = $container->GetIdentifier() === 'nextcloud-aio-borgbackup';
+ $isReadOnly = $container->identifier === 'nextcloud-aio-borgbackup';
foreach ($this->configurationManager->GetAdditionalBackupDirectoriesArray() as $additionalBackupDirectories) {
if ($additionalBackupDirectories !== '') {
@@ -402,12 +397,12 @@ readonly class DockerActionManager {
}
// Special things for the talk container which should not be exposed in the containers.json
- } elseif ($container->GetIdentifier() === 'nextcloud-aio-talk') {
+ } elseif ($container->identifier === 'nextcloud-aio-talk') {
// This is needed due to a bug in libwebsockets used in Janus which cannot handle unlimited ulimits
$requestBody['HostConfig']['Ulimits'] = [["Name" => "nofile", "Hard" => 200000, "Soft" => 200000]];
// // Special things for the nextcloud container which should not be exposed in the containers.json
- // } elseif ($container->GetIdentifier() === 'nextcloud-aio-nextcloud') {
- // foreach ($container->GetVolumes()->GetVolumes() as $volume) {
+ // } elseif ($container->identifier === 'nextcloud-aio-nextcloud') {
+ // foreach ($container->volumes->GetVolumes() as $volume) {
// if ($volume->name !== $this->configurationManager->GetNextcloudMount()) {
// continue;
// }
@@ -415,11 +410,11 @@ readonly class DockerActionManager {
// }
// Special things for the caddy community container
- } elseif ($container->GetIdentifier() === 'nextcloud-aio-caddy') {
+ } elseif ($container->identifier === 'nextcloud-aio-caddy') {
$requestBody['HostConfig']['ExtraHosts'] = ['host.docker.internal:host-gateway'];
// Special things for the collabora container which should not be exposed in the containers.json
- } elseif ($container->GetIdentifier() === 'nextcloud-aio-collabora') {
+ } elseif ($container->identifier === 'nextcloud-aio-collabora') {
if (!$this->configurationManager->isSeccompDisabled()) {
// Load reference seccomp profile for collabora
$seccompProfile = (string)file_get_contents(DataConst::GetCollaboraSeccompProfilePath());
@@ -439,12 +434,12 @@ readonly class DockerActionManager {
// All AIO-managed containers should not be updated externally via watchtower but gracefully by AIO's backup and update feature.
// Also DIUN should not send update notifications. See https://crazymax.dev/diun/providers/docker/#docker-labels
// Additionally set a default org.label-schema.vendor and com.docker.compose.project
- $requestBody['Labels'] = ["com.centurylinklabs.watchtower.enable" => "false", "diun.enable" => "false", "org.label-schema.vendor" => "Nextcloud", "com.docker.compose.project" => "nextcloud-aio"];
+ $requestBody['Labels'] = ["com.centurylinklabs.watchtower.enable" => "false", "wud.watch" => "false", "diun.enable" => "false", "org.label-schema.vendor" => "Nextcloud", "com.docker.compose.project" => "nextcloud-aio"];
// Containers should have a fixed host name. See https://github.com/nextcloud/all-in-one/discussions/6589
- $requestBody['Hostname'] = $container->GetIdentifier();
+ $requestBody['Hostname'] = $container->identifier;
- $url = $this->BuildApiUrl('containers/create?name=' . $container->GetIdentifier());
+ $url = $this->BuildApiUrl('containers/create?name=' . $container->identifier);
try {
$this->guzzleClient->request(
'POST',
@@ -454,18 +449,18 @@ readonly class DockerActionManager {
]
);
} catch (RequestException $e) {
- throw new \Exception("Could not create container " . $container->GetIdentifier() . ": " . $e->getResponse()?->getBody()->getContents());
+ throw new \Exception("Could not create container " . $container->identifier . ": " . $e->getResponse()?->getBody()->getContents());
}
}
public function isRegistryReachable(Container $container): bool {
- $tag = $container->GetImageTag();
+ $tag = $container->imageTag;
if ($tag === '%AIO_CHANNEL%') {
$tag = $this->GetCurrentChannel();
}
- $remoteDigest = $this->GetLatestDigestOfTag($container->GetContainerName(), $tag);
+ $remoteDigest = $this->GetLatestDigestOfTag($container->containerName, $tag);
if ($remoteDigest === null) {
return false;
@@ -477,7 +472,7 @@ readonly class DockerActionManager {
public function PullImage(Container $container, bool $pullImage = true): void {
// Skip database image pull if the last shutdown was not clean
- if ($container->GetIdentifier() === 'nextcloud-aio-database') {
+ if ($container->identifier === 'nextcloud-aio-database') {
if ($this->GetDatabasecontainerExitCode() > 0) {
$pullImage = false;
error_log('Not pulling the latest database image because the container was not correctly shut down.');
@@ -489,7 +484,7 @@ readonly class DockerActionManager {
if ($pullImage) {
if (!$this->isRegistryReachable($container)) {
$pullImage = false;
- error_log('Not pulling the ' . $container->GetContainerName() . ' image for the ' . $container->GetIdentifier() . ' container because the registry does not seem to be reachable.');
+ error_log('Not pulling the ' . $container->containerName . ' image for the ' . $container->identifier . ' container because the registry does not seem to be reachable.');
}
}
@@ -508,14 +503,24 @@ readonly class DockerActionManager {
} catch (\Throwable $e) {
$imageIsThere = false;
}
- try {
- $this->guzzleClient->post($url);
- } catch (RequestException $e) {
- $message = "Could not pull image " . $imageName . ": " . $e->getResponse()?->getBody()->getContents();
- if ($imageIsThere === false) {
- throw new \Exception($message);
- } else {
- error_log($message);
+
+ $maxRetries = 3;
+ for ($attempt = 1; $attempt <= $maxRetries; $attempt++) {
+ try {
+ $this->guzzleClient->post($url);
+ break;
+ } catch (RequestException $e) {
+ $message = "Could not pull image " . $imageName . " (attempt $attempt/$maxRetries): " . $e->getResponse()?->getBody()->getContents();
+ if ($attempt === $maxRetries) {
+ if ($imageIsThere === false) {
+ throw new \Exception($message);
+ } else {
+ error_log($message);
+ }
+ } else {
+ error_log($message . ' Retrying...');
+ sleep(1);
+ }
}
}
}
@@ -603,7 +608,7 @@ readonly class DockerActionManager {
if ($container->GetUpdateState() === VersionState::Different) {
$updateAvailable = '1';
}
- foreach ($container->GetDependsOn() as $dependency) {
+ foreach ($container->dependsOn as $dependency) {
$updateAvailable .= $this->isContainerUpdateAvailable($dependency);
}
return $updateAvailable;
@@ -627,10 +632,10 @@ readonly class DockerActionManager {
$container = $this->containerDefinitionFetcher->GetContainerById($id);
$backupVolumes = '';
- foreach ($container->GetBackupVolumes() as $backupVolume) {
+ foreach ($container->backupVolumes as $backupVolume) {
$backupVolumes .= $backupVolume . ' ';
}
- foreach ($container->GetDependsOn() as $dependency) {
+ foreach ($container->dependsOn as $dependency) {
$backupVolumes .= $this->getBackupVolumes($dependency);
}
return $backupVolumes;
@@ -646,10 +651,10 @@ readonly class DockerActionManager {
$container = $this->containerDefinitionFetcher->GetContainerById($id);
$nextcloudExecCommands = '';
- foreach ($container->GetNextcloudExecCommands() as $execCommand) {
+ foreach ($container->nextcloudExecCommands as $execCommand) {
$nextcloudExecCommands .= $execCommand . PHP_EOL;
}
- foreach ($container->GetDependsOn() as $dependency) {
+ foreach ($container->dependsOn as $dependency) {
$nextcloudExecCommands .= $this->GetNextcloudExecCommands($dependency);
}
return $nextcloudExecCommands;
@@ -781,7 +786,7 @@ readonly class DockerActionManager {
public function sendNotification(Container $container, string $subject, string $message, string $file = '/notify.sh'): void {
if ($this->GetContainerStartingState($container) === ContainerState::Running) {
- $containerName = $container->GetIdentifier();
+ $containerName = $container->identifier;
// schedule the exec
$url = $this->BuildApiUrl(sprintf('containers/%s/exec', urlencode($containerName)));
@@ -906,14 +911,14 @@ readonly class DockerActionManager {
// Add a secondary alias for domaincheck container, to keep it as similar to actual apache controller as possible.
// If a reverse-proxy is relying on container name as hostname this allows it to operate as usual and still validate the domain
// The domaincheck container and apache container are never supposed to be active at the same time because they use the same APACHE_PORT anyway, so this doesn't add any new constraints.
- $alias = ($container->GetIdentifier() === 'nextcloud-aio-domaincheck') ? 'nextcloud-aio-apache' : '';
+ $alias = ($container->identifier === 'nextcloud-aio-domaincheck') ? 'nextcloud-aio-apache' : '';
- $this->ConnectContainerIdToNetwork($container->GetIdentifier(), $container->GetInternalPort(), alias: $alias);
+ $this->ConnectContainerIdToNetwork($container->identifier, $container->internalPorts, alias: $alias);
- if ($container->GetIdentifier() === 'nextcloud-aio-apache' || $container->GetIdentifier() === 'nextcloud-aio-domaincheck') {
+ if ($container->identifier === 'nextcloud-aio-apache' || $container->identifier === 'nextcloud-aio-domaincheck') {
$apacheAdditionalNetwork = $this->configurationManager->GetApacheAdditionalNetwork();
if ($apacheAdditionalNetwork !== '') {
- $this->ConnectContainerIdToNetwork($container->GetIdentifier(), $container->GetInternalPort(), $apacheAdditionalNetwork, false, $alias);
+ $this->ConnectContainerIdToNetwork($container->identifier, $container->internalPorts, $apacheAdditionalNetwork, false, $alias);
}
}
}
@@ -922,9 +927,9 @@ readonly class DockerActionManager {
if ($forceStopContainer) {
$maxShutDownTime = 10;
} else {
- $maxShutDownTime = $container->GetMaxShutdownTime();
+ $maxShutDownTime = $container->maxShutdownTime;
}
- $url = $this->BuildApiUrl(sprintf('containers/%s/stop?t=%s', urlencode($container->GetIdentifier()), $maxShutDownTime));
+ $url = $this->BuildApiUrl(sprintf('containers/%s/stop?t=%s', urlencode($container->identifier), $maxShutDownTime));
try {
$this->guzzleClient->post($url);
} catch (RequestException $e) {
diff --git a/php/templates/components/container-state.twig b/php/templates/components/container-state.twig
index 8375d033..07580e66 100644
--- a/php/templates/components/container-state.twig
+++ b/php/templates/components/container-state.twig
@@ -3,24 +3,24 @@
{% if c.GetStartingState().value == 'starting' %}
- {{ c.GetDisplayName() }}
- (Starting)
+ {{ c.displayName }}
+ (Starting)
{% elseif c.GetRunningState().value == 'running' %}
- {{ c.GetDisplayName() }}
- (Running)
+ {{ c.displayName }}
+ (Running)
{% else %}
- {{ c.GetDisplayName() }}
- (Stopped)
+ {{ c.displayName }}
+ (Stopped)
{% endif %}
- {% if c.GetDocumentation() != '' %}
- (docs)
+ {% if c.documentation != '' %}
+ (docs)
{% endif %}
{% if c.GetUiSecret() != '' %}
- Show password for {{ c.GetDisplayName() }}
+ Show password for {{ c.displayName }}
{% endif %}
diff --git a/php/templates/containers.twig b/php/templates/containers.twig
index c318e8a6..2f722768 100644
--- a/php/templates/containers.twig
+++ b/php/templates/containers.twig
@@ -17,7 +17,8 @@
-
Nextcloud AIO v12.4.0
+ {% set aio_version = include('includes/aio-version.twig') %}
+
Nextcloud AIO v{{ aio_version }}
{# Add 2nd tab warning #}
@@ -45,19 +46,19 @@
{% endif %}
{% for container in containers %}
- {% if container.GetDisplayName() != '' and container.GetRunningState().value == 'running' %}
+ {% if container.displayName != '' and container.GetRunningState().value == 'running' %}
{% set isAnyRunning = true %}
{% endif %}
- {% if container.GetDisplayName() != '' and container.GetRestartingState().value == 'restarting' %}
+ {% if container.displayName != '' and container.GetRestartingState().value == 'restarting' %}
{% set isAnyRestarting = true %}
{% endif %}
- {% if container.GetIdentifier() == 'nextcloud-aio-watchtower' and container.GetRunningState().value == 'running' %}
+ {% if container.identifier == 'nextcloud-aio-watchtower' and container.GetRunningState().value == 'running' %}
{% set isWatchtowerRunning = true %}
{% endif %}
- {% if container.GetIdentifier() == 'nextcloud-aio-domaincheck' and container.GetRunningState().value == 'running' %}
+ {% if container.identifier == 'nextcloud-aio-domaincheck' and container.GetRunningState().value == 'running' %}
{% set isDomaincheckRunning = true %}
{% endif %}
- {% if container.GetIdentifier() == 'nextcloud-aio-apache' and container.GetStartingState().value == 'starting' %}
+ {% if container.identifier == 'nextcloud-aio-apache' and container.GetStartingState().value == 'starting' %}
{% set isApacheStarting = true %}
{% endif %}
{% endfor %}
@@ -280,7 +281,7 @@
{# @var containers \AIO\Container\Container[] #}
{% for container in containers %}
- {% if container.GetDisplayName() != '' %}
+ {% if container.displayName != '' %}
{% include 'components/container-state.twig' with {'c': container} only %}
{% endif %}
{% endfor %}
diff --git a/php/templates/includes/aio-version.twig b/php/templates/includes/aio-version.twig
new file mode 100644
index 00000000..b7d7205d
--- /dev/null
+++ b/php/templates/includes/aio-version.twig
@@ -0,0 +1 @@
+12.5.0
diff --git a/php/templates/includes/optional-containers.twig b/php/templates/includes/optional-containers.twig
index b4764592..f3739b04 100644
--- a/php/templates/includes/optional-containers.twig
+++ b/php/templates/includes/optional-containers.twig
@@ -23,20 +23,96 @@
>
-
+
Office Suite
+
Choose your preferred office suite. Only one can be enabled at a time.
+
-
-
+
+
+
+
+
+
+
+
+
+
+
Additional Optional Containers
-
-
-
-
+
AIO
-
+
diff --git a/php/tests/tests/initial-setup.spec.js b/php/tests/tests/initial-setup.spec.js
index c88cd8e3..c455e725 100644
--- a/php/tests/tests/initial-setup.spec.js
+++ b/php/tests/tests/initial-setup.spec.js
@@ -32,12 +32,12 @@ test('Initial setup', async ({ page: setupPage }) => {
await containersPage.locator('#talk').uncheck();
await containersPage.getByRole('checkbox', { name: 'Whiteboard' }).uncheck();
await containersPage.getByRole('checkbox', { name: 'Imaginary' }).uncheck();
- await containersPage.getByRole('checkbox', { name: 'Collabora' }).uncheck();
+ await containersPage.getByText('Disable office suite').click();
await containersPage.getByRole('button', { name: 'Save changes' }).click();
await expect(containersPage.locator('#talk')).not.toBeChecked()
await expect(containersPage.getByRole('checkbox', { name: 'Whiteboard' })).not.toBeChecked()
await expect(containersPage.getByRole('checkbox', { name: 'Imaginary' })).not.toBeChecked()
- await expect(containersPage.getByRole('checkbox', { name: 'Collabora' })).not.toBeChecked()
+ await expect(containersPage.locator('#office-none')).toBeChecked()
// Reject invalid time zones
await containersPage.locator('#timezone').click();
diff --git a/readme.md b/readme.md
index bcbf7d57..66059954 100644
--- a/readme.md
+++ b/readme.md
@@ -340,7 +340,7 @@ Although it does not seems like it is the case but from AIO perspective a Cloudf
For a reverse proxy example guide for Tailscale, see this guide by [@Perseus333](https://github.com/Perseus333): https://github.com/nextcloud/all-in-one/discussions/6817
### How to get Nextcloud running using the ACME DNS-challenge?
-You can install AIO in reverse proxy mode where is also documented how to get it running using the ACME DNS-challenge for getting a valid certificate for AIO. See the [reverse proxy documentation](./reverse-proxy.md). (Meant is the `Caddy with ACME DNS-challenge` section). Also see https://github.com/dani-garcia/vaultwarden/wiki/Running-a-private-vaultwarden-instance-with-Let%27s-Encrypt-certs#getting-a-custom-caddy-build for additional docs on this topic.
+You can install AIO behind an external reverse proxy where is also documented how to get it running using the ACME DNS-challenge for getting a valid certificate for AIO. See the [reverse proxy documentation](./reverse-proxy.md). (Meant is the `Caddy with ACME DNS-challenge` section). Also see https://github.com/dani-garcia/vaultwarden/wiki/Running-a-private-vaultwarden-instance-with-Let%27s-Encrypt-certs#getting-a-custom-caddy-build for additional docs on this topic.
### How to run Nextcloud locally? No domain wanted, or wanting intranet access within your LAN.
If you do not want to open Nextcloud to the public internet, you may have a look at the following documentation on how to set it up locally: [local-instance.md](./local-instance.md), but keep in mind you're still required to have https working properly.
diff --git a/reverse-proxy.md b/reverse-proxy.md
index 50a6bccd..bdeb3244 100644
--- a/reverse-proxy.md
+++ b/reverse-proxy.md
@@ -564,19 +564,14 @@ Note: this will cause that a non root user can bind privileged ports.
Second, see these screenshots for a working config:
-
+
-
+
-
+
-
+
-
-
-`proxy_set_header Accept-Encoding $http_accept_encoding;`
-
-⚠️ **Please note:** Nextcloud will complain that X-XXS-Protection is set to the wrong value, this is intended by NPMplus.
⚠️ **Please note:** look into [this](#adapting-the-sample-web-server-configurations-below) to adapt the above example configuration.