Compare commits

..

1 Commits

Author SHA1 Message Date
copilot-swe-agent[bot] 1928b0a3f3 fix: ensure mastercontainer is updated before sibling containers
When watchtower updates the mastercontainer there is a Docker stop grace
period during which the old mastercontainer's daily-backup.sh can still
execute StartAndUpdateContainers.php.  That old PHP process uses the old
containers.json (which lacks AIO_LOG_LEVEL) while the freshly pulled
sibling images already require that variable — causing redis/postgres to
fail with an empty log-level.

Add a guard in startTopContainer(): when pullImage=true, check
IsMastercontainerUpdateAvailable().  During the grace period the old
container's image digest still differs from the remote digest, so the
check returns true and the function returns early.  The new mastercontainer
will re-run the full update with the correct containers.json.

Fixes: https://github.com/nextcloud/all-in-one/issues/8101

Agent-Logs-Url: https://github.com/nextcloud/all-in-one/sessions/cbe966e6-1731-480e-a359-b98d9510844f

Co-authored-by: szaimen <42591237+szaimen@users.noreply.github.com>
2026-05-15 07:49:42 +00:00
19 changed files with 36 additions and 29 deletions
+1 -2
View File
@@ -31,5 +31,4 @@ LABEL com.centurylinklabs.watchtower.enable="false" \
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"
ENV BORG_RETENTION_POLICY="--keep-within=7d --keep-weekly=4 --keep-monthly=6" \
AIO_LOG_LEVEL="warn"
ENV BORG_RETENTION_POLICY="--keep-within=7d --keep-weekly=4 --keep-monthly=6"
+2 -4
View File
@@ -1,13 +1,13 @@
# syntax=docker/dockerfile:latest
FROM golang:1.26.3-alpine3.23 AS go
ENV WATCHTOWER_COMMIT_HASH=1a7990e7065f1292471114b2a9c94147743de06f
ENV WATCHTOWER_COMMIT_HASH=652c89577076f6bc6f2af4465217589641216ee3
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.17.0
go install github.com/nicholas-fedor/watchtower@$WATCHTOWER_COMMIT_HASH # v1.16.1
FROM alpine:3.23.4
@@ -22,8 +22,6 @@ COPY --chmod=775 start.sh /start.sh
# hadolint ignore=DL3002
USER root
ENV AIO_LOG_LEVEL="warn"
ENTRYPOINT ["/start.sh"]
LABEL com.centurylinklabs.watchtower.enable="false" \
wud.watch="false" \
+2 -2
View File
@@ -4,8 +4,8 @@
"container_name": "nextcloud-aio-lldap",
"display_name": "Light LDAP implementation",
"documentation": "https://github.com/nextcloud/all-in-one/tree/main/community-containers/lldap",
"image": "ghcr.io/lldap/lldap",
"image_tag": "latest-alpine",
"image": "lldap/lldap",
"image_tag": "v0-alpine",
"internal_port": "17170",
"restart": "unless-stopped",
"ports": [
+1 -1
View File
@@ -1,6 +1,6 @@
name: nextcloud-aio-helm-chart
description: A generated Helm Chart for Nextcloud AIO from Skippbox Kompose
version: 13.0.4
version: 13.0.3-1
apiVersion: v2
keywords:
- latest
@@ -65,7 +65,7 @@ spec:
value: "{{ .Values.TIMEZONE }}"
- name: WHITEBOARD_HOST
value: nextcloud-aio-whiteboard
image: ghcr.io/nextcloud-releases/aio-apache:20260515_145717
image: ghcr.io/nextcloud-releases/aio-apache:20260513_090235
readinessProbe:
exec:
command:
@@ -36,7 +36,7 @@ spec:
{{- end }}
initContainers:
- name: init-subpath
image: ghcr.io/nextcloud-releases/aio-alpine:20260515_145717
image: ghcr.io/nextcloud-releases/aio-alpine:20260513_090235
command:
- mkdir
- "-p"
@@ -61,7 +61,7 @@ spec:
value: "{{ .Values.NEXTCLOUD_UPLOAD_LIMIT }}"
- name: TZ
value: "{{ .Values.TIMEZONE }}"
image: ghcr.io/nextcloud-releases/aio-clamav:20260515_145717
image: ghcr.io/nextcloud-releases/aio-clamav:20260513_090235
readinessProbe:
exec:
command:
@@ -38,9 +38,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:20260515_145717
image: ghcr.io/nextcloud-releases/aio-collabora-online:20260513_090235
{{- else }}
image: ghcr.io/nextcloud-releases/aio-collabora:20260515_145717
image: ghcr.io/nextcloud-releases/aio-collabora:20260513_090235
{{- end }}
readinessProbe:
exec:
@@ -35,7 +35,7 @@ spec:
{{- end }}
initContainers:
- name: init-subpath
image: ghcr.io/nextcloud-releases/aio-alpine:20260515_145717
image: ghcr.io/nextcloud-releases/aio-alpine:20260513_090235
command:
- mkdir
- "-p"
@@ -66,7 +66,7 @@ spec:
value: nextcloud
- name: TZ
value: "{{ .Values.TIMEZONE }}"
image: ghcr.io/nextcloud-releases/aio-postgresql:20260515_145717
image: ghcr.io/nextcloud-releases/aio-postgresql:20260513_090235
readinessProbe:
exec:
command:
@@ -24,7 +24,7 @@ spec:
spec:
initContainers:
- name: init-volumes
image: ghcr.io/nextcloud-releases/aio-alpine:20260515_145717
image: ghcr.io/nextcloud-releases/aio-alpine:20260513_090235
command:
- chmod
- "777"
@@ -60,7 +60,7 @@ spec:
value: basic
- name: xpack.security.enabled
value: "false"
image: ghcr.io/nextcloud-releases/aio-fulltextsearch:20260515_145717
image: ghcr.io/nextcloud-releases/aio-fulltextsearch:20260513_090235
readinessProbe:
exec:
command:
@@ -40,7 +40,7 @@ spec:
value: "{{ .Values.IMAGINARY_SECRET }}"
- name: TZ
value: "{{ .Values.TIMEZONE }}"
image: ghcr.io/nextcloud-releases/aio-imaginary:20260515_145717
image: ghcr.io/nextcloud-releases/aio-imaginary:20260513_090235
readinessProbe:
exec:
command:
@@ -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:20260515_145717
image: ghcr.io/nextcloud-releases/aio-alpine:20260513_090235
command:
- chmod
- "777"
@@ -192,7 +192,7 @@ spec:
value: "{{ .Values.WHITEBOARD_ENABLED }}"
- name: WHITEBOARD_SECRET
value: "{{ .Values.WHITEBOARD_SECRET }}"
image: ghcr.io/nextcloud-releases/aio-nextcloud:20260515_145717
image: ghcr.io/nextcloud-releases/aio-nextcloud:20260513_090235
{{- if eq (.Values.RPSS_ENABLED | default "no") "yes" }} # AIO-config - do not change this comment!
securityContext:
# The items below only work in container context
@@ -41,7 +41,7 @@ spec:
value: nextcloud-aio-nextcloud
- name: TZ
value: "{{ .Values.TIMEZONE }}"
image: ghcr.io/nextcloud-releases/aio-notify-push:20260515_145717
image: ghcr.io/nextcloud-releases/aio-notify-push:20260513_090235
readinessProbe:
exec:
command:
@@ -24,7 +24,7 @@ spec:
spec:
initContainers:
- name: init-volumes
image: ghcr.io/nextcloud-releases/aio-alpine:20260515_145717
image: ghcr.io/nextcloud-releases/aio-alpine:20260513_090235
command:
- chmod
- "777"
@@ -46,7 +46,7 @@ spec:
value: "{{ .Values.AIO_LOG_LEVEL }}"
- name: TZ
value: "{{ .Values.TIMEZONE }}"
image: ghcr.io/nextcloud-releases/aio-onlyoffice:20260515_145717
image: ghcr.io/nextcloud-releases/aio-onlyoffice:20260513_090235
readinessProbe:
exec:
command:
@@ -41,7 +41,7 @@ spec:
value: "{{ .Values.REDIS_PASSWORD }}"
- name: TZ
value: "{{ .Values.TIMEZONE }}"
image: ghcr.io/nextcloud-releases/aio-redis:20260515_145717
image: ghcr.io/nextcloud-releases/aio-redis:20260513_090235
readinessProbe:
exec:
command:
@@ -56,7 +56,7 @@ spec:
value: "{{ .Values.TURN_SECRET }}"
- name: TZ
value: "{{ .Values.TIMEZONE }}"
image: ghcr.io/nextcloud-releases/aio-talk:20260515_145717
image: ghcr.io/nextcloud-releases/aio-talk:20260513_090235
readinessProbe:
exec:
command:
@@ -46,7 +46,7 @@ spec:
value: "{{ .Values.RECORDING_SECRET }}"
- name: TZ
value: "{{ .Values.TIMEZONE }}"
image: ghcr.io/nextcloud-releases/aio-talk-recording:20260515_145717
image: ghcr.io/nextcloud-releases/aio-talk-recording:20260513_090235
readinessProbe:
exec:
command:
@@ -52,7 +52,7 @@ spec:
value: redis
- name: TZ
value: "{{ .Values.TIMEZONE }}"
image: ghcr.io/nextcloud-releases/aio-whiteboard:20260515_145717
image: ghcr.io/nextcloud-releases/aio-whiteboard:20260513_090235
readinessProbe:
exec:
command:
+10
View File
@@ -258,6 +258,16 @@ readonly class DockerController {
}
public function startTopContainer(bool $pullImage, ?\Closure $addToStreamingResponseBody = null) : void {
if ($pullImage && $this->dockerActionManager->IsMastercontainerUpdateAvailable()) {
// The mastercontainer must always be updated before the sibling containers.
// If a mastercontainer update is still available at this point it means we are likely
// running inside the old mastercontainer during its Docker stop grace period while
// watchtower has already started the new mastercontainer. Skip the update here —
// the new mastercontainer will re-run this process and perform the update correctly.
error_log('Not updating sibling containers because a mastercontainer update is available. The mastercontainer must be updated first.');
return;
}
$this->configurationManager->aioToken = bin2hex(random_bytes(24));
// Stop domaincheck since apache would not be able to start otherwise
+1 -1
View File
@@ -1 +1 @@
13.0.4
13.0.3