From cdd21ae1ff62f02992670677cd4b7aecc2f49107 Mon Sep 17 00:00:00 2001
From: Jean-Yves <7360784+docjyJ@users.noreply.github.com>
Date: Sat, 10 Jan 2026 15:07:08 +0100
Subject: [PATCH 001/164] refactor: change private properties to public in
Container class and update related methods
Signed-off-by: Jean-Yves <7360784+docjyJ@users.noreply.github.com>
---
php/src/Container/Container.php | 148 ++++--------------
php/src/ContainerDefinitionFetcher.php | 2 +-
php/src/Controller/DockerController.php | 6 +-
php/src/Docker/DockerActionManager.php | 112 ++++++-------
php/templates/components/container-state.twig | 18 +--
php/templates/containers.twig | 12 +-
6 files changed, 105 insertions(+), 193 deletions(-)
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/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 9e8a8ff2..529af1fe 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,14 +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')) {
+ if (str_starts_with($container->identifier, 'nextcloud-aio-borgbackup')) {
// Additional backup directories
foreach ($this->getAllBackupVolumes() as $additionalBackupVolumes) {
if ($additionalBackupVolumes !== '') {
@@ -384,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 !== '') {
@@ -397,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;
// }
@@ -410,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());
@@ -437,9 +437,9 @@ readonly class DockerActionManager {
$requestBody['Labels'] = ["com.centurylinklabs.watchtower.enable" => "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',
@@ -449,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;
@@ -472,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.');
@@ -484,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.');
}
}
@@ -598,7 +598,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;
@@ -622,10 +622,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;
@@ -641,10 +641,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;
@@ -776,7 +776,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)));
@@ -901,14 +901,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);
}
}
}
@@ -917,9 +917,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..0e7d1427 100644
--- a/php/templates/containers.twig
+++ b/php/templates/containers.twig
@@ -45,19 +45,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 +280,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 %}
From 59ad7dc98be6eecbe7866add09ac771cd8ccf0ee Mon Sep 17 00:00:00 2001
From: "Simon L."
Date: Fri, 16 Jan 2026 15:12:44 +0100
Subject: [PATCH 002/164] move version to a dedicated file
Signed-off-by: Simon L.
---
nextcloud-aio-helm-chart/update-helm.sh | 2 +-
php/templates/containers.twig | 3 ++-
php/templates/includes/aio-version.twig | 1 +
3 files changed, 4 insertions(+), 2 deletions(-)
create mode 100644 php/templates/includes/aio-version.twig
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/templates/containers.twig b/php/templates/containers.twig
index 9c55350e..d0ed38b1 100644
--- a/php/templates/containers.twig
+++ b/php/templates/containers.twig
@@ -17,7 +17,8 @@
-
Nextcloud AIO v12.5.0
+ {% set aio_version = include('includes/aio-version.twig') %}
+
Nextcloud AIO v{{ aio_version }}
{# Add 2nd tab warning #}
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
From 792ba0dfb352fe6a0018dd7ee470c777da5658df Mon Sep 17 00:00:00 2001
From: Zoey
Date: Fri, 16 Jan 2026 22:54:58 +0100
Subject: [PATCH 003/164] update NPMplus images in reverse proxy guide
Signed-off-by: Zoey
---
reverse-proxy.md | 13 ++++---------
1 file changed, 4 insertions(+), 9 deletions(-)
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.
From d5c3e79b31f34a66687db78bc9f1065bf24b31e4 Mon Sep 17 00:00:00 2001
From: ph818 <71797925+ph818@users.noreply.github.com>
Date: Sat, 17 Jan 2026 17:17:28 -0500
Subject: [PATCH 004/164] Update local-instance.md
Clarifying DNS-challenge description.
Signed-off-by: ph818 <71797925+ph818@users.noreply.github.com>
---
local-instance.md | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
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.
+
From a3e43c5cd913d45b34d137bbecfb806d559cb6e7 Mon Sep 17 00:00:00 2001
From: ph818 <71797925+ph818@users.noreply.github.com>
Date: Sat, 17 Jan 2026 17:22:42 -0500
Subject: [PATCH 005/164] Update readme.md
Clarifying the Instructions for DNS-challenge so following the links will make more sense (configuring the caddyfile of the external caddy reverse proxy).
Signed-off-by: ph818 <71797925+ph818@users.noreply.github.com>
---
readme.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
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.
From 4a65c04e3d7410109ca35121c6aedd0d8e4f0986 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 19 Jan 2026 04:28:14 +0000
Subject: [PATCH 006/164] build(deps): bump docker in
/Containers/mastercontainer
Bumps docker from 29.1.4-cli to 29.1.5-cli.
---
updated-dependencies:
- dependency-name: docker
dependency-version: 29.1.5-cli
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot]
---
Containers/mastercontainer/Dockerfile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Containers/mastercontainer/Dockerfile b/Containers/mastercontainer/Dockerfile
index d2019e49..a719c71a 100644
--- a/Containers/mastercontainer/Dockerfile
+++ b/Containers/mastercontainer/Dockerfile
@@ -1,6 +1,6 @@
# 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 9822a63c44dc965a202b539fcacb2ad9339243c3 Mon Sep 17 00:00:00 2001
From: "Simon L."
Date: Mon, 19 Jan 2026 10:07:52 +0100
Subject: [PATCH 007/164] nextcloud-entrypoint: make recording server dependent
on `REMOVE_DISABLED_APPS`
Signed-off-by: Simon L.
---
Containers/nextcloud/entrypoint.sh | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
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
From 0e22f38d16b4a1a0eb375ce1945f796d5b40da4d Mon Sep 17 00:00:00 2001
From: "Simon L."
Date: Mon, 19 Jan 2026 10:25:14 +0100
Subject: [PATCH 008/164] add `wud.watch=false` to all containers
Signed-off-by: Simon L.
---
Containers/apache/Dockerfile | 1 +
Containers/borgbackup/Dockerfile | 1 +
Containers/clamav/Dockerfile | 1 +
Containers/collabora-online/Dockerfile | 1 +
Containers/collabora/Dockerfile | 1 +
Containers/docker-socket-proxy/Dockerfile | 1 +
Containers/domaincheck/Dockerfile | 1 +
Containers/fulltextsearch/Dockerfile | 1 +
Containers/imaginary/Dockerfile | 3 ++-
Containers/nextcloud/Dockerfile | 1 +
Containers/notify-push/Dockerfile | 1 +
Containers/onlyoffice/Dockerfile | 1 +
Containers/postgresql/Dockerfile | 1 +
Containers/redis/Dockerfile | 1 +
Containers/talk-recording/Dockerfile | 1 +
Containers/talk/Dockerfile | 1 +
Containers/watchtower/Dockerfile | 1 +
Containers/whiteboard/Dockerfile | 1 +
php/src/Docker/DockerActionManager.php | 2 +-
19 files changed, 20 insertions(+), 2 deletions(-)
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..04f190b5 100644
--- a/Containers/imaginary/Dockerfile
+++ b/Containers/imaginary/Dockerfile
@@ -1,7 +1,7 @@
# syntax=docker/dockerfile:latest
FROM golang:1.25.5-alpine3.23 AS go
-ENV IMAGINARY_HASH=6a274b488759a896aff02f52afee6e50b5e3a3ee
+ENV IMAGINARY_HASH=6a274b488759a896aff02f52afee6e50b5e3a3ee
RUN set -ex; \
apk upgrade --no-cache -a; \
@@ -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/nextcloud/Dockerfile b/Containers/nextcloud/Dockerfile
index 9c468bbb..afb3def5 100644
--- a/Containers/nextcloud/Dockerfile
+++ b/Containers/nextcloud/Dockerfile
@@ -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/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..6b948c9b 100644
--- a/Containers/watchtower/Dockerfile
+++ b/Containers/watchtower/Dockerfile
@@ -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..0a45981d 100644
--- a/Containers/whiteboard/Dockerfile
+++ b/Containers/whiteboard/Dockerfile
@@ -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/php/src/Docker/DockerActionManager.php b/php/src/Docker/DockerActionManager.php
index 9e8a8ff2..99264d54 100644
--- a/php/src/Docker/DockerActionManager.php
+++ b/php/src/Docker/DockerActionManager.php
@@ -434,7 +434,7 @@ 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();
From c5b146f84c1b517d956cc5e1796f953b8381e385 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 20 Jan 2026 04:08:44 +0000
Subject: [PATCH 009/164] build(deps): bump golang in /Containers/imaginary
Bumps golang from 1.25.5-alpine3.23 to 1.25.6-alpine3.23.
---
updated-dependencies:
- dependency-name: golang
dependency-version: 1.25.6-alpine3.23
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot]
---
Containers/imaginary/Dockerfile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Containers/imaginary/Dockerfile b/Containers/imaginary/Dockerfile
index 11250a43..a0c583e0 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
From dbabfe14f0b35d0d6df9e16dd09d626888ae602d Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 20 Jan 2026 04:09:56 +0000
Subject: [PATCH 010/164] build(deps): bump golang in /Containers/watchtower
Bumps golang from 1.25.5-alpine3.23 to 1.25.6-alpine3.23.
---
updated-dependencies:
- dependency-name: golang
dependency-version: 1.25.6-alpine3.23
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot]
---
Containers/watchtower/Dockerfile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Containers/watchtower/Dockerfile b/Containers/watchtower/Dockerfile
index cd5238ac..2ee06f51 100644
--- a/Containers/watchtower/Dockerfile
+++ b/Containers/watchtower/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 WATCHTOWER_COMMIT_HASH=f6a7b29c312bec5f389a4fb52259919f0678800b
From f58465f93022b1960428c88d4c5a65c4636aec7d Mon Sep 17 00:00:00 2001
From: "Simon L."
Date: Mon, 19 Jan 2026 15:21:28 +0100
Subject: [PATCH 011/164] DockeractionManager: rewrite `PullImage` function to
re-try 3 times before failing
Signed-off-by: Simon L.
---
php/src/Docker/DockerActionManager.php | 26 ++++++++++++++++++--------
1 file changed, 18 insertions(+), 8 deletions(-)
diff --git a/php/src/Docker/DockerActionManager.php b/php/src/Docker/DockerActionManager.php
index 9e8a8ff2..34ca4f56 100644
--- a/php/src/Docker/DockerActionManager.php
+++ b/php/src/Docker/DockerActionManager.php
@@ -503,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);
+ }
}
}
}
From b7d63253db7e5d74a83bd0d5f4bd7c51793c8da1 Mon Sep 17 00:00:00 2001
From: "Simon L."
Date: Tue, 20 Jan 2026 11:50:04 +0100
Subject: [PATCH 012/164] postgres.config.php: fix `PDO::MYSQL_ATTR_SSL_CA`
Signed-off-by: Simon L.
---
Containers/nextcloud/config/postgres.config.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
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',
),
);
}
From 88a45d1a8087b8097c257905b91ea77db30f4a6c Mon Sep 17 00:00:00 2001
From: "Simon L."
Date: Tue, 20 Jan 2026 13:20:09 +0100
Subject: [PATCH 013/164] add cooldown to dependabot
Signed-off-by: Simon L.
---
.github/dependabot.yml | 2 ++
1 file changed, 2 insertions(+)
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:
From fcdd000731f025f11f6bcfe26c6e47c46bc64e63 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Wed, 21 Jan 2026 04:10:21 +0000
Subject: [PATCH 014/164] build(deps): bump nextcloud-releases/whiteboard
Bumps nextcloud-releases/whiteboard from v1.5.1 to v1.5.3.
---
updated-dependencies:
- dependency-name: nextcloud-releases/whiteboard
dependency-version: v1.5.3
dependency-type: direct:production
...
Signed-off-by: dependabot[bot]
---
Containers/whiteboard/Dockerfile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Containers/whiteboard/Dockerfile b/Containers/whiteboard/Dockerfile
index 37ba25e0..31500313 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; \
From 3b3eea7ef02e7bf5f11dc632cfc3b654d101859f Mon Sep 17 00:00:00 2001
From: "Simon L."
Date: Wed, 21 Jan 2026 10:54:39 +0100
Subject: [PATCH 015/164] don't ask for a cute anmial picture
Signed-off-by: Simon L.
---
.github/ISSUE_TEMPLATE/Bug_report.md | 2 --
1 file changed, 2 deletions(-)
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
From 2c968917ebcac51b6c0a6cc033fde63e8fb72cc7 Mon Sep 17 00:00:00 2001
From: szaimen <42591237+szaimen@users.noreply.github.com>
Date: Wed, 21 Jan 2026 12:03:53 +0000
Subject: [PATCH 016/164] php dependency updates
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
---
php/composer.lock | 48 +++++++++++++++++++++++------------------------
1 file changed, 24 insertions(+), 24 deletions(-)
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",
From b12c36f675274fd159ead5b19f7c74adf83302d7 Mon Sep 17 00:00:00 2001
From: szaimen <42591237+szaimen@users.noreply.github.com>
Date: Wed, 21 Jan 2026 12:12:48 +0000
Subject: [PATCH 017/164] watchtower-update automated change
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
---
Containers/watchtower/Dockerfile | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Containers/watchtower/Dockerfile b/Containers/watchtower/Dockerfile
index cd5238ac..0aeb6fd7 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
-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
From 708e542270df92a7baf4e01fc314bb45054f8183 Mon Sep 17 00:00:00 2001
From: szaimen <42591237+szaimen@users.noreply.github.com>
Date: Wed, 21 Jan 2026 12:16:29 +0000
Subject: [PATCH 018/164] nextcloud-update automated change
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
---
Containers/nextcloud/Dockerfile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Containers/nextcloud/Dockerfile b/Containers/nextcloud/Dockerfile
index 9c468bbb..6968ac31 100644
--- a/Containers/nextcloud/Dockerfile
+++ b/Containers/nextcloud/Dockerfile
@@ -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.4
+ENV NEXTCLOUD_VERSION=32.0.5
ENV AIO_TOKEN=123456
ENV AIO_URL=localhost
# AIO settings end # Do not remove or change this line!
From f59b2776c796ea4216ec8c6d5063ba5fb877e0dd Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 22 Jan 2026 04:08:30 +0000
Subject: [PATCH 019/164] build(deps): bump php in /Containers/mastercontainer
Bumps php from 8.4.16-fpm-alpine3.23 to 8.4.17-fpm-alpine3.23.
---
updated-dependencies:
- dependency-name: php
dependency-version: 8.4.17-fpm-alpine3.23
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot]
---
Containers/mastercontainer/Dockerfile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Containers/mastercontainer/Dockerfile b/Containers/mastercontainer/Dockerfile
index d2019e49..ed930781 100644
--- a/Containers/mastercontainer/Dockerfile
+++ b/Containers/mastercontainer/Dockerfile
@@ -6,7 +6,7 @@ FROM docker:29.1.4-cli AS docker
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
From 8eed705a906351ed15e8f379650e1c6d22021d44 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 22 Jan 2026 04:08:35 +0000
Subject: [PATCH 020/164] build(deps): bump php in /Containers/nextcloud
Bumps php from 8.3.29-fpm-alpine3.23 to 8.3.30-fpm-alpine3.23.
---
updated-dependencies:
- dependency-name: php
dependency-version: 8.3.30-fpm-alpine3.23
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot]
---
Containers/nextcloud/Dockerfile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Containers/nextcloud/Dockerfile b/Containers/nextcloud/Dockerfile
index 9c468bbb..f3181a05 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
From a7c091a5b26835db3ca579e9266fa02cc37172d0 Mon Sep 17 00:00:00 2001
From: "Simon L."
Date: Thu, 22 Jan 2026 12:21:26 +0100
Subject: [PATCH 021/164] mastercontainer: also add `wud.watch` label
Signed-off-by: Simon L.
---
Containers/mastercontainer/Dockerfile | 1 +
1 file changed, 1 insertion(+)
diff --git a/Containers/mastercontainer/Dockerfile b/Containers/mastercontainer/Dockerfile
index e92d0a86..2fea59d1 100644
--- a/Containers/mastercontainer/Dockerfile
+++ b/Containers/mastercontainer/Dockerfile
@@ -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
From 8fb3126ce7e11bdc9d6d2f7c609478ce72c89848 Mon Sep 17 00:00:00 2001
From: "Simon L."
Date: Wed, 21 Jan 2026 14:30:23 +0100
Subject: [PATCH 022/164] `CreateContainer`: also insert the max shutdown time
into the container itself
Signed-off-by: Simon L.
---
php/src/Docker/DockerActionManager.php | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/php/src/Docker/DockerActionManager.php b/php/src/Docker/DockerActionManager.php
index 1743c4a5..fb3701a4 100644
--- a/php/src/Docker/DockerActionManager.php
+++ b/php/src/Docker/DockerActionManager.php
@@ -356,6 +356,11 @@ readonly class DockerActionManager {
$requestBody['HostConfig']['Init'] = $container->init;
+ $maxShutDownTime = $container->maxShutdownTime;
+ if ($maxShutDownTime > 0) {
+ $requestBody['StopTimeout'] = $maxShutDownTime;
+ }
+
$capAdds = $container->capAdd;
if (count($capAdds) > 0) {
$requestBody['HostConfig']['CapAdd'] = $capAdds;
From 00688a52bd9e85768398eb01c8389f940233268d Mon Sep 17 00:00:00 2001
From: szaimen <42591237+szaimen@users.noreply.github.com>
Date: Thu, 22 Jan 2026 13:12:02 +0000
Subject: [PATCH 023/164] Helm Chart updates
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
---
nextcloud-aio-helm-chart/Chart.yaml | 2 +-
.../templates/nextcloud-aio-apache-deployment.yaml | 6 +++---
.../templates/nextcloud-aio-apache-service.yaml | 2 +-
.../templates/nextcloud-aio-clamav-deployment.yaml | 8 ++++----
.../templates/nextcloud-aio-clamav-service.yaml | 2 +-
.../templates/nextcloud-aio-collabora-deployment.yaml | 8 ++++----
.../templates/nextcloud-aio-collabora-service.yaml | 2 +-
.../templates/nextcloud-aio-database-deployment.yaml | 8 ++++----
.../templates/nextcloud-aio-database-service.yaml | 2 +-
.../nextcloud-aio-fulltextsearch-deployment.yaml | 8 ++++----
.../templates/nextcloud-aio-fulltextsearch-service.yaml | 2 +-
.../templates/nextcloud-aio-imaginary-deployment.yaml | 6 +++---
.../templates/nextcloud-aio-imaginary-service.yaml | 2 +-
.../templates/nextcloud-aio-nextcloud-deployment.yaml | 8 ++++----
.../templates/nextcloud-aio-nextcloud-service.yaml | 2 +-
.../templates/nextcloud-aio-notify-push-deployment.yaml | 6 +++---
.../templates/nextcloud-aio-notify-push-service.yaml | 2 +-
.../templates/nextcloud-aio-onlyoffice-deployment.yaml | 8 ++++----
.../templates/nextcloud-aio-onlyoffice-service.yaml | 2 +-
.../templates/nextcloud-aio-redis-deployment.yaml | 6 +++---
.../templates/nextcloud-aio-redis-service.yaml | 2 +-
.../templates/nextcloud-aio-talk-deployment.yaml | 6 +++---
.../nextcloud-aio-talk-recording-deployment.yaml | 6 +++---
.../templates/nextcloud-aio-talk-recording-service.yaml | 2 +-
.../templates/nextcloud-aio-talk-service.yaml | 4 ++--
.../templates/nextcloud-aio-whiteboard-deployment.yaml | 6 +++---
.../templates/nextcloud-aio-whiteboard-service.yaml | 2 +-
27 files changed, 60 insertions(+), 60 deletions(-)
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
From c47ace7718a790c01e631ec3b4398293a298fa11 Mon Sep 17 00:00:00 2001
From: szaimen <42591237+szaimen@users.noreply.github.com>
Date: Thu, 22 Jan 2026 13:33:38 +0000
Subject: [PATCH 024/164] imaginary-update automated change
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
---
Containers/imaginary/Dockerfile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Containers/imaginary/Dockerfile b/Containers/imaginary/Dockerfile
index 0a0c14ce..650c4c67 100644
--- a/Containers/imaginary/Dockerfile
+++ b/Containers/imaginary/Dockerfile
@@ -1,7 +1,7 @@
# syntax=docker/dockerfile:latest
FROM golang:1.25.6-alpine3.23 AS go
-ENV IMAGINARY_HASH=6a274b488759a896aff02f52afee6e50b5e3a3ee
+ENV IMAGINARY_HASH=6a274b488759a896aff02f52afee6e50b5e3a3ee
RUN set -ex; \
apk upgrade --no-cache -a; \
From 664ca0b26d0e69e1ebda9ea2010113b1f63b4d90 Mon Sep 17 00:00:00 2001
From: Jean-Yves <7360784+docjyJ@users.noreply.github.com>
Date: Thu, 22 Jan 2026 21:08:08 +0100
Subject: [PATCH 025/164] Add Code of conduct
See: https://github.com/nextcloud/server/blob/master/CODE_OF_CONDUCT.md
Signed-off-by: Jean-Yves <7360784+docjyJ@users.noreply.github.com>
---
CODE_OF_CONDUCT.md | 13 +++++++++++++
1 file changed, 13 insertions(+)
create mode 100644 CODE_OF_CONDUCT.md
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
new file mode 100644
index 00000000..fec85a59
--- /dev/null
+++ b/CODE_OF_CONDUCT.md
@@ -0,0 +1,13 @@
+
+In the Nextcloud community, participants from all over the world come together to create Free Software for a free internet. This is made possible by the support, hard work and enthusiasm of thousands of people, including those who create and use Nextcloud software.
+
+Our code of conduct offers some guidance to ensure Nextcloud participants can cooperate effectively in a positive and inspiring atmosphere, and to explain how together we can strengthen and support each other.
+
+The Code of Conduct is shared by all contributors and users who engage with the Nextcloud team and its community services. It presents a summary of the shared values and “common sense” thinking in our community.
+
+You can find our full code of conduct on our website: https://nextcloud.com/code-of-conduct/
+
+Please, keep our CoC in mind when you contribute! That way, everyone can be a part of our community in a productive, positive, creative and fun way.
From 89be3d9e234af8db8c07847539b6ae8354e16b29 Mon Sep 17 00:00:00 2001
From: Jean-Yves <7360784+docjyJ@users.noreply.github.com>
Date: Thu, 22 Jan 2026 21:12:39 +0100
Subject: [PATCH 026/164] Add files via upload
Signed-off-by: Jean-Yves <7360784+docjyJ@users.noreply.github.com>
---
.github/pull_request_template.md | 25 +++++++++++++++++++++++++
1 file changed, 25 insertions(+)
create mode 100644 .github/pull_request_template.md
diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
new file mode 100644
index 00000000..7958ceab
--- /dev/null
+++ b/.github/pull_request_template.md
@@ -0,0 +1,25 @@
+
+
+* Resolves: #
+
+## Summary
+
+
+## TODO
+
+- [ ] ...
+
+## Checklist
+
+- Code is [properly formatted](https://docs.nextcloud.com/server/latest/developer_manual/digging_deeper/continuous_integration.html#linting)
+- [Sign-off message](https://github.com/src-d/guide/blob/master/developer-community/fix-DCO.md) is added to all commits
+- [ ] Tests ([unit](https://docs.nextcloud.com/server/latest/developer_manual/app_development/tutorial.html#unit-tests), [integration](https://docs.nextcloud.com/server/latest/developer_manual/app_development/tutorial.html#integration-tests), api and/or acceptance) are included
+- [ ] Screenshots before/after for front-end changes
+- [ ] Documentation ([manuals](https://github.com/nextcloud/documentation/) or wiki) has been updated or is not required
+- [ ] [Backports requested](https://github.com/nextcloud/backportbot/#usage) where applicable (ex: critical bugfixes)
+- [ ] [Labels added](https://github.com/nextcloud/server/labels) where applicable (ex: bug/enhancement, `3. to review`, feature component)
+- [ ] [Milestone added](https://github.com/nextcloud/server/milestones) for target branch/version (ex: 32.x for `stable32`)
From db07c79db1cc692903a637cb0cadd5d9b79755ca Mon Sep 17 00:00:00 2001
From: Jean-Yves <7360784+docjyJ@users.noreply.github.com>
Date: Thu, 22 Jan 2026 21:20:36 +0100
Subject: [PATCH 027/164] novodb: add (deprecated) to its display name
Signed-off-by: Jean-Yves <7360784+docjyJ@users.noreply.github.com>
---
community-containers/nocodb/nocodb.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/community-containers/nocodb/nocodb.json b/community-containers/nocodb/nocodb.json
index 7ef4cc5c..e93d173c 100644
--- a/community-containers/nocodb/nocodb.json
+++ b/community-containers/nocodb/nocodb.json
@@ -2,7 +2,7 @@
"aio_services_v1": [
{
"container_name": "nextcloud-aio-nocodb",
- "display_name": "NocoDB",
+ "display_name": "NocoDB (deprecated)",
"documentation": "https://github.com/nextcloud/all-in-one/tree/main/community-containers/nocodb",
"image": "nocodb/nocodb",
"image_tag": "latest",
From e1718faf0b4364283a4925a8b7163511f272ffae Mon Sep 17 00:00:00 2001
From: Jean-Yves <7360784+docjyJ@users.noreply.github.com>
Date: Thu, 22 Jan 2026 21:24:35 +0100
Subject: [PATCH 028/164] Update README with licensing and maintenance notes
Added caution and note about NocoDB licensing and maintenance status.
Signed-off-by: Jean-Yves <7360784+docjyJ@users.noreply.github.com>
---
community-containers/nocodb/readme.md | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/community-containers/nocodb/readme.md b/community-containers/nocodb/readme.md
index 4c1281b5..fa23f8f6 100644
--- a/community-containers/nocodb/readme.md
+++ b/community-containers/nocodb/readme.md
@@ -1,3 +1,8 @@
+> [!CAUTION]
+> NocoDB is licensed under a non-free license.
+>
+> And is no longer maintained.
+
> [!NOTE]
> This container is there to compensate for the lack of functionality in Nextcloud Tables.
>
From 0e868c4570826497fd32b24d3d4bbd7d03d6557d Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Fri, 23 Jan 2026 12:08:36 +0000
Subject: [PATCH 029/164] build(deps): bump actions/checkout in
/.github/workflows
Bumps [actions/checkout](https://github.com/actions/checkout) from 6.0.1 to 6.0.2.
- [Release notes](https://github.com/actions/checkout/releases)
- [Commits](https://github.com/actions/checkout/compare/v6.0.1...v6.0.2)
---
updated-dependencies:
- dependency-name: actions/checkout
dependency-version: 6.0.2
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot]
---
.github/workflows/codespell.yml | 2 +-
.github/workflows/collabora.yml | 2 +-
.github/workflows/community-containers.yml | 2 +-
.github/workflows/dependency-updates.yml | 2 +-
.github/workflows/docker-lint.yml | 2 +-
.github/workflows/helm-release.yml | 2 +-
.github/workflows/imaginary-update.yml | 2 +-
.github/workflows/json-validator.yml | 2 +-
.github/workflows/lint-helm.yml | 2 +-
.github/workflows/lint-php.yml | 2 +-
.github/workflows/lint-yaml.yml | 2 +-
.github/workflows/nextcloud-update.yml | 2 +-
.github/workflows/php-deprecation-detector.yml | 2 +-
.github/workflows/playwright-on-push.yml | 2 +-
.github/workflows/playwright-on-workflow-dispatch.yml | 2 +-
.github/workflows/psalm-update-baseline.yml | 2 +-
.github/workflows/psalm.yml | 2 +-
.github/workflows/shellcheck.yml | 2 +-
.github/workflows/talk.yml | 2 +-
.github/workflows/twig-lint.yml | 2 +-
.github/workflows/update-copyright.yml | 2 +-
.github/workflows/update-helm.yml | 2 +-
.github/workflows/update-yaml.yml | 2 +-
.github/workflows/watchtower-update.yml | 2 +-
24 files changed, 24 insertions(+), 24 deletions(-)
diff --git a/.github/workflows/codespell.yml b/.github/workflows/codespell.yml
index 2bd4823a..2fff5ddb 100644
--- a/.github/workflows/codespell.yml
+++ b/.github/workflows/codespell.yml
@@ -12,7 +12,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Check out code
- uses: actions/checkout@v6.0.1
+ uses: actions/checkout@v6.0.2
- name: Check spelling
uses: codespell-project/actions-codespell@8f01853be192eb0f849a5c7d721450e7a467c579 # v2
with:
diff --git a/.github/workflows/collabora.yml b/.github/workflows/collabora.yml
index 8e464925..abf5d520 100644
--- a/.github/workflows/collabora.yml
+++ b/.github/workflows/collabora.yml
@@ -10,7 +10,7 @@ jobs:
name: update collabora
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v6.0.1
+ - uses: actions/checkout@v6.0.2
- name: Run collabora-profile-update
run: |
rm -f php/cool-seccomp-profile.json
diff --git a/.github/workflows/community-containers.yml b/.github/workflows/community-containers.yml
index 7446677f..cfe35ee0 100644
--- a/.github/workflows/community-containers.yml
+++ b/.github/workflows/community-containers.yml
@@ -16,7 +16,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout code
- uses: actions/checkout@v6.0.1
+ uses: actions/checkout@v6.0.2
- name: Validate structure
run: |
CONTAINERS="$(find ./community-containers -mindepth 1 -maxdepth 1 -type d)"
diff --git a/.github/workflows/dependency-updates.yml b/.github/workflows/dependency-updates.yml
index 1b448139..3a40363b 100644
--- a/.github/workflows/dependency-updates.yml
+++ b/.github/workflows/dependency-updates.yml
@@ -10,7 +10,7 @@ jobs:
name: Run dependency update script
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v6.0.1
+ - uses: actions/checkout@v6.0.2
- uses: shivammathur/setup-php@7bf05c6b704e0b9bfee22300130a31b5ea68d593 # v2
with:
php-version: 8.4
diff --git a/.github/workflows/docker-lint.yml b/.github/workflows/docker-lint.yml
index 917df1d6..b9ce68ef 100644
--- a/.github/workflows/docker-lint.yml
+++ b/.github/workflows/docker-lint.yml
@@ -25,7 +25,7 @@ jobs:
steps:
- name: Checkout
- uses: actions/checkout@v6.0.1
+ uses: actions/checkout@v6.0.2
- name: Install hadolint
run: |
diff --git a/.github/workflows/helm-release.yml b/.github/workflows/helm-release.yml
index a4f441c2..f621f229 100644
--- a/.github/workflows/helm-release.yml
+++ b/.github/workflows/helm-release.yml
@@ -13,7 +13,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
- uses: actions/checkout@v6.0.1
+ uses: actions/checkout@v6.0.2
- name: Turnstyle
uses: softprops/turnstyle@e565d2d86403c5d23533937e95980570545e5586 # v2
diff --git a/.github/workflows/imaginary-update.yml b/.github/workflows/imaginary-update.yml
index 060b376e..7440a09f 100644
--- a/.github/workflows/imaginary-update.yml
+++ b/.github/workflows/imaginary-update.yml
@@ -10,7 +10,7 @@ jobs:
name: update to latest imaginary commit on master branch
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v6.0.1
+ - uses: actions/checkout@v6.0.2
- name: Run imaginary-update
run: |
# Imaginary
diff --git a/.github/workflows/json-validator.yml b/.github/workflows/json-validator.yml
index 4cbd28ed..4213296b 100644
--- a/.github/workflows/json-validator.yml
+++ b/.github/workflows/json-validator.yml
@@ -16,7 +16,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout code
- uses: actions/checkout@v6.0.1
+ uses: actions/checkout@v6.0.2
- name: Validate Json
run: |
sudo apt-get update
diff --git a/.github/workflows/lint-helm.yml b/.github/workflows/lint-helm.yml
index 7beec865..1ea877a6 100644
--- a/.github/workflows/lint-helm.yml
+++ b/.github/workflows/lint-helm.yml
@@ -11,7 +11,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
- uses: actions/checkout@v6.0.1
+ uses: actions/checkout@v6.0.2
with:
fetch-depth: 0
diff --git a/.github/workflows/lint-php.yml b/.github/workflows/lint-php.yml
index 0c5e2c74..12cba439 100644
--- a/.github/workflows/lint-php.yml
+++ b/.github/workflows/lint-php.yml
@@ -36,7 +36,7 @@ jobs:
steps:
- name: Checkout
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v5.0.1
+ uses: actions/checkout@0c366fd6a839edf440554fa01a7085ccba70ac98 # v5.0.1
with:
persist-credentials: false
diff --git a/.github/workflows/lint-yaml.yml b/.github/workflows/lint-yaml.yml
index 3bb1d33f..010077ca 100644
--- a/.github/workflows/lint-yaml.yml
+++ b/.github/workflows/lint-yaml.yml
@@ -24,7 +24,7 @@ jobs:
steps:
- name: Checkout
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
+ uses: actions/checkout@0c366fd6a839edf440554fa01a7085ccba70ac98 # v6.0.1
with:
persist-credentials: false
diff --git a/.github/workflows/nextcloud-update.yml b/.github/workflows/nextcloud-update.yml
index 7fe5bbf9..b96ac2b9 100644
--- a/.github/workflows/nextcloud-update.yml
+++ b/.github/workflows/nextcloud-update.yml
@@ -11,7 +11,7 @@ jobs:
name: Run nextcloud-update script
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v6.0.1
+ - uses: actions/checkout@v6.0.2
- name: Run nextcloud-update script
run: |
# Inspired by https://github.com/nextcloud/docker/blob/master/update.sh
diff --git a/.github/workflows/php-deprecation-detector.yml b/.github/workflows/php-deprecation-detector.yml
index c8638683..ee35830c 100644
--- a/.github/workflows/php-deprecation-detector.yml
+++ b/.github/workflows/php-deprecation-detector.yml
@@ -16,7 +16,7 @@ jobs:
name: PHP Deprecation Detector
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v6.0.1
+ - uses: actions/checkout@v6.0.2
- name: Set up php
uses: shivammathur/setup-php@7bf05c6b704e0b9bfee22300130a31b5ea68d593 # v2
with:
diff --git a/.github/workflows/playwright-on-push.yml b/.github/workflows/playwright-on-push.yml
index af8dec02..28ba7d9c 100644
--- a/.github/workflows/playwright-on-push.yml
+++ b/.github/workflows/playwright-on-push.yml
@@ -24,7 +24,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v6.0.1
+ - uses: actions/checkout@v6.0.2
- uses: actions/setup-node@v6
with:
diff --git a/.github/workflows/playwright-on-workflow-dispatch.yml b/.github/workflows/playwright-on-workflow-dispatch.yml
index 252a6510..483811f2 100644
--- a/.github/workflows/playwright-on-workflow-dispatch.yml
+++ b/.github/workflows/playwright-on-workflow-dispatch.yml
@@ -13,7 +13,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v6.0.1
+ - uses: actions/checkout@v6.0.2
- uses: actions/setup-node@v6
with:
diff --git a/.github/workflows/psalm-update-baseline.yml b/.github/workflows/psalm-update-baseline.yml
index 1bd47ac4..14715108 100644
--- a/.github/workflows/psalm-update-baseline.yml
+++ b/.github/workflows/psalm-update-baseline.yml
@@ -10,7 +10,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v6.0.1
+ - uses: actions/checkout@v6.0.2
- name: Set up php
uses: shivammathur/setup-php@7bf05c6b704e0b9bfee22300130a31b5ea68d593 # v2
diff --git a/.github/workflows/psalm.yml b/.github/workflows/psalm.yml
index bdae585e..cbc77bf5 100644
--- a/.github/workflows/psalm.yml
+++ b/.github/workflows/psalm.yml
@@ -32,7 +32,7 @@ jobs:
name: static-psalm-analysis
steps:
- name: Checkout
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v5.0.1
+ uses: actions/checkout@0c366fd6a839edf440554fa01a7085ccba70ac98 # v5.0.1
with:
persist-credentials: false
diff --git a/.github/workflows/shellcheck.yml b/.github/workflows/shellcheck.yml
index 86954033..0ef69085 100644
--- a/.github/workflows/shellcheck.yml
+++ b/.github/workflows/shellcheck.yml
@@ -15,7 +15,7 @@ jobs:
name: Check Shell
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v6.0.1
+ - uses: actions/checkout@v6.0.2
- name: Run Shellcheck
uses: ludeeus/action-shellcheck@00cae500b08a931fb5698e11e79bfbd38e612a38 # v2.0.0
with:
diff --git a/.github/workflows/talk.yml b/.github/workflows/talk.yml
index f28ad9f2..c1b96d24 100644
--- a/.github/workflows/talk.yml
+++ b/.github/workflows/talk.yml
@@ -10,7 +10,7 @@ jobs:
name: update talk
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v6.0.1
+ - uses: actions/checkout@v6.0.2
- name: Run talk-container-update
run: |
# Recording
diff --git a/.github/workflows/twig-lint.yml b/.github/workflows/twig-lint.yml
index 7e9b5cdc..3b04704d 100644
--- a/.github/workflows/twig-lint.yml
+++ b/.github/workflows/twig-lint.yml
@@ -24,7 +24,7 @@ jobs:
steps:
- name: Checkout
- uses: actions/checkout@v6.0.1
+ uses: actions/checkout@v6.0.2
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@7bf05c6b704e0b9bfee22300130a31b5ea68d593 # v2
diff --git a/.github/workflows/update-copyright.yml b/.github/workflows/update-copyright.yml
index f7960ead..95329d3c 100644
--- a/.github/workflows/update-copyright.yml
+++ b/.github/workflows/update-copyright.yml
@@ -8,4 +8,4 @@ jobs:
name: update copyright
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v6.0.1
+ - uses: actions/checkout@v6.0.2
diff --git a/.github/workflows/update-helm.yml b/.github/workflows/update-helm.yml
index ee8e4669..2f441735 100644
--- a/.github/workflows/update-helm.yml
+++ b/.github/workflows/update-helm.yml
@@ -11,7 +11,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout code
- uses: actions/checkout@v6.0.1
+ uses: actions/checkout@v6.0.2
- name: update helm chart
run: |
set -x
diff --git a/.github/workflows/update-yaml.yml b/.github/workflows/update-yaml.yml
index ba92fd50..41b0adf2 100644
--- a/.github/workflows/update-yaml.yml
+++ b/.github/workflows/update-yaml.yml
@@ -11,7 +11,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout code
- uses: actions/checkout@v6.0.1
+ uses: actions/checkout@v6.0.2
- name: update yaml files
run: |
sudo bash manual-install/update-yaml.sh
diff --git a/.github/workflows/watchtower-update.yml b/.github/workflows/watchtower-update.yml
index be929285..b26cd1a4 100644
--- a/.github/workflows/watchtower-update.yml
+++ b/.github/workflows/watchtower-update.yml
@@ -10,7 +10,7 @@ jobs:
name: update watchtower
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v6.0.1
+ - uses: actions/checkout@v6.0.2
- name: Run watchtower-container-update
run: |
# Watchtower
From d2940b0dc8d3c92d9647c4faf101b4e19e37b6d1 Mon Sep 17 00:00:00 2001
From: szaimen <42591237+szaimen@users.noreply.github.com>
Date: Sat, 24 Jan 2026 12:03:23 +0000
Subject: [PATCH 030/164] php dependency updates
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
---
php/composer.lock | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/php/composer.lock b/php/composer.lock
index 75e53dfe..30c13df6 100644
--- a/php/composer.lock
+++ b/php/composer.lock
@@ -1644,16 +1644,16 @@
},
{
"name": "twig/twig",
- "version": "v3.22.2",
+ "version": "v3.23.0",
"source": {
"type": "git",
"url": "https://github.com/twigphp/Twig.git",
- "reference": "946ddeafa3c9f4ce279d1f34051af041db0e16f2"
+ "reference": "a64dc5d2cc7d6cafb9347f6cd802d0d06d0351c9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/twigphp/Twig/zipball/946ddeafa3c9f4ce279d1f34051af041db0e16f2",
- "reference": "946ddeafa3c9f4ce279d1f34051af041db0e16f2",
+ "url": "https://api.github.com/repos/twigphp/Twig/zipball/a64dc5d2cc7d6cafb9347f6cd802d0d06d0351c9",
+ "reference": "a64dc5d2cc7d6cafb9347f6cd802d0d06d0351c9",
"shasum": ""
},
"require": {
@@ -1707,7 +1707,7 @@
],
"support": {
"issues": "https://github.com/twigphp/Twig/issues",
- "source": "https://github.com/twigphp/Twig/tree/v3.22.2"
+ "source": "https://github.com/twigphp/Twig/tree/v3.23.0"
},
"funding": [
{
@@ -1719,7 +1719,7 @@
"type": "tidelift"
}
],
- "time": "2025-12-14T11:28:47+00:00"
+ "time": "2026-01-23T21:00:41+00:00"
}
],
"packages-dev": [
From 7e2e0d11daf517a303da09ac4906d032697220d5 Mon Sep 17 00:00:00 2001
From: szaimen <42591237+szaimen@users.noreply.github.com>
Date: Sun, 25 Jan 2026 12:03:33 +0000
Subject: [PATCH 031/164] php dependency updates
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
---
php/composer.lock | 36 ++++++++++++++++++------------------
1 file changed, 18 insertions(+), 18 deletions(-)
diff --git a/php/composer.lock b/php/composer.lock
index 30c13df6..42bc1415 100644
--- a/php/composer.lock
+++ b/php/composer.lock
@@ -3890,16 +3890,16 @@
},
{
"name": "symfony/console",
- "version": "v6.4.31",
+ "version": "v6.4.32",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
- "reference": "f9f8a889f54c264f9abac3fc0f7a371ffca51997"
+ "reference": "0bc2199c6c1f05276b05956f1ddc63f6d7eb5fc3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/console/zipball/f9f8a889f54c264f9abac3fc0f7a371ffca51997",
- "reference": "f9f8a889f54c264f9abac3fc0f7a371ffca51997",
+ "url": "https://api.github.com/repos/symfony/console/zipball/0bc2199c6c1f05276b05956f1ddc63f6d7eb5fc3",
+ "reference": "0bc2199c6c1f05276b05956f1ddc63f6d7eb5fc3",
"shasum": ""
},
"require": {
@@ -3964,7 +3964,7 @@
"terminal"
],
"support": {
- "source": "https://github.com/symfony/console/tree/v6.4.31"
+ "source": "https://github.com/symfony/console/tree/v6.4.32"
},
"funding": [
{
@@ -3984,7 +3984,7 @@
"type": "tidelift"
}
],
- "time": "2025-12-22T08:30:34+00:00"
+ "time": "2026-01-13T08:45:59+00:00"
},
{
"name": "symfony/filesystem",
@@ -4058,16 +4058,16 @@
},
{
"name": "symfony/finder",
- "version": "v6.4.31",
+ "version": "v6.4.32",
"source": {
"type": "git",
"url": "https://github.com/symfony/finder.git",
- "reference": "5547f2e1f0ca8e2e7abe490156b62da778cfbe2b"
+ "reference": "3ec24885c1d9ababbb9c8f63bb42fea3c8c9b6de"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/finder/zipball/5547f2e1f0ca8e2e7abe490156b62da778cfbe2b",
- "reference": "5547f2e1f0ca8e2e7abe490156b62da778cfbe2b",
+ "url": "https://api.github.com/repos/symfony/finder/zipball/3ec24885c1d9ababbb9c8f63bb42fea3c8c9b6de",
+ "reference": "3ec24885c1d9ababbb9c8f63bb42fea3c8c9b6de",
"shasum": ""
},
"require": {
@@ -4102,7 +4102,7 @@
"description": "Finds files and directories via an intuitive fluent interface",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/finder/tree/v6.4.31"
+ "source": "https://github.com/symfony/finder/tree/v6.4.32"
},
"funding": [
{
@@ -4122,7 +4122,7 @@
"type": "tidelift"
}
],
- "time": "2025-12-11T14:52:17+00:00"
+ "time": "2026-01-10T14:09:00+00:00"
},
{
"name": "symfony/polyfill-intl-grapheme",
@@ -4460,16 +4460,16 @@
},
{
"name": "symfony/string",
- "version": "v7.4.0",
+ "version": "v7.4.4",
"source": {
"type": "git",
"url": "https://github.com/symfony/string.git",
- "reference": "d50e862cb0a0e0886f73ca1f31b865efbb795003"
+ "reference": "1c4b10461bf2ec27537b5f36105337262f5f5d6f"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/string/zipball/d50e862cb0a0e0886f73ca1f31b865efbb795003",
- "reference": "d50e862cb0a0e0886f73ca1f31b865efbb795003",
+ "url": "https://api.github.com/repos/symfony/string/zipball/1c4b10461bf2ec27537b5f36105337262f5f5d6f",
+ "reference": "1c4b10461bf2ec27537b5f36105337262f5f5d6f",
"shasum": ""
},
"require": {
@@ -4527,7 +4527,7 @@
"utf8"
],
"support": {
- "source": "https://github.com/symfony/string/tree/v7.4.0"
+ "source": "https://github.com/symfony/string/tree/v7.4.4"
},
"funding": [
{
@@ -4547,7 +4547,7 @@
"type": "tidelift"
}
],
- "time": "2025-11-27T13:27:24+00:00"
+ "time": "2026-01-12T10:54:30+00:00"
},
{
"name": "vimeo/psalm",
From 0df6c0a645e1a117978d70e109d676977f5dc243 Mon Sep 17 00:00:00 2001
From: "Simon L."
Date: Sun, 25 Jan 2026 11:41:58 +0100
Subject: [PATCH 032/164] mastercontainer: make check for correct volume name
more strict
Signed-off-by: Simon L.
---
Containers/mastercontainer/start.sh | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Containers/mastercontainer/start.sh b/Containers/mastercontainer/start.sh
index ad1734f1..a65e29ae 100644
--- a/Containers/mastercontainer/start.sh
+++ b/Containers/mastercontainer/start.sh
@@ -166,7 +166,7 @@ elif ! sudo -E -u www-data docker volume ls --format "{{.Name}}" | grep -q "^nex
print_red "It seems like you did not give the mastercontainer volume the correct name? (The 'nextcloud_aio_mastercontainer' volume was not found.)
Using a different name is not supported since the built-in backup solution will not work in that case!"
exit 1
-elif ! sudo -E -u www-data docker inspect nextcloud-aio-mastercontainer | grep -q "nextcloud_aio_mastercontainer"; then
+elif ! sudo -E -u www-data docker inspect nextcloud-aio-mastercontainer --format '{{.Mounts}}' | grep -q " nextcloud_aio_mastercontainer "; then
print_red "It seems like you did not attach the 'nextcloud_aio_mastercontainer' volume to the mastercontainer?
This is not supported since the built-in backup solution will not work in that case!"
exit 1
From ebe3d7ee838a7d74dd1129555ad99a80dfd0c834 Mon Sep 17 00:00:00 2001
From: "Simon L."
Date: Mon, 26 Jan 2026 11:55:19 +0100
Subject: [PATCH 033/164] increase to v12.6.0
Signed-off-by: Simon L.
---
php/templates/includes/aio-version.twig | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/php/templates/includes/aio-version.twig b/php/templates/includes/aio-version.twig
index b7d7205d..062985d4 100644
--- a/php/templates/includes/aio-version.twig
+++ b/php/templates/includes/aio-version.twig
@@ -1 +1 @@
-12.5.0
+12.6.0
From 27eae80466a43ea5e181309fb150730b0283c9a0 Mon Sep 17 00:00:00 2001
From: "Simon L."
Date: Thu, 22 Jan 2026 17:50:28 +0100
Subject: [PATCH 034/164] pin all actions via commit hash
Signed-off-by: Simon L.
---
.github/workflows/codespell.yml | 2 +-
.github/workflows/collabora.yml | 2 +-
.github/workflows/community-containers.yml | 2 +-
.github/workflows/dependency-updates.yml | 2 +-
.github/workflows/docker-lint.yml | 2 +-
.github/workflows/helm-release.yml | 2 +-
.github/workflows/imaginary-update.yml | 2 +-
.github/workflows/json-validator.yml | 2 +-
.github/workflows/lint-helm.yml | 2 +-
.github/workflows/lint-php.yml | 2 +-
.github/workflows/nextcloud-update.yml | 2 +-
.github/workflows/php-deprecation-detector.yml | 2 +-
.github/workflows/playwright-on-push.yml | 6 +++---
.github/workflows/playwright-on-workflow-dispatch.yml | 6 +++---
.github/workflows/psalm-update-baseline.yml | 2 +-
.github/workflows/psalm.yml | 2 +-
.github/workflows/shellcheck.yml | 2 +-
.github/workflows/talk.yml | 2 +-
.github/workflows/twig-lint.yml | 2 +-
.github/workflows/update-copyright.yml | 2 +-
.github/workflows/update-helm.yml | 2 +-
.github/workflows/update-yaml.yml | 2 +-
.github/workflows/watchtower-update.yml | 2 +-
zizmor.yml | 6 ++----
24 files changed, 29 insertions(+), 31 deletions(-)
diff --git a/.github/workflows/codespell.yml b/.github/workflows/codespell.yml
index 2fff5ddb..94af09c8 100644
--- a/.github/workflows/codespell.yml
+++ b/.github/workflows/codespell.yml
@@ -12,7 +12,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Check out code
- uses: actions/checkout@v6.0.2
+ uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- name: Check spelling
uses: codespell-project/actions-codespell@8f01853be192eb0f849a5c7d721450e7a467c579 # v2
with:
diff --git a/.github/workflows/collabora.yml b/.github/workflows/collabora.yml
index abf5d520..39758f3e 100644
--- a/.github/workflows/collabora.yml
+++ b/.github/workflows/collabora.yml
@@ -10,7 +10,7 @@ jobs:
name: update collabora
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v6.0.2
+ - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- name: Run collabora-profile-update
run: |
rm -f php/cool-seccomp-profile.json
diff --git a/.github/workflows/community-containers.yml b/.github/workflows/community-containers.yml
index cfe35ee0..c901358d 100644
--- a/.github/workflows/community-containers.yml
+++ b/.github/workflows/community-containers.yml
@@ -16,7 +16,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout code
- uses: actions/checkout@v6.0.2
+ uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- name: Validate structure
run: |
CONTAINERS="$(find ./community-containers -mindepth 1 -maxdepth 1 -type d)"
diff --git a/.github/workflows/dependency-updates.yml b/.github/workflows/dependency-updates.yml
index 3a40363b..66404af5 100644
--- a/.github/workflows/dependency-updates.yml
+++ b/.github/workflows/dependency-updates.yml
@@ -10,7 +10,7 @@ jobs:
name: Run dependency update script
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v6.0.2
+ - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- uses: shivammathur/setup-php@7bf05c6b704e0b9bfee22300130a31b5ea68d593 # v2
with:
php-version: 8.4
diff --git a/.github/workflows/docker-lint.yml b/.github/workflows/docker-lint.yml
index b9ce68ef..7a5509df 100644
--- a/.github/workflows/docker-lint.yml
+++ b/.github/workflows/docker-lint.yml
@@ -25,7 +25,7 @@ jobs:
steps:
- name: Checkout
- uses: actions/checkout@v6.0.2
+ uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- name: Install hadolint
run: |
diff --git a/.github/workflows/helm-release.yml b/.github/workflows/helm-release.yml
index f621f229..528c6cd3 100644
--- a/.github/workflows/helm-release.yml
+++ b/.github/workflows/helm-release.yml
@@ -13,7 +13,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
- uses: actions/checkout@v6.0.2
+ uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- name: Turnstyle
uses: softprops/turnstyle@e565d2d86403c5d23533937e95980570545e5586 # v2
diff --git a/.github/workflows/imaginary-update.yml b/.github/workflows/imaginary-update.yml
index 7440a09f..e182b073 100644
--- a/.github/workflows/imaginary-update.yml
+++ b/.github/workflows/imaginary-update.yml
@@ -10,7 +10,7 @@ jobs:
name: update to latest imaginary commit on master branch
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v6.0.2
+ - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- name: Run imaginary-update
run: |
# Imaginary
diff --git a/.github/workflows/json-validator.yml b/.github/workflows/json-validator.yml
index 4213296b..68b66812 100644
--- a/.github/workflows/json-validator.yml
+++ b/.github/workflows/json-validator.yml
@@ -16,7 +16,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout code
- uses: actions/checkout@v6.0.2
+ uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- name: Validate Json
run: |
sudo apt-get update
diff --git a/.github/workflows/lint-helm.yml b/.github/workflows/lint-helm.yml
index 1ea877a6..e65d7cdc 100644
--- a/.github/workflows/lint-helm.yml
+++ b/.github/workflows/lint-helm.yml
@@ -11,7 +11,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
- uses: actions/checkout@v6.0.2
+ uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
with:
fetch-depth: 0
diff --git a/.github/workflows/lint-php.yml b/.github/workflows/lint-php.yml
index 12cba439..69c42c2b 100644
--- a/.github/workflows/lint-php.yml
+++ b/.github/workflows/lint-php.yml
@@ -36,7 +36,7 @@ jobs:
steps:
- name: Checkout
- uses: actions/checkout@0c366fd6a839edf440554fa01a7085ccba70ac98 # v5.0.1
+ uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
with:
persist-credentials: false
diff --git a/.github/workflows/nextcloud-update.yml b/.github/workflows/nextcloud-update.yml
index b96ac2b9..aaaa26eb 100644
--- a/.github/workflows/nextcloud-update.yml
+++ b/.github/workflows/nextcloud-update.yml
@@ -11,7 +11,7 @@ jobs:
name: Run nextcloud-update script
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v6.0.2
+ - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- name: Run nextcloud-update script
run: |
# Inspired by https://github.com/nextcloud/docker/blob/master/update.sh
diff --git a/.github/workflows/php-deprecation-detector.yml b/.github/workflows/php-deprecation-detector.yml
index ee35830c..61ae7c0d 100644
--- a/.github/workflows/php-deprecation-detector.yml
+++ b/.github/workflows/php-deprecation-detector.yml
@@ -16,7 +16,7 @@ jobs:
name: PHP Deprecation Detector
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v6.0.2
+ - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- name: Set up php
uses: shivammathur/setup-php@7bf05c6b704e0b9bfee22300130a31b5ea68d593 # v2
with:
diff --git a/.github/workflows/playwright-on-push.yml b/.github/workflows/playwright-on-push.yml
index 28ba7d9c..2eda156e 100644
--- a/.github/workflows/playwright-on-push.yml
+++ b/.github/workflows/playwright-on-push.yml
@@ -24,9 +24,9 @@ jobs:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v6.0.2
+ - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- - uses: actions/setup-node@v6
+ - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6
with:
node-version: lts/*
@@ -114,7 +114,7 @@ jobs:
exit 1
fi
- - uses: actions/upload-artifact@v6
+ - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6
if: ${{ !cancelled() }}
with:
name: playwright-report
diff --git a/.github/workflows/playwright-on-workflow-dispatch.yml b/.github/workflows/playwright-on-workflow-dispatch.yml
index 483811f2..ab31c564 100644
--- a/.github/workflows/playwright-on-workflow-dispatch.yml
+++ b/.github/workflows/playwright-on-workflow-dispatch.yml
@@ -13,9 +13,9 @@ jobs:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v6.0.2
+ - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- - uses: actions/setup-node@v6
+ - uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6
with:
node-version: lts/*
@@ -82,7 +82,7 @@ jobs:
exit 1
fi
- - uses: actions/upload-artifact@v6
+ - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6
if: ${{ !cancelled() }}
with:
name: playwright-report
diff --git a/.github/workflows/psalm-update-baseline.yml b/.github/workflows/psalm-update-baseline.yml
index 14715108..45860741 100644
--- a/.github/workflows/psalm-update-baseline.yml
+++ b/.github/workflows/psalm-update-baseline.yml
@@ -10,7 +10,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v6.0.2
+ - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- name: Set up php
uses: shivammathur/setup-php@7bf05c6b704e0b9bfee22300130a31b5ea68d593 # v2
diff --git a/.github/workflows/psalm.yml b/.github/workflows/psalm.yml
index cbc77bf5..47a6994c 100644
--- a/.github/workflows/psalm.yml
+++ b/.github/workflows/psalm.yml
@@ -32,7 +32,7 @@ jobs:
name: static-psalm-analysis
steps:
- name: Checkout
- uses: actions/checkout@0c366fd6a839edf440554fa01a7085ccba70ac98 # v5.0.1
+ uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
with:
persist-credentials: false
diff --git a/.github/workflows/shellcheck.yml b/.github/workflows/shellcheck.yml
index 0ef69085..8b746c05 100644
--- a/.github/workflows/shellcheck.yml
+++ b/.github/workflows/shellcheck.yml
@@ -15,7 +15,7 @@ jobs:
name: Check Shell
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v6.0.2
+ - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- name: Run Shellcheck
uses: ludeeus/action-shellcheck@00cae500b08a931fb5698e11e79bfbd38e612a38 # v2.0.0
with:
diff --git a/.github/workflows/talk.yml b/.github/workflows/talk.yml
index c1b96d24..6057ed1a 100644
--- a/.github/workflows/talk.yml
+++ b/.github/workflows/talk.yml
@@ -10,7 +10,7 @@ jobs:
name: update talk
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v6.0.2
+ - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- name: Run talk-container-update
run: |
# Recording
diff --git a/.github/workflows/twig-lint.yml b/.github/workflows/twig-lint.yml
index 3b04704d..07e6549b 100644
--- a/.github/workflows/twig-lint.yml
+++ b/.github/workflows/twig-lint.yml
@@ -24,7 +24,7 @@ jobs:
steps:
- name: Checkout
- uses: actions/checkout@v6.0.2
+ uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@7bf05c6b704e0b9bfee22300130a31b5ea68d593 # v2
diff --git a/.github/workflows/update-copyright.yml b/.github/workflows/update-copyright.yml
index 95329d3c..f453a05c 100644
--- a/.github/workflows/update-copyright.yml
+++ b/.github/workflows/update-copyright.yml
@@ -8,4 +8,4 @@ jobs:
name: update copyright
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v6.0.2
+ - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
diff --git a/.github/workflows/update-helm.yml b/.github/workflows/update-helm.yml
index 2f441735..69974d3a 100644
--- a/.github/workflows/update-helm.yml
+++ b/.github/workflows/update-helm.yml
@@ -11,7 +11,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout code
- uses: actions/checkout@v6.0.2
+ uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- name: update helm chart
run: |
set -x
diff --git a/.github/workflows/update-yaml.yml b/.github/workflows/update-yaml.yml
index 41b0adf2..41a54a41 100644
--- a/.github/workflows/update-yaml.yml
+++ b/.github/workflows/update-yaml.yml
@@ -11,7 +11,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout code
- uses: actions/checkout@v6.0.2
+ uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- name: update yaml files
run: |
sudo bash manual-install/update-yaml.sh
diff --git a/.github/workflows/watchtower-update.yml b/.github/workflows/watchtower-update.yml
index b26cd1a4..34938de0 100644
--- a/.github/workflows/watchtower-update.yml
+++ b/.github/workflows/watchtower-update.yml
@@ -10,7 +10,7 @@ jobs:
name: update watchtower
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v6.0.2
+ - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- name: Run watchtower-container-update
run: |
# Watchtower
diff --git a/zizmor.yml b/zizmor.yml
index a991eaa5..7601baa4 100644
--- a/zizmor.yml
+++ b/zizmor.yml
@@ -4,7 +4,5 @@ rules:
dangerous-triggers:
ignore:
- build_images.yml
- unpinned-uses:
- config:
- policies:
- actions/*: ref-pin
+ artipacked:
+ disable: true
From 3e6deb8802848222f3a00b38b101464d3afc922e Mon Sep 17 00:00:00 2001
From: szaimen <42591237+szaimen@users.noreply.github.com>
Date: Mon, 26 Jan 2026 12:04:00 +0000
Subject: [PATCH 035/164] php dependency updates
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
---
php/composer.lock | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/php/composer.lock b/php/composer.lock
index 42bc1415..ee344d52 100644
--- a/php/composer.lock
+++ b/php/composer.lock
@@ -3578,16 +3578,16 @@
},
{
"name": "phpstan/phpdoc-parser",
- "version": "2.3.1",
+ "version": "2.3.2",
"source": {
"type": "git",
"url": "https://github.com/phpstan/phpdoc-parser.git",
- "reference": "16dbf9937da8d4528ceb2145c9c7c0bd29e26374"
+ "reference": "a004701b11273a26cd7955a61d67a7f1e525a45a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/16dbf9937da8d4528ceb2145c9c7c0bd29e26374",
- "reference": "16dbf9937da8d4528ceb2145c9c7c0bd29e26374",
+ "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/a004701b11273a26cd7955a61d67a7f1e525a45a",
+ "reference": "a004701b11273a26cd7955a61d67a7f1e525a45a",
"shasum": ""
},
"require": {
@@ -3619,9 +3619,9 @@
"description": "PHPDoc parser with support for nullable, intersection and generic types",
"support": {
"issues": "https://github.com/phpstan/phpdoc-parser/issues",
- "source": "https://github.com/phpstan/phpdoc-parser/tree/2.3.1"
+ "source": "https://github.com/phpstan/phpdoc-parser/tree/2.3.2"
},
- "time": "2026-01-12T11:33:04+00:00"
+ "time": "2026-01-25T14:56:51+00:00"
},
{
"name": "revolt/event-loop",
From 3f85f10bfb7e0cf913b94365209a09edd13b0cf1 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 26 Jan 2026 13:08:44 +0000
Subject: [PATCH 036/164] build(deps): bump actions/checkout in
/.github/workflows
Bumps [actions/checkout](https://github.com/actions/checkout) from 6.0.1 to 6.0.2.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v6.0.1...de0fac2e4500dabe0009e67214ff5f5447ce83dd)
---
updated-dependencies:
- dependency-name: actions/checkout
dependency-version: 6.0.2
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot]
---
.github/workflows/codespell.yml | 2 +-
.github/workflows/collabora.yml | 2 +-
.github/workflows/community-containers.yml | 2 +-
.github/workflows/dependency-updates.yml | 2 +-
.github/workflows/docker-lint.yml | 2 +-
.github/workflows/helm-release.yml | 2 +-
.github/workflows/imaginary-update.yml | 2 +-
.github/workflows/json-validator.yml | 2 +-
.github/workflows/lint-helm.yml | 2 +-
.github/workflows/lint-php.yml | 2 +-
.github/workflows/lint-yaml.yml | 2 +-
.github/workflows/nextcloud-update.yml | 2 +-
.github/workflows/php-deprecation-detector.yml | 2 +-
.github/workflows/playwright-on-push.yml | 2 +-
.github/workflows/playwright-on-workflow-dispatch.yml | 2 +-
.github/workflows/psalm-update-baseline.yml | 2 +-
.github/workflows/psalm.yml | 2 +-
.github/workflows/shellcheck.yml | 2 +-
.github/workflows/talk.yml | 2 +-
.github/workflows/twig-lint.yml | 2 +-
.github/workflows/update-copyright.yml | 2 +-
.github/workflows/update-helm.yml | 2 +-
.github/workflows/update-yaml.yml | 2 +-
.github/workflows/watchtower-update.yml | 2 +-
24 files changed, 24 insertions(+), 24 deletions(-)
diff --git a/.github/workflows/codespell.yml b/.github/workflows/codespell.yml
index 94af09c8..475940a9 100644
--- a/.github/workflows/codespell.yml
+++ b/.github/workflows/codespell.yml
@@ -12,7 +12,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Check out code
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Check spelling
uses: codespell-project/actions-codespell@8f01853be192eb0f849a5c7d721450e7a467c579 # v2
with:
diff --git a/.github/workflows/collabora.yml b/.github/workflows/collabora.yml
index 39758f3e..81ea8ff1 100644
--- a/.github/workflows/collabora.yml
+++ b/.github/workflows/collabora.yml
@@ -10,7 +10,7 @@ jobs:
name: update collabora
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Run collabora-profile-update
run: |
rm -f php/cool-seccomp-profile.json
diff --git a/.github/workflows/community-containers.yml b/.github/workflows/community-containers.yml
index c901358d..5271bfa8 100644
--- a/.github/workflows/community-containers.yml
+++ b/.github/workflows/community-containers.yml
@@ -16,7 +16,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout code
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Validate structure
run: |
CONTAINERS="$(find ./community-containers -mindepth 1 -maxdepth 1 -type d)"
diff --git a/.github/workflows/dependency-updates.yml b/.github/workflows/dependency-updates.yml
index 66404af5..7bdc5d1a 100644
--- a/.github/workflows/dependency-updates.yml
+++ b/.github/workflows/dependency-updates.yml
@@ -10,7 +10,7 @@ jobs:
name: Run dependency update script
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: shivammathur/setup-php@7bf05c6b704e0b9bfee22300130a31b5ea68d593 # v2
with:
php-version: 8.4
diff --git a/.github/workflows/docker-lint.yml b/.github/workflows/docker-lint.yml
index 7a5509df..3f09bb98 100644
--- a/.github/workflows/docker-lint.yml
+++ b/.github/workflows/docker-lint.yml
@@ -25,7 +25,7 @@ jobs:
steps:
- name: Checkout
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Install hadolint
run: |
diff --git a/.github/workflows/helm-release.yml b/.github/workflows/helm-release.yml
index 528c6cd3..ba3b865d 100644
--- a/.github/workflows/helm-release.yml
+++ b/.github/workflows/helm-release.yml
@@ -13,7 +13,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Turnstyle
uses: softprops/turnstyle@e565d2d86403c5d23533937e95980570545e5586 # v2
diff --git a/.github/workflows/imaginary-update.yml b/.github/workflows/imaginary-update.yml
index e182b073..171fb132 100644
--- a/.github/workflows/imaginary-update.yml
+++ b/.github/workflows/imaginary-update.yml
@@ -10,7 +10,7 @@ jobs:
name: update to latest imaginary commit on master branch
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Run imaginary-update
run: |
# Imaginary
diff --git a/.github/workflows/json-validator.yml b/.github/workflows/json-validator.yml
index 68b66812..8c0a7f45 100644
--- a/.github/workflows/json-validator.yml
+++ b/.github/workflows/json-validator.yml
@@ -16,7 +16,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout code
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Validate Json
run: |
sudo apt-get update
diff --git a/.github/workflows/lint-helm.yml b/.github/workflows/lint-helm.yml
index e65d7cdc..61e51450 100644
--- a/.github/workflows/lint-helm.yml
+++ b/.github/workflows/lint-helm.yml
@@ -11,7 +11,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0
diff --git a/.github/workflows/lint-php.yml b/.github/workflows/lint-php.yml
index 69c42c2b..c0d2d577 100644
--- a/.github/workflows/lint-php.yml
+++ b/.github/workflows/lint-php.yml
@@ -36,7 +36,7 @@ jobs:
steps:
- name: Checkout
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
diff --git a/.github/workflows/lint-yaml.yml b/.github/workflows/lint-yaml.yml
index 010077ca..e36b8f4c 100644
--- a/.github/workflows/lint-yaml.yml
+++ b/.github/workflows/lint-yaml.yml
@@ -24,7 +24,7 @@ jobs:
steps:
- name: Checkout
- uses: actions/checkout@0c366fd6a839edf440554fa01a7085ccba70ac98 # v6.0.1
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.1
with:
persist-credentials: false
diff --git a/.github/workflows/nextcloud-update.yml b/.github/workflows/nextcloud-update.yml
index aaaa26eb..5b420c20 100644
--- a/.github/workflows/nextcloud-update.yml
+++ b/.github/workflows/nextcloud-update.yml
@@ -11,7 +11,7 @@ jobs:
name: Run nextcloud-update script
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Run nextcloud-update script
run: |
# Inspired by https://github.com/nextcloud/docker/blob/master/update.sh
diff --git a/.github/workflows/php-deprecation-detector.yml b/.github/workflows/php-deprecation-detector.yml
index 61ae7c0d..38b0fa8d 100644
--- a/.github/workflows/php-deprecation-detector.yml
+++ b/.github/workflows/php-deprecation-detector.yml
@@ -16,7 +16,7 @@ jobs:
name: PHP Deprecation Detector
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Set up php
uses: shivammathur/setup-php@7bf05c6b704e0b9bfee22300130a31b5ea68d593 # v2
with:
diff --git a/.github/workflows/playwright-on-push.yml b/.github/workflows/playwright-on-push.yml
index 2eda156e..40277e57 100644
--- a/.github/workflows/playwright-on-push.yml
+++ b/.github/workflows/playwright-on-push.yml
@@ -24,7 +24,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6
with:
diff --git a/.github/workflows/playwright-on-workflow-dispatch.yml b/.github/workflows/playwright-on-workflow-dispatch.yml
index ab31c564..6d2f6d32 100644
--- a/.github/workflows/playwright-on-workflow-dispatch.yml
+++ b/.github/workflows/playwright-on-workflow-dispatch.yml
@@ -13,7 +13,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6
with:
diff --git a/.github/workflows/psalm-update-baseline.yml b/.github/workflows/psalm-update-baseline.yml
index 45860741..0c2f8aee 100644
--- a/.github/workflows/psalm-update-baseline.yml
+++ b/.github/workflows/psalm-update-baseline.yml
@@ -10,7 +10,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Set up php
uses: shivammathur/setup-php@7bf05c6b704e0b9bfee22300130a31b5ea68d593 # v2
diff --git a/.github/workflows/psalm.yml b/.github/workflows/psalm.yml
index 47a6994c..2bab876e 100644
--- a/.github/workflows/psalm.yml
+++ b/.github/workflows/psalm.yml
@@ -32,7 +32,7 @@ jobs:
name: static-psalm-analysis
steps:
- name: Checkout
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
diff --git a/.github/workflows/shellcheck.yml b/.github/workflows/shellcheck.yml
index 8b746c05..b051c355 100644
--- a/.github/workflows/shellcheck.yml
+++ b/.github/workflows/shellcheck.yml
@@ -15,7 +15,7 @@ jobs:
name: Check Shell
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Run Shellcheck
uses: ludeeus/action-shellcheck@00cae500b08a931fb5698e11e79bfbd38e612a38 # v2.0.0
with:
diff --git a/.github/workflows/talk.yml b/.github/workflows/talk.yml
index 6057ed1a..28f9fef7 100644
--- a/.github/workflows/talk.yml
+++ b/.github/workflows/talk.yml
@@ -10,7 +10,7 @@ jobs:
name: update talk
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Run talk-container-update
run: |
# Recording
diff --git a/.github/workflows/twig-lint.yml b/.github/workflows/twig-lint.yml
index 07e6549b..27b8776d 100644
--- a/.github/workflows/twig-lint.yml
+++ b/.github/workflows/twig-lint.yml
@@ -24,7 +24,7 @@ jobs:
steps:
- name: Checkout
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@7bf05c6b704e0b9bfee22300130a31b5ea68d593 # v2
diff --git a/.github/workflows/update-copyright.yml b/.github/workflows/update-copyright.yml
index f453a05c..103851c9 100644
--- a/.github/workflows/update-copyright.yml
+++ b/.github/workflows/update-copyright.yml
@@ -8,4 +8,4 @@ jobs:
name: update copyright
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
diff --git a/.github/workflows/update-helm.yml b/.github/workflows/update-helm.yml
index 69974d3a..2dcd2e73 100644
--- a/.github/workflows/update-helm.yml
+++ b/.github/workflows/update-helm.yml
@@ -11,7 +11,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout code
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: update helm chart
run: |
set -x
diff --git a/.github/workflows/update-yaml.yml b/.github/workflows/update-yaml.yml
index 41a54a41..a60ea1c6 100644
--- a/.github/workflows/update-yaml.yml
+++ b/.github/workflows/update-yaml.yml
@@ -11,7 +11,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout code
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: update yaml files
run: |
sudo bash manual-install/update-yaml.sh
diff --git a/.github/workflows/watchtower-update.yml b/.github/workflows/watchtower-update.yml
index 34938de0..c04657be 100644
--- a/.github/workflows/watchtower-update.yml
+++ b/.github/workflows/watchtower-update.yml
@@ -10,7 +10,7 @@ jobs:
name: update watchtower
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
+ - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Run watchtower-container-update
run: |
# Watchtower
From 59e0776808f377244484d2ed59d499d484e7960c Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 27 Jan 2026 04:06:09 +0000
Subject: [PATCH 037/164] build(deps): bump docker in
/Containers/mastercontainer
Bumps docker from 29.1.5-cli to 29.2.0-cli.
---
updated-dependencies:
- dependency-name: docker
dependency-version: 29.2.0-cli
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot]
---
Containers/mastercontainer/Dockerfile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Containers/mastercontainer/Dockerfile b/Containers/mastercontainer/Dockerfile
index 2fea59d1..f3079ca7 100644
--- a/Containers/mastercontainer/Dockerfile
+++ b/Containers/mastercontainer/Dockerfile
@@ -1,6 +1,6 @@
# syntax=docker/dockerfile:latest
# Docker CLI is a requirement
-FROM docker:29.1.5-cli AS docker
+FROM docker:29.2.0-cli AS docker
# Caddy is a requirement
FROM caddy:2.10.2-alpine AS caddy
From 0213d8e548066624e202a387d01ca3f65791ae53 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Wed, 28 Jan 2026 04:08:45 +0000
Subject: [PATCH 038/164] build(deps): bump nats in /Containers/talk
Bumps nats from 2.12.3-scratch to 2.12.4-scratch.
---
updated-dependencies:
- dependency-name: nats
dependency-version: 2.12.4-scratch
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot]
---
Containers/talk/Dockerfile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Containers/talk/Dockerfile b/Containers/talk/Dockerfile
index fb78f943..fc8cc54a 100644
--- a/Containers/talk/Dockerfile
+++ b/Containers/talk/Dockerfile
@@ -1,5 +1,5 @@
# syntax=docker/dockerfile:latest
-FROM nats:2.12.3-scratch AS nats
+FROM nats:2.12.4-scratch AS nats
FROM eturnal/eturnal:1.12.2-alpine AS eturnal
FROM strukturag/nextcloud-spreed-signaling:2.0.4 AS signaling
FROM alpine:3.23.2 AS janus
From 3f4eecaa9654c5c88c5b2fc5b24f40352f9236c3 Mon Sep 17 00:00:00 2001
From: Julius Knorr
Date: Wed, 28 Jan 2026 09:53:53 +0100
Subject: [PATCH 039/164] feat: Add office switcher with feature comparison
(#7421)
Signed-off-by: Julius Knorr
Signed-off-by: Simon L.
Signed-off-by: Andrew Backhouse
Co-authored-by: Simon L.
Co-authored-by: Andrew Backhouse
---
php/public/containers-form-submit.js | 58 ++++++-
php/public/disable-collabora.js | 2 +-
php/public/disable-onlyoffice.js | 6 +-
php/public/style.css | 163 +++++++++++++++++-
.../Controller/ConfigurationController.php | 24 +--
php/templates/containers.twig | 2 +-
.../includes/optional-containers.twig | 134 ++++++++++----
php/templates/layout.twig | 2 +-
php/tests/tests/initial-setup.spec.js | 6 +-
9 files changed, 338 insertions(+), 59 deletions(-)
diff --git a/php/public/containers-form-submit.js b/php/public/containers-form-submit.js
index b7ffd2d8..1382bced 100644
--- a/php/public/containers-form-submit.js
+++ b/php/public/containers-form-submit.js
@@ -1,7 +1,9 @@
document.addEventListener("DOMContentLoaded", function () {
// Hide submit button initially
- const optionsFormSubmit = document.getElementById("options-form-submit");
- optionsFormSubmit.style.display = 'none';
+ const optionsFormSubmit = document.querySelectorAll(".options-form-submit");
+ optionsFormSubmit.forEach(element => {
+ element.style.display = 'none';
+ });
const communityFormSubmit = document.getElementById("community-form-submit");
communityFormSubmit.style.display = 'none';
@@ -12,6 +14,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 +30,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,8 +51,32 @@ 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';
+ optionsFormSubmit.forEach(element => {
+ element.style.display = hasChanges ? 'block' : 'none';
+ });
}
// Function to compare current states to initial states
@@ -82,6 +127,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/disable-collabora.js b/php/public/disable-collabora.js
index 3064ef51..762252ce 100644
--- a/php/public/disable-collabora.js
+++ b/php/public/disable-collabora.js
@@ -1,5 +1,5 @@
document.addEventListener("DOMContentLoaded", function(event) {
// Collabora
- let collabora = document.getElementById("collabora");
+ const collabora = document.getElementById("office-collabora");
collabora.disabled = true;
});
\ No newline at end of file
diff --git a/php/public/disable-onlyoffice.js b/php/public/disable-onlyoffice.js
index 83482339..c660bd9d 100644
--- a/php/public/disable-onlyoffice.js
+++ b/php/public/disable-onlyoffice.js
@@ -1,7 +1,5 @@
document.addEventListener("DOMContentLoaded", function(event) {
// OnlyOffice
- let onlyoffice = document.getElementById("onlyoffice");
- if (onlyoffice) {
- onlyoffice.disabled = true;
- }
+ const onlyoffice = document.getElementById("office-onlyoffice");
+ onlyoffice.disabled = true;
});
\ No newline at end of file
diff --git a/php/public/style.css b/php/public/style.css
index b4d5f8a5..b35883d0 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: 580px (max-width) + 100px (main-padding * 2) + 200px (additional space) = 880px
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: 880px) {
:root {
--container-top-margin: 50px;
--container-bottom-margin: 0px;
@@ -549,3 +549,160 @@ 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-disabled {
+ opacity: 50%;
+ pointer-events: none;
+}
+
+.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/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/templates/containers.twig b/php/templates/containers.twig
index 2f722768..8e437bc2 100644
--- a/php/templates/containers.twig
+++ b/php/templates/containers.twig
@@ -27,7 +27,7 @@
{# js for optional containers and additional containers forms #}
-
+
{% set hasBackupLocation = borg_backup_host_location or borg_remote_repo %}
{% set isAnyRunning = false %}
diff --git a/php/templates/includes/optional-containers.twig b/php/templates/includes/optional-containers.twig
index b4764592..dcf59bfb 100644
--- a/php/templates/includes/optional-containers.twig
+++ b/php/templates/includes/optional-containers.twig
@@ -9,6 +9,105 @@
+
Office Suite
+ {% if isAnyRunning == false %}
+
Choose your preferred office suite. Only one can be enabled at a time.
+ {% endif %}
+
+
+
+
+
+
+
+
+ {% if isAnyRunning == false %}
+
+
+
+
+ {% endif %}
+
+
Additional Optional Containers
-
-
-
-
-
-
-
-
+
-
+
Minimal system requirements: When any optional container is enabled, at least 2GB RAM, a dual-core CPU and 40GB system storage are required. When enabling ClamAV, Nextcloud Talk Recording-server or Fulltextsearch, at least 3GB RAM are required. For Talk Recording-server additional 2 vCPUs are required. When enabling everything, at least 5GB RAM and a quad-core CPU are required. Recommended are at least 1GB more RAM than the minimal requirement. For further advice and recommendations see this documentation
{% if isAnyRunning == true %}
-
-
+
+
diff --git a/php/templates/layout.twig b/php/templates/layout.twig
index 4d842e3d..79c615d9 100644
--- a/php/templates/layout.twig
+++ b/php/templates/layout.twig
@@ -1,7 +1,7 @@
AIO
-
+
diff --git a/php/tests/tests/initial-setup.spec.js b/php/tests/tests/initial-setup.spec.js
index c88cd8e3..1f21f011 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.getByRole('button', { name: 'Save changes' }).click();
+ await containersPage.getByText('Disable office suite').click();
+ await containersPage.getByRole('button', { name: 'Save changes' }).last().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();
From 0b6c0733ab996a3141b0afebb794f40c5c290cfe Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Wed, 7 Jan 2026 17:29:24 +0100
Subject: [PATCH 040/164] Cache config, introduce get() and set() helpers to
guide new way to set attributes
Use cached config, use set() for single attributes, setMultiple to wrap
multiple calls to set()
Signed-off-by: Pablo Zmdl
---
php/src/Data/ConfigurationManager.php | 50 ++++++++++++++++++++++++---
1 file changed, 45 insertions(+), 5 deletions(-)
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index 320bc477..3b09c5b3 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -9,15 +9,19 @@ class ConfigurationManager
{
private array $secrets = [];
+ private array $config = [];
+
+ private bool $noWrite = false;
+
public function GetConfig() : array
{
- if(file_exists(DataConst::GetConfigFile()))
+ if ($this->config === [] && file_exists(DataConst::GetConfigFile()))
{
$configContent = (string)file_get_contents(DataConst::GetConfigFile());
- return json_decode($configContent, true, 512, JSON_THROW_ON_ERROR);
+ $this->config = json_decode($configContent, true, 512, JSON_THROW_ON_ERROR);
}
- return [];
+ return $this->config;
}
public function GetPassword() : string {
@@ -34,6 +38,34 @@ class ConfigurationManager
$this->WriteConfig($config);
}
+ private function get(string $key, mixed $fallbackValue = null) : mixed {
+ return $this->GetConfig()[$key] ?? $fallbackValue;
+ }
+
+ private function set(string $key, mixed $value) : void {
+ $this->GetConfig();
+ $this->config[$key] = $value;
+ // Only write if this isn't called via setMultiple().
+ if ($this->noWrite !== true) {
+ $this->WriteConfig();
+ }
+ }
+
+ /**
+ * This allows to assign multiple attributes without saving the config to disk in between (as would
+ * calling set() do).
+ */
+ public function setMultiple(\Closure $closure) : void {
+ $this->noWrite = true;
+ try {
+ $this->GetConfig();
+ $closure($this);
+ $this->WriteConfig();
+ } finally {
+ $this->noWrite = false;
+ }
+ }
+
public function GetAndGenerateSecret(string $secretId) : string {
if ($secretId === '') {
return '';
@@ -599,17 +631,25 @@ class ConfigurationManager
/**
* @throws InvalidSettingConfigurationException
*/
- public function WriteConfig(array $config) : void {
+ public function WriteConfig(?array $config) : void {
+ if ($config) {
+ $this->config = $config;
+ }
if(!is_dir(DataConst::GetDataDirectory())) {
throw new InvalidSettingConfigurationException(DataConst::GetDataDirectory() . " does not exist! Something was set up falsely!");
}
+ // Shouldn't happen, but as a precaution we won't write an empty config to disk.
+ if ($this->config === []) {
+ return;
+ }
$df = disk_free_space(DataConst::GetDataDirectory());
- $content = json_encode($config, JSON_UNESCAPED_SLASHES|JSON_PRETTY_PRINT|JSON_THROW_ON_ERROR);
+ $content = json_encode($this->config, JSON_UNESCAPED_SLASHES|JSON_PRETTY_PRINT|JSON_THROW_ON_ERROR);
$size = strlen($content) + 10240;
if ($df !== false && (int)$df < $size) {
throw new InvalidSettingConfigurationException(DataConst::GetDataDirectory() . " does not have enough space for writing the config file! Not writing it back!");
}
file_put_contents(DataConst::GetConfigFile(), $content);
+ $this->config = [];
}
private function GetEnvironmentalVariableOrConfig(string $envVariableName, string $configName, string $defaultValue) : string {
From 21b14a4a5df379f7ed457f9185faf94323c737fb Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 19 Jan 2026 11:43:43 +0100
Subject: [PATCH 041/164] Adapt GetEnvironmentalVariableOrConfig() to get() and
set()
Signed-off-by: Pablo Zmdl
---
php/src/Data/ConfigurationManager.php | 22 ++++++++++------------
1 file changed, 10 insertions(+), 12 deletions(-)
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index 3b09c5b3..0ee4bae2 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -654,23 +654,21 @@ class ConfigurationManager
private function GetEnvironmentalVariableOrConfig(string $envVariableName, string $configName, string $defaultValue) : string {
$envVariableOutput = getenv($envVariableName);
+ $configValue = $this->get($configName, '');
if ($envVariableOutput === false) {
- $config = $this->GetConfig();
- if (!isset($config[$configName]) || $config[$configName] === '') {
- $config[$configName] = $defaultValue;
+ if ($configValue === '') {
+ $this->set($configName, $defaultValue);
+ return $defaultValue;
}
- return $config[$configName];
+ return $configValue;
}
- if(file_exists(DataConst::GetConfigFile())) {
- $config = $this->GetConfig();
- if (!isset($config[$configName])) {
- $config[$configName] = '';
- }
- if ($envVariableOutput !== $config[$configName]) {
- $config[$configName] = $envVariableOutput;
- $this->WriteConfig($config);
+
+ if (file_exists(DataConst::GetConfigFile())) {
+ if ($envVariableOutput !== $configValue) {
+ $this->set($configName, $envVariableOutput);
}
}
+
return $envVariableOutput;
}
From a9b648e18fcfd6bd973b13c2dbca19b2260054d8 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Tue, 20 Jan 2026 18:22:40 +0100
Subject: [PATCH 042/164] Adapt GetAndGenerateSecret() to get() and set()
Signed-off-by: Pablo Zmdl
---
php/src/Data/ConfigurationManager.php | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index 0ee4bae2..27a98d03 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -71,17 +71,17 @@ class ConfigurationManager
return '';
}
- $config = $this->GetConfig();
- if(!isset($config['secrets'][$secretId])) {
- $config['secrets'][$secretId] = bin2hex(random_bytes(24));
- $this->WriteConfig($config);
+ $secrets = $this->get('secrets', []);
+ if (!isset($secrets[$secretId])) {
+ $secrets[$secretId] = bin2hex(random_bytes(24));
+ $this->set('secrets', $secrets);
}
if ($secretId === 'BORGBACKUP_PASSWORD' && !file_exists(DataConst::GetBackupSecretFile())) {
- $this->DoubleSafeBackupSecret($config['secrets'][$secretId]);
+ $this->DoubleSafeBackupSecret($secrets[$secretId]);
}
- return $config['secrets'][$secretId];
+ return $secrets[$secretId];
}
public function GetRegisteredSecret(string $secretId) : string {
From b2f992d955d26c10bba639bae89ff4156a74899c Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 19 Jan 2026 12:37:36 +0100
Subject: [PATCH 043/164] Make `AIO_TOKEN` an attribute
Signed-off-by: Pablo Zmdl
---
php/src/Auth/AuthManager.php | 2 +-
php/src/Controller/DockerController.php | 5 +----
php/src/Data/ConfigurationManager.php | 9 +++++----
php/src/Docker/DockerActionManager.php | 2 +-
4 files changed, 8 insertions(+), 10 deletions(-)
diff --git a/php/src/Auth/AuthManager.php b/php/src/Auth/AuthManager.php
index 925ff89f..b4533c1e 100644
--- a/php/src/Auth/AuthManager.php
+++ b/php/src/Auth/AuthManager.php
@@ -19,7 +19,7 @@ readonly class AuthManager {
}
public function CheckToken(string $token) : bool {
- return hash_equals($this->configurationManager->GetToken(), $token);
+ return hash_equals($this->configurationManager->AIO_TOKEN, $token);
}
public function SetAuthState(bool $isLoggedIn) : void {
diff --git a/php/src/Controller/DockerController.php b/php/src/Controller/DockerController.php
index a924e61f..ab10d3c6 100644
--- a/php/src/Controller/DockerController.php
+++ b/php/src/Controller/DockerController.php
@@ -213,10 +213,7 @@ readonly class DockerController {
}
public function startTopContainer(bool $pullImage) : void {
- $config = $this->configurationManager->GetConfig();
- // set AIO_TOKEN
- $config['AIO_TOKEN'] = bin2hex(random_bytes(24));
- $this->configurationManager->WriteConfig($config);
+ $this->configurationManager->AIO_TOKEN = bin2hex(random_bytes(24));
// Stop domaincheck since apache would not be able to start otherwise
$this->StopDomaincheckContainer();
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index 27a98d03..6b80c71b 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -13,6 +13,11 @@ class ConfigurationManager
private bool $noWrite = false;
+ public string $AIO_TOKEN {
+ get => $this->get('AIO_TOKEN', '');
+ set { $this->set('AIO_TOKEN', $value); }
+ }
+
public function GetConfig() : array
{
if ($this->config === [] && file_exists(DataConst::GetConfigFile()))
@@ -28,10 +33,6 @@ class ConfigurationManager
return $this->GetConfig()['password'];
}
- public function GetToken() : string {
- return $this->GetConfig()['AIO_TOKEN'];
- }
-
public function SetPassword(string $password) : void {
$config = $this->GetConfig();
$config['password'] = $password;
diff --git a/php/src/Docker/DockerActionManager.php b/php/src/Docker/DockerActionManager.php
index fb3701a4..ae957d35 100644
--- a/php/src/Docker/DockerActionManager.php
+++ b/php/src/Docker/DockerActionManager.php
@@ -559,7 +559,7 @@ readonly class DockerActionManager {
return match ($placeholder) {
'NC_DOMAIN' => $this->configurationManager->GetDomain(),
'NC_BASE_DN' => $this->configurationManager->GetBaseDN(),
- 'AIO_TOKEN' => $this->configurationManager->GetToken(),
+ 'AIO_TOKEN' => $this->configurationManager->AIO_TOKEN,
'BORGBACKUP_REMOTE_REPO' => $this->configurationManager->GetBorgRemoteRepo(),
'BORGBACKUP_MODE' => $this->configurationManager->GetBackupMode(),
'AIO_URL' => $this->configurationManager->GetAIOURL(),
From 4d8e959608c9c1be21b337bb19b89656e478d8ec Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 19 Jan 2026 14:55:29 +0100
Subject: [PATCH 044/164] Make `password` an attribute
Signed-off-by: Pablo Zmdl
---
php/src/Auth/AuthManager.php | 2 +-
php/src/Data/ConfigurationManager.php | 19 +++++++------------
php/src/Data/Setup.php | 2 +-
3 files changed, 9 insertions(+), 14 deletions(-)
diff --git a/php/src/Auth/AuthManager.php b/php/src/Auth/AuthManager.php
index b4533c1e..1d558aed 100644
--- a/php/src/Auth/AuthManager.php
+++ b/php/src/Auth/AuthManager.php
@@ -15,7 +15,7 @@ readonly class AuthManager {
}
public function CheckCredentials(string $password) : bool {
- return hash_equals($this->configurationManager->GetPassword(), $password);
+ return hash_equals($this->configurationManager->password, $password);
}
public function CheckToken(string $token) : bool {
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index 6b80c71b..1c40508f 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -18,6 +18,11 @@ class ConfigurationManager
set { $this->set('AIO_TOKEN', $value); }
}
+ public string $password {
+ get => $this->get('password', '');
+ set { $this->set('password', $value); }
+ }
+
public function GetConfig() : array
{
if ($this->config === [] && file_exists(DataConst::GetConfigFile()))
@@ -29,16 +34,6 @@ class ConfigurationManager
return $this->config;
}
- public function GetPassword() : string {
- return $this->GetConfig()['password'];
- }
-
- public function SetPassword(string $password) : void {
- $config = $this->GetConfig();
- $config['password'] = $password;
- $this->WriteConfig($config);
- }
-
private function get(string $key, mixed $fallbackValue = null) : mixed {
return $this->GetConfig()[$key] ?? $fallbackValue;
}
@@ -586,7 +581,7 @@ class ConfigurationManager
throw new InvalidSettingConfigurationException("Please enter your current password.");
}
- if ($currentPassword !== $this->GetPassword()) {
+ if ($currentPassword !== $this->password) {
throw new InvalidSettingConfigurationException("The entered current password is not correct.");
}
@@ -603,7 +598,7 @@ class ConfigurationManager
}
// All checks pass so set the password
- $this->SetPassword($newPassword);
+ $this->set('password', $newPassword);
}
public function GetApachePort() : string {
diff --git a/php/src/Data/Setup.php b/php/src/Data/Setup.php
index f8f43e4b..e409eef8 100644
--- a/php/src/Data/Setup.php
+++ b/php/src/Data/Setup.php
@@ -17,7 +17,7 @@ readonly class Setup {
}
$password = $this->passwordGenerator->GeneratePassword(8);
- $this->configurationManager->SetPassword($password);
+ $this->configurationManager->password = $password;
return $password;
}
From 484ff7994319838736570ad8e7b900bb9580c9e6 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 19 Jan 2026 13:11:20 +0100
Subject: [PATCH 045/164] Make `wasStartButtonClicked` an attribute
Signed-off-by: Pablo Zmdl
---
php/public/index.php | 2 +-
php/src/Controller/DockerController.php | 6 +++---
php/src/Data/ConfigurationManager.php | 13 +++++--------
php/src/Docker/DockerActionManager.php | 2 +-
4 files changed, 10 insertions(+), 13 deletions(-)
diff --git a/php/public/index.php b/php/public/index.php
index b57f65a5..59708627 100644
--- a/php/public/index.php
+++ b/php/public/index.php
@@ -105,7 +105,7 @@ $app->get('/containers', function (Request $request, Response $response, array $
'backup_exit_code' => $dockerActionManager->GetBackupcontainerExitCode(),
'is_instance_restore_attempt' => $configurationManager->isInstanceRestoreAttempt(),
'borg_backup_mode' => $configurationManager->GetBackupMode(),
- 'was_start_button_clicked' => $configurationManager->wasStartButtonClicked(),
+ 'was_start_button_clicked' => $configurationManager->wasStartButtonClicked,
'has_update_available' => $dockerActionManager->isAnyUpdateAvailable(),
'last_backup_time' => $configurationManager->GetLastBackupTime(),
'backup_times' => $configurationManager->GetBackupTimes(),
diff --git a/php/src/Controller/DockerController.php b/php/src/Controller/DockerController.php
index ab10d3c6..e913349d 100644
--- a/php/src/Controller/DockerController.php
+++ b/php/src/Controller/DockerController.php
@@ -190,11 +190,11 @@ readonly class DockerController {
$config = $this->configurationManager->GetConfig();
// set AIO_URL
$config['AIO_URL'] = $host . ':' . (string)$port . $path;
- // set wasStartButtonClicked
- $config['wasStartButtonClicked'] = 1;
// set install_latest_major
$config['install_latest_major'] = $installLatestMajor;
$this->configurationManager->WriteConfig($config);
+ // set wasStartButtonClicked
+ $this->configurationManager->wasStartButtonClicked = true;
// Do not pull container images in case 'bypass_container_update' is set via url params
// Needed for local testing
@@ -274,7 +274,7 @@ readonly class DockerController {
public function StartDomaincheckContainer() : void
{
# Don't start if domain is already set
- if ($this->configurationManager->GetDomain() !== '' || $this->configurationManager->wasStartButtonClicked()) {
+ if ($this->configurationManager->GetDomain() !== '' || $this->configurationManager->wasStartButtonClicked) {
return;
}
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index 1c40508f..18cdc46c 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -23,6 +23,11 @@ class ConfigurationManager
set { $this->set('password', $value); }
}
+ public bool $wasStartButtonClicked {
+ get => $this->get('wasStartButtonClicked', false);
+ set { $this->set('wasStartButtonClicked', $value); }
+ }
+
public function GetConfig() : array
{
if ($this->config === [] && file_exists(DataConst::GetConfigFile()))
@@ -150,14 +155,6 @@ class ConfigurationManager
return $backupTimes;
}
- public function wasStartButtonClicked() : bool {
- if (isset($this->GetConfig()['wasStartButtonClicked'])) {
- return true;
- } else {
- return false;
- }
- }
-
private function isx64Platform() : bool {
if (php_uname('m') === 'x86_64') {
return true;
diff --git a/php/src/Docker/DockerActionManager.php b/php/src/Docker/DockerActionManager.php
index ae957d35..42c2d5f0 100644
--- a/php/src/Docker/DockerActionManager.php
+++ b/php/src/Docker/DockerActionManager.php
@@ -621,7 +621,7 @@ readonly class DockerActionManager {
public function isAnyUpdateAvailable(): bool {
// return early if instance is not installed
- if (!$this->configurationManager->wasStartButtonClicked()) {
+ if (!$this->configurationManager->wasStartButtonClicked) {
return false;
}
$id = 'nextcloud-aio-apache';
From 06fdf31c8707b6edee57fc93efdbf16930434320 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 19 Jan 2026 13:09:52 +0100
Subject: [PATCH 046/164] Make `AIO_URL` an attribute
Signed-off-by: Pablo Zmdl
---
php/src/Controller/DockerController.php | 4 ++--
php/src/Data/ConfigurationManager.php | 14 +++++---------
php/src/Docker/DockerActionManager.php | 2 +-
3 files changed, 8 insertions(+), 12 deletions(-)
diff --git a/php/src/Controller/DockerController.php b/php/src/Controller/DockerController.php
index e913349d..b8f89c46 100644
--- a/php/src/Controller/DockerController.php
+++ b/php/src/Controller/DockerController.php
@@ -188,11 +188,11 @@ readonly class DockerController {
}
$config = $this->configurationManager->GetConfig();
- // set AIO_URL
- $config['AIO_URL'] = $host . ':' . (string)$port . $path;
// set install_latest_major
$config['install_latest_major'] = $installLatestMajor;
$this->configurationManager->WriteConfig($config);
+ // set AIO_URL
+ $this->configurationManager->AIO_URL = $host . ':' . (string)$port . $path;
// set wasStartButtonClicked
$this->configurationManager->wasStartButtonClicked = true;
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index 18cdc46c..c4032fea 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -23,6 +23,11 @@ class ConfigurationManager
set { $this->set('password', $value); }
}
+ public string $AIO_URL {
+ get => $this->get('AIO_URL', '');
+ set { $this->set('AIO_URL', $value); }
+ }
+
public bool $wasStartButtonClicked {
get => $this->get('wasStartButtonClicked', false);
set { $this->set('wasStartButtonClicked', $value); }
@@ -475,15 +480,6 @@ class ConfigurationManager
return $config['restore-exclude-previews'];
}
- public function GetAIOURL() : string {
- $config = $this->GetConfig();
- if(!isset($config['AIO_URL'])) {
- $config['AIO_URL'] = '';
- }
-
- return $config['AIO_URL'];
- }
-
/**
* @throws InvalidSettingConfigurationException
*/
diff --git a/php/src/Docker/DockerActionManager.php b/php/src/Docker/DockerActionManager.php
index 42c2d5f0..7ef920e7 100644
--- a/php/src/Docker/DockerActionManager.php
+++ b/php/src/Docker/DockerActionManager.php
@@ -562,7 +562,7 @@ readonly class DockerActionManager {
'AIO_TOKEN' => $this->configurationManager->AIO_TOKEN,
'BORGBACKUP_REMOTE_REPO' => $this->configurationManager->GetBorgRemoteRepo(),
'BORGBACKUP_MODE' => $this->configurationManager->GetBackupMode(),
- 'AIO_URL' => $this->configurationManager->GetAIOURL(),
+ 'AIO_URL' => $this->configurationManager->AIO_URL,
'SELECTED_RESTORE_TIME' => $this->configurationManager->GetSelectedRestoreTime(),
'RESTORE_EXCLUDE_PREVIEWS' => $this->configurationManager->GetRestoreExcludePreviews(),
'APACHE_PORT' => $this->configurationManager->GetApachePort(),
From 1d11a4682b3f03200f2e22b413ffb76424464a78 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 19 Jan 2026 13:06:59 +0100
Subject: [PATCH 047/164] Make `install_latest_major` an attribute
Signed-off-by: Pablo Zmdl
---
php/src/Controller/DockerController.php | 11 +----------
php/src/Data/ConfigurationManager.php | 13 +++++--------
php/src/Docker/DockerActionManager.php | 2 +-
3 files changed, 7 insertions(+), 19 deletions(-)
diff --git a/php/src/Controller/DockerController.php b/php/src/Controller/DockerController.php
index b8f89c46..f8f2896a 100644
--- a/php/src/Controller/DockerController.php
+++ b/php/src/Controller/DockerController.php
@@ -181,16 +181,7 @@ readonly class DockerController {
$port = 443;
}
- if (isset($request->getParsedBody()['install_latest_major'])) {
- $installLatestMajor = 32;
- } else {
- $installLatestMajor = "";
- }
-
- $config = $this->configurationManager->GetConfig();
- // set install_latest_major
- $config['install_latest_major'] = $installLatestMajor;
- $this->configurationManager->WriteConfig($config);
+ $this->configurationManager->install_latest_major = isset($request->getParsedBody()['install_latest_major']);
// set AIO_URL
$this->configurationManager->AIO_URL = $host . ':' . (string)$port . $path;
// set wasStartButtonClicked
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index c4032fea..1fb03e68 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -33,6 +33,11 @@ class ConfigurationManager
set { $this->set('wasStartButtonClicked', $value); }
}
+ public bool $install_latest_major {
+ get => $this->get('install_latest_major', false);
+ set { $this->set('install_latest_major', $value); }
+ }
+
public function GetConfig() : array
{
if ($this->config === [] && file_exists(DataConst::GetConfigFile()))
@@ -889,14 +894,6 @@ class ConfigurationManager
}
}
- public function shouldLatestMajorGetInstalled() : bool {
- $config = $this->GetConfig();
- if(!isset($config['install_latest_major'])) {
- $config['install_latest_major'] = '';
- }
- return $config['install_latest_major'] !== '';
- }
-
public function GetAdditionalBackupDirectoriesString() : string {
if (!file_exists(DataConst::GetAdditionalBackupDirectoriesFile())) {
return '';
diff --git a/php/src/Docker/DockerActionManager.php b/php/src/Docker/DockerActionManager.php
index 7ef920e7..1c6c418e 100644
--- a/php/src/Docker/DockerActionManager.php
+++ b/php/src/Docker/DockerActionManager.php
@@ -595,7 +595,7 @@ readonly class DockerActionManager {
'NEXTCLOUD_STARTUP_APPS' => $this->configurationManager->GetNextcloudStartupApps(),
'NEXTCLOUD_ADDITIONAL_APKS' => $this->configurationManager->GetNextcloudAdditionalApks(),
'NEXTCLOUD_ADDITIONAL_PHP_EXTENSIONS' => $this->configurationManager->GetNextcloudAdditionalPhpExtensions(),
- 'INSTALL_LATEST_MAJOR' => $this->configurationManager->shouldLatestMajorGetInstalled() ? 'yes' : '',
+ 'INSTALL_LATEST_MAJOR' => $this->configurationManager->install_latest_major ? 'yes' : '',
'REMOVE_DISABLED_APPS' => $this->configurationManager->shouldDisabledAppsGetRemoved() ? 'yes' : '',
// Allow to get local ip-address of database container which allows to talk to it even in host mode (the container that requires this needs to be started first then)
'AIO_DATABASE_HOST' => gethostbyname('nextcloud-aio-database'),
From b8130958c557b05499736c32aaa6808a9bd5b8b1 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 19 Jan 2026 13:05:10 +0100
Subject: [PATCH 048/164] Make `selectedRestoreTime` an attribute
Signed-off-by: Pablo Zmdl
---
php/src/Controller/DockerController.php | 4 +---
php/src/Data/ConfigurationManager.php | 14 +++++---------
php/src/Docker/DockerActionManager.php | 1 +
3 files changed, 7 insertions(+), 12 deletions(-)
diff --git a/php/src/Controller/DockerController.php b/php/src/Controller/DockerController.php
index f8f2896a..1848ccab 100644
--- a/php/src/Controller/DockerController.php
+++ b/php/src/Controller/DockerController.php
@@ -124,14 +124,12 @@ readonly class DockerController {
public function StartBackupContainerRestore(Request $request, Response $response, array $args) : Response {
$this->configurationManager->SetBackupMode('restore');
- $config = $this->configurationManager->GetConfig();
- $config['selected-restore-time'] = $request->getParsedBody()['selected_restore_time'] ?? '';
if (isset($request->getParsedBody()['restore-exclude-previews'])) {
$config['restore-exclude-previews'] = 1;
} else {
$config['restore-exclude-previews'] = '';
}
- $this->configurationManager->WriteConfig($config);
+ $this->configurationManager->selectedRestoreTime = $request->getParsedBody()['selected_restore_time'] ?? '';
$id = self::TOP_CONTAINER;
$forceStopNextcloud = true;
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index 1fb03e68..3e003e61 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -23,6 +23,11 @@ class ConfigurationManager
set { $this->set('password', $value); }
}
+ public string $selectedRestoreTime {
+ get => $this->get('selected-restore-time', '');
+ set { $this->set('selected-restore-time', $value); }
+ }
+
public string $AIO_URL {
get => $this->get('AIO_URL', '');
set { $this->set('AIO_URL', $value); }
@@ -467,15 +472,6 @@ class ConfigurationManager
$this->WriteConfig($config);
}
- public function GetSelectedRestoreTime() : string {
- $config = $this->GetConfig();
- if(!isset($config['selected-restore-time'])) {
- $config['selected-restore-time'] = '';
- }
-
- return $config['selected-restore-time'];
- }
-
public function GetRestoreExcludePreviews() : string {
$config = $this->GetConfig();
if(!isset($config['restore-exclude-previews'])) {
diff --git a/php/src/Docker/DockerActionManager.php b/php/src/Docker/DockerActionManager.php
index 1c6c418e..8ce0749e 100644
--- a/php/src/Docker/DockerActionManager.php
+++ b/php/src/Docker/DockerActionManager.php
@@ -565,6 +565,7 @@ readonly class DockerActionManager {
'AIO_URL' => $this->configurationManager->AIO_URL,
'SELECTED_RESTORE_TIME' => $this->configurationManager->GetSelectedRestoreTime(),
'RESTORE_EXCLUDE_PREVIEWS' => $this->configurationManager->GetRestoreExcludePreviews(),
+ 'SELECTED_RESTORE_TIME' => $this->configurationManager->selectedRestoreTime,
'APACHE_PORT' => $this->configurationManager->GetApachePort(),
'APACHE_IP_BINDING' => $this->configurationManager->GetApacheIPBinding(),
'TALK_PORT' => $this->configurationManager->GetTalkPort(),
From c968e9e310ad36d2529e9624abe07d6271b55c27 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 19 Jan 2026 13:02:19 +0100
Subject: [PATCH 049/164] Make `restoreExcludePreviews` an attribute
Signed-off-by: Pablo Zmdl
---
php/src/Controller/DockerController.php | 6 +-----
php/src/Data/ConfigurationManager.php | 14 +++++---------
php/src/Docker/DockerActionManager.php | 3 +--
3 files changed, 7 insertions(+), 16 deletions(-)
diff --git a/php/src/Controller/DockerController.php b/php/src/Controller/DockerController.php
index 1848ccab..0ee4e522 100644
--- a/php/src/Controller/DockerController.php
+++ b/php/src/Controller/DockerController.php
@@ -124,12 +124,8 @@ readonly class DockerController {
public function StartBackupContainerRestore(Request $request, Response $response, array $args) : Response {
$this->configurationManager->SetBackupMode('restore');
- if (isset($request->getParsedBody()['restore-exclude-previews'])) {
- $config['restore-exclude-previews'] = 1;
- } else {
- $config['restore-exclude-previews'] = '';
- }
$this->configurationManager->selectedRestoreTime = $request->getParsedBody()['selected_restore_time'] ?? '';
+ $this->configurationManager->restoreExcludePreviews = isset($request->getParsedBody()['restore-exclude-previews']);
$id = self::TOP_CONTAINER;
$forceStopNextcloud = true;
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index 3e003e61..d216fedd 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -23,6 +23,11 @@ class ConfigurationManager
set { $this->set('password', $value); }
}
+ public bool $restoreExcludePreviews {
+ get => $this->get('restore-exclude-previews', false);
+ set { $this->set('restore-exclude-previews', $value); }
+ }
+
public string $selectedRestoreTime {
get => $this->get('selected-restore-time', '');
set { $this->set('selected-restore-time', $value); }
@@ -472,15 +477,6 @@ class ConfigurationManager
$this->WriteConfig($config);
}
- public function GetRestoreExcludePreviews() : string {
- $config = $this->GetConfig();
- if(!isset($config['restore-exclude-previews'])) {
- $config['restore-exclude-previews'] = '';
- }
-
- return $config['restore-exclude-previews'];
- }
-
/**
* @throws InvalidSettingConfigurationException
*/
diff --git a/php/src/Docker/DockerActionManager.php b/php/src/Docker/DockerActionManager.php
index 8ce0749e..b04124f3 100644
--- a/php/src/Docker/DockerActionManager.php
+++ b/php/src/Docker/DockerActionManager.php
@@ -563,8 +563,7 @@ readonly class DockerActionManager {
'BORGBACKUP_REMOTE_REPO' => $this->configurationManager->GetBorgRemoteRepo(),
'BORGBACKUP_MODE' => $this->configurationManager->GetBackupMode(),
'AIO_URL' => $this->configurationManager->AIO_URL,
- 'SELECTED_RESTORE_TIME' => $this->configurationManager->GetSelectedRestoreTime(),
- 'RESTORE_EXCLUDE_PREVIEWS' => $this->configurationManager->GetRestoreExcludePreviews(),
+ 'RESTORE_EXCLUDE_PREVIEWS' => $this->configurationManager->restoreExcludePreviews ? '1' : '',
'SELECTED_RESTORE_TIME' => $this->configurationManager->selectedRestoreTime,
'APACHE_PORT' => $this->configurationManager->GetApachePort(),
'APACHE_IP_BINDING' => $this->configurationManager->GetApacheIPBinding(),
From 881e77cca5d4b975f8ae2588dde4cd5a02898043 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 19 Jan 2026 13:00:22 +0100
Subject: [PATCH 050/164] Make `isWhiteboardEnabled` an attribute
Signed-off-by: Pablo Zmdl
---
php/public/index.php | 2 +-
php/src/ContainerDefinitionFetcher.php | 4 ++--
.../Controller/ConfigurationController.php | 6 +-----
php/src/Data/ConfigurationManager.php | 20 +++++--------------
php/src/Docker/DockerActionManager.php | 2 +-
5 files changed, 10 insertions(+), 24 deletions(-)
diff --git a/php/public/index.php b/php/public/index.php
index 59708627..a0b45675 100644
--- a/php/public/index.php
+++ b/php/public/index.php
@@ -136,7 +136,7 @@ $app->get('/containers', function (Request $request, Response $response, array $
'is_nvidia_gpu_enabled' => $configurationManager->isNvidiaGpuEnabled(),
'is_talk_recording_enabled' => $configurationManager->isTalkRecordingEnabled(),
'is_docker_socket_proxy_enabled' => $configurationManager->isDockerSocketProxyEnabled(),
- 'is_whiteboard_enabled' => $configurationManager->isWhiteboardEnabled(),
+ 'is_whiteboard_enabled' => $configurationManager->isWhiteboardEnabled,
'community_containers' => $configurationManager->listAvailableCommunityContainers(),
'community_containers_enabled' => $configurationManager->GetEnabledCommunityContainers(),
'bypass_container_update' => $bypass_container_update,
diff --git a/php/src/ContainerDefinitionFetcher.php b/php/src/ContainerDefinitionFetcher.php
index d7498047..ccca996f 100644
--- a/php/src/ContainerDefinitionFetcher.php
+++ b/php/src/ContainerDefinitionFetcher.php
@@ -91,7 +91,7 @@ readonly class ContainerDefinitionFetcher {
continue;
}
} elseif ($entry['container_name'] === 'nextcloud-aio-whiteboard') {
- if (!$this->configurationManager->isWhiteboardEnabled()) {
+ if (!$this->configurationManager->isWhiteboardEnabled) {
continue;
}
}
@@ -200,7 +200,7 @@ readonly class ContainerDefinitionFetcher {
continue;
}
} elseif ($value === 'nextcloud-aio-whiteboard') {
- if (!$this->configurationManager->isWhiteboardEnabled()) {
+ if (!$this->configurationManager->isWhiteboardEnabled) {
continue;
}
}
diff --git a/php/src/Controller/ConfigurationController.php b/php/src/Controller/ConfigurationController.php
index b449db6a..62034681 100644
--- a/php/src/Controller/ConfigurationController.php
+++ b/php/src/Controller/ConfigurationController.php
@@ -119,11 +119,7 @@ readonly class ConfigurationController {
} else {
$this->configurationManager->SetDockerSocketProxyEnabledState(0);
}
- if (isset($request->getParsedBody()['whiteboard'])) {
- $this->configurationManager->SetWhiteboardEnabledState(1);
- } else {
- $this->configurationManager->SetWhiteboardEnabledState(0);
- }
+ $this->configurationManager->isWhiteboardEnabled = isset($request->getParsedBody()['whiteboard']);
}
if (isset($request->getParsedBody()['community-form'])) {
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index d216fedd..a6dd196a 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -23,6 +23,11 @@ class ConfigurationManager
set { $this->set('password', $value); }
}
+ public bool $isWhiteboardEnabled {
+ get => $this->get('isWhiteboardEnabled', true);
+ set { $this->set('isWhiteboardEnabled', $value); }
+ }
+
public bool $restoreExcludePreviews {
get => $this->get('restore-exclude-previews', false);
set { $this->set('restore-exclude-previews', $value); }
@@ -207,21 +212,6 @@ class ConfigurationManager
$this->WriteConfig($config);
}
- public function isWhiteboardEnabled() : bool {
- $config = $this->GetConfig();
- if (isset($config['isWhiteboardEnabled']) && $config['isWhiteboardEnabled'] === 0) {
- return false;
- } else {
- return true;
- }
- }
-
- public function SetWhiteboardEnabledState(int $value) : void {
- $config = $this->GetConfig();
- $config['isWhiteboardEnabled'] = $value;
- $this->WriteConfig($config);
- }
-
public function SetClamavEnabledState(int $value) : void {
$config = $this->GetConfig();
$config['isClamavEnabled'] = $value;
diff --git a/php/src/Docker/DockerActionManager.php b/php/src/Docker/DockerActionManager.php
index b04124f3..72abd49c 100644
--- a/php/src/Docker/DockerActionManager.php
+++ b/php/src/Docker/DockerActionManager.php
@@ -601,7 +601,7 @@ readonly class DockerActionManager {
'AIO_DATABASE_HOST' => gethostbyname('nextcloud-aio-database'),
// Allow to get local ip-address of caddy container and add it to trusted proxies automatically
'CADDY_IP_ADDRESS' => in_array('caddy', $this->configurationManager->GetEnabledCommunityContainers(), true) ? gethostbyname('nextcloud-aio-caddy') : '',
- 'WHITEBOARD_ENABLED' => $this->configurationManager->isWhiteboardEnabled() ? 'yes' : '',
+ 'WHITEBOARD_ENABLED' => $this->configurationManager->isWhiteboardEnabled ? 'yes' : '',
default => $this->configurationManager->GetRegisteredSecret($placeholder),
};
}
From 6576d3c1e9e8e4d0c118dc3388ab8415152b7690 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 19 Jan 2026 12:58:50 +0100
Subject: [PATCH 051/164] Make `backupMode` an attribute
Signed-off-by: Pablo Zmdl
---
php/public/index.php | 2 +-
php/src/Controller/DockerController.php | 14 +++++++-------
php/src/Data/ConfigurationManager.php | 20 +++++---------------
3 files changed, 13 insertions(+), 23 deletions(-)
diff --git a/php/public/index.php b/php/public/index.php
index a0b45675..6abe1989 100644
--- a/php/public/index.php
+++ b/php/public/index.php
@@ -104,7 +104,7 @@ $app->get('/containers', function (Request $request, Response $response, array $
'is_backup_container_running' => $dockerActionManager->isBackupContainerRunning(),
'backup_exit_code' => $dockerActionManager->GetBackupcontainerExitCode(),
'is_instance_restore_attempt' => $configurationManager->isInstanceRestoreAttempt(),
- 'borg_backup_mode' => $configurationManager->GetBackupMode(),
+ 'borg_backup_mode' => $configurationManager->backupMode,
'was_start_button_clicked' => $configurationManager->wasStartButtonClicked,
'has_update_available' => $dockerActionManager->isAnyUpdateAvailable(),
'last_backup_time' => $configurationManager->GetLastBackupTime(),
diff --git a/php/src/Controller/DockerController.php b/php/src/Controller/DockerController.php
index 0ee4e522..566f430a 100644
--- a/php/src/Controller/DockerController.php
+++ b/php/src/Controller/DockerController.php
@@ -89,7 +89,7 @@ readonly class DockerController {
}
public function startBackup(bool $forceStopNextcloud = false) : void {
- $this->configurationManager->SetBackupMode('backup');
+ $this->configurationManager->backupMode = 'backup';
$id = self::TOP_CONTAINER;
$this->PerformRecursiveContainerStop($id, $forceStopNextcloud);
@@ -109,21 +109,21 @@ readonly class DockerController {
}
public function checkBackup() : void {
- $this->configurationManager->SetBackupMode('check');
+ $this->configurationManager->backupMode = 'check';
$id = 'nextcloud-aio-borgbackup';
$this->PerformRecursiveContainerStart($id);
}
private function listBackup() : void {
- $this->configurationManager->SetBackupMode('list');
+ $this->configurationManager->backupMode = 'list';
$id = 'nextcloud-aio-borgbackup';
$this->PerformRecursiveContainerStart($id);
}
public function StartBackupContainerRestore(Request $request, Response $response, array $args) : Response {
- $this->configurationManager->SetBackupMode('restore');
+ $this->configurationManager->backupMode = 'restore';
$this->configurationManager->selectedRestoreTime = $request->getParsedBody()['selected_restore_time'] ?? '';
$this->configurationManager->restoreExcludePreviews = isset($request->getParsedBody()['restore-exclude-previews']);
@@ -138,22 +138,22 @@ readonly class DockerController {
}
public function StartBackupContainerCheckRepair(Request $request, Response $response, array $args) : Response {
- $this->configurationManager->SetBackupMode('check-repair');
+ $this->configurationManager->backupMode = 'check-repair';
$id = 'nextcloud-aio-borgbackup';
$this->PerformRecursiveContainerStart($id);
// Restore to backup check which is needed to make the UI logic work correctly
- $this->configurationManager->SetBackupMode('check');
+ $this->configurationManager->backupMode = 'check';
return $response->withStatus(201)->withHeader('Location', '.');
}
public function StartBackupContainerTest(Request $request, Response $response, array $args) : Response {
- $this->configurationManager->SetBackupMode('test');
$config = $this->configurationManager->GetConfig();
$config['instance_restore_attempt'] = 0;
$this->configurationManager->WriteConfig($config);
+ $this->configurationManager->backupMode = 'test';
$id = self::TOP_CONTAINER;
$this->PerformRecursiveContainerStop($id);
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index a6dd196a..e21984b6 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -38,6 +38,11 @@ class ConfigurationManager
set { $this->set('selected-restore-time', $value); }
}
+ public string $backupMode {
+ get => $this->get('backup-mode', '');
+ set { $this->set('backup-mode', $value); }
+ }
+
public string $AIO_URL {
get => $this->get('AIO_URL', '');
set { $this->set('AIO_URL', $value); }
@@ -452,21 +457,6 @@ class ConfigurationManager
return 'dc=' . implode(',dc=', explode('.', $domain));
}
- public function GetBackupMode() : string {
- $config = $this->GetConfig();
- if(!isset($config['backup-mode'])) {
- $config['backup-mode'] = '';
- }
-
- return $config['backup-mode'];
- }
-
- public function SetBackupMode(string $mode) : void {
- $config = $this->GetConfig();
- $config['backup-mode'] = $mode;
- $this->WriteConfig($config);
- }
-
/**
* @throws InvalidSettingConfigurationException
*/
From f235af29e33f7d84197a3861754fe3e5792a21bf Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 19 Jan 2026 12:56:10 +0100
Subject: [PATCH 052/164] Make `isDockerSocketProxyEnabled` an attribute
Signed-off-by: Pablo Zmdl
---
php/public/index.php | 2 +-
php/src/ContainerDefinitionFetcher.php | 4 ++--
.../Controller/ConfigurationController.php | 6 +-----
php/src/Data/ConfigurationManager.php | 20 +++++--------------
php/src/Docker/DockerActionManager.php | 2 +-
5 files changed, 10 insertions(+), 24 deletions(-)
diff --git a/php/public/index.php b/php/public/index.php
index 6abe1989..caff178c 100644
--- a/php/public/index.php
+++ b/php/public/index.php
@@ -135,7 +135,7 @@ $app->get('/containers', function (Request $request, Response $response, array $
'is_dri_device_enabled' => $configurationManager->isDriDeviceEnabled(),
'is_nvidia_gpu_enabled' => $configurationManager->isNvidiaGpuEnabled(),
'is_talk_recording_enabled' => $configurationManager->isTalkRecordingEnabled(),
- 'is_docker_socket_proxy_enabled' => $configurationManager->isDockerSocketProxyEnabled(),
+ 'is_docker_socket_proxy_enabled' => $configurationManager->isDockerSocketProxyEnabled,
'is_whiteboard_enabled' => $configurationManager->isWhiteboardEnabled,
'community_containers' => $configurationManager->listAvailableCommunityContainers(),
'community_containers_enabled' => $configurationManager->GetEnabledCommunityContainers(),
diff --git a/php/src/ContainerDefinitionFetcher.php b/php/src/ContainerDefinitionFetcher.php
index ccca996f..fe454fba 100644
--- a/php/src/ContainerDefinitionFetcher.php
+++ b/php/src/ContainerDefinitionFetcher.php
@@ -87,7 +87,7 @@ readonly class ContainerDefinitionFetcher {
continue;
}
} elseif ($entry['container_name'] === 'nextcloud-aio-docker-socket-proxy') {
- if (!$this->configurationManager->isDockerSocketProxyEnabled()) {
+ if (!$this->configurationManager->isDockerSocketProxyEnabled) {
continue;
}
} elseif ($entry['container_name'] === 'nextcloud-aio-whiteboard') {
@@ -196,7 +196,7 @@ readonly class ContainerDefinitionFetcher {
continue;
}
} elseif ($value === 'nextcloud-aio-docker-socket-proxy') {
- if (!$this->configurationManager->isDockerSocketProxyEnabled()) {
+ if (!$this->configurationManager->isDockerSocketProxyEnabled) {
continue;
}
} elseif ($value === 'nextcloud-aio-whiteboard') {
diff --git a/php/src/Controller/ConfigurationController.php b/php/src/Controller/ConfigurationController.php
index 62034681..76eefae5 100644
--- a/php/src/Controller/ConfigurationController.php
+++ b/php/src/Controller/ConfigurationController.php
@@ -114,11 +114,7 @@ readonly class ConfigurationController {
} else {
$this->configurationManager->SetFulltextsearchEnabledState(0);
}
- if (isset($request->getParsedBody()['docker-socket-proxy'])) {
- $this->configurationManager->SetDockerSocketProxyEnabledState(1);
- } else {
- $this->configurationManager->SetDockerSocketProxyEnabledState(0);
- }
+ $this->configurationManager->isDockerSocketProxyEnabled = isset($request->getParsedBody()['docker-socket-proxy']);
$this->configurationManager->isWhiteboardEnabled = isset($request->getParsedBody()['whiteboard']);
}
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index e21984b6..a44751c4 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -23,6 +23,11 @@ class ConfigurationManager
set { $this->set('password', $value); }
}
+ public bool $isDockerSocketProxyEnabled {
+ get => $this->get('isDockerSocketProxyEnabled', false);
+ set { $this->set('isDockerSocketProxyEnabled', $value); }
+ }
+
public bool $isWhiteboardEnabled {
get => $this->get('isWhiteboardEnabled', true);
set { $this->set('isWhiteboardEnabled', $value); }
@@ -202,21 +207,6 @@ class ConfigurationManager
}
}
- public function isDockerSocketProxyEnabled() : bool {
- $config = $this->GetConfig();
- if (isset($config['isDockerSocketProxyEnabled']) && $config['isDockerSocketProxyEnabled'] === 1) {
- return true;
- } else {
- return false;
- }
- }
-
- public function SetDockerSocketProxyEnabledState(int $value) : void {
- $config = $this->GetConfig();
- $config['isDockerSocketProxyEnabled'] = $value;
- $this->WriteConfig($config);
- }
-
public function SetClamavEnabledState(int $value) : void {
$config = $this->GetConfig();
$config['isClamavEnabled'] = $value;
diff --git a/php/src/Docker/DockerActionManager.php b/php/src/Docker/DockerActionManager.php
index 72abd49c..66368ca4 100644
--- a/php/src/Docker/DockerActionManager.php
+++ b/php/src/Docker/DockerActionManager.php
@@ -581,7 +581,7 @@ readonly class DockerActionManager {
'COLLABORA_DICTIONARIES' => $this->configurationManager->GetCollaboraDictionaries() === '' ? 'de_DE en_GB en_US es_ES fr_FR it nl pt_BR pt_PT ru' : $this->configurationManager->GetCollaboraDictionaries(),
'IMAGINARY_ENABLED' => $this->configurationManager->isImaginaryEnabled() ? 'yes' : '',
'FULLTEXTSEARCH_ENABLED' => $this->configurationManager->isFulltextsearchEnabled() ? 'yes' : '',
- 'DOCKER_SOCKET_PROXY_ENABLED' => $this->configurationManager->isDockerSocketProxyEnabled() ? 'yes' : '',
+ 'DOCKER_SOCKET_PROXY_ENABLED' => $this->configurationManager->isDockerSocketProxyEnabled ? 'yes' : '',
'NEXTCLOUD_UPLOAD_LIMIT' => $this->configurationManager->GetNextcloudUploadLimit(),
'NEXTCLOUD_MEMORY_LIMIT' => $this->configurationManager->GetNextcloudMemoryLimit(),
'NEXTCLOUD_MAX_TIME' => $this->configurationManager->GetNextcloudMaxTime(),
From bebae7069b41d4c49bc13fa6817ee1241cb4751c Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 19 Jan 2026 12:52:03 +0100
Subject: [PATCH 053/164] Make `instance_restore_attempt` an attribute
Signed-off-by: Pablo Zmdl
---
php/public/index.php | 2 +-
php/src/Controller/DockerController.php | 4 +---
php/src/Data/ConfigurationManager.php | 22 +++++++++-------------
3 files changed, 11 insertions(+), 17 deletions(-)
diff --git a/php/public/index.php b/php/public/index.php
index caff178c..235a3ffc 100644
--- a/php/public/index.php
+++ b/php/public/index.php
@@ -103,7 +103,7 @@ $app->get('/containers', function (Request $request, Response $response, array $
'has_backup_run_once' => $configurationManager->hasBackupRunOnce(),
'is_backup_container_running' => $dockerActionManager->isBackupContainerRunning(),
'backup_exit_code' => $dockerActionManager->GetBackupcontainerExitCode(),
- 'is_instance_restore_attempt' => $configurationManager->isInstanceRestoreAttempt(),
+ 'is_instance_restore_attempt' => $configurationManager->instance_restore_attempt,
'borg_backup_mode' => $configurationManager->backupMode,
'was_start_button_clicked' => $configurationManager->wasStartButtonClicked,
'has_update_available' => $dockerActionManager->isAnyUpdateAvailable(),
diff --git a/php/src/Controller/DockerController.php b/php/src/Controller/DockerController.php
index 566f430a..df6fbe5d 100644
--- a/php/src/Controller/DockerController.php
+++ b/php/src/Controller/DockerController.php
@@ -150,10 +150,8 @@ readonly class DockerController {
}
public function StartBackupContainerTest(Request $request, Response $response, array $args) : Response {
- $config = $this->configurationManager->GetConfig();
- $config['instance_restore_attempt'] = 0;
- $this->configurationManager->WriteConfig($config);
$this->configurationManager->backupMode = 'test';
+ $this->configurationManager->instance_restore_attempt = false;
$id = self::TOP_CONTAINER;
$this->PerformRecursiveContainerStop($id);
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index a44751c4..12d4aef2 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -48,6 +48,11 @@ class ConfigurationManager
set { $this->set('backup-mode', $value); }
}
+ public bool $instance_restore_attempt {
+ get => $this->get('instance_restore_attempt', false);
+ set { $this->set('instance_restore_attempt', $value); }
+ }
+
public string $AIO_URL {
get => $this->get('AIO_URL', '');
set { $this->set('AIO_URL', $value); }
@@ -529,8 +534,11 @@ class ConfigurationManager
$config['borg_backup_host_location'] = $location;
$config['borg_remote_repo'] = $repo;
$config['borg_restore_password'] = $password;
- $config['instance_restore_attempt'] = 1;
$this->WriteConfig($config);
+
+ $this->setMultiple(function ($confManager) {
+ $confManager->instance_restore_attempt = true;
+ });
}
/**
@@ -663,18 +671,6 @@ class ConfigurationManager
return $config['borg_restore_password'];
}
- public function isInstanceRestoreAttempt() : bool {
- $config = $this->GetConfig();
- if(!isset($config['instance_restore_attempt'])) {
- $config['instance_restore_attempt'] = '';
- }
-
- if ($config['instance_restore_attempt'] === 1) {
- return true;
- }
- return false;
- }
-
public function GetNextcloudMount() : string {
$envVariableName = 'NEXTCLOUD_MOUNT';
$configName = 'nextcloud_mount';
From f8a244bee2e87c6a0bd46d61ee93b39fb4267b24 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 19 Jan 2026 12:01:53 +0100
Subject: [PATCH 054/164] Make `isClamavEnabled` an attribute
Signed-off-by: Pablo Zmdl
---
php/public/index.php | 2 +-
php/src/ContainerDefinitionFetcher.php | 4 ++--
.../Controller/ConfigurationController.php | 6 +-----
php/src/Data/ConfigurationManager.php | 20 +++++--------------
php/src/Docker/DockerActionManager.php | 2 +-
5 files changed, 10 insertions(+), 24 deletions(-)
diff --git a/php/public/index.php b/php/public/index.php
index 235a3ffc..c213251d 100644
--- a/php/public/index.php
+++ b/php/public/index.php
@@ -110,7 +110,7 @@ $app->get('/containers', function (Request $request, Response $response, array $
'last_backup_time' => $configurationManager->GetLastBackupTime(),
'backup_times' => $configurationManager->GetBackupTimes(),
'current_channel' => $dockerActionManager->GetCurrentChannel(),
- 'is_clamav_enabled' => $configurationManager->isClamavEnabled(),
+ 'is_clamav_enabled' => $configurationManager->isClamavEnabled,
'is_onlyoffice_enabled' => $configurationManager->isOnlyofficeEnabled(),
'is_collabora_enabled' => $configurationManager->isCollaboraEnabled(),
'is_talk_enabled' => $configurationManager->isTalkEnabled(),
diff --git a/php/src/ContainerDefinitionFetcher.php b/php/src/ContainerDefinitionFetcher.php
index fe454fba..639f6513 100644
--- a/php/src/ContainerDefinitionFetcher.php
+++ b/php/src/ContainerDefinitionFetcher.php
@@ -56,7 +56,7 @@ readonly class ContainerDefinitionFetcher {
$containers = [];
foreach ($data['aio_services_v1'] as $entry) {
if ($entry['container_name'] === 'nextcloud-aio-clamav') {
- if (!$this->configurationManager->isClamavEnabled()) {
+ if (!$this->configurationManager->isClamavEnabled) {
continue;
}
} elseif ($entry['container_name'] === 'nextcloud-aio-onlyoffice') {
@@ -168,7 +168,7 @@ readonly class ContainerDefinitionFetcher {
}
foreach ($valueDependsOn as $value) {
if ($value === 'nextcloud-aio-clamav') {
- if (!$this->configurationManager->isClamavEnabled()) {
+ if (!$this->configurationManager->isClamavEnabled) {
continue;
}
} elseif ($value === 'nextcloud-aio-onlyoffice') {
diff --git a/php/src/Controller/ConfigurationController.php b/php/src/Controller/ConfigurationController.php
index 76eefae5..b8a4bb6c 100644
--- a/php/src/Controller/ConfigurationController.php
+++ b/php/src/Controller/ConfigurationController.php
@@ -88,11 +88,7 @@ readonly class ConfigurationController {
$this->configurationManager->SetCollaboraEnabledState(0);
$this->configurationManager->SetOnlyofficeEnabledState(0);
}
-
- if (isset($request->getParsedBody()['clamav'])) {
- $this->configurationManager->SetClamavEnabledState(1);
- } else {
- $this->configurationManager->SetClamavEnabledState(0);
+ $this->configurationManager->isClamavEnabled = isset($request->getParsedBody()['clamav']);
}
if (isset($request->getParsedBody()['talk'])) {
$this->configurationManager->SetTalkEnabledState(1);
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index 12d4aef2..485ca6ce 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -68,6 +68,11 @@ class ConfigurationManager
set { $this->set('install_latest_major', $value); }
}
+ public bool $isClamavEnabled {
+ get => $this->get('isClamavEnabled', false);
+ set { $this->set('isClamavEnabled', $value); }
+ }
+
public function GetConfig() : array
{
if ($this->config === [] && file_exists(DataConst::GetConfigFile()))
@@ -203,21 +208,6 @@ class ConfigurationManager
}
}
- public function isClamavEnabled() : bool {
- $config = $this->GetConfig();
- if (isset($config['isClamavEnabled']) && $config['isClamavEnabled'] === 1) {
- return true;
- } else {
- return false;
- }
- }
-
- public function SetClamavEnabledState(int $value) : void {
- $config = $this->GetConfig();
- $config['isClamavEnabled'] = $value;
- $this->WriteConfig($config);
- }
-
public function isImaginaryEnabled() : bool {
$config = $this->GetConfig();
if (isset($config['isImaginaryEnabled']) && $config['isImaginaryEnabled'] === 0) {
diff --git a/php/src/Docker/DockerActionManager.php b/php/src/Docker/DockerActionManager.php
index 66368ca4..86401005 100644
--- a/php/src/Docker/DockerActionManager.php
+++ b/php/src/Docker/DockerActionManager.php
@@ -571,7 +571,7 @@ readonly class DockerActionManager {
'TURN_DOMAIN' => $this->configurationManager->GetTurnDomain(),
'NEXTCLOUD_MOUNT' => $this->configurationManager->GetNextcloudMount(),
'BACKUP_RESTORE_PASSWORD' => $this->configurationManager->GetBorgRestorePassword(),
- 'CLAMAV_ENABLED' => $this->configurationManager->isClamavEnabled() ? 'yes' : '',
+ 'CLAMAV_ENABLED' => $this->configurationManager->isClamavEnabled ? 'yes' : '',
'TALK_RECORDING_ENABLED' => $this->configurationManager->isTalkRecordingEnabled() ? 'yes' : '',
'ONLYOFFICE_ENABLED' => $this->configurationManager->isOnlyofficeEnabled() ? 'yes' : '',
'COLLABORA_ENABLED' => $this->configurationManager->isCollaboraEnabled() ? 'yes' : '',
From 0c3d919618f5e61173a7c7b3533926fdd5bd4434 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 19 Jan 2026 12:02:41 +0100
Subject: [PATCH 055/164] Make `isOnlyofficeEnabled` an attribute
Signed-off-by: Pablo Zmdl
---
php/public/index.php | 2 +-
php/src/ContainerDefinitionFetcher.php | 4 ++--
.../Controller/ConfigurationController.php | 7 +++----
php/src/Data/ConfigurationManager.php | 20 +++++--------------
php/src/Docker/DockerActionManager.php | 2 +-
5 files changed, 12 insertions(+), 23 deletions(-)
diff --git a/php/public/index.php b/php/public/index.php
index c213251d..75607e63 100644
--- a/php/public/index.php
+++ b/php/public/index.php
@@ -111,7 +111,7 @@ $app->get('/containers', function (Request $request, Response $response, array $
'backup_times' => $configurationManager->GetBackupTimes(),
'current_channel' => $dockerActionManager->GetCurrentChannel(),
'is_clamav_enabled' => $configurationManager->isClamavEnabled,
- 'is_onlyoffice_enabled' => $configurationManager->isOnlyofficeEnabled(),
+ 'is_onlyoffice_enabled' => $configurationManager->isOnlyofficeEnabled,
'is_collabora_enabled' => $configurationManager->isCollaboraEnabled(),
'is_talk_enabled' => $configurationManager->isTalkEnabled(),
'borg_restore_password' => $configurationManager->GetBorgRestorePassword(),
diff --git a/php/src/ContainerDefinitionFetcher.php b/php/src/ContainerDefinitionFetcher.php
index 639f6513..d101178b 100644
--- a/php/src/ContainerDefinitionFetcher.php
+++ b/php/src/ContainerDefinitionFetcher.php
@@ -60,7 +60,7 @@ readonly class ContainerDefinitionFetcher {
continue;
}
} elseif ($entry['container_name'] === 'nextcloud-aio-onlyoffice') {
- if (!$this->configurationManager->isOnlyofficeEnabled()) {
+ if (!$this->configurationManager->isOnlyofficeEnabled) {
continue;
}
} elseif ($entry['container_name'] === 'nextcloud-aio-collabora') {
@@ -172,7 +172,7 @@ readonly class ContainerDefinitionFetcher {
continue;
}
} elseif ($value === 'nextcloud-aio-onlyoffice') {
- if (!$this->configurationManager->isOnlyofficeEnabled()) {
+ if (!$this->configurationManager->isOnlyofficeEnabled) {
continue;
}
} elseif ($value === 'nextcloud-aio-collabora') {
diff --git a/php/src/Controller/ConfigurationController.php b/php/src/Controller/ConfigurationController.php
index b8a4bb6c..d39efd2a 100644
--- a/php/src/Controller/ConfigurationController.php
+++ b/php/src/Controller/ConfigurationController.php
@@ -80,16 +80,15 @@ readonly class ConfigurationController {
if ($officeSuiteChoice === 'collabora') {
$this->configurationManager->SetCollaboraEnabledState(1);
- $this->configurationManager->SetOnlyofficeEnabledState(0);
+ $this->configurationManager->isOnlyofficeEnabled = false;
} elseif ($officeSuiteChoice === 'onlyoffice') {
$this->configurationManager->SetCollaboraEnabledState(0);
- $this->configurationManager->SetOnlyofficeEnabledState(1);
+ $this->configurationManager->isOnlyofficeEnabled = true;
} else {
$this->configurationManager->SetCollaboraEnabledState(0);
- $this->configurationManager->SetOnlyofficeEnabledState(0);
+ $this->configurationManager->isOnlyofficeEnabled = false;
}
$this->configurationManager->isClamavEnabled = isset($request->getParsedBody()['clamav']);
- }
if (isset($request->getParsedBody()['talk'])) {
$this->configurationManager->SetTalkEnabledState(1);
} else {
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index 485ca6ce..36cea5e0 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -73,6 +73,11 @@ class ConfigurationManager
set { $this->set('isClamavEnabled', $value); }
}
+ public bool $isOnlyofficeEnabled {
+ get => $this->get('isOnlyofficeEnabled', false);
+ set { $this->set('isOnlyofficeEnabled', $value); }
+ }
+
public function GetConfig() : array
{
if ($this->config === [] && file_exists(DataConst::GetConfigFile()))
@@ -243,21 +248,6 @@ class ConfigurationManager
$this->WriteConfig($config);
}
- public function isOnlyofficeEnabled() : bool {
- $config = $this->GetConfig();
- if (isset($config['isOnlyofficeEnabled']) && $config['isOnlyofficeEnabled'] === 1) {
- return true;
- } else {
- return false;
- }
- }
-
- public function SetOnlyofficeEnabledState(int $value) : void {
- $config = $this->GetConfig();
- $config['isOnlyofficeEnabled'] = $value;
- $this->WriteConfig($config);
- }
-
public function isCollaboraEnabled() : bool {
$config = $this->GetConfig();
if (isset($config['isCollaboraEnabled']) && $config['isCollaboraEnabled'] === 0) {
diff --git a/php/src/Docker/DockerActionManager.php b/php/src/Docker/DockerActionManager.php
index 86401005..16771c6c 100644
--- a/php/src/Docker/DockerActionManager.php
+++ b/php/src/Docker/DockerActionManager.php
@@ -573,7 +573,7 @@ readonly class DockerActionManager {
'BACKUP_RESTORE_PASSWORD' => $this->configurationManager->GetBorgRestorePassword(),
'CLAMAV_ENABLED' => $this->configurationManager->isClamavEnabled ? 'yes' : '',
'TALK_RECORDING_ENABLED' => $this->configurationManager->isTalkRecordingEnabled() ? 'yes' : '',
- 'ONLYOFFICE_ENABLED' => $this->configurationManager->isOnlyofficeEnabled() ? 'yes' : '',
+ 'ONLYOFFICE_ENABLED' => $this->configurationManager->isOnlyofficeEnabled ? 'yes' : '',
'COLLABORA_ENABLED' => $this->configurationManager->isCollaboraEnabled() ? 'yes' : '',
'TALK_ENABLED' => $this->configurationManager->isTalkEnabled() ? 'yes' : '',
'UPDATE_NEXTCLOUD_APPS' => ($this->configurationManager->isDailyBackupRunning() && $this->configurationManager->areAutomaticUpdatesEnabled()) ? 'yes' : '',
From cd1c2276e5ca2959ced114d881caf5dfa5bbc8d5 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 19 Jan 2026 12:03:12 +0100
Subject: [PATCH 056/164] Make `isCollaboraEnabled` an attribute
Signed-off-by: Pablo Zmdl
---
php/public/index.php | 2 +-
php/src/ContainerDefinitionFetcher.php | 4 ++--
.../Controller/ConfigurationController.php | 6 +++---
php/src/Controller/DockerController.php | 2 +-
php/src/Data/ConfigurationManager.php | 20 +++++--------------
php/src/Docker/DockerActionManager.php | 2 +-
6 files changed, 13 insertions(+), 23 deletions(-)
diff --git a/php/public/index.php b/php/public/index.php
index 75607e63..adfd72d5 100644
--- a/php/public/index.php
+++ b/php/public/index.php
@@ -112,7 +112,7 @@ $app->get('/containers', function (Request $request, Response $response, array $
'current_channel' => $dockerActionManager->GetCurrentChannel(),
'is_clamav_enabled' => $configurationManager->isClamavEnabled,
'is_onlyoffice_enabled' => $configurationManager->isOnlyofficeEnabled,
- 'is_collabora_enabled' => $configurationManager->isCollaboraEnabled(),
+ 'is_collabora_enabled' => $configurationManager->isCollaboraEnabled,
'is_talk_enabled' => $configurationManager->isTalkEnabled(),
'borg_restore_password' => $configurationManager->GetBorgRestorePassword(),
'daily_backup_time' => $configurationManager->GetDailyBackupTime(),
diff --git a/php/src/ContainerDefinitionFetcher.php b/php/src/ContainerDefinitionFetcher.php
index d101178b..e4e27f69 100644
--- a/php/src/ContainerDefinitionFetcher.php
+++ b/php/src/ContainerDefinitionFetcher.php
@@ -64,7 +64,7 @@ readonly class ContainerDefinitionFetcher {
continue;
}
} elseif ($entry['container_name'] === 'nextcloud-aio-collabora') {
- if (!$this->configurationManager->isCollaboraEnabled()) {
+ if (!$this->configurationManager->isCollaboraEnabled) {
continue;
}
if ($this->configurationManager->isCollaboraSubscriptionEnabled()) {
@@ -176,7 +176,7 @@ readonly class ContainerDefinitionFetcher {
continue;
}
} elseif ($value === 'nextcloud-aio-collabora') {
- if (!$this->configurationManager->isCollaboraEnabled()) {
+ if (!$this->configurationManager->isCollaboraEnabled) {
continue;
}
} elseif ($value === 'nextcloud-aio-talk') {
diff --git a/php/src/Controller/ConfigurationController.php b/php/src/Controller/ConfigurationController.php
index d39efd2a..56621eee 100644
--- a/php/src/Controller/ConfigurationController.php
+++ b/php/src/Controller/ConfigurationController.php
@@ -79,13 +79,13 @@ readonly class ConfigurationController {
$officeSuiteChoice = $request->getParsedBody()['office_suite_choice'] ?? '';
if ($officeSuiteChoice === 'collabora') {
- $this->configurationManager->SetCollaboraEnabledState(1);
+ $this->configurationManager->isCollaboraEnabled = true;
$this->configurationManager->isOnlyofficeEnabled = false;
} elseif ($officeSuiteChoice === 'onlyoffice') {
- $this->configurationManager->SetCollaboraEnabledState(0);
+ $this->configurationManager->isCollaboraEnabled = false;
$this->configurationManager->isOnlyofficeEnabled = true;
} else {
- $this->configurationManager->SetCollaboraEnabledState(0);
+ $this->configurationManager->isCollaboraEnabled = false;
$this->configurationManager->isOnlyofficeEnabled = false;
}
$this->configurationManager->isClamavEnabled = isset($request->getParsedBody()['clamav']);
diff --git a/php/src/Controller/DockerController.php b/php/src/Controller/DockerController.php
index df6fbe5d..ff73e29a 100644
--- a/php/src/Controller/DockerController.php
+++ b/php/src/Controller/DockerController.php
@@ -224,7 +224,7 @@ readonly class DockerController {
// This is a hack but no better solution was found for the meantime
// Stop Collabora first to make sure it force-saves
// See https://github.com/nextcloud/richdocuments/issues/3799
- if ($id === self::TOP_CONTAINER && $this->configurationManager->isCollaboraEnabled()) {
+ if ($id === self::TOP_CONTAINER && $this->configurationManager->isCollaboraEnabled) {
$this->PerformRecursiveContainerStop('nextcloud-aio-collabora');
}
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index 36cea5e0..165f9c44 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -78,6 +78,11 @@ class ConfigurationManager
set { $this->set('isOnlyofficeEnabled', $value); }
}
+ public bool $isCollaboraEnabled {
+ get => $this->get('isCollaboraEnabled', true);
+ set { $this->set('isCollaboraEnabled', $value); }
+ }
+
public function GetConfig() : array
{
if ($this->config === [] && file_exists(DataConst::GetConfigFile()))
@@ -248,21 +253,6 @@ class ConfigurationManager
$this->WriteConfig($config);
}
- public function isCollaboraEnabled() : bool {
- $config = $this->GetConfig();
- if (isset($config['isCollaboraEnabled']) && $config['isCollaboraEnabled'] === 0) {
- return false;
- } else {
- return true;
- }
- }
-
- public function SetCollaboraEnabledState(int $value) : void {
- $config = $this->GetConfig();
- $config['isCollaboraEnabled'] = $value;
- $this->WriteConfig($config);
- }
-
public function isTalkEnabled() : bool {
$config = $this->GetConfig();
if (isset($config['isTalkEnabled']) && $config['isTalkEnabled'] === 0) {
diff --git a/php/src/Docker/DockerActionManager.php b/php/src/Docker/DockerActionManager.php
index 16771c6c..7cb20ad6 100644
--- a/php/src/Docker/DockerActionManager.php
+++ b/php/src/Docker/DockerActionManager.php
@@ -574,7 +574,7 @@ readonly class DockerActionManager {
'CLAMAV_ENABLED' => $this->configurationManager->isClamavEnabled ? 'yes' : '',
'TALK_RECORDING_ENABLED' => $this->configurationManager->isTalkRecordingEnabled() ? 'yes' : '',
'ONLYOFFICE_ENABLED' => $this->configurationManager->isOnlyofficeEnabled ? 'yes' : '',
- 'COLLABORA_ENABLED' => $this->configurationManager->isCollaboraEnabled() ? 'yes' : '',
+ 'COLLABORA_ENABLED' => $this->configurationManager->isCollaboraEnabled ? 'yes' : '',
'TALK_ENABLED' => $this->configurationManager->isTalkEnabled() ? 'yes' : '',
'UPDATE_NEXTCLOUD_APPS' => ($this->configurationManager->isDailyBackupRunning() && $this->configurationManager->areAutomaticUpdatesEnabled()) ? 'yes' : '',
'TIMEZONE' => $this->configurationManager->GetTimezone() === '' ? 'Etc/UTC' : $this->configurationManager->GetTimezone(),
From e009abdd54030b654044f567fb88873b6365dc42 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 19 Jan 2026 12:03:38 +0100
Subject: [PATCH 057/164] Make `isTalkEnabled` an attribute
Signed-off-by: Pablo Zmdl
---
php/public/index.php | 2 +-
php/src/ContainerDefinitionFetcher.php | 4 ++--
.../Controller/ConfigurationController.php | 6 +-----
php/src/Data/ConfigurationManager.php | 20 +++++--------------
php/src/Docker/DockerActionManager.php | 2 +-
5 files changed, 10 insertions(+), 24 deletions(-)
diff --git a/php/public/index.php b/php/public/index.php
index adfd72d5..0481aceb 100644
--- a/php/public/index.php
+++ b/php/public/index.php
@@ -113,7 +113,7 @@ $app->get('/containers', function (Request $request, Response $response, array $
'is_clamav_enabled' => $configurationManager->isClamavEnabled,
'is_onlyoffice_enabled' => $configurationManager->isOnlyofficeEnabled,
'is_collabora_enabled' => $configurationManager->isCollaboraEnabled,
- 'is_talk_enabled' => $configurationManager->isTalkEnabled(),
+ 'is_talk_enabled' => $configurationManager->isTalkEnabled,
'borg_restore_password' => $configurationManager->GetBorgRestorePassword(),
'daily_backup_time' => $configurationManager->GetDailyBackupTime(),
'is_daily_backup_running' => $configurationManager->isDailyBackupRunning(),
diff --git a/php/src/ContainerDefinitionFetcher.php b/php/src/ContainerDefinitionFetcher.php
index e4e27f69..9635c8cf 100644
--- a/php/src/ContainerDefinitionFetcher.php
+++ b/php/src/ContainerDefinitionFetcher.php
@@ -71,7 +71,7 @@ readonly class ContainerDefinitionFetcher {
$entry['image'] = 'ghcr.io/nextcloud-releases/aio-collabora-online';
}
} elseif ($entry['container_name'] === 'nextcloud-aio-talk') {
- if (!$this->configurationManager->isTalkEnabled()) {
+ if (!$this->configurationManager->isTalkEnabled) {
continue;
}
} elseif ($entry['container_name'] === 'nextcloud-aio-talk-recording') {
@@ -180,7 +180,7 @@ readonly class ContainerDefinitionFetcher {
continue;
}
} elseif ($value === 'nextcloud-aio-talk') {
- if (!$this->configurationManager->isTalkEnabled()) {
+ if (!$this->configurationManager->isTalkEnabled) {
continue;
}
} elseif ($value === 'nextcloud-aio-talk-recording') {
diff --git a/php/src/Controller/ConfigurationController.php b/php/src/Controller/ConfigurationController.php
index 56621eee..75ec29ae 100644
--- a/php/src/Controller/ConfigurationController.php
+++ b/php/src/Controller/ConfigurationController.php
@@ -89,11 +89,7 @@ readonly class ConfigurationController {
$this->configurationManager->isOnlyofficeEnabled = false;
}
$this->configurationManager->isClamavEnabled = isset($request->getParsedBody()['clamav']);
- if (isset($request->getParsedBody()['talk'])) {
- $this->configurationManager->SetTalkEnabledState(1);
- } else {
- $this->configurationManager->SetTalkEnabledState(0);
- }
+ $this->configurationManager->isTalkEnabled = isset($request->getParsedBody()['talk']);
if (isset($request->getParsedBody()['talk-recording'])) {
$this->configurationManager->SetTalkRecordingEnabledState(1);
} else {
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index 165f9c44..648d04c3 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -83,6 +83,11 @@ class ConfigurationManager
set { $this->set('isCollaboraEnabled', $value); }
}
+ public bool $isTalkEnabled {
+ get => $this->get('isTalkEnabled', true);
+ set { $this->set('isTalkEnabled', $value); }
+ }
+
public function GetConfig() : array
{
if ($this->config === [] && file_exists(DataConst::GetConfigFile()))
@@ -253,21 +258,6 @@ class ConfigurationManager
$this->WriteConfig($config);
}
- public function isTalkEnabled() : bool {
- $config = $this->GetConfig();
- if (isset($config['isTalkEnabled']) && $config['isTalkEnabled'] === 0) {
- return false;
- } else {
- return true;
- }
- }
-
- public function SetTalkEnabledState(int $value) : void {
- $config = $this->GetConfig();
- $config['isTalkEnabled'] = $value;
- $this->WriteConfig($config);
- }
-
public function isTalkRecordingEnabled() : bool {
if (!$this->isTalkEnabled()) {
return false;
diff --git a/php/src/Docker/DockerActionManager.php b/php/src/Docker/DockerActionManager.php
index 7cb20ad6..313de7b0 100644
--- a/php/src/Docker/DockerActionManager.php
+++ b/php/src/Docker/DockerActionManager.php
@@ -575,7 +575,7 @@ readonly class DockerActionManager {
'TALK_RECORDING_ENABLED' => $this->configurationManager->isTalkRecordingEnabled() ? 'yes' : '',
'ONLYOFFICE_ENABLED' => $this->configurationManager->isOnlyofficeEnabled ? 'yes' : '',
'COLLABORA_ENABLED' => $this->configurationManager->isCollaboraEnabled ? 'yes' : '',
- 'TALK_ENABLED' => $this->configurationManager->isTalkEnabled() ? 'yes' : '',
+ 'TALK_ENABLED' => $this->configurationManager->isTalkEnabled ? 'yes' : '',
'UPDATE_NEXTCLOUD_APPS' => ($this->configurationManager->isDailyBackupRunning() && $this->configurationManager->areAutomaticUpdatesEnabled()) ? 'yes' : '',
'TIMEZONE' => $this->configurationManager->GetTimezone() === '' ? 'Etc/UTC' : $this->configurationManager->GetTimezone(),
'COLLABORA_DICTIONARIES' => $this->configurationManager->GetCollaboraDictionaries() === '' ? 'de_DE en_GB en_US es_ES fr_FR it nl pt_BR pt_PT ru' : $this->configurationManager->GetCollaboraDictionaries(),
From 190d47810b8501f0788e5e65dc576ae0284f9554 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 19 Jan 2026 12:04:04 +0100
Subject: [PATCH 058/164] Make `isTalkRecordingEnabled` an attribute
Signed-off-by: Pablo Zmdl
---
php/public/index.php | 2 +-
php/src/ContainerDefinitionFetcher.php | 4 +--
.../Controller/ConfigurationController.php | 6 +----
php/src/Data/ConfigurationManager.php | 27 ++++---------------
php/src/Docker/DockerActionManager.php | 2 +-
5 files changed, 10 insertions(+), 31 deletions(-)
diff --git a/php/public/index.php b/php/public/index.php
index 0481aceb..34d7efe1 100644
--- a/php/public/index.php
+++ b/php/public/index.php
@@ -134,7 +134,7 @@ $app->get('/containers', function (Request $request, Response $response, array $
'nextcloud_memory_limit' => $configurationManager->GetNextcloudMemoryLimit(),
'is_dri_device_enabled' => $configurationManager->isDriDeviceEnabled(),
'is_nvidia_gpu_enabled' => $configurationManager->isNvidiaGpuEnabled(),
- 'is_talk_recording_enabled' => $configurationManager->isTalkRecordingEnabled(),
+ 'is_talk_recording_enabled' => $configurationManager->isTalkRecordingEnabled,
'is_docker_socket_proxy_enabled' => $configurationManager->isDockerSocketProxyEnabled,
'is_whiteboard_enabled' => $configurationManager->isWhiteboardEnabled,
'community_containers' => $configurationManager->listAvailableCommunityContainers(),
diff --git a/php/src/ContainerDefinitionFetcher.php b/php/src/ContainerDefinitionFetcher.php
index 9635c8cf..851b2b4d 100644
--- a/php/src/ContainerDefinitionFetcher.php
+++ b/php/src/ContainerDefinitionFetcher.php
@@ -75,7 +75,7 @@ readonly class ContainerDefinitionFetcher {
continue;
}
} elseif ($entry['container_name'] === 'nextcloud-aio-talk-recording') {
- if (!$this->configurationManager->isTalkRecordingEnabled()) {
+ if (!$this->configurationManager->isTalkRecordingEnabled) {
continue;
}
} elseif ($entry['container_name'] === 'nextcloud-aio-imaginary') {
@@ -184,7 +184,7 @@ readonly class ContainerDefinitionFetcher {
continue;
}
} elseif ($value === 'nextcloud-aio-talk-recording') {
- if (!$this->configurationManager->isTalkRecordingEnabled()) {
+ if (!$this->configurationManager->isTalkRecordingEnabled) {
continue;
}
} elseif ($value === 'nextcloud-aio-imaginary') {
diff --git a/php/src/Controller/ConfigurationController.php b/php/src/Controller/ConfigurationController.php
index 75ec29ae..cf8bf02b 100644
--- a/php/src/Controller/ConfigurationController.php
+++ b/php/src/Controller/ConfigurationController.php
@@ -90,11 +90,7 @@ readonly class ConfigurationController {
}
$this->configurationManager->isClamavEnabled = isset($request->getParsedBody()['clamav']);
$this->configurationManager->isTalkEnabled = isset($request->getParsedBody()['talk']);
- if (isset($request->getParsedBody()['talk-recording'])) {
- $this->configurationManager->SetTalkRecordingEnabledState(1);
- } else {
- $this->configurationManager->SetTalkRecordingEnabledState(0);
- }
+ $this->configurationManager->isTalkRecordingEnabled = isset($request->getParsedBody()['talk-recording']);
if (isset($request->getParsedBody()['imaginary'])) {
$this->configurationManager->SetImaginaryEnabledState(1);
} else {
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index 648d04c3..bd920a04 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -88,6 +88,11 @@ class ConfigurationManager
set { $this->set('isTalkEnabled', $value); }
}
+ public bool $isTalkRecordingEnabled {
+ get => $this->isTalkEnabled && $this->get('isTalkRecordingEnabled', false);
+ set { $this->set('isTalkRecordingEnabled', $this->isTalkEnabled && $value); }
+ }
+
public function GetConfig() : array
{
if ($this->config === [] && file_exists(DataConst::GetConfigFile()))
@@ -258,28 +263,6 @@ class ConfigurationManager
$this->WriteConfig($config);
}
- public function isTalkRecordingEnabled() : bool {
- if (!$this->isTalkEnabled()) {
- return false;
- }
- $config = $this->GetConfig();
- if (isset($config['isTalkRecordingEnabled']) && $config['isTalkRecordingEnabled'] === 1) {
- return true;
- } else {
- return false;
- }
- }
-
- public function SetTalkRecordingEnabledState(int $value) : void {
- if (!$this->isTalkEnabled()) {
- $value = 0;
- }
-
- $config = $this->GetConfig();
- $config['isTalkRecordingEnabled'] = $value;
- $this->WriteConfig($config);
- }
-
/**
* @throws InvalidSettingConfigurationException
*/
diff --git a/php/src/Docker/DockerActionManager.php b/php/src/Docker/DockerActionManager.php
index 313de7b0..ebd1489d 100644
--- a/php/src/Docker/DockerActionManager.php
+++ b/php/src/Docker/DockerActionManager.php
@@ -572,7 +572,7 @@ readonly class DockerActionManager {
'NEXTCLOUD_MOUNT' => $this->configurationManager->GetNextcloudMount(),
'BACKUP_RESTORE_PASSWORD' => $this->configurationManager->GetBorgRestorePassword(),
'CLAMAV_ENABLED' => $this->configurationManager->isClamavEnabled ? 'yes' : '',
- 'TALK_RECORDING_ENABLED' => $this->configurationManager->isTalkRecordingEnabled() ? 'yes' : '',
+ 'TALK_RECORDING_ENABLED' => $this->configurationManager->isTalkRecordingEnabled ? 'yes' : '',
'ONLYOFFICE_ENABLED' => $this->configurationManager->isOnlyofficeEnabled ? 'yes' : '',
'COLLABORA_ENABLED' => $this->configurationManager->isCollaboraEnabled ? 'yes' : '',
'TALK_ENABLED' => $this->configurationManager->isTalkEnabled ? 'yes' : '',
From f16f5b233d72ab22e96bb40a65540a2e6ea7efba Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 19 Jan 2026 12:04:24 +0100
Subject: [PATCH 059/164] Make `isImaginaryEnabled` an attribute
Signed-off-by: Pablo Zmdl
---
php/public/index.php | 2 +-
php/src/ContainerDefinitionFetcher.php | 4 ++--
.../Controller/ConfigurationController.php | 6 +-----
php/src/Data/ConfigurationManager.php | 20 +++++--------------
php/src/Docker/DockerActionManager.php | 2 +-
5 files changed, 10 insertions(+), 24 deletions(-)
diff --git a/php/public/index.php b/php/public/index.php
index 34d7efe1..27b2edad 100644
--- a/php/public/index.php
+++ b/php/public/index.php
@@ -124,7 +124,7 @@ $app->get('/containers', function (Request $request, Response $response, array $
'collabora_additional_options' => $configurationManager->GetAdditionalCollaboraOptions(),
'automatic_updates' => $configurationManager->areAutomaticUpdatesEnabled(),
'is_backup_section_enabled' => $configurationManager->isBackupSectionEnabled(),
- 'is_imaginary_enabled' => $configurationManager->isImaginaryEnabled(),
+ 'is_imaginary_enabled' => $configurationManager->isImaginaryEnabled,
'is_fulltextsearch_enabled' => $configurationManager->isFulltextsearchEnabled(),
'additional_backup_directories' => $configurationManager->GetAdditionalBackupDirectoriesString(),
'nextcloud_datadir' => $configurationManager->GetNextcloudDatadirMount(),
diff --git a/php/src/ContainerDefinitionFetcher.php b/php/src/ContainerDefinitionFetcher.php
index 851b2b4d..75d47f83 100644
--- a/php/src/ContainerDefinitionFetcher.php
+++ b/php/src/ContainerDefinitionFetcher.php
@@ -79,7 +79,7 @@ readonly class ContainerDefinitionFetcher {
continue;
}
} elseif ($entry['container_name'] === 'nextcloud-aio-imaginary') {
- if (!$this->configurationManager->isImaginaryEnabled()) {
+ if (!$this->configurationManager->isImaginaryEnabled) {
continue;
}
} elseif ($entry['container_name'] === 'nextcloud-aio-fulltextsearch') {
@@ -188,7 +188,7 @@ readonly class ContainerDefinitionFetcher {
continue;
}
} elseif ($value === 'nextcloud-aio-imaginary') {
- if (!$this->configurationManager->isImaginaryEnabled()) {
+ if (!$this->configurationManager->isImaginaryEnabled) {
continue;
}
} elseif ($value === 'nextcloud-aio-fulltextsearch') {
diff --git a/php/src/Controller/ConfigurationController.php b/php/src/Controller/ConfigurationController.php
index cf8bf02b..c7df757b 100644
--- a/php/src/Controller/ConfigurationController.php
+++ b/php/src/Controller/ConfigurationController.php
@@ -91,11 +91,7 @@ readonly class ConfigurationController {
$this->configurationManager->isClamavEnabled = isset($request->getParsedBody()['clamav']);
$this->configurationManager->isTalkEnabled = isset($request->getParsedBody()['talk']);
$this->configurationManager->isTalkRecordingEnabled = isset($request->getParsedBody()['talk-recording']);
- if (isset($request->getParsedBody()['imaginary'])) {
- $this->configurationManager->SetImaginaryEnabledState(1);
- } else {
- $this->configurationManager->SetImaginaryEnabledState(0);
- }
+ $this->configurationManager->isImaginaryEnabled = isset($request->getParsedBody()['imaginary']);
if (isset($request->getParsedBody()['fulltextsearch'])) {
$this->configurationManager->SetFulltextsearchEnabledState(1);
} else {
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index bd920a04..65e83524 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -93,6 +93,11 @@ class ConfigurationManager
set { $this->set('isTalkRecordingEnabled', $this->isTalkEnabled && $value); }
}
+ public bool $isImaginaryEnabled {
+ get => $this->get('isImaginaryEnabled', true);
+ set { $this->set('isImaginaryEnabled', $value); }
+ }
+
public function GetConfig() : array
{
if ($this->config === [] && file_exists(DataConst::GetConfigFile()))
@@ -228,21 +233,6 @@ class ConfigurationManager
}
}
- public function isImaginaryEnabled() : bool {
- $config = $this->GetConfig();
- if (isset($config['isImaginaryEnabled']) && $config['isImaginaryEnabled'] === 0) {
- return false;
- } else {
- return true;
- }
- }
-
- public function SetImaginaryEnabledState(int $value) : void {
- $config = $this->GetConfig();
- $config['isImaginaryEnabled'] = $value;
- $this->WriteConfig($config);
- }
-
public function isFulltextsearchEnabled() : bool {
$config = $this->GetConfig();
if (isset($config['isFulltextsearchEnabled']) && $config['isFulltextsearchEnabled'] === 1) {
diff --git a/php/src/Docker/DockerActionManager.php b/php/src/Docker/DockerActionManager.php
index ebd1489d..a9f2c29e 100644
--- a/php/src/Docker/DockerActionManager.php
+++ b/php/src/Docker/DockerActionManager.php
@@ -579,7 +579,7 @@ readonly class DockerActionManager {
'UPDATE_NEXTCLOUD_APPS' => ($this->configurationManager->isDailyBackupRunning() && $this->configurationManager->areAutomaticUpdatesEnabled()) ? 'yes' : '',
'TIMEZONE' => $this->configurationManager->GetTimezone() === '' ? 'Etc/UTC' : $this->configurationManager->GetTimezone(),
'COLLABORA_DICTIONARIES' => $this->configurationManager->GetCollaboraDictionaries() === '' ? 'de_DE en_GB en_US es_ES fr_FR it nl pt_BR pt_PT ru' : $this->configurationManager->GetCollaboraDictionaries(),
- 'IMAGINARY_ENABLED' => $this->configurationManager->isImaginaryEnabled() ? 'yes' : '',
+ 'IMAGINARY_ENABLED' => $this->configurationManager->isImaginaryEnabled ? 'yes' : '',
'FULLTEXTSEARCH_ENABLED' => $this->configurationManager->isFulltextsearchEnabled() ? 'yes' : '',
'DOCKER_SOCKET_PROXY_ENABLED' => $this->configurationManager->isDockerSocketProxyEnabled ? 'yes' : '',
'NEXTCLOUD_UPLOAD_LIMIT' => $this->configurationManager->GetNextcloudUploadLimit(),
From f737d2f598032df2fd2df3ad9c4f7b4319e91d66 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 19 Jan 2026 12:04:48 +0100
Subject: [PATCH 060/164] Make `isFulltextsearchEnabled` an attribute
Signed-off-by: Pablo Zmdl
---
php/public/index.php | 2 +-
php/src/ContainerDefinitionFetcher.php | 4 +--
.../Controller/ConfigurationController.php | 6 +----
php/src/Data/ConfigurationManager.php | 26 +++++--------------
php/src/Docker/DockerActionManager.php | 2 +-
5 files changed, 11 insertions(+), 29 deletions(-)
diff --git a/php/public/index.php b/php/public/index.php
index 27b2edad..2b1d6af1 100644
--- a/php/public/index.php
+++ b/php/public/index.php
@@ -125,7 +125,7 @@ $app->get('/containers', function (Request $request, Response $response, array $
'automatic_updates' => $configurationManager->areAutomaticUpdatesEnabled(),
'is_backup_section_enabled' => $configurationManager->isBackupSectionEnabled(),
'is_imaginary_enabled' => $configurationManager->isImaginaryEnabled,
- 'is_fulltextsearch_enabled' => $configurationManager->isFulltextsearchEnabled(),
+ 'is_fulltextsearch_enabled' => $configurationManager->isFulltextsearchEnabled,
'additional_backup_directories' => $configurationManager->GetAdditionalBackupDirectoriesString(),
'nextcloud_datadir' => $configurationManager->GetNextcloudDatadirMount(),
'nextcloud_mount' => $configurationManager->GetNextcloudMount(),
diff --git a/php/src/ContainerDefinitionFetcher.php b/php/src/ContainerDefinitionFetcher.php
index 75d47f83..4ac53258 100644
--- a/php/src/ContainerDefinitionFetcher.php
+++ b/php/src/ContainerDefinitionFetcher.php
@@ -83,7 +83,7 @@ readonly class ContainerDefinitionFetcher {
continue;
}
} elseif ($entry['container_name'] === 'nextcloud-aio-fulltextsearch') {
- if (!$this->configurationManager->isFulltextsearchEnabled()) {
+ if (!$this->configurationManager->isFulltextsearchEnabled) {
continue;
}
} elseif ($entry['container_name'] === 'nextcloud-aio-docker-socket-proxy') {
@@ -192,7 +192,7 @@ readonly class ContainerDefinitionFetcher {
continue;
}
} elseif ($value === 'nextcloud-aio-fulltextsearch') {
- if (!$this->configurationManager->isFulltextsearchEnabled()) {
+ if (!$this->configurationManager->isFulltextsearchEnabled) {
continue;
}
} elseif ($value === 'nextcloud-aio-docker-socket-proxy') {
diff --git a/php/src/Controller/ConfigurationController.php b/php/src/Controller/ConfigurationController.php
index c7df757b..9688c5e9 100644
--- a/php/src/Controller/ConfigurationController.php
+++ b/php/src/Controller/ConfigurationController.php
@@ -92,11 +92,7 @@ readonly class ConfigurationController {
$this->configurationManager->isTalkEnabled = isset($request->getParsedBody()['talk']);
$this->configurationManager->isTalkRecordingEnabled = isset($request->getParsedBody()['talk-recording']);
$this->configurationManager->isImaginaryEnabled = isset($request->getParsedBody()['imaginary']);
- if (isset($request->getParsedBody()['fulltextsearch'])) {
- $this->configurationManager->SetFulltextsearchEnabledState(1);
- } else {
- $this->configurationManager->SetFulltextsearchEnabledState(0);
- }
+ $this->configurationManager->isFulltextsearchEnabled = isset($request->getParsedBody()['fulltextsearch']);
$this->configurationManager->isDockerSocketProxyEnabled = isset($request->getParsedBody()['docker-socket-proxy']);
$this->configurationManager->isWhiteboardEnabled = isset($request->getParsedBody()['whiteboard']);
}
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index 65e83524..43680ca9 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -98,6 +98,12 @@ class ConfigurationManager
set { $this->set('isImaginaryEnabled', $value); }
}
+ public bool $isFulltextsearchEnabled {
+ get => $this->get('isFulltextsearchEnabled', false);
+ // Elasticsearch does not work on kernels without seccomp anymore. See https://github.com/nextcloud/all-in-one/discussions/5768
+ set { $this->set('isFulltextsearchEnabled', ($this->isSeccompDisabled() && $value)); }
+ }
+
public function GetConfig() : array
{
if ($this->config === [] && file_exists(DataConst::GetConfigFile()))
@@ -233,26 +239,6 @@ class ConfigurationManager
}
}
- public function isFulltextsearchEnabled() : bool {
- $config = $this->GetConfig();
- if (isset($config['isFulltextsearchEnabled']) && $config['isFulltextsearchEnabled'] === 1) {
- return true;
- } else {
- return false;
- }
- }
-
- public function SetFulltextsearchEnabledState(int $value) : void {
- // Elasticsearch does not work on kernels without seccomp anymore. See https://github.com/nextcloud/all-in-one/discussions/5768
- if ($this->isSeccompDisabled()) {
- $value = 0;
- }
-
- $config = $this->GetConfig();
- $config['isFulltextsearchEnabled'] = $value;
- $this->WriteConfig($config);
- }
-
/**
* @throws InvalidSettingConfigurationException
*/
diff --git a/php/src/Docker/DockerActionManager.php b/php/src/Docker/DockerActionManager.php
index a9f2c29e..73f4bd9d 100644
--- a/php/src/Docker/DockerActionManager.php
+++ b/php/src/Docker/DockerActionManager.php
@@ -580,7 +580,7 @@ readonly class DockerActionManager {
'TIMEZONE' => $this->configurationManager->GetTimezone() === '' ? 'Etc/UTC' : $this->configurationManager->GetTimezone(),
'COLLABORA_DICTIONARIES' => $this->configurationManager->GetCollaboraDictionaries() === '' ? 'de_DE en_GB en_US es_ES fr_FR it nl pt_BR pt_PT ru' : $this->configurationManager->GetCollaboraDictionaries(),
'IMAGINARY_ENABLED' => $this->configurationManager->isImaginaryEnabled ? 'yes' : '',
- 'FULLTEXTSEARCH_ENABLED' => $this->configurationManager->isFulltextsearchEnabled() ? 'yes' : '',
+ 'FULLTEXTSEARCH_ENABLED' => $this->configurationManager->isFulltextsearchEnabled ? 'yes' : '',
'DOCKER_SOCKET_PROXY_ENABLED' => $this->configurationManager->isDockerSocketProxyEnabled ? 'yes' : '',
'NEXTCLOUD_UPLOAD_LIMIT' => $this->configurationManager->GetNextcloudUploadLimit(),
'NEXTCLOUD_MEMORY_LIMIT' => $this->configurationManager->GetNextcloudMemoryLimit(),
From 5b0b9ef8263e740fa854be09dc424d53ae1ad9ff Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 19 Jan 2026 12:06:20 +0100
Subject: [PATCH 061/164] Make `domain` an attribute
Signed-off-by: Pablo Zmdl
---
php/public/index.php | 2 +-
php/src/Controller/DockerController.php | 2 +-
php/src/Data/ConfigurationManager.php | 25 +++++++++++++------------
3 files changed, 15 insertions(+), 14 deletions(-)
diff --git a/php/public/index.php b/php/public/index.php
index 2b1d6af1..f3e8f940 100644
--- a/php/public/index.php
+++ b/php/public/index.php
@@ -91,7 +91,7 @@ $app->get('/containers', function (Request $request, Response $response, array $
$skip_domain_validation = isset($params['skip_domain_validation']);
return $view->render($response, 'containers.twig', [
- 'domain' => $configurationManager->GetDomain(),
+ 'domain' => $configurationManager->domain,
'apache_port' => $configurationManager->GetApachePort(),
'borg_backup_host_location' => $configurationManager->GetBorgBackupHostLocation(),
'borg_remote_repo' => $configurationManager->GetBorgRemoteRepo(),
diff --git a/php/src/Controller/DockerController.php b/php/src/Controller/DockerController.php
index ff73e29a..4e6d52b7 100644
--- a/php/src/Controller/DockerController.php
+++ b/php/src/Controller/DockerController.php
@@ -257,7 +257,7 @@ readonly class DockerController {
public function StartDomaincheckContainer() : void
{
# Don't start if domain is already set
- if ($this->configurationManager->GetDomain() !== '' || $this->configurationManager->wasStartButtonClicked) {
+ if ($this->configurationManager->domain !== '' || $this->configurationManager->wasStartButtonClicked) {
return;
}
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index 43680ca9..d276ebb7 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -104,6 +104,11 @@ class ConfigurationManager
set { $this->set('isFulltextsearchEnabled', ($this->isSeccompDisabled() && $value)); }
}
+ public string $domain {
+ get => $this->get('domain', '');
+ set { $this->SetDomain($value); }
+ }
+
public function GetConfig() : array
{
if ($this->config === [] && file_exists(DataConst::GetConfigFile()))
@@ -241,6 +246,8 @@ class ConfigurationManager
/**
* @throws InvalidSettingConfigurationException
+ *
+ * We can't turn this into a private validation method because of the second argument.
*/
public function SetDomain(string $domain, bool $skipDomainValidation) : void {
// Validate that at least one dot is contained
@@ -346,25 +353,19 @@ class ConfigurationManager
}
}
- // Write domain
$config = $this->GetConfig();
- $config['domain'] = $domain;
// Reset the borg restore password when setting the domain
$config['borg_restore_password'] = '';
$this->WriteConfig($config);
- }
-
- public function GetDomain() : string {
- $config = $this->GetConfig();
- if(!isset($config['domain'])) {
- $config['domain'] = '';
- }
-
- return $config['domain'];
+ $this->setMultiple(function ($confManager) use ($domain) {
+ // Write domain
+ // Don't set the domain via the attribute, or we create a loop.
+ $confManager->set('domain', $domain);
+ });
}
public function GetBaseDN() : string {
- $domain = $this->GetDomain();
+ $domain = $this->domain;
if ($domain === "") {
return "";
}
From b4d198f72b14cc52e667bf782d3db51c4fd80c34 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 19 Jan 2026 12:07:45 +0100
Subject: [PATCH 062/164] Make `borg_backup_host_location` an attribute
Signed-off-by: Pablo Zmdl
---
php/public/index.php | 2 +-
php/src/ContainerDefinitionFetcher.php | 2 +-
php/src/Data/ConfigurationManager.php | 26 +++++++++++++-------------
php/src/Docker/DockerActionManager.php | 2 +-
4 files changed, 16 insertions(+), 16 deletions(-)
diff --git a/php/public/index.php b/php/public/index.php
index f3e8f940..eb214eff 100644
--- a/php/public/index.php
+++ b/php/public/index.php
@@ -93,7 +93,7 @@ $app->get('/containers', function (Request $request, Response $response, array $
return $view->render($response, 'containers.twig', [
'domain' => $configurationManager->domain,
'apache_port' => $configurationManager->GetApachePort(),
- 'borg_backup_host_location' => $configurationManager->GetBorgBackupHostLocation(),
+ 'borg_backup_host_location' => $configurationManager->borg_backup_host_location,
'borg_remote_repo' => $configurationManager->GetBorgRemoteRepo(),
'borg_public_key' => $configurationManager->GetBorgPublicKey(),
'nextcloud_password' => $configurationManager->GetAndGenerateSecret('NEXTCLOUD_PASSWORD'),
diff --git a/php/src/ContainerDefinitionFetcher.php b/php/src/ContainerDefinitionFetcher.php
index 4ac53258..e8244ddc 100644
--- a/php/src/ContainerDefinitionFetcher.php
+++ b/php/src/ContainerDefinitionFetcher.php
@@ -113,7 +113,7 @@ readonly class ContainerDefinitionFetcher {
if (isset($entry['volumes'])) {
foreach ($entry['volumes'] as $value) {
if($value['source'] === '%BORGBACKUP_HOST_LOCATION%') {
- $value['source'] = $this->configurationManager->GetBorgBackupHostLocation();
+ $value['source'] = $this->configurationManager->borg_backup_host_location;
if($value['source'] === '') {
continue;
}
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index d276ebb7..1c93f51b 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -109,6 +109,11 @@ class ConfigurationManager
set { $this->SetDomain($value); }
}
+ public string $borg_backup_host_location {
+ get => $this->get('borg_backup_host_location', '');
+ set { $this->set('borg_backup_host_location', $value); }
+ }
+
public function GetConfig() : array
{
if ($this->config === [] && file_exists(DataConst::GetConfigFile()))
@@ -379,9 +384,11 @@ class ConfigurationManager
$this->ValidateBorgLocationVars($location, $repo);
$config = $this->GetConfig();
- $config['borg_backup_host_location'] = $location;
$config['borg_remote_repo'] = $repo;
$this->WriteConfig($config);
+ $this->setMultiple(function ($confManager) use ($location) {
+ $confManager->borg_backup_host_location = $location;
+ });
}
private function ValidateBorgLocationVars(string $location, string $repo) : void {
@@ -428,9 +435,11 @@ class ConfigurationManager
public function DeleteBorgBackupLocationItems() : void {
// Delete the variables
$config = $this->GetConfig();
- $config['borg_backup_host_location'] = '';
$config['borg_remote_repo'] = '';
$this->WriteConfig($config);
+ $this->setMultiple(function ($confManager) {
+ $confManager->borg_backup_host_location = '';
+ });
// Also delete the borg config file to be able to start over
if (file_exists(DataConst::GetBackupKeyFile())) {
@@ -451,12 +460,12 @@ class ConfigurationManager
}
$config = $this->GetConfig();
- $config['borg_backup_host_location'] = $location;
$config['borg_remote_repo'] = $repo;
$config['borg_restore_password'] = $password;
$this->WriteConfig($config);
- $this->setMultiple(function ($confManager) {
+ $this->setMultiple(function ($confManager) use ($location) {
+ $confManager->borg_backup_host_location = $location;
$confManager->instance_restore_attempt = true;
});
}
@@ -556,15 +565,6 @@ class ConfigurationManager
return $envVariableOutput;
}
- public function GetBorgBackupHostLocation() : string {
- $config = $this->GetConfig();
- if(!isset($config['borg_backup_host_location'])) {
- $config['borg_backup_host_location'] = '';
- }
-
- return $config['borg_backup_host_location'];
- }
-
public function GetBorgRemoteRepo() : string {
$config = $this->GetConfig();
if(!isset($config['borg_remote_repo'])) {
diff --git a/php/src/Docker/DockerActionManager.php b/php/src/Docker/DockerActionManager.php
index 73f4bd9d..a3ea0c9b 100644
--- a/php/src/Docker/DockerActionManager.php
+++ b/php/src/Docker/DockerActionManager.php
@@ -589,7 +589,7 @@ readonly class DockerActionManager {
'FULLTEXTSEARCH_JAVA_OPTIONS' => $this->configurationManager->GetFulltextsearchJavaOptions(),
'NEXTCLOUD_TRUSTED_CACERTS_DIR' => $this->configurationManager->GetTrustedCacertsDir(),
'ADDITIONAL_DIRECTORIES_BACKUP' => $this->configurationManager->GetAdditionalBackupDirectoriesString() !== '' ? 'yes' : '',
- 'BORGBACKUP_HOST_LOCATION' => $this->configurationManager->GetBorgBackupHostLocation(),
+ 'BORGBACKUP_HOST_LOCATION' => $this->configurationManager->borg_backup_host_location,
'APACHE_MAX_SIZE' => (string)($this->configurationManager->GetApacheMaxSize()),
'COLLABORA_SECCOMP_POLICY' => $this->configurationManager->GetCollaboraSeccompPolicy(),
'NEXTCLOUD_STARTUP_APPS' => $this->configurationManager->GetNextcloudStartupApps(),
From a361ab9d20f4cfc4c5c0fc071509756a734bdea1 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 19 Jan 2026 12:14:39 +0100
Subject: [PATCH 063/164] Make `borg_remote_repo` an attribute
Signed-off-by: Pablo Zmdl
---
php/public/index.php | 2 +-
php/src/Data/ConfigurationManager.php | 24 ++++++++++--------------
php/src/Docker/DockerActionManager.php | 2 +-
3 files changed, 12 insertions(+), 16 deletions(-)
diff --git a/php/public/index.php b/php/public/index.php
index eb214eff..16d274f9 100644
--- a/php/public/index.php
+++ b/php/public/index.php
@@ -94,7 +94,7 @@ $app->get('/containers', function (Request $request, Response $response, array $
'domain' => $configurationManager->domain,
'apache_port' => $configurationManager->GetApachePort(),
'borg_backup_host_location' => $configurationManager->borg_backup_host_location,
- 'borg_remote_repo' => $configurationManager->GetBorgRemoteRepo(),
+ 'borg_remote_repo' => $configurationManager->borg_remote_repo,
'borg_public_key' => $configurationManager->GetBorgPublicKey(),
'nextcloud_password' => $configurationManager->GetAndGenerateSecret('NEXTCLOUD_PASSWORD'),
'containers' => (new \AIO\ContainerDefinitionFetcher($container->get(\AIO\Data\ConfigurationManager::class), $container))->FetchDefinition(),
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index 1c93f51b..5dea0c6d 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -114,6 +114,11 @@ class ConfigurationManager
set { $this->set('borg_backup_host_location', $value); }
}
+ public string $borg_remote_repo {
+ get => $this->get('borg_remote_repo', '');
+ set { $this->set('borg_remote_repo', $value); }
+ }
+
public function GetConfig() : array
{
if ($this->config === [] && file_exists(DataConst::GetConfigFile()))
@@ -384,10 +389,10 @@ class ConfigurationManager
$this->ValidateBorgLocationVars($location, $repo);
$config = $this->GetConfig();
- $config['borg_remote_repo'] = $repo;
$this->WriteConfig($config);
- $this->setMultiple(function ($confManager) use ($location) {
+ $this->setMultiple(function ($confManager) use ($location, $repo) {
$confManager->borg_backup_host_location = $location;
+ $confManager->borg_remote_repo = $repo;
});
}
@@ -435,10 +440,10 @@ class ConfigurationManager
public function DeleteBorgBackupLocationItems() : void {
// Delete the variables
$config = $this->GetConfig();
- $config['borg_remote_repo'] = '';
$this->WriteConfig($config);
$this->setMultiple(function ($confManager) {
$confManager->borg_backup_host_location = '';
+ $confManager->borg_remote_repo = '';
});
// Also delete the borg config file to be able to start over
@@ -460,12 +465,12 @@ class ConfigurationManager
}
$config = $this->GetConfig();
- $config['borg_remote_repo'] = $repo;
$config['borg_restore_password'] = $password;
$this->WriteConfig($config);
- $this->setMultiple(function ($confManager) use ($location) {
+ $this->setMultiple(function ($confManager) use ($location, $repo) {
$confManager->borg_backup_host_location = $location;
+ $confManager->borg_remote_repo = $repo;
$confManager->instance_restore_attempt = true;
});
}
@@ -565,15 +570,6 @@ class ConfigurationManager
return $envVariableOutput;
}
- public function GetBorgRemoteRepo() : string {
- $config = $this->GetConfig();
- if(!isset($config['borg_remote_repo'])) {
- $config['borg_remote_repo'] = '';
- }
-
- return $config['borg_remote_repo'];
- }
-
public function GetBorgPublicKey() : string {
if (!file_exists(DataConst::GetBackupPublicKey())) {
return "";
diff --git a/php/src/Docker/DockerActionManager.php b/php/src/Docker/DockerActionManager.php
index a3ea0c9b..876dd805 100644
--- a/php/src/Docker/DockerActionManager.php
+++ b/php/src/Docker/DockerActionManager.php
@@ -560,7 +560,7 @@ readonly class DockerActionManager {
'NC_DOMAIN' => $this->configurationManager->GetDomain(),
'NC_BASE_DN' => $this->configurationManager->GetBaseDN(),
'AIO_TOKEN' => $this->configurationManager->AIO_TOKEN,
- 'BORGBACKUP_REMOTE_REPO' => $this->configurationManager->GetBorgRemoteRepo(),
+ 'BORGBACKUP_REMOTE_REPO' => $this->configurationManager->borg_remote_repo,
'BORGBACKUP_MODE' => $this->configurationManager->GetBackupMode(),
'AIO_URL' => $this->configurationManager->AIO_URL,
'RESTORE_EXCLUDE_PREVIEWS' => $this->configurationManager->restoreExcludePreviews ? '1' : '',
From 6033a4486c147eab303ba9f8120ab4663e348084 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 19 Jan 2026 12:16:30 +0100
Subject: [PATCH 064/164] Make `borg_restore_password` an attribute
Signed-off-by: Pablo Zmdl
---
php/public/index.php | 2 +-
php/src/Data/ConfigurationManager.php | 23 +++++++++--------------
php/src/Docker/DockerActionManager.php | 2 +-
3 files changed, 11 insertions(+), 16 deletions(-)
diff --git a/php/public/index.php b/php/public/index.php
index 16d274f9..05c39f76 100644
--- a/php/public/index.php
+++ b/php/public/index.php
@@ -114,7 +114,7 @@ $app->get('/containers', function (Request $request, Response $response, array $
'is_onlyoffice_enabled' => $configurationManager->isOnlyofficeEnabled,
'is_collabora_enabled' => $configurationManager->isCollaboraEnabled,
'is_talk_enabled' => $configurationManager->isTalkEnabled,
- 'borg_restore_password' => $configurationManager->GetBorgRestorePassword(),
+ 'borg_restore_password' => $configurationManager->borg_restore_password,
'daily_backup_time' => $configurationManager->GetDailyBackupTime(),
'is_daily_backup_running' => $configurationManager->isDailyBackupRunning(),
'timezone' => $configurationManager->GetTimezone(),
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index 5dea0c6d..2091ddb5 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -119,6 +119,11 @@ class ConfigurationManager
set { $this->set('borg_remote_repo', $value); }
}
+ public string $borg_restore_password {
+ get => $this->get('borg_restore_password', '');
+ set { $this->set('borg_restore_password', $value); }
+ }
+
public function GetConfig() : array
{
if ($this->config === [] && file_exists(DataConst::GetConfigFile()))
@@ -364,13 +369,13 @@ class ConfigurationManager
}
$config = $this->GetConfig();
- // Reset the borg restore password when setting the domain
- $config['borg_restore_password'] = '';
$this->WriteConfig($config);
$this->setMultiple(function ($confManager) use ($domain) {
// Write domain
// Don't set the domain via the attribute, or we create a loop.
$confManager->set('domain', $domain);
+ // Reset the borg restore password when setting the domain
+ $confManager->borg_restore_password = '';
});
}
@@ -465,12 +470,11 @@ class ConfigurationManager
}
$config = $this->GetConfig();
- $config['borg_restore_password'] = $password;
$this->WriteConfig($config);
-
- $this->setMultiple(function ($confManager) use ($location, $repo) {
+ $this->setMultiple(function ($confManager) use ($location, $repo, $password) {
$confManager->borg_backup_host_location = $location;
$confManager->borg_remote_repo = $repo;
+ $confManager->borg_restore_password = $password;
$confManager->instance_restore_attempt = true;
});
}
@@ -578,15 +582,6 @@ class ConfigurationManager
return trim((string)file_get_contents(DataConst::GetBackupPublicKey()));
}
- public function GetBorgRestorePassword() : string {
- $config = $this->GetConfig();
- if(!isset($config['borg_restore_password'])) {
- $config['borg_restore_password'] = '';
- }
-
- return $config['borg_restore_password'];
- }
-
public function GetNextcloudMount() : string {
$envVariableName = 'NEXTCLOUD_MOUNT';
$configName = 'nextcloud_mount';
diff --git a/php/src/Docker/DockerActionManager.php b/php/src/Docker/DockerActionManager.php
index 876dd805..8b9720fb 100644
--- a/php/src/Docker/DockerActionManager.php
+++ b/php/src/Docker/DockerActionManager.php
@@ -570,7 +570,7 @@ readonly class DockerActionManager {
'TALK_PORT' => $this->configurationManager->GetTalkPort(),
'TURN_DOMAIN' => $this->configurationManager->GetTurnDomain(),
'NEXTCLOUD_MOUNT' => $this->configurationManager->GetNextcloudMount(),
- 'BACKUP_RESTORE_PASSWORD' => $this->configurationManager->GetBorgRestorePassword(),
+ 'BACKUP_RESTORE_PASSWORD' => $this->configurationManager->borg_restore_password,
'CLAMAV_ENABLED' => $this->configurationManager->isClamavEnabled ? 'yes' : '',
'TALK_RECORDING_ENABLED' => $this->configurationManager->isTalkRecordingEnabled ? 'yes' : '',
'ONLYOFFICE_ENABLED' => $this->configurationManager->isOnlyofficeEnabled ? 'yes' : '',
From 6e5237cd205f0dc6ef069b6026f43a77028d00e7 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 19 Jan 2026 12:17:25 +0100
Subject: [PATCH 065/164] Make `timezone` an attribute
Signed-off-by: Pablo Zmdl
---
php/public/index.php | 2 +-
.../Controller/ConfigurationController.php | 4 +--
php/src/Data/ConfigurationManager.php | 36 +++++++++----------
php/src/Docker/DockerActionManager.php | 2 +-
4 files changed, 22 insertions(+), 22 deletions(-)
diff --git a/php/public/index.php b/php/public/index.php
index 05c39f76..130d34d5 100644
--- a/php/public/index.php
+++ b/php/public/index.php
@@ -117,7 +117,7 @@ $app->get('/containers', function (Request $request, Response $response, array $
'borg_restore_password' => $configurationManager->borg_restore_password,
'daily_backup_time' => $configurationManager->GetDailyBackupTime(),
'is_daily_backup_running' => $configurationManager->isDailyBackupRunning(),
- 'timezone' => $configurationManager->GetTimezone(),
+ 'timezone' => $configurationManager->timezone,
'skip_domain_validation' => $configurationManager->shouldDomainValidationBeSkipped($skip_domain_validation),
'talk_port' => $configurationManager->GetTalkPort(),
'collabora_dictionaries' => $configurationManager->GetCollaboraDictionaries(),
diff --git a/php/src/Controller/ConfigurationController.php b/php/src/Controller/ConfigurationController.php
index 9688c5e9..58337ef4 100644
--- a/php/src/Controller/ConfigurationController.php
+++ b/php/src/Controller/ConfigurationController.php
@@ -67,12 +67,12 @@ readonly class ConfigurationController {
}
if (isset($request->getParsedBody()['delete_timezone'])) {
- $this->configurationManager->DeleteTimezone();
+ $this->configurationManager->deleteTimezone();
}
if (isset($request->getParsedBody()['timezone'])) {
$timezone = $request->getParsedBody()['timezone'] ?? '';
- $this->configurationManager->SetTimezone($timezone);
+ $this->configurationManager->timezone = $timezone;
}
if (isset($request->getParsedBody()['options-form'])) {
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index 2091ddb5..119e81ce 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -124,6 +124,18 @@ class ConfigurationManager
set { $this->set('borg_restore_password', $value); }
}
+ /**
+ * @throws InvalidSettingConfigurationException
+ */
+ public string $timezone {
+ get => $this->get('timezone', '');
+ set {
+ // This throws an exception if the validation fails.
+ $this->validateTimezone($value);
+ $this->set('timezone', $value);
+ }
+ }
+
public function GetConfig() : array
{
if ($this->config === [] && file_exists(DataConst::GetConfigFile()))
@@ -784,19 +796,10 @@ class ConfigurationManager
return false;
}
- public function GetTimezone() : string {
- $config = $this->GetConfig();
- if(!isset($config['timezone'])) {
- $config['timezone'] = '';
- }
-
- return $config['timezone'];
- }
-
/**
* @throws InvalidSettingConfigurationException
*/
- public function SetTimezone(string $timezone) : void {
+ private function validateTimezone(string $timezone) : void {
if ($timezone === "") {
throw new InvalidSettingConfigurationException("The timezone must not be empty!");
}
@@ -804,16 +807,13 @@ class ConfigurationManager
if (!preg_match("#^[a-zA-Z0-9_\-\/\+]+$#", $timezone)) {
throw new InvalidSettingConfigurationException("The entered timezone does not seem to be a valid timezone!");
}
-
- $config = $this->GetConfig();
- $config['timezone'] = $timezone;
- $this->WriteConfig($config);
}
- public function DeleteTimezone() : void {
- $config = $this->GetConfig();
- $config['timezone'] = '';
- $this->WriteConfig($config);
+ /**
+ * Provide an extra method since our `timezone` attribute setter prevents setting an empty timezone.
+ */
+ public function deleteTimezone() : void {
+ $this->set('timezone', '');
}
public function shouldDomainValidationBeSkipped(bool $skipDomainValidation) : bool {
diff --git a/php/src/Docker/DockerActionManager.php b/php/src/Docker/DockerActionManager.php
index 8b9720fb..ae8e9c83 100644
--- a/php/src/Docker/DockerActionManager.php
+++ b/php/src/Docker/DockerActionManager.php
@@ -577,7 +577,7 @@ readonly class DockerActionManager {
'COLLABORA_ENABLED' => $this->configurationManager->isCollaboraEnabled ? 'yes' : '',
'TALK_ENABLED' => $this->configurationManager->isTalkEnabled ? 'yes' : '',
'UPDATE_NEXTCLOUD_APPS' => ($this->configurationManager->isDailyBackupRunning() && $this->configurationManager->areAutomaticUpdatesEnabled()) ? 'yes' : '',
- 'TIMEZONE' => $this->configurationManager->GetTimezone() === '' ? 'Etc/UTC' : $this->configurationManager->GetTimezone(),
+ 'TIMEZONE' => $this->configurationManager->timezone === '' ? 'Etc/UTC' : $this->configurationManager->timezone,
'COLLABORA_DICTIONARIES' => $this->configurationManager->GetCollaboraDictionaries() === '' ? 'de_DE en_GB en_US es_ES fr_FR it nl pt_BR pt_PT ru' : $this->configurationManager->GetCollaboraDictionaries(),
'IMAGINARY_ENABLED' => $this->configurationManager->isImaginaryEnabled ? 'yes' : '',
'FULLTEXTSEARCH_ENABLED' => $this->configurationManager->isFulltextsearchEnabled ? 'yes' : '',
From ca35006a8595e6abbb0d6313b819ae98b8ea2068 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 19 Jan 2026 12:18:45 +0100
Subject: [PATCH 066/164] Make `collabora_dictionaries` an attribute
Signed-off-by: Pablo Zmdl
---
php/public/index.php | 2 +-
.../Controller/ConfigurationController.php | 2 +-
php/src/Data/ConfigurationManager.php | 34 +++++++++----------
php/src/Docker/DockerActionManager.php | 2 +-
4 files changed, 20 insertions(+), 20 deletions(-)
diff --git a/php/public/index.php b/php/public/index.php
index 130d34d5..dc0151e2 100644
--- a/php/public/index.php
+++ b/php/public/index.php
@@ -120,7 +120,7 @@ $app->get('/containers', function (Request $request, Response $response, array $
'timezone' => $configurationManager->timezone,
'skip_domain_validation' => $configurationManager->shouldDomainValidationBeSkipped($skip_domain_validation),
'talk_port' => $configurationManager->GetTalkPort(),
- 'collabora_dictionaries' => $configurationManager->GetCollaboraDictionaries(),
+ 'collabora_dictionaries' => $configurationManager->collabora_dictionaries,
'collabora_additional_options' => $configurationManager->GetAdditionalCollaboraOptions(),
'automatic_updates' => $configurationManager->areAutomaticUpdatesEnabled(),
'is_backup_section_enabled' => $configurationManager->isBackupSectionEnabled(),
diff --git a/php/src/Controller/ConfigurationController.php b/php/src/Controller/ConfigurationController.php
index 58337ef4..4a36ce5c 100644
--- a/php/src/Controller/ConfigurationController.php
+++ b/php/src/Controller/ConfigurationController.php
@@ -117,7 +117,7 @@ readonly class ConfigurationController {
if (isset($request->getParsedBody()['collabora_dictionaries'])) {
$collaboraDictionaries = $request->getParsedBody()['collabora_dictionaries'] ?? '';
- $this->configurationManager->SetCollaboraDictionaries($collaboraDictionaries);
+ $this->configurationManager->collabora_dictionaries = $collaboraDictionaries;
}
if (isset($request->getParsedBody()['delete_collabora_additional_options'])) {
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index 119e81ce..9f037ec4 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -136,6 +136,18 @@ class ConfigurationManager
}
}
+ /**
+ * @throws InvalidSettingConfigurationException
+ */
+ public string $collabora_dictionaries {
+ get => $this->get('collabora_dictionaries', '');
+ set {
+ // This throws an exception if the validation fails.
+ $this->validateCollaboraDictionaries($value);
+ $this->set('collabora_dictionaries', $value);
+ }
+ }
+
public function GetConfig() : array
{
if ($this->config === [] && file_exists(DataConst::GetConfigFile()))
@@ -831,19 +843,10 @@ class ConfigurationManager
return 'deck twofactor_totp tasks calendar contacts notes';
}
- public function GetCollaboraDictionaries() : string {
- $config = $this->GetConfig();
- if(!isset($config['collabora_dictionaries'])) {
- $config['collabora_dictionaries'] = '';
- }
-
- return $config['collabora_dictionaries'];
- }
-
/**
* @throws InvalidSettingConfigurationException
*/
- public function SetCollaboraDictionaries(string $CollaboraDictionaries) : void {
+ private function validateCollaboraDictionaries(string $CollaboraDictionaries) : void {
if ($CollaboraDictionaries === "") {
throw new InvalidSettingConfigurationException("The dictionaries must not be empty!");
}
@@ -851,16 +854,13 @@ class ConfigurationManager
if (!preg_match("#^[a-zA-Z_ ]+$#", $CollaboraDictionaries)) {
throw new InvalidSettingConfigurationException("The entered dictionaries do not seem to be a valid!");
}
-
- $config = $this->GetConfig();
- $config['collabora_dictionaries'] = $CollaboraDictionaries;
- $this->WriteConfig($config);
}
+ /**
+ * Provide an extra method since the corresponding attribute setter prevents setting an empty value.
+ */
public function DeleteCollaboraDictionaries() : void {
- $config = $this->GetConfig();
- $config['collabora_dictionaries'] = '';
- $this->WriteConfig($config);
+ $this->set('collabora_dictionaries', '');
}
/**
diff --git a/php/src/Docker/DockerActionManager.php b/php/src/Docker/DockerActionManager.php
index ae8e9c83..3bbc37f1 100644
--- a/php/src/Docker/DockerActionManager.php
+++ b/php/src/Docker/DockerActionManager.php
@@ -578,7 +578,7 @@ readonly class DockerActionManager {
'TALK_ENABLED' => $this->configurationManager->isTalkEnabled ? 'yes' : '',
'UPDATE_NEXTCLOUD_APPS' => ($this->configurationManager->isDailyBackupRunning() && $this->configurationManager->areAutomaticUpdatesEnabled()) ? 'yes' : '',
'TIMEZONE' => $this->configurationManager->timezone === '' ? 'Etc/UTC' : $this->configurationManager->timezone,
- 'COLLABORA_DICTIONARIES' => $this->configurationManager->GetCollaboraDictionaries() === '' ? 'de_DE en_GB en_US es_ES fr_FR it nl pt_BR pt_PT ru' : $this->configurationManager->GetCollaboraDictionaries(),
+ 'COLLABORA_DICTIONARIES' => $this->configurationManager->collabora_dictionaries === '' ? 'de_DE en_GB en_US es_ES fr_FR it nl pt_BR pt_PT ru' : $this->configurationManager->collabora_dictionaries,
'IMAGINARY_ENABLED' => $this->configurationManager->isImaginaryEnabled ? 'yes' : '',
'FULLTEXTSEARCH_ENABLED' => $this->configurationManager->isFulltextsearchEnabled ? 'yes' : '',
'DOCKER_SOCKET_PROXY_ENABLED' => $this->configurationManager->isDockerSocketProxyEnabled ? 'yes' : '',
From 228440f2a8905aab4a2db54faa70fc8565776ffd Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 19 Jan 2026 12:21:23 +0100
Subject: [PATCH 067/164] Make `collabora_additional_options` an attribute
Signed-off-by: Pablo Zmdl
---
php/public/index.php | 2 +-
.../Controller/ConfigurationController.php | 4 +-
php/src/Data/ConfigurationManager.php | 38 +++++++++----------
php/src/Docker/DockerActionManager.php | 4 +-
4 files changed, 24 insertions(+), 24 deletions(-)
diff --git a/php/public/index.php b/php/public/index.php
index dc0151e2..83d1d878 100644
--- a/php/public/index.php
+++ b/php/public/index.php
@@ -121,7 +121,7 @@ $app->get('/containers', function (Request $request, Response $response, array $
'skip_domain_validation' => $configurationManager->shouldDomainValidationBeSkipped($skip_domain_validation),
'talk_port' => $configurationManager->GetTalkPort(),
'collabora_dictionaries' => $configurationManager->collabora_dictionaries,
- 'collabora_additional_options' => $configurationManager->GetAdditionalCollaboraOptions(),
+ 'collabora_additional_options' => $configurationManager->collabora_additional_options,
'automatic_updates' => $configurationManager->areAutomaticUpdatesEnabled(),
'is_backup_section_enabled' => $configurationManager->isBackupSectionEnabled(),
'is_imaginary_enabled' => $configurationManager->isImaginaryEnabled,
diff --git a/php/src/Controller/ConfigurationController.php b/php/src/Controller/ConfigurationController.php
index 4a36ce5c..3147fda4 100644
--- a/php/src/Controller/ConfigurationController.php
+++ b/php/src/Controller/ConfigurationController.php
@@ -121,12 +121,12 @@ readonly class ConfigurationController {
}
if (isset($request->getParsedBody()['delete_collabora_additional_options'])) {
- $this->configurationManager->DeleteAdditionalCollaboraOptions();
+ $this->configurationManager->deleteAdditionalCollaboraOptions();
}
if (isset($request->getParsedBody()['collabora_additional_options'])) {
$additionalCollaboraOptions = $request->getParsedBody()['collabora_additional_options'] ?? '';
- $this->configurationManager->SetAdditionalCollaboraOptions($additionalCollaboraOptions);
+ $this->configurationManager->collabora_additional_options = $additionalCollaboraOptions;
}
if (isset($request->getParsedBody()['delete_borg_backup_location_vars'])) {
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index 9f037ec4..3c176556 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -148,6 +148,18 @@ class ConfigurationManager
}
}
+ /**
+ * @throws InvalidSettingConfigurationException
+ */
+ public string $collabora_additional_options {
+ get => $this->get('collabora_additional_options', '');
+ set {
+ // This throws an exception if the validation fails.
+ $this->validateCollaboraAdditionalOptions($value);
+ $this->set('collabora_additional_options', $value);
+ }
+ }
+
public function GetConfig() : array
{
if ($this->config === [] && file_exists(DataConst::GetConfigFile()))
@@ -866,7 +878,7 @@ class ConfigurationManager
/**
* @throws InvalidSettingConfigurationException
*/
- public function SetAdditionalCollaboraOptions(string $additionalCollaboraOptions) : void {
+ private function validateCollaboraAdditionalOptions(string $additionalCollaboraOptions) : void {
if ($additionalCollaboraOptions === "") {
throw new InvalidSettingConfigurationException("The additional options must not be empty!");
}
@@ -874,32 +886,20 @@ class ConfigurationManager
if (!preg_match("#^--o:#", $additionalCollaboraOptions)) {
throw new InvalidSettingConfigurationException("The entered options must start with '--o:'. So the config does not seem to be a valid!");
}
-
- $config = $this->GetConfig();
- $config['collabora_additional_options'] = $additionalCollaboraOptions;
- $this->WriteConfig($config);
- }
-
- public function GetAdditionalCollaboraOptions() : string {
- $config = $this->GetConfig();
- if(!isset($config['collabora_additional_options'])) {
- $config['collabora_additional_options'] = '';
- }
-
- return $config['collabora_additional_options'];
}
public function isCollaboraSubscriptionEnabled() : bool {
- if (str_contains($this->GetAdditionalCollaboraOptions(), '--o:support_key=')) {
+ if (str_contains($this->collabora_additional_options, '--o:support_key=')) {
return true;
}
return false;
}
- public function DeleteAdditionalCollaboraOptions() : void {
- $config = $this->GetConfig();
- $config['collabora_additional_options'] = '';
- $this->WriteConfig($config);
+ /**
+ * Provide an extra method since the corresponding attribute setter prevents setting an empty value.
+ */
+ public function deleteAdditionalCollaboraOptions() : void {
+ $this->set('collabora_additional_options', '');
}
public function GetApacheAdditionalNetwork() : string {
diff --git a/php/src/Docker/DockerActionManager.php b/php/src/Docker/DockerActionManager.php
index 3bbc37f1..6afa46fe 100644
--- a/php/src/Docker/DockerActionManager.php
+++ b/php/src/Docker/DockerActionManager.php
@@ -427,8 +427,8 @@ readonly class DockerActionManager {
}
// Additional Collabora options
- if ($this->configurationManager->GetAdditionalCollaboraOptions() !== '') {
- $requestBody['Cmd'] = [$this->configurationManager->GetAdditionalCollaboraOptions()];
+ if ($this->configurationManager->collabora_additional_options !== '') {
+ $requestBody['Cmd'] = [$this->configurationManager->collabora_additional_options];
}
}
From 6c04cd055f363dc52d4e1bcac7a317f428246ebb Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 19 Jan 2026 15:44:22 +0100
Subject: [PATCH 068/164] Make `aio_community_containers` an attribute
Signed-off-by: Pablo Zmdl
---
php/public/index.php | 2 +-
php/src/ContainerDefinitionFetcher.php | 2 +-
.../Controller/ConfigurationController.php | 2 +-
php/src/Data/ConfigurationManager.php | 26 ++++---------------
php/src/Docker/DockerActionManager.php | 2 +-
5 files changed, 9 insertions(+), 25 deletions(-)
diff --git a/php/public/index.php b/php/public/index.php
index 83d1d878..2d3e4f03 100644
--- a/php/public/index.php
+++ b/php/public/index.php
@@ -138,7 +138,7 @@ $app->get('/containers', function (Request $request, Response $response, array $
'is_docker_socket_proxy_enabled' => $configurationManager->isDockerSocketProxyEnabled,
'is_whiteboard_enabled' => $configurationManager->isWhiteboardEnabled,
'community_containers' => $configurationManager->listAvailableCommunityContainers(),
- 'community_containers_enabled' => $configurationManager->GetEnabledCommunityContainers(),
+ 'community_containers_enabled' => $configurationManager->aio_community_containers,
'bypass_container_update' => $bypass_container_update,
]);
})->setName('profile');
diff --git a/php/src/ContainerDefinitionFetcher.php b/php/src/ContainerDefinitionFetcher.php
index e8244ddc..6f96d480 100644
--- a/php/src/ContainerDefinitionFetcher.php
+++ b/php/src/ContainerDefinitionFetcher.php
@@ -41,7 +41,7 @@ readonly class ContainerDefinitionFetcher {
$data = json_decode((string)file_get_contents(DataConst::GetContainersDefinitionPath()), true, 512, JSON_THROW_ON_ERROR);
$additionalContainerNames = [];
- foreach ($this->configurationManager->GetEnabledCommunityContainers() as $communityContainer) {
+ foreach ($this->configurationManager->aio_community_containers as $communityContainer) {
if ($communityContainer !== '') {
$path = DataConst::GetCommunityContainersDirectory() . '/' . $communityContainer . '/' . $communityContainer . '.json';
$additionalData = json_decode((string)file_get_contents($path), true, 512, JSON_THROW_ON_ERROR);
diff --git a/php/src/Controller/ConfigurationController.php b/php/src/Controller/ConfigurationController.php
index 3147fda4..a1132981 100644
--- a/php/src/Controller/ConfigurationController.php
+++ b/php/src/Controller/ConfigurationController.php
@@ -108,7 +108,7 @@ readonly class ConfigurationController {
$enabledCC[] = $item;
}
}
- $this->configurationManager->SetEnabledCommunityContainers($enabledCC);
+ $this->configurationManager->aio_community_containers = $enabledCC;
}
if (isset($request->getParsedBody()['delete_collabora_dictionaries'])) {
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index 3c176556..72f69086 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -160,6 +160,11 @@ class ConfigurationManager
}
}
+ public array $aio_community_containers {
+ get => explode(' ', $this->get('aio_community_containers', ''));
+ set { $this->set('aio_community_containers', implode(' ', $value)); }
+ }
+
public function GetConfig() : array
{
if ($this->config === [] && file_exists(DataConst::GetConfigFile()))
@@ -931,16 +936,6 @@ class ConfigurationManager
}
}
- private function GetCommunityContainers() : string {
- $config = $this->GetConfig();
- if(!isset($config['aio_community_containers'])) {
- $config['aio_community_containers'] = '';
- }
-
- return $config['aio_community_containers'];
- }
-
-
public function listAvailableCommunityContainers() : array {
$cc = [];
$dir = scandir(DataConst::GetCommunityContainersDirectory());
@@ -976,17 +971,6 @@ class ConfigurationManager
return $cc;
}
- /** @return list */
- public function GetEnabledCommunityContainers(): array {
- return explode(' ', $this->GetCommunityContainers());
- }
-
- public function SetEnabledCommunityContainers(array $enabledCommunityContainers) : void {
- $config = $this->GetConfig();
- $config['aio_community_containers'] = implode(' ', $enabledCommunityContainers);
- $this->WriteConfig($config);
- }
-
private function GetEnabledDriDevice() : string {
$envVariableName = 'NEXTCLOUD_ENABLE_DRI_DEVICE';
$configName = 'nextcloud_enable_dri_device';
diff --git a/php/src/Docker/DockerActionManager.php b/php/src/Docker/DockerActionManager.php
index 6afa46fe..08cbf9b1 100644
--- a/php/src/Docker/DockerActionManager.php
+++ b/php/src/Docker/DockerActionManager.php
@@ -600,7 +600,7 @@ readonly class DockerActionManager {
// Allow to get local ip-address of database container which allows to talk to it even in host mode (the container that requires this needs to be started first then)
'AIO_DATABASE_HOST' => gethostbyname('nextcloud-aio-database'),
// Allow to get local ip-address of caddy container and add it to trusted proxies automatically
- 'CADDY_IP_ADDRESS' => in_array('caddy', $this->configurationManager->GetEnabledCommunityContainers(), true) ? gethostbyname('nextcloud-aio-caddy') : '',
+ 'CADDY_IP_ADDRESS' => in_array('caddy', $this->configurationManager->aio_community_containers, true) ? gethostbyname('nextcloud-aio-caddy') : '',
'WHITEBOARD_ENABLED' => $this->configurationManager->isWhiteboardEnabled ? 'yes' : '',
default => $this->configurationManager->GetRegisteredSecret($placeholder),
};
From 0a22384cd90127a14f11dc55b1e73c83daf485c4 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 19 Jan 2026 12:23:22 +0100
Subject: [PATCH 069/164] Make `turn_domain` an attribute
Signed-off-by: Pablo Zmdl
---
php/src/Data/ConfigurationManager.php | 14 +++++---------
php/src/Docker/DockerActionManager.php | 2 +-
2 files changed, 6 insertions(+), 10 deletions(-)
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index 72f69086..9362815a 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -165,6 +165,11 @@ class ConfigurationManager
set { $this->set('aio_community_containers', implode(' ', $value)); }
}
+ public string $turn_domain {
+ get => $this->get('turn_domain', '');
+ set { $this->set('turn_domain', $value); }
+ }
+
public function GetConfig() : array
{
if ($this->config === [] && file_exists(DataConst::GetConfigFile()))
@@ -562,15 +567,6 @@ class ConfigurationManager
return $this->GetEnvironmentalVariableOrConfig($envVariableName, $configName, $defaultValue);
}
- public function GetTurnDomain() : string {
- $config = $this->GetConfig();
- if(!isset($config['turn_domain'])) {
- $config['turn_domain'] = '';
- }
-
- return $config['turn_domain'];
- }
-
/**
* @throws InvalidSettingConfigurationException
*/
diff --git a/php/src/Docker/DockerActionManager.php b/php/src/Docker/DockerActionManager.php
index 08cbf9b1..367b7eb4 100644
--- a/php/src/Docker/DockerActionManager.php
+++ b/php/src/Docker/DockerActionManager.php
@@ -568,7 +568,7 @@ readonly class DockerActionManager {
'APACHE_PORT' => $this->configurationManager->GetApachePort(),
'APACHE_IP_BINDING' => $this->configurationManager->GetApacheIPBinding(),
'TALK_PORT' => $this->configurationManager->GetTalkPort(),
- 'TURN_DOMAIN' => $this->configurationManager->GetTurnDomain(),
+ 'TURN_DOMAIN' => $this->configurationManager->turn_domain,
'NEXTCLOUD_MOUNT' => $this->configurationManager->GetNextcloudMount(),
'BACKUP_RESTORE_PASSWORD' => $this->configurationManager->borg_restore_password,
'CLAMAV_ENABLED' => $this->configurationManager->isClamavEnabled ? 'yes' : '',
From 4e373cb2f8a0be7e809f0a6d2cdc3700e5b8abf2 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Tue, 20 Jan 2026 12:45:00 +0100
Subject: [PATCH 070/164] Make `apache_ip_binding` an attribute
Signed-off-by: Pablo Zmdl
---
php/src/Data/ConfigurationManager.php | 12 +++++-------
php/src/Docker/DockerActionManager.php | 4 ++--
2 files changed, 7 insertions(+), 9 deletions(-)
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index 9362815a..7182602e 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -124,6 +124,11 @@ class ConfigurationManager
set { $this->set('borg_restore_password', $value); }
}
+ public string $apache_ip_binding {
+ get => $this->GetEnvironmentalVariableOrConfig('APACHE_IP_BINDING', 'apache_ip_binding', '');
+ set { $this->set('apache_ip_binding', $value); }
+ }
+
/**
* @throws InvalidSettingConfigurationException
*/
@@ -910,13 +915,6 @@ class ConfigurationManager
return $this->GetEnvironmentalVariableOrConfig($envVariableName, $configName, $defaultValue);
}
- public function GetApacheIPBinding() : string {
- $envVariableName = 'APACHE_IP_BINDING';
- $configName = 'apache_ip_binding';
- $defaultValue = '';
- return $this->GetEnvironmentalVariableOrConfig($envVariableName, $configName, $defaultValue);
- }
-
private function GetDisableBackupSection() : string {
$envVariableName = 'AIO_DISABLE_BACKUP_SECTION';
$configName = 'disable_backup_section';
diff --git a/php/src/Docker/DockerActionManager.php b/php/src/Docker/DockerActionManager.php
index 367b7eb4..b1bf847e 100644
--- a/php/src/Docker/DockerActionManager.php
+++ b/php/src/Docker/DockerActionManager.php
@@ -297,7 +297,7 @@ readonly class DockerActionManager {
}
$ipBinding = $value->ipBinding;
if ($ipBinding === '%APACHE_IP_BINDING%') {
- $ipBinding = $this->configurationManager->GetApacheIPBinding();
+ $ipBinding = $this->configurationManager->apache_ip_binding;
// Do not expose if AIO is in internal network mode
if ($ipBinding === '@INTERNAL') {
continue;
@@ -566,7 +566,7 @@ readonly class DockerActionManager {
'RESTORE_EXCLUDE_PREVIEWS' => $this->configurationManager->restoreExcludePreviews ? '1' : '',
'SELECTED_RESTORE_TIME' => $this->configurationManager->selectedRestoreTime,
'APACHE_PORT' => $this->configurationManager->GetApachePort(),
- 'APACHE_IP_BINDING' => $this->configurationManager->GetApacheIPBinding(),
+ 'APACHE_IP_BINDING' => $this->configurationManager->apache_ip_binding,
'TALK_PORT' => $this->configurationManager->GetTalkPort(),
'TURN_DOMAIN' => $this->configurationManager->turn_domain,
'NEXTCLOUD_MOUNT' => $this->configurationManager->GetNextcloudMount(),
From dc28eb67372be8bc6848eb17c27673c1ae382bb4 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Tue, 20 Jan 2026 12:47:45 +0100
Subject: [PATCH 071/164] Make `apache_port` an attribute
Signed-off-by: Pablo Zmdl
---
php/public/index.php | 2 +-
php/src/Data/ConfigurationManager.php | 10 ++++------
php/src/Docker/DockerActionManager.php | 8 ++++----
3 files changed, 9 insertions(+), 11 deletions(-)
diff --git a/php/public/index.php b/php/public/index.php
index 2d3e4f03..27364a98 100644
--- a/php/public/index.php
+++ b/php/public/index.php
@@ -92,7 +92,7 @@ $app->get('/containers', function (Request $request, Response $response, array $
return $view->render($response, 'containers.twig', [
'domain' => $configurationManager->domain,
- 'apache_port' => $configurationManager->GetApachePort(),
+ 'apache_port' => $configurationManager->apache_port,
'borg_backup_host_location' => $configurationManager->borg_backup_host_location,
'borg_remote_repo' => $configurationManager->borg_remote_repo,
'borg_public_key' => $configurationManager->GetBorgPublicKey(),
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index 7182602e..aaef8e08 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -363,7 +363,7 @@ class ConfigurationManager
}
// Get the apache port
- $port = $this->GetApachePort();
+ $port = $this->apache_port;
if (!filter_var($dnsRecordIP, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
if ($port === '443') {
@@ -558,11 +558,9 @@ class ConfigurationManager
$this->set('password', $newPassword);
}
- public function GetApachePort() : string {
- $envVariableName = 'APACHE_PORT';
- $configName = 'apache_port';
- $defaultValue = '443';
- return $this->GetEnvironmentalVariableOrConfig($envVariableName, $configName, $defaultValue);
+ public string $apache_port {
+ get => $this->GetEnvironmentalVariableOrConfig('APACHE_PORT', 'apache_port', '443');
+ set { $this->set('apache_port', $value); }
}
public function GetTalkPort() : string {
diff --git a/php/src/Docker/DockerActionManager.php b/php/src/Docker/DockerActionManager.php
index b1bf847e..0db11ade 100644
--- a/php/src/Docker/DockerActionManager.php
+++ b/php/src/Docker/DockerActionManager.php
@@ -115,7 +115,7 @@ readonly class DockerActionManager {
$containerName = $container->identifier;
$internalPort = $container->internalPorts;
if ($internalPort === '%APACHE_PORT%') {
- $internalPort = $this->configurationManager->GetApachePort();
+ $internalPort = $this->configurationManager->apache_port;
} elseif ($internalPort === '%TALK_PORT%') {
$internalPort = $this->configurationManager->GetTalkPort();
}
@@ -261,7 +261,7 @@ readonly class DockerActionManager {
$port = $value->port;
$protocol = $value->protocol;
if ($port === '%APACHE_PORT%') {
- $port = $this->configurationManager->GetApachePort();
+ $port = $this->configurationManager->apache_port;
// Do not expose udp if AIO is in reverse proxy mode
if ($port !== '443' && $protocol === 'udp') {
continue;
@@ -283,7 +283,7 @@ readonly class DockerActionManager {
$port = $value->port;
$protocol = $value->protocol;
if ($port === '%APACHE_PORT%') {
- $port = $this->configurationManager->GetApachePort();
+ $port = $this->configurationManager->apache_port;
// Do not expose udp if AIO is in reverse proxy mode
if ($port !== '443' && $protocol === 'udp') {
continue;
@@ -565,7 +565,7 @@ readonly class DockerActionManager {
'AIO_URL' => $this->configurationManager->AIO_URL,
'RESTORE_EXCLUDE_PREVIEWS' => $this->configurationManager->restoreExcludePreviews ? '1' : '',
'SELECTED_RESTORE_TIME' => $this->configurationManager->selectedRestoreTime,
- 'APACHE_PORT' => $this->configurationManager->GetApachePort(),
+ 'APACHE_PORT' => $this->configurationManager->apache_port,
'APACHE_IP_BINDING' => $this->configurationManager->apache_ip_binding,
'TALK_PORT' => $this->configurationManager->GetTalkPort(),
'TURN_DOMAIN' => $this->configurationManager->turn_domain,
From 96c9c1a6f91befbba4150d9312bc00173044ade9 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Tue, 20 Jan 2026 12:52:24 +0100
Subject: [PATCH 072/164] Make `talk_port` an attribute
Signed-off-by: Pablo Zmdl
---
php/public/index.php | 2 +-
php/src/Data/ConfigurationManager.php | 10 ++++------
php/src/Docker/DockerActionManager.php | 8 ++++----
3 files changed, 9 insertions(+), 11 deletions(-)
diff --git a/php/public/index.php b/php/public/index.php
index 27364a98..718ad0ca 100644
--- a/php/public/index.php
+++ b/php/public/index.php
@@ -119,7 +119,7 @@ $app->get('/containers', function (Request $request, Response $response, array $
'is_daily_backup_running' => $configurationManager->isDailyBackupRunning(),
'timezone' => $configurationManager->timezone,
'skip_domain_validation' => $configurationManager->shouldDomainValidationBeSkipped($skip_domain_validation),
- 'talk_port' => $configurationManager->GetTalkPort(),
+ 'talk_port' => $configurationManager->talk_port,
'collabora_dictionaries' => $configurationManager->collabora_dictionaries,
'collabora_additional_options' => $configurationManager->collabora_additional_options,
'automatic_updates' => $configurationManager->areAutomaticUpdatesEnabled(),
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index aaef8e08..fca733e9 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -562,12 +562,10 @@ class ConfigurationManager
get => $this->GetEnvironmentalVariableOrConfig('APACHE_PORT', 'apache_port', '443');
set { $this->set('apache_port', $value); }
}
-
- public function GetTalkPort() : string {
- $envVariableName = 'TALK_PORT';
- $configName = 'talk_port';
- $defaultValue = '3478';
- return $this->GetEnvironmentalVariableOrConfig($envVariableName, $configName, $defaultValue);
+
+ public string $talk_port {
+ get => $this->GetEnvironmentalVariableOrConfig('TALK_PORT', 'talk_port', '3478');
+ set { $this->set('talk_port', $value); }
}
/**
diff --git a/php/src/Docker/DockerActionManager.php b/php/src/Docker/DockerActionManager.php
index 0db11ade..8cfbe399 100644
--- a/php/src/Docker/DockerActionManager.php
+++ b/php/src/Docker/DockerActionManager.php
@@ -117,7 +117,7 @@ readonly class DockerActionManager {
if ($internalPort === '%APACHE_PORT%') {
$internalPort = $this->configurationManager->apache_port;
} elseif ($internalPort === '%TALK_PORT%') {
- $internalPort = $this->configurationManager->GetTalkPort();
+ $internalPort = $this->configurationManager->talk_port;
}
if ($internalPort !== "" && $internalPort !== 'host') {
@@ -267,7 +267,7 @@ readonly class DockerActionManager {
continue;
}
} else if ($port === '%TALK_PORT%') {
- $port = $this->configurationManager->GetTalkPort();
+ $port = $this->configurationManager->talk_port;
}
$portWithProtocol = $port . '/' . $protocol;
$exposedPorts[$portWithProtocol] = null;
@@ -289,7 +289,7 @@ readonly class DockerActionManager {
continue;
}
} else if ($port === '%TALK_PORT%') {
- $port = $this->configurationManager->GetTalkPort();
+ $port = $this->configurationManager->talk_port;
// Skip publishing talk tcp port if it is set to 443
if ($port === '443' && $protocol === 'tcp') {
continue;
@@ -567,7 +567,7 @@ readonly class DockerActionManager {
'SELECTED_RESTORE_TIME' => $this->configurationManager->selectedRestoreTime,
'APACHE_PORT' => $this->configurationManager->apache_port,
'APACHE_IP_BINDING' => $this->configurationManager->apache_ip_binding,
- 'TALK_PORT' => $this->configurationManager->GetTalkPort(),
+ 'TALK_PORT' => $this->configurationManager->talk_port,
'TURN_DOMAIN' => $this->configurationManager->turn_domain,
'NEXTCLOUD_MOUNT' => $this->configurationManager->GetNextcloudMount(),
'BACKUP_RESTORE_PASSWORD' => $this->configurationManager->borg_restore_password,
From 903aed1e34797c0fcaaa6bde13fe83b9cd77000f Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Tue, 20 Jan 2026 12:54:14 +0100
Subject: [PATCH 073/164] Make `nextcloud_upload_limit` an attribute
Signed-off-by: Pablo Zmdl
---
php/public/index.php | 2 +-
php/src/Data/ConfigurationManager.php | 11 ++++-------
php/src/Docker/DockerActionManager.php | 2 +-
3 files changed, 6 insertions(+), 9 deletions(-)
diff --git a/php/public/index.php b/php/public/index.php
index 718ad0ca..b14bb449 100644
--- a/php/public/index.php
+++ b/php/public/index.php
@@ -129,7 +129,7 @@ $app->get('/containers', function (Request $request, Response $response, array $
'additional_backup_directories' => $configurationManager->GetAdditionalBackupDirectoriesString(),
'nextcloud_datadir' => $configurationManager->GetNextcloudDatadirMount(),
'nextcloud_mount' => $configurationManager->GetNextcloudMount(),
- 'nextcloud_upload_limit' => $configurationManager->GetNextcloudUploadLimit(),
+ 'nextcloud_upload_limit' => $configurationManager->nextcloud_upload_limit,
'nextcloud_max_time' => $configurationManager->GetNextcloudMaxTime(),
'nextcloud_memory_limit' => $configurationManager->GetNextcloudMemoryLimit(),
'is_dri_device_enabled' => $configurationManager->isDriDeviceEnabled(),
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index fca733e9..f9525c09 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -634,13 +634,10 @@ class ConfigurationManager
return $this->GetEnvironmentalVariableOrConfig($envVariableName, $configName, $defaultValue);
}
- public function GetNextcloudUploadLimit() : string {
- $envVariableName = 'NEXTCLOUD_UPLOAD_LIMIT';
- $configName = 'nextcloud_upload_limit';
- $defaultValue = '16G';
- return $this->GetEnvironmentalVariableOrConfig($envVariableName, $configName, $defaultValue);
+ public string $nextcloud_upload_limit {
+ get => $this->GetEnvironmentalVariableOrConfig('NEXTCLOUD_UPLOAD_LIMIT', 'nextcloud_upload_limit', '16G');
+ set { $this->set('nextcloud_upload_limit', $value); }
}
-
public function GetNextcloudMemoryLimit() : string {
$envVariableName = 'NEXTCLOUD_MEMORY_LIMIT';
$configName = 'nextcloud_memory_limit';
@@ -649,7 +646,7 @@ class ConfigurationManager
}
public function GetApacheMaxSize() : int {
- $uploadLimit = (int)rtrim($this->GetNextcloudUploadLimit(), 'G');
+ $uploadLimit = (int)rtrim($this->nextcloud_upload_limit, 'G');
return $uploadLimit * 1024 * 1024 * 1024;
}
diff --git a/php/src/Docker/DockerActionManager.php b/php/src/Docker/DockerActionManager.php
index 8cfbe399..d42678a7 100644
--- a/php/src/Docker/DockerActionManager.php
+++ b/php/src/Docker/DockerActionManager.php
@@ -582,7 +582,7 @@ readonly class DockerActionManager {
'IMAGINARY_ENABLED' => $this->configurationManager->isImaginaryEnabled ? 'yes' : '',
'FULLTEXTSEARCH_ENABLED' => $this->configurationManager->isFulltextsearchEnabled ? 'yes' : '',
'DOCKER_SOCKET_PROXY_ENABLED' => $this->configurationManager->isDockerSocketProxyEnabled ? 'yes' : '',
- 'NEXTCLOUD_UPLOAD_LIMIT' => $this->configurationManager->GetNextcloudUploadLimit(),
+ 'NEXTCLOUD_UPLOAD_LIMIT' => $this->configurationManager->nextcloud_upload_limit,
'NEXTCLOUD_MEMORY_LIMIT' => $this->configurationManager->GetNextcloudMemoryLimit(),
'NEXTCLOUD_MAX_TIME' => $this->configurationManager->GetNextcloudMaxTime(),
'BORG_RETENTION_POLICY' => $this->configurationManager->GetBorgRetentionPolicy(),
From 4de73dd75b865b6e5a1e0488ca0e92d30efbbbd8 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Tue, 20 Jan 2026 12:53:22 +0100
Subject: [PATCH 074/164] Make `nextcloud_mount` an attribute
Signed-off-by: Pablo Zmdl
---
php/public/index.php | 2 +-
php/src/ContainerDefinitionFetcher.php | 4 ++--
php/src/Data/ConfigurationManager.php | 8 +++-----
php/src/Docker/DockerActionManager.php | 6 +++---
4 files changed, 9 insertions(+), 11 deletions(-)
diff --git a/php/public/index.php b/php/public/index.php
index b14bb449..a87449fc 100644
--- a/php/public/index.php
+++ b/php/public/index.php
@@ -128,7 +128,7 @@ $app->get('/containers', function (Request $request, Response $response, array $
'is_fulltextsearch_enabled' => $configurationManager->isFulltextsearchEnabled,
'additional_backup_directories' => $configurationManager->GetAdditionalBackupDirectoriesString(),
'nextcloud_datadir' => $configurationManager->GetNextcloudDatadirMount(),
- 'nextcloud_mount' => $configurationManager->GetNextcloudMount(),
+ 'nextcloud_mount' => $configurationManager->nextcloud_mount,
'nextcloud_upload_limit' => $configurationManager->nextcloud_upload_limit,
'nextcloud_max_time' => $configurationManager->GetNextcloudMaxTime(),
'nextcloud_memory_limit' => $configurationManager->GetNextcloudMemoryLimit(),
diff --git a/php/src/ContainerDefinitionFetcher.php b/php/src/ContainerDefinitionFetcher.php
index 6f96d480..c81989f2 100644
--- a/php/src/ContainerDefinitionFetcher.php
+++ b/php/src/ContainerDefinitionFetcher.php
@@ -119,7 +119,7 @@ readonly class ContainerDefinitionFetcher {
}
}
if($value['source'] === '%NEXTCLOUD_MOUNT%') {
- $value['source'] = $this->configurationManager->GetNextcloudMount();
+ $value['source'] = $this->configurationManager->nextcloud_mount;
if($value['source'] === '') {
continue;
}
@@ -140,7 +140,7 @@ readonly class ContainerDefinitionFetcher {
}
}
if ($value['destination'] === '%NEXTCLOUD_MOUNT%') {
- $value['destination'] = $this->configurationManager->GetNextcloudMount();
+ $value['destination'] = $this->configurationManager->nextcloud_mount;
if($value['destination'] === '') {
continue;
}
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index f9525c09..da823439 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -620,11 +620,9 @@ class ConfigurationManager
return trim((string)file_get_contents(DataConst::GetBackupPublicKey()));
}
- public function GetNextcloudMount() : string {
- $envVariableName = 'NEXTCLOUD_MOUNT';
- $configName = 'nextcloud_mount';
- $defaultValue = '';
- return $this->GetEnvironmentalVariableOrConfig($envVariableName, $configName, $defaultValue);
+ public string $nextcloud_mount {
+ get => $this->GetEnvironmentalVariableOrConfig('NEXTCLOUD_MOUNT', 'nextcloud_mount', '');
+ set { $this->set('nextcloud_mount', $value); }
}
public function GetNextcloudDatadirMount() : string {
diff --git a/php/src/Docker/DockerActionManager.php b/php/src/Docker/DockerActionManager.php
index d42678a7..7ab3bc23 100644
--- a/php/src/Docker/DockerActionManager.php
+++ b/php/src/Docker/DockerActionManager.php
@@ -205,7 +205,7 @@ readonly class DockerActionManager {
foreach ($container->volumes->GetVolumes() as $volume) {
// // NEXTCLOUD_MOUNT gets added via bind-mount later on
// if ($container->identifier === 'nextcloud-aio-nextcloud') {
- // if ($volume->name === $this->configurationManager->GetNextcloudMount()) {
+ // if ($volume->name === $this->configurationManager->nextcloud_mount) {
// continue;
// }
// }
@@ -408,7 +408,7 @@ readonly class DockerActionManager {
// // Special things for the nextcloud container which should not be exposed in the containers.json
// } elseif ($container->identifier === 'nextcloud-aio-nextcloud') {
// foreach ($container->volumes->GetVolumes() as $volume) {
- // if ($volume->name !== $this->configurationManager->GetNextcloudMount()) {
+ // if ($volume->name !== $this->configurationManager->nextcloud_mount) {
// continue;
// }
// $mounts[] = ["Type" => "bind", "Source" => $volume->name, "Target" => $volume->mountPoint, "ReadOnly" => !$volume->isWritable, "BindOptions" => [ "Propagation" => "rshared"]];
@@ -569,7 +569,7 @@ readonly class DockerActionManager {
'APACHE_IP_BINDING' => $this->configurationManager->apache_ip_binding,
'TALK_PORT' => $this->configurationManager->talk_port,
'TURN_DOMAIN' => $this->configurationManager->turn_domain,
- 'NEXTCLOUD_MOUNT' => $this->configurationManager->GetNextcloudMount(),
+ 'NEXTCLOUD_MOUNT' => $this->configurationManager->nextcloud_mount,
'BACKUP_RESTORE_PASSWORD' => $this->configurationManager->borg_restore_password,
'CLAMAV_ENABLED' => $this->configurationManager->isClamavEnabled ? 'yes' : '',
'TALK_RECORDING_ENABLED' => $this->configurationManager->isTalkRecordingEnabled ? 'yes' : '',
From 3e19fa66d0271eb3b656a0aebab90e17383f6406 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Tue, 20 Jan 2026 12:51:30 +0100
Subject: [PATCH 075/164] Make `nextcloud_datadir_mount` an attribute
Signed-off-by: Pablo Zmdl
---
php/public/index.php | 2 +-
php/src/ContainerDefinitionFetcher.php | 2 +-
php/src/Data/ConfigurationManager.php | 13 ++++++-------
3 files changed, 8 insertions(+), 9 deletions(-)
diff --git a/php/public/index.php b/php/public/index.php
index a87449fc..e312a7df 100644
--- a/php/public/index.php
+++ b/php/public/index.php
@@ -127,7 +127,7 @@ $app->get('/containers', function (Request $request, Response $response, array $
'is_imaginary_enabled' => $configurationManager->isImaginaryEnabled,
'is_fulltextsearch_enabled' => $configurationManager->isFulltextsearchEnabled,
'additional_backup_directories' => $configurationManager->GetAdditionalBackupDirectoriesString(),
- 'nextcloud_datadir' => $configurationManager->GetNextcloudDatadirMount(),
+ 'nextcloud_datadir' => $configurationManager->nextcloud_datadir_mount,
'nextcloud_mount' => $configurationManager->nextcloud_mount,
'nextcloud_upload_limit' => $configurationManager->nextcloud_upload_limit,
'nextcloud_max_time' => $configurationManager->GetNextcloudMaxTime(),
diff --git a/php/src/ContainerDefinitionFetcher.php b/php/src/ContainerDefinitionFetcher.php
index c81989f2..22309da8 100644
--- a/php/src/ContainerDefinitionFetcher.php
+++ b/php/src/ContainerDefinitionFetcher.php
@@ -124,7 +124,7 @@ readonly class ContainerDefinitionFetcher {
continue;
}
} elseif ($value['source'] === '%NEXTCLOUD_DATADIR%') {
- $value['source'] = $this->configurationManager->GetNextcloudDatadirMount();
+ $value['source'] = $this->configurationManager->nextcloud_datadir_mount;
if ($value['source'] === '') {
continue;
}
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index da823439..b2dd40fb 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -473,8 +473,8 @@ class ConfigurationManager
// Prevent backup to be contained in Nextcloud Datadir as this will delete the backup archive upon restore
// See https://github.com/nextcloud/all-in-one/issues/6607
- if (str_starts_with($location . '/', rtrim($this->GetNextcloudDatadirMount(), '/') . '/')) {
- throw new InvalidSettingConfigurationException("The path must not be a children of or equal to NEXTCLOUD_DATADIR, which is currently set to " . $this->GetNextcloudDatadirMount());
+ if (str_starts_with($location . '/', rtrim($this->nextcloud_datadir_mount, '/') . '/')) {
+ throw new InvalidSettingConfigurationException("The path must not be a children of or equal to NEXTCLOUD_DATADIR, which is currently set to " . $this->nextcloud_datadir_mount);
}
} else {
@@ -625,11 +625,10 @@ class ConfigurationManager
set { $this->set('nextcloud_mount', $value); }
}
- public function GetNextcloudDatadirMount() : string {
- $envVariableName = 'NEXTCLOUD_DATADIR';
- $configName = 'nextcloud_datadir';
- $defaultValue = 'nextcloud_aio_nextcloud_data';
- return $this->GetEnvironmentalVariableOrConfig($envVariableName, $configName, $defaultValue);
+
+ public string $nextcloud_datadir_mount {
+ get => $this->GetEnvironmentalVariableOrConfig('NEXTCLOUD_DATADIR', 'nextcloud_datadir', 'nextcloud_aio_nextcloud_data');
+ set { $this->set('nextcloud_datadir_mount', $value); }
}
public string $nextcloud_upload_limit {
From c1f8ac6989e9a0064c6012546f0f6060fccac190 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Tue, 20 Jan 2026 12:54:54 +0100
Subject: [PATCH 076/164] Make `nextcloud_memory_limit` an attribute
Signed-off-by: Pablo Zmdl
---
php/public/index.php | 2 +-
php/src/Data/ConfigurationManager.php | 9 ++++-----
php/src/Docker/DockerActionManager.php | 2 +-
3 files changed, 6 insertions(+), 7 deletions(-)
diff --git a/php/public/index.php b/php/public/index.php
index e312a7df..7bace4ac 100644
--- a/php/public/index.php
+++ b/php/public/index.php
@@ -131,7 +131,7 @@ $app->get('/containers', function (Request $request, Response $response, array $
'nextcloud_mount' => $configurationManager->nextcloud_mount,
'nextcloud_upload_limit' => $configurationManager->nextcloud_upload_limit,
'nextcloud_max_time' => $configurationManager->GetNextcloudMaxTime(),
- 'nextcloud_memory_limit' => $configurationManager->GetNextcloudMemoryLimit(),
+ 'nextcloud_memory_limit' => $configurationManager->nextcloud_memory_limit,
'is_dri_device_enabled' => $configurationManager->isDriDeviceEnabled(),
'is_nvidia_gpu_enabled' => $configurationManager->isNvidiaGpuEnabled(),
'is_talk_recording_enabled' => $configurationManager->isTalkRecordingEnabled,
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index b2dd40fb..c466bb3c 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -635,11 +635,10 @@ class ConfigurationManager
get => $this->GetEnvironmentalVariableOrConfig('NEXTCLOUD_UPLOAD_LIMIT', 'nextcloud_upload_limit', '16G');
set { $this->set('nextcloud_upload_limit', $value); }
}
- public function GetNextcloudMemoryLimit() : string {
- $envVariableName = 'NEXTCLOUD_MEMORY_LIMIT';
- $configName = 'nextcloud_memory_limit';
- $defaultValue = '512M';
- return $this->GetEnvironmentalVariableOrConfig($envVariableName, $configName, $defaultValue);
+
+ public string $nextcloud_memory_limit {
+ get => $this->GetEnvironmentalVariableOrConfig('NEXTCLOUD_MEMORY_LIMIT', 'nextcloud_memory_limit', '512M');
+ set { $this->set('nextcloud_memory_limit', $value); }
}
public function GetApacheMaxSize() : int {
diff --git a/php/src/Docker/DockerActionManager.php b/php/src/Docker/DockerActionManager.php
index 7ab3bc23..ee3cee60 100644
--- a/php/src/Docker/DockerActionManager.php
+++ b/php/src/Docker/DockerActionManager.php
@@ -583,7 +583,7 @@ readonly class DockerActionManager {
'FULLTEXTSEARCH_ENABLED' => $this->configurationManager->isFulltextsearchEnabled ? 'yes' : '',
'DOCKER_SOCKET_PROXY_ENABLED' => $this->configurationManager->isDockerSocketProxyEnabled ? 'yes' : '',
'NEXTCLOUD_UPLOAD_LIMIT' => $this->configurationManager->nextcloud_upload_limit,
- 'NEXTCLOUD_MEMORY_LIMIT' => $this->configurationManager->GetNextcloudMemoryLimit(),
+ 'NEXTCLOUD_MEMORY_LIMIT' => $this->configurationManager->nextcloud_memory_limit,
'NEXTCLOUD_MAX_TIME' => $this->configurationManager->GetNextcloudMaxTime(),
'BORG_RETENTION_POLICY' => $this->configurationManager->GetBorgRetentionPolicy(),
'FULLTEXTSEARCH_JAVA_OPTIONS' => $this->configurationManager->GetFulltextsearchJavaOptions(),
From 367e847cc813a674c8977c3b0e7e635588838dda Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Tue, 20 Jan 2026 12:55:58 +0100
Subject: [PATCH 077/164] Make `nextcloud_max_time` an attribute
Signed-off-by: Pablo Zmdl
---
php/public/index.php | 2 +-
php/src/Data/ConfigurationManager.php | 8 +++-----
php/src/Docker/DockerActionManager.php | 2 +-
3 files changed, 5 insertions(+), 7 deletions(-)
diff --git a/php/public/index.php b/php/public/index.php
index 7bace4ac..d4f4799f 100644
--- a/php/public/index.php
+++ b/php/public/index.php
@@ -130,7 +130,7 @@ $app->get('/containers', function (Request $request, Response $response, array $
'nextcloud_datadir' => $configurationManager->nextcloud_datadir_mount,
'nextcloud_mount' => $configurationManager->nextcloud_mount,
'nextcloud_upload_limit' => $configurationManager->nextcloud_upload_limit,
- 'nextcloud_max_time' => $configurationManager->GetNextcloudMaxTime(),
+ 'nextcloud_max_time' => $configurationManager->nextcloud_max_time,
'nextcloud_memory_limit' => $configurationManager->nextcloud_memory_limit,
'is_dri_device_enabled' => $configurationManager->isDriDeviceEnabled(),
'is_nvidia_gpu_enabled' => $configurationManager->isNvidiaGpuEnabled(),
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index c466bb3c..44c8cc62 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -646,11 +646,9 @@ class ConfigurationManager
return $uploadLimit * 1024 * 1024 * 1024;
}
- public function GetNextcloudMaxTime() : string {
- $envVariableName = 'NEXTCLOUD_MAX_TIME';
- $configName = 'nextcloud_max_time';
- $defaultValue = '3600';
- return $this->GetEnvironmentalVariableOrConfig($envVariableName, $configName, $defaultValue);
+ public string $nextcloud_max_time {
+ get => $this->GetEnvironmentalVariableOrConfig('NEXTCLOUD_MAX_TIME', 'nextcloud_max_time', '3600');
+ set { $this->set('nextcloud_max_time', $value); }
}
public function GetBorgRetentionPolicy() : string {
diff --git a/php/src/Docker/DockerActionManager.php b/php/src/Docker/DockerActionManager.php
index ee3cee60..b14e31db 100644
--- a/php/src/Docker/DockerActionManager.php
+++ b/php/src/Docker/DockerActionManager.php
@@ -584,7 +584,7 @@ readonly class DockerActionManager {
'DOCKER_SOCKET_PROXY_ENABLED' => $this->configurationManager->isDockerSocketProxyEnabled ? 'yes' : '',
'NEXTCLOUD_UPLOAD_LIMIT' => $this->configurationManager->nextcloud_upload_limit,
'NEXTCLOUD_MEMORY_LIMIT' => $this->configurationManager->nextcloud_memory_limit,
- 'NEXTCLOUD_MAX_TIME' => $this->configurationManager->GetNextcloudMaxTime(),
+ 'NEXTCLOUD_MAX_TIME' => $this->configurationManager->nextcloud_max_time,
'BORG_RETENTION_POLICY' => $this->configurationManager->GetBorgRetentionPolicy(),
'FULLTEXTSEARCH_JAVA_OPTIONS' => $this->configurationManager->GetFulltextsearchJavaOptions(),
'NEXTCLOUD_TRUSTED_CACERTS_DIR' => $this->configurationManager->GetTrustedCacertsDir(),
From f1ffd0771ce86e253e40e16ef4996fe16a960c76 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 19 Jan 2026 14:28:15 +0100
Subject: [PATCH 078/164] Privatize GetConfig() and WriteConfig()
Signed-off-by: Pablo Zmdl
---
php/src/Data/ConfigurationManager.php | 7 ++-----
1 file changed, 2 insertions(+), 5 deletions(-)
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index 44c8cc62..e172d19b 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -175,7 +175,7 @@ class ConfigurationManager
set { $this->set('turn_domain', $value); }
}
- public function GetConfig() : array
+ private function GetConfig() : array
{
if ($this->config === [] && file_exists(DataConst::GetConfigFile()))
{
@@ -571,10 +571,7 @@ class ConfigurationManager
/**
* @throws InvalidSettingConfigurationException
*/
- public function WriteConfig(?array $config) : void {
- if ($config) {
- $this->config = $config;
- }
+ private function WriteConfig() : void {
if(!is_dir(DataConst::GetDataDirectory())) {
throw new InvalidSettingConfigurationException(DataConst::GetDataDirectory() . " does not exist! Something was set up falsely!");
}
From c997332e47e26473536fbffa5e6881293814f369 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Tue, 20 Jan 2026 18:28:58 +0100
Subject: [PATCH 079/164] Remove residue code
Signed-off-by: Pablo Zmdl
---
php/src/Data/ConfigurationManager.php | 9 ---------
1 file changed, 9 deletions(-)
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index e172d19b..b30e6fc3 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -419,8 +419,6 @@ class ConfigurationManager
}
}
- $config = $this->GetConfig();
- $this->WriteConfig($config);
$this->setMultiple(function ($confManager) use ($domain) {
// Write domain
// Don't set the domain via the attribute, or we create a loop.
@@ -443,9 +441,6 @@ class ConfigurationManager
*/
public function SetBorgLocationVars(string $location, string $repo) : void {
$this->ValidateBorgLocationVars($location, $repo);
-
- $config = $this->GetConfig();
- $this->WriteConfig($config);
$this->setMultiple(function ($confManager) use ($location, $repo) {
$confManager->borg_backup_host_location = $location;
$confManager->borg_remote_repo = $repo;
@@ -495,8 +490,6 @@ class ConfigurationManager
public function DeleteBorgBackupLocationItems() : void {
// Delete the variables
- $config = $this->GetConfig();
- $this->WriteConfig($config);
$this->setMultiple(function ($confManager) {
$confManager->borg_backup_host_location = '';
$confManager->borg_remote_repo = '';
@@ -520,8 +513,6 @@ class ConfigurationManager
throw new InvalidSettingConfigurationException("Please enter the password!");
}
- $config = $this->GetConfig();
- $this->WriteConfig($config);
$this->setMultiple(function ($confManager) use ($location, $repo, $password) {
$confManager->borg_backup_host_location = $location;
$confManager->borg_remote_repo = $repo;
From 9c9ad02f8a830f210494ea141fbcf400bb87fbd7 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 19 Jan 2026 16:31:29 +0100
Subject: [PATCH 080/164] Set multiple attributes at once
Signed-off-by: Pablo Zmdl
---
php/src/Controller/DockerController.php | 27 +++++++++++++++----------
1 file changed, 16 insertions(+), 11 deletions(-)
diff --git a/php/src/Controller/DockerController.php b/php/src/Controller/DockerController.php
index 4e6d52b7..f1c5400d 100644
--- a/php/src/Controller/DockerController.php
+++ b/php/src/Controller/DockerController.php
@@ -123,9 +123,11 @@ readonly class DockerController {
}
public function StartBackupContainerRestore(Request $request, Response $response, array $args) : Response {
- $this->configurationManager->backupMode = 'restore';
- $this->configurationManager->selectedRestoreTime = $request->getParsedBody()['selected_restore_time'] ?? '';
- $this->configurationManager->restoreExcludePreviews = isset($request->getParsedBody()['restore-exclude-previews']);
+ $this->configurationManager->setMultiple(function ($confManager) use ($request) {
+ $confManager->backupMode = 'restore';
+ $confManager->selectedRestoreTime = $request->getParsedBody()['selected_restore_time'] ?? '';
+ $confManager->restoreExcludePreviews = isset($request->getParsedBody()['restore-exclude-previews']);
+ });
$id = self::TOP_CONTAINER;
$forceStopNextcloud = true;
@@ -150,8 +152,10 @@ readonly class DockerController {
}
public function StartBackupContainerTest(Request $request, Response $response, array $args) : Response {
- $this->configurationManager->backupMode = 'test';
- $this->configurationManager->instance_restore_attempt = false;
+ $this->configurationManager->setMultiple(function ($confManager) {
+ $confManager->backupMode = 'test';
+ $confManager->instance_restore_attempt = false;
+ });
$id = self::TOP_CONTAINER;
$this->PerformRecursiveContainerStop($id);
@@ -173,12 +177,13 @@ readonly class DockerController {
$port = 443;
}
- $this->configurationManager->install_latest_major = isset($request->getParsedBody()['install_latest_major']);
- // set AIO_URL
- $this->configurationManager->AIO_URL = $host . ':' . (string)$port . $path;
- // set wasStartButtonClicked
- $this->configurationManager->wasStartButtonClicked = true;
-
+ $this->configurationManager->setMultiple(function ($confManager) use ($request, $host, $port, $path) {
+ $confManager->install_latest_major = isset($request->getParsedBody()['install_latest_major']);
+ // set AIO_URL
+ $confManager->AIO_URL = $host . ':' . (string)$port . $path;
+ // set wasStartButtonClicked
+ $confManager->wasStartButtonClicked = true;
+ });
// Do not pull container images in case 'bypass_container_update' is set via url params
// Needed for local testing
$pullImage = !isset($request->getParsedBody()['bypass_container_update']);
From 844831a899fd075adcd820b307faac0c81b20eb8 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Tue, 20 Jan 2026 09:27:43 +0100
Subject: [PATCH 081/164] Move handling ENV-var replacement into
ConfigurationManger
It's the more appropriate place to have this code, and we had to touch
it anyways to make it assign the values to the attributes.
Signed-off-by: Pablo Zmdl
---
php/src/Data/ConfigurationManager.php | 93 ++++++++++++++++++++++++++
php/src/Docker/DockerActionManager.php | 88 +-----------------------
2 files changed, 95 insertions(+), 86 deletions(-)
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index b30e6fc3..2cbae5cc 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -980,4 +980,97 @@ class ConfigurationManager
return true;
}
}
+
+ public function setAioVariables(array $input) : void {
+ if ($input === []) {
+ return;
+ }
+ $this->setMultiple(function($confManager) use ($input) {
+ foreach ($input as $variable) {
+ $keyWithValue = $confManager->replaceEnvPlaceholders($variable);
+ [$key, $value] = explode('=', $keyWithValue, 2);
+ // Set if there's an attribute corresponding to the key.
+ if (isset($key, $confManager->$key)) {
+ $confManager->$key = $value;
+ }
+ }
+ });
+ }
+
+ //
+ // Replaces placeholders in $envValue with their values.
+ // E.g. "%NC_DOMAIN%:%APACHE_PORT" becomes "my.nextcloud.com:11000"
+ public function replaceEnvPlaceholders(string $envValue): string {
+ // $pattern breaks down as:
+ // % - matches a literal percent sign
+ // ([^%]+) - capture group that matches one or more characters that are NOT percent signs
+ // % - matches the closing percent sign
+ //
+ // Assumes literal percent signs are always matched and there is no
+ // escaping.
+ $pattern = '/%([^%]+)%/';
+ $matchCount = preg_match_all($pattern, $envValue, $matches);
+
+ if ($matchCount === 0) {
+ return $envValue;
+ }
+
+ $placeholders = $matches[0]; // ["%PLACEHOLDER1%", "%PLACEHOLDER2%", ...]
+ $placeholderNames = $matches[1]; // ["PLACEHOLDER1", "PLACEHOLDER2", ...]
+ $placeholderPatterns = array_map(static fn(string $p) => '/' . preg_quote($p) . '/', $placeholders); // ["/%PLACEHOLDER1%/", ...]
+ $placeholderValues = array_map($this->getPlaceholderValue(...), $placeholderNames); // ["val1", "val2"]
+ // Guaranteed to be non-null because we found the placeholders in the preg_match_all.
+ return (string) preg_replace($placeholderPatterns, $placeholderValues, $envValue);
+ }
+
+ private function getPlaceholderValue(string $placeholder) : string {
+ return match ($placeholder) {
+ 'NC_DOMAIN' => $this->domain,
+ 'NC_BASE_DN' => $this->GetBaseDN(),
+ 'AIO_TOKEN' => $this->AIO_TOKEN,
+ 'BORGBACKUP_REMOTE_REPO' => $this->borg_remote_repo,
+ 'BORGBACKUP_MODE' => $this->backupMode,
+ 'AIO_URL' => $this->AIO_URL,
+ 'SELECTED_RESTORE_TIME' => $this->selectedRestoreTime,
+ 'RESTORE_EXCLUDE_PREVIEWS' => $this->restoreExcludePreviews ? '1' : '',
+ 'APACHE_PORT' => $this->apache_port,
+ 'APACHE_IP_BINDING' => $this->apache_ip_binding,
+ 'TALK_PORT' => $this->talk_port,
+ 'TURN_DOMAIN' => $this->turn_domain,
+ 'NEXTCLOUD_MOUNT' => $this->nextcloud_mount,
+ 'BACKUP_RESTORE_PASSWORD' => $this->borg_restore_password,
+ 'CLAMAV_ENABLED' => $this->isClamavEnabled ? 'yes' : '',
+ 'TALK_RECORDING_ENABLED' => $this->isTalkRecordingEnabled ? 'yes' : '',
+ 'ONLYOFFICE_ENABLED' => $this->isOnlyofficeEnabled ? 'yes' : '',
+ 'COLLABORA_ENABLED' => $this->isCollaboraEnabled ? 'yes' : '',
+ 'TALK_ENABLED' => $this->isTalkEnabled ? 'yes' : '',
+ 'UPDATE_NEXTCLOUD_APPS' => ($this->isDailyBackupRunning() && $this->areAutomaticUpdatesEnabled()) ? 'yes' : '',
+ 'TIMEZONE' => $this->timezone === '' ? 'Etc/UTC' : $this->timezone,
+ 'COLLABORA_DICTIONARIES' => $this->collabora_dictionaries === '' ? 'de_DE en_GB en_US es_ES fr_FR it nl pt_BR pt_PT ru' : $this->collabora_dictionaries,
+ 'IMAGINARY_ENABLED' => $this->isImaginaryEnabled ? 'yes' : '',
+ 'FULLTEXTSEARCH_ENABLED' => $this->isFulltextsearchEnabled ? 'yes' : '',
+ 'DOCKER_SOCKET_PROXY_ENABLED' => $this->isDockerSocketProxyEnabled ? 'yes' : '',
+ 'NEXTCLOUD_UPLOAD_LIMIT' => $this->nextcloud_upload_limit,
+ 'NEXTCLOUD_MEMORY_LIMIT' => $this->nextcloud_memory_limit,
+ 'NEXTCLOUD_MAX_TIME' => $this->nextcloud_max_time,
+ 'BORG_RETENTION_POLICY' => $this->GetBorgRetentionPolicy(),
+ 'FULLTEXTSEARCH_JAVA_OPTIONS' => $this->GetFulltextsearchJavaOptions(),
+ 'NEXTCLOUD_TRUSTED_CACERTS_DIR' => $this->GetTrustedCacertsDir(),
+ 'ADDITIONAL_DIRECTORIES_BACKUP' => $this->GetAdditionalBackupDirectoriesString() !== '' ? 'yes' : '',
+ 'BORGBACKUP_HOST_LOCATION' => $this->borg_backup_host_location,
+ 'APACHE_MAX_SIZE' => (string)($this->GetApacheMaxSize()),
+ 'COLLABORA_SECCOMP_POLICY' => $this->GetCollaboraSeccompPolicy(),
+ 'NEXTCLOUD_STARTUP_APPS' => $this->GetNextcloudStartupApps(),
+ 'NEXTCLOUD_ADDITIONAL_APKS' => $this->GetNextcloudAdditionalApks(),
+ 'NEXTCLOUD_ADDITIONAL_PHP_EXTENSIONS' => $this->GetNextcloudAdditionalPhpExtensions(),
+ 'INSTALL_LATEST_MAJOR' => $this->install_latest_major ? 'yes' : '',
+ 'REMOVE_DISABLED_APPS' => $this->shouldDisabledAppsGetRemoved() ? 'yes' : '',
+ // Allow to get local ip-address of database container which allows to talk to it even in host mode (the container that requires this needs to be started first then)
+ 'AIO_DATABASE_HOST' => gethostbyname('nextcloud-aio-database'),
+ // Allow to get local ip-address of caddy container and add it to trusted proxies automatically
+ 'CADDY_IP_ADDRESS' => in_array('caddy', $this->aio_community_containers, true) ? gethostbyname('nextcloud-aio-caddy') : '',
+ 'WHITEBOARD_ENABLED' => $this->isWhiteboardEnabled ? 'yes' : '',
+ default => $this->GetRegisteredSecret($placeholder),
+ };
+ }
}
diff --git a/php/src/Docker/DockerActionManager.php b/php/src/Docker/DockerActionManager.php
index b14e31db..832480c2 100644
--- a/php/src/Docker/DockerActionManager.php
+++ b/php/src/Docker/DockerActionManager.php
@@ -228,15 +228,7 @@ readonly class DockerActionManager {
$requestBody['HostConfig']['Binds'] = $volumes;
}
- $aioVariables = $container->aioVariables->GetVariables();
- foreach ($aioVariables as $variable) {
- $config = $this->configurationManager->GetConfig();
- $variable = $this->replaceEnvPlaceholders($variable);
- $variableArray = explode('=', $variable);
- $config[$variableArray[0]] = $variableArray[1];
- $this->configurationManager->WriteConfig($config);
- sleep(1);
- }
+ $this->configurationManager->setAioVariables($container->aioVariables->GetVariables());
$envs = $container->containerEnvironmentVariables->GetVariables();
// Special thing for the nextcloud container
@@ -244,7 +236,7 @@ readonly class DockerActionManager {
$envs[] = $this->GetAllNextcloudExecCommands();
}
foreach ($envs as $key => $env) {
- $envs[$key] = $this->replaceEnvPlaceholders($env);
+ $envs[$key] = $this->configurationManager->replaceEnvPlaceholders($env);
}
if (count($envs) > 0) {
@@ -530,82 +522,6 @@ readonly class DockerActionManager {
}
}
- // Replaces placeholders in $envValue with their values.
- // E.g. "%NC_DOMAIN%:%APACHE_PORT" becomes "my.nextcloud.com:11000"
- private function replaceEnvPlaceholders(string $envValue): string {
- // $pattern breaks down as:
- // % - matches a literal percent sign
- // ([^%]+) - capture group that matches one or more characters that are NOT percent signs
- // % - matches the closing percent sign
- //
- // Assumes literal percent signs are always matched and there is no
- // escaping.
- $pattern = '/%([^%]+)%/';
- $matchCount = preg_match_all($pattern, $envValue, $matches);
-
- if ($matchCount === 0) {
- return $envValue;
- }
-
- $placeholders = $matches[0]; // ["%PLACEHOLDER1%", "%PLACEHOLDER2%", ...]
- $placeholderNames = $matches[1]; // ["PLACEHOLDER1", "PLACEHOLDER2", ...]
- $placeholderPatterns = array_map(static fn(string $p) => '/' . preg_quote($p) . '/', $placeholders); // ["/%PLACEHOLDER1%/", ...]
- $placeholderValues = array_map($this->getPlaceholderValue(...), $placeholderNames); // ["val1", "val2"]
- // Guaranteed to be non-null because we found the placeholders in the preg_match_all.
- return (string) preg_replace($placeholderPatterns, $placeholderValues, $envValue);
- }
-
- private function getPlaceholderValue(string $placeholder) : string {
- return match ($placeholder) {
- 'NC_DOMAIN' => $this->configurationManager->GetDomain(),
- 'NC_BASE_DN' => $this->configurationManager->GetBaseDN(),
- 'AIO_TOKEN' => $this->configurationManager->AIO_TOKEN,
- 'BORGBACKUP_REMOTE_REPO' => $this->configurationManager->borg_remote_repo,
- 'BORGBACKUP_MODE' => $this->configurationManager->GetBackupMode(),
- 'AIO_URL' => $this->configurationManager->AIO_URL,
- 'RESTORE_EXCLUDE_PREVIEWS' => $this->configurationManager->restoreExcludePreviews ? '1' : '',
- 'SELECTED_RESTORE_TIME' => $this->configurationManager->selectedRestoreTime,
- 'APACHE_PORT' => $this->configurationManager->apache_port,
- 'APACHE_IP_BINDING' => $this->configurationManager->apache_ip_binding,
- 'TALK_PORT' => $this->configurationManager->talk_port,
- 'TURN_DOMAIN' => $this->configurationManager->turn_domain,
- 'NEXTCLOUD_MOUNT' => $this->configurationManager->nextcloud_mount,
- 'BACKUP_RESTORE_PASSWORD' => $this->configurationManager->borg_restore_password,
- 'CLAMAV_ENABLED' => $this->configurationManager->isClamavEnabled ? 'yes' : '',
- 'TALK_RECORDING_ENABLED' => $this->configurationManager->isTalkRecordingEnabled ? 'yes' : '',
- 'ONLYOFFICE_ENABLED' => $this->configurationManager->isOnlyofficeEnabled ? 'yes' : '',
- 'COLLABORA_ENABLED' => $this->configurationManager->isCollaboraEnabled ? 'yes' : '',
- 'TALK_ENABLED' => $this->configurationManager->isTalkEnabled ? 'yes' : '',
- 'UPDATE_NEXTCLOUD_APPS' => ($this->configurationManager->isDailyBackupRunning() && $this->configurationManager->areAutomaticUpdatesEnabled()) ? 'yes' : '',
- 'TIMEZONE' => $this->configurationManager->timezone === '' ? 'Etc/UTC' : $this->configurationManager->timezone,
- 'COLLABORA_DICTIONARIES' => $this->configurationManager->collabora_dictionaries === '' ? 'de_DE en_GB en_US es_ES fr_FR it nl pt_BR pt_PT ru' : $this->configurationManager->collabora_dictionaries,
- 'IMAGINARY_ENABLED' => $this->configurationManager->isImaginaryEnabled ? 'yes' : '',
- 'FULLTEXTSEARCH_ENABLED' => $this->configurationManager->isFulltextsearchEnabled ? 'yes' : '',
- 'DOCKER_SOCKET_PROXY_ENABLED' => $this->configurationManager->isDockerSocketProxyEnabled ? 'yes' : '',
- 'NEXTCLOUD_UPLOAD_LIMIT' => $this->configurationManager->nextcloud_upload_limit,
- 'NEXTCLOUD_MEMORY_LIMIT' => $this->configurationManager->nextcloud_memory_limit,
- 'NEXTCLOUD_MAX_TIME' => $this->configurationManager->nextcloud_max_time,
- 'BORG_RETENTION_POLICY' => $this->configurationManager->GetBorgRetentionPolicy(),
- 'FULLTEXTSEARCH_JAVA_OPTIONS' => $this->configurationManager->GetFulltextsearchJavaOptions(),
- 'NEXTCLOUD_TRUSTED_CACERTS_DIR' => $this->configurationManager->GetTrustedCacertsDir(),
- 'ADDITIONAL_DIRECTORIES_BACKUP' => $this->configurationManager->GetAdditionalBackupDirectoriesString() !== '' ? 'yes' : '',
- 'BORGBACKUP_HOST_LOCATION' => $this->configurationManager->borg_backup_host_location,
- 'APACHE_MAX_SIZE' => (string)($this->configurationManager->GetApacheMaxSize()),
- 'COLLABORA_SECCOMP_POLICY' => $this->configurationManager->GetCollaboraSeccompPolicy(),
- 'NEXTCLOUD_STARTUP_APPS' => $this->configurationManager->GetNextcloudStartupApps(),
- 'NEXTCLOUD_ADDITIONAL_APKS' => $this->configurationManager->GetNextcloudAdditionalApks(),
- 'NEXTCLOUD_ADDITIONAL_PHP_EXTENSIONS' => $this->configurationManager->GetNextcloudAdditionalPhpExtensions(),
- 'INSTALL_LATEST_MAJOR' => $this->configurationManager->install_latest_major ? 'yes' : '',
- 'REMOVE_DISABLED_APPS' => $this->configurationManager->shouldDisabledAppsGetRemoved() ? 'yes' : '',
- // Allow to get local ip-address of database container which allows to talk to it even in host mode (the container that requires this needs to be started first then)
- 'AIO_DATABASE_HOST' => gethostbyname('nextcloud-aio-database'),
- // Allow to get local ip-address of caddy container and add it to trusted proxies automatically
- 'CADDY_IP_ADDRESS' => in_array('caddy', $this->configurationManager->aio_community_containers, true) ? gethostbyname('nextcloud-aio-caddy') : '',
- 'WHITEBOARD_ENABLED' => $this->configurationManager->isWhiteboardEnabled ? 'yes' : '',
- default => $this->configurationManager->GetRegisteredSecret($placeholder),
- };
- }
-
private function isContainerUpdateAvailable(string $id): string {
$container = $this->containerDefinitionFetcher->GetContainerById($id);
From fd308d4b802c31169fb2df2189daad638c32a7ce Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 19 Jan 2026 15:18:13 +0100
Subject: [PATCH 082/164] Simplify some code a little bit
Signed-off-by: Pablo Zmdl
---
php/src/Data/ConfigurationManager.php | 15 +++------------
1 file changed, 3 insertions(+), 12 deletions(-)
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index 2cbae5cc..19ff0b74 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -697,10 +697,7 @@ class ConfigurationManager
}
public function isSeccompDisabled() : bool {
- if ($this->GetCollaboraSeccompDisabledState() === 'true') {
- return true;
- }
- return false;
+ return $this->GetCollaboraSeccompDisabledState() === 'true';
}
/**
@@ -795,10 +792,7 @@ class ConfigurationManager
}
public function isDailyBackupRunning() : bool {
- if (file_exists(DataConst::GetDailyBackupBlockFile())) {
- return true;
- }
- return false;
+ return file_exists(DataConst::GetDailyBackupBlockFile());
}
/**
@@ -870,10 +864,7 @@ class ConfigurationManager
}
public function isCollaboraSubscriptionEnabled() : bool {
- if (str_contains($this->collabora_additional_options, '--o:support_key=')) {
- return true;
- }
- return false;
+ return str_contains($this->collabora_additional_options, '--o:support_key=');
}
/**
From 662840bc25444fb1081af602a0143c6cea2f75ae Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Tue, 20 Jan 2026 19:36:39 +0100
Subject: [PATCH 083/164] Make psalm accept the property-hooks for virtual
attributes
Signed-off-by: Pablo Zmdl
---
php/psalm.xml | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/php/psalm.xml b/php/psalm.xml
index d7ce38c9..576d82d2 100644
--- a/php/psalm.xml
+++ b/php/psalm.xml
@@ -20,5 +20,10 @@
+
+
+
+
+
From 77bec5898f84de1e0f9dd66bf3e0ceef8919abf5 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Tue, 20 Jan 2026 19:34:52 +0100
Subject: [PATCH 084/164] Type for Closure argument
Signed-off-by: Pablo Zmdl
---
php/src/Controller/DockerController.php | 6 +++---
php/src/Data/ConfigurationManager.php | 10 +++++-----
2 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/php/src/Controller/DockerController.php b/php/src/Controller/DockerController.php
index f1c5400d..c60efda5 100644
--- a/php/src/Controller/DockerController.php
+++ b/php/src/Controller/DockerController.php
@@ -123,7 +123,7 @@ readonly class DockerController {
}
public function StartBackupContainerRestore(Request $request, Response $response, array $args) : Response {
- $this->configurationManager->setMultiple(function ($confManager) use ($request) {
+ $this->configurationManager->setMultiple(function (ConfigurationManager $confManager) use ($request) {
$confManager->backupMode = 'restore';
$confManager->selectedRestoreTime = $request->getParsedBody()['selected_restore_time'] ?? '';
$confManager->restoreExcludePreviews = isset($request->getParsedBody()['restore-exclude-previews']);
@@ -152,7 +152,7 @@ readonly class DockerController {
}
public function StartBackupContainerTest(Request $request, Response $response, array $args) : Response {
- $this->configurationManager->setMultiple(function ($confManager) {
+ $this->configurationManager->setMultiple(function (ConfigurationManager $confManager) {
$confManager->backupMode = 'test';
$confManager->instance_restore_attempt = false;
});
@@ -177,7 +177,7 @@ readonly class DockerController {
$port = 443;
}
- $this->configurationManager->setMultiple(function ($confManager) use ($request, $host, $port, $path) {
+ $this->configurationManager->setMultiple(function (ConfigurationManager $confManager) use ($request, $host, $port, $path) {
$confManager->install_latest_major = isset($request->getParsedBody()['install_latest_major']);
// set AIO_URL
$confManager->AIO_URL = $host . ':' . (string)$port . $path;
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index 19ff0b74..2fb0a413 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -419,7 +419,7 @@ class ConfigurationManager
}
}
- $this->setMultiple(function ($confManager) use ($domain) {
+ $this->setMultiple(function (ConfigurationManager $confManager) use ($domain) {
// Write domain
// Don't set the domain via the attribute, or we create a loop.
$confManager->set('domain', $domain);
@@ -441,7 +441,7 @@ class ConfigurationManager
*/
public function SetBorgLocationVars(string $location, string $repo) : void {
$this->ValidateBorgLocationVars($location, $repo);
- $this->setMultiple(function ($confManager) use ($location, $repo) {
+ $this->setMultiple(function (ConfigurationManager $confManager) use ($location, $repo) {
$confManager->borg_backup_host_location = $location;
$confManager->borg_remote_repo = $repo;
});
@@ -490,7 +490,7 @@ class ConfigurationManager
public function DeleteBorgBackupLocationItems() : void {
// Delete the variables
- $this->setMultiple(function ($confManager) {
+ $this->setMultiple(function (ConfigurationManager $confManager) {
$confManager->borg_backup_host_location = '';
$confManager->borg_remote_repo = '';
});
@@ -513,7 +513,7 @@ class ConfigurationManager
throw new InvalidSettingConfigurationException("Please enter the password!");
}
- $this->setMultiple(function ($confManager) use ($location, $repo, $password) {
+ $this->setMultiple(function (ConfigurationManager $confManager) use ($location, $repo, $password) {
$confManager->borg_backup_host_location = $location;
$confManager->borg_remote_repo = $repo;
$confManager->borg_restore_password = $password;
@@ -976,7 +976,7 @@ class ConfigurationManager
if ($input === []) {
return;
}
- $this->setMultiple(function($confManager) use ($input) {
+ $this->setMultiple(function(ConfigurationManager $confManager) use ($input) {
foreach ($input as $variable) {
$keyWithValue = $confManager->replaceEnvPlaceholders($variable);
[$key, $value] = explode('=', $keyWithValue, 2);
From c65ccd2db02f7dfbf664ce17b7ca07036d5d4516 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Wed, 21 Jan 2026 09:54:29 +0100
Subject: [PATCH 085/164] Make aio-variables code more robust and
psalm-compatible
Now the input gets checked for being useful. It's user-generated data in the
end, which might be "funny" in curious ways.
psalm complained about the possibly unset second array key in the
destructuring assignment of `$key` and `$value`, which won't happen due to the
check for a present equal sign earlier, but nonetheless this way the code is
more robust.
Signed-off-by: Pablo Zmdl
---
php/src/Data/ConfigurationManager.php | 15 ++++++++++++---
1 file changed, 12 insertions(+), 3 deletions(-)
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index 2fb0a413..2863d6e8 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -978,10 +978,19 @@ class ConfigurationManager
}
$this->setMultiple(function(ConfigurationManager $confManager) use ($input) {
foreach ($input as $variable) {
+ if (!is_string($variable) || !str_contains($variable, '=')) {
+ error_log("Invalid input: '$variable' is not a string or does not contain an equal sign ('=')");
+ continue;
+ }
$keyWithValue = $confManager->replaceEnvPlaceholders($variable);
- [$key, $value] = explode('=', $keyWithValue, 2);
- // Set if there's an attribute corresponding to the key.
- if (isset($key, $confManager->$key)) {
+ // Pad the result with nulls so psalm is happy (and we don't risk to run into warnings in case
+ // the check for an equal sign from above gets changed).
+ [$key, $value] = explode('=', $keyWithValue, 2) + [null, null];
+ if ($value === null) {
+ error_log("Invalid input: '$keyWithValue' has no value after the equal sign");
+ } else if (!property_exists($confManager, $key)) {
+ error_log("Error: '$key' is not a valid configuration key (in '$keyWithValue')");
+ } else {
$confManager->$key = $value;
}
}
From 6bf45fb5072788a4926a4c3175f996b97b10fc10 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Wed, 21 Jan 2026 13:11:45 +0100
Subject: [PATCH 086/164] A script to list AIO variables that are configurable
through `aio_variables` in community containers
Signed-off-by: Pablo Zmdl
---
get-configurable-aio-variables.sh | 3 +++
1 file changed, 3 insertions(+)
create mode 100755 get-configurable-aio-variables.sh
diff --git a/get-configurable-aio-variables.sh b/get-configurable-aio-variables.sh
new file mode 100755
index 00000000..44536bd3
--- /dev/null
+++ b/get-configurable-aio-variables.sh
@@ -0,0 +1,3 @@
+#!/usr/bin/env bash
+
+awk '/^ public [^f][^u][^n]/ { sub(/\$/, "", $3); print $3 }' php/src/Data/ConfigurationManager.php | sort
From 76d475f2b249aa6447b96d89a1eae56875fb8b34 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Fri, 23 Jan 2026 16:40:45 +0100
Subject: [PATCH 087/164] Replace setMultiple() by startTransaction() and
commitTransaction()
Signed-off-by: Pablo Zmdl
---
php/src/Controller/DockerController.php | 33 ++++-----
php/src/Data/ConfigurationManager.php | 96 +++++++++++++------------
2 files changed, 68 insertions(+), 61 deletions(-)
diff --git a/php/src/Controller/DockerController.php b/php/src/Controller/DockerController.php
index c60efda5..7078b71f 100644
--- a/php/src/Controller/DockerController.php
+++ b/php/src/Controller/DockerController.php
@@ -123,11 +123,11 @@ readonly class DockerController {
}
public function StartBackupContainerRestore(Request $request, Response $response, array $args) : Response {
- $this->configurationManager->setMultiple(function (ConfigurationManager $confManager) use ($request) {
- $confManager->backupMode = 'restore';
- $confManager->selectedRestoreTime = $request->getParsedBody()['selected_restore_time'] ?? '';
- $confManager->restoreExcludePreviews = isset($request->getParsedBody()['restore-exclude-previews']);
- });
+ $this->configurationManager->startTransaction();
+ $this->configurationManager->backupMode = 'restore';
+ $this->configurationManager->selectedRestoreTime = $request->getParsedBody()['selected_restore_time'] ?? '';
+ $this->configurationManager->restoreExcludePreviews = isset($request->getParsedBody()['restore-exclude-previews']);
+ $this->configurationManager->commitTransaction();
$id = self::TOP_CONTAINER;
$forceStopNextcloud = true;
@@ -152,10 +152,10 @@ readonly class DockerController {
}
public function StartBackupContainerTest(Request $request, Response $response, array $args) : Response {
- $this->configurationManager->setMultiple(function (ConfigurationManager $confManager) {
- $confManager->backupMode = 'test';
- $confManager->instance_restore_attempt = false;
- });
+ $this->configurationManager->startTransaction();
+ $this->configurationManager->backupMode = 'test';
+ $this->configurationManager->instance_restore_attempt = false;
+ $this->configurationManager->commitTransaction();
$id = self::TOP_CONTAINER;
$this->PerformRecursiveContainerStop($id);
@@ -177,13 +177,14 @@ readonly class DockerController {
$port = 443;
}
- $this->configurationManager->setMultiple(function (ConfigurationManager $confManager) use ($request, $host, $port, $path) {
- $confManager->install_latest_major = isset($request->getParsedBody()['install_latest_major']);
- // set AIO_URL
- $confManager->AIO_URL = $host . ':' . (string)$port . $path;
- // set wasStartButtonClicked
- $confManager->wasStartButtonClicked = true;
- });
+ $this->configurationManager->startTransaction();
+ $this->configurationManager->install_latest_major = isset($request->getParsedBody()['install_latest_major']);
+ // set AIO_URL
+ $this->configurationManager->AIO_URL = $host . ':' . (string)$port . $path;
+ // set wasStartButtonClicked
+ $this->configurationManager->wasStartButtonClicked = true;
+ $this->configurationManager->commitTransaction();
+
// Do not pull container images in case 'bypass_container_update' is set via url params
// Needed for local testing
$pullImage = !isset($request->getParsedBody()['bypass_container_update']);
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index 2863d6e8..2caf7849 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -193,21 +193,26 @@ class ConfigurationManager
private function set(string $key, mixed $value) : void {
$this->GetConfig();
$this->config[$key] = $value;
- // Only write if this isn't called via setMultiple().
+ // Only write if this isn't called in between startTransaction() and commitTransaction().
if ($this->noWrite !== true) {
$this->WriteConfig();
}
}
/**
- * This allows to assign multiple attributes without saving the config to disk in between (as would
- * calling set() do).
+ * This allows to assign multiple attributes without saving the config to disk in between. It must be
+ * followed by a call to commitTransaction(), which then writes all changes to disk.
*/
- public function setMultiple(\Closure $closure) : void {
+ public function startTransaction() : void {
+ $this->GetConfig();
$this->noWrite = true;
+ }
+
+ /**
+ * This allows to assign multiple attributes without saving the config to disk in between.
+ */
+ public function commitTransaction() : void {
try {
- $this->GetConfig();
- $closure($this);
$this->WriteConfig();
} finally {
$this->noWrite = false;
@@ -419,13 +424,14 @@ class ConfigurationManager
}
}
- $this->setMultiple(function (ConfigurationManager $confManager) use ($domain) {
- // Write domain
- // Don't set the domain via the attribute, or we create a loop.
- $confManager->set('domain', $domain);
- // Reset the borg restore password when setting the domain
- $confManager->borg_restore_password = '';
- });
+ $this->startTransaction();
+ // Write domain
+ // Don't set the domain via the attribute, or we create a loop.
+ $this->set('domain', $domain);
+ // Reset the borg restore password when setting the domain
+ $this->borg_restore_password = '';
+ $this->startTransaction();
+ $this->commitTransaction();
}
public function GetBaseDN() : string {
@@ -441,10 +447,10 @@ class ConfigurationManager
*/
public function SetBorgLocationVars(string $location, string $repo) : void {
$this->ValidateBorgLocationVars($location, $repo);
- $this->setMultiple(function (ConfigurationManager $confManager) use ($location, $repo) {
- $confManager->borg_backup_host_location = $location;
- $confManager->borg_remote_repo = $repo;
- });
+ $this->startTransaction();
+ $this->borg_backup_host_location = $location;
+ $this->borg_remote_repo = $repo;
+ $this->commitTransaction();
}
private function ValidateBorgLocationVars(string $location, string $repo) : void {
@@ -490,10 +496,10 @@ class ConfigurationManager
public function DeleteBorgBackupLocationItems() : void {
// Delete the variables
- $this->setMultiple(function (ConfigurationManager $confManager) {
- $confManager->borg_backup_host_location = '';
- $confManager->borg_remote_repo = '';
- });
+ $this->startTransaction();
+ $this->borg_backup_host_location = '';
+ $this->borg_remote_repo = '';
+ $this->commitTransaction();
// Also delete the borg config file to be able to start over
if (file_exists(DataConst::GetBackupKeyFile())) {
@@ -513,12 +519,12 @@ class ConfigurationManager
throw new InvalidSettingConfigurationException("Please enter the password!");
}
- $this->setMultiple(function (ConfigurationManager $confManager) use ($location, $repo, $password) {
- $confManager->borg_backup_host_location = $location;
- $confManager->borg_remote_repo = $repo;
- $confManager->borg_restore_password = $password;
- $confManager->instance_restore_attempt = true;
- });
+ $this->startTransaction();
+ $this->borg_backup_host_location = $location;
+ $this->borg_remote_repo = $repo;
+ $this->borg_restore_password = $password;
+ $this->instance_restore_attempt = true;
+ $this->commitTransaction();
}
/**
@@ -976,25 +982,25 @@ class ConfigurationManager
if ($input === []) {
return;
}
- $this->setMultiple(function(ConfigurationManager $confManager) use ($input) {
- foreach ($input as $variable) {
- if (!is_string($variable) || !str_contains($variable, '=')) {
- error_log("Invalid input: '$variable' is not a string or does not contain an equal sign ('=')");
- continue;
- }
- $keyWithValue = $confManager->replaceEnvPlaceholders($variable);
- // Pad the result with nulls so psalm is happy (and we don't risk to run into warnings in case
- // the check for an equal sign from above gets changed).
- [$key, $value] = explode('=', $keyWithValue, 2) + [null, null];
- if ($value === null) {
- error_log("Invalid input: '$keyWithValue' has no value after the equal sign");
- } else if (!property_exists($confManager, $key)) {
- error_log("Error: '$key' is not a valid configuration key (in '$keyWithValue')");
- } else {
- $confManager->$key = $value;
- }
+ $this->startTransaction();
+ foreach ($input as $variable) {
+ if (!is_string($variable) || !str_contains($variable, '=')) {
+ error_log("Invalid input: '$variable' is not a string or does not contain an equal sign ('=')");
+ continue;
}
- });
+ $keyWithValue = $confManager->replaceEnvPlaceholders($variable);
+ // Pad the result with nulls so psalm is happy (and we don't risk to run into warnings in case
+ // the check for an equal sign from above gets changed).
+ [$key, $value] = explode('=', $keyWithValue, 2) + [null, null];
+ if ($value === null) {
+ error_log("Invalid input: '$keyWithValue' has no value after the equal sign");
+ } else if (!property_exists($confManager, $key)) {
+ error_log("Error: '$key' is not a valid configuration key (in '$keyWithValue')");
+ } else {
+ $confManager->$key = $value;
+ }
+ }
+ $this->commitTransaction();
}
//
From dac5cfd917b8d7f7b748facf20874679e886cb36 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Fri, 23 Jan 2026 16:43:41 +0100
Subject: [PATCH 088/164] Don't write the default value to disk
This matches the previous behaviour and should not be changed silently.
Signed-off-by: Pablo Zmdl
---
php/src/Data/ConfigurationManager.php | 1 -
1 file changed, 1 deletion(-)
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index 2caf7849..d25e4a91 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -591,7 +591,6 @@ class ConfigurationManager
$configValue = $this->get($configName, '');
if ($envVariableOutput === false) {
if ($configValue === '') {
- $this->set($configName, $defaultValue);
return $defaultValue;
}
return $configValue;
From 3bb2ce6e4cc979dc772c410e9ac568ed515f1271 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Fri, 23 Jan 2026 16:55:15 +0100
Subject: [PATCH 089/164] Type-cast get values to fix handling old config data
Signed-off-by: Pablo Zmdl
---
php/src/Data/ConfigurationManager.php | 36 ++++++++++++++++++---------
1 file changed, 24 insertions(+), 12 deletions(-)
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index d25e4a91..b7916b16 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -24,17 +24,20 @@ class ConfigurationManager
}
public bool $isDockerSocketProxyEnabled {
- get => $this->get('isDockerSocketProxyEnabled', false);
+ // Type-cast because old configs could have 1/0 for this key.
+ get => (bool) $this->get('isDockerSocketProxyEnabled', false);
set { $this->set('isDockerSocketProxyEnabled', $value); }
}
public bool $isWhiteboardEnabled {
- get => $this->get('isWhiteboardEnabled', true);
+ // Type-cast because old configs could have 1/0 for this key.
+ get => (bool) $this->get('isWhiteboardEnabled', true);
set { $this->set('isWhiteboardEnabled', $value); }
}
public bool $restoreExcludePreviews {
- get => $this->get('restore-exclude-previews', false);
+ // Type-cast because old configs could have '1'/'' for this key.
+ get => (bool) $this->get('restore-exclude-previews', false);
set { $this->set('restore-exclude-previews', $value); }
}
@@ -49,7 +52,8 @@ class ConfigurationManager
}
public bool $instance_restore_attempt {
- get => $this->get('instance_restore_attempt', false);
+ // Type-cast because old configs could have 1/'' for this key.
+ get => (bool) $this->get('instance_restore_attempt', false);
set { $this->set('instance_restore_attempt', $value); }
}
@@ -59,7 +63,8 @@ class ConfigurationManager
}
public bool $wasStartButtonClicked {
- get => $this->get('wasStartButtonClicked', false);
+ // Type-cast because old configs could have 1/0 for this key.
+ get => (bool) $this->get('wasStartButtonClicked', false);
set { $this->set('wasStartButtonClicked', $value); }
}
@@ -69,37 +74,44 @@ class ConfigurationManager
}
public bool $isClamavEnabled {
- get => $this->get('isClamavEnabled', false);
+ // Type-cast because old configs could have 1/0 for this key.
+ get => (bool) $this->get('isClamavEnabled', false);
set { $this->set('isClamavEnabled', $value); }
}
public bool $isOnlyofficeEnabled {
- get => $this->get('isOnlyofficeEnabled', false);
+ // Type-cast because old configs could have 1/0 for this key.
+ get => (bool) $this->get('isOnlyofficeEnabled', false);
set { $this->set('isOnlyofficeEnabled', $value); }
}
public bool $isCollaboraEnabled {
- get => $this->get('isCollaboraEnabled', true);
+ // Type-cast because old configs could have 1/0 for this key.
+ get => (bool) $this->get('isCollaboraEnabled', true);
set { $this->set('isCollaboraEnabled', $value); }
}
public bool $isTalkEnabled {
- get => $this->get('isTalkEnabled', true);
+ // Type-cast because old configs could have 1/0 for this key.
+ get => (bool) $this->get('isTalkEnabled', true);
set { $this->set('isTalkEnabled', $value); }
}
public bool $isTalkRecordingEnabled {
- get => $this->isTalkEnabled && $this->get('isTalkRecordingEnabled', false);
+ // Type-cast because old configs could have 1/0 for this key.
+ get => (bool) $this->isTalkEnabled && $this->get('isTalkRecordingEnabled', false);
set { $this->set('isTalkRecordingEnabled', $this->isTalkEnabled && $value); }
}
public bool $isImaginaryEnabled {
- get => $this->get('isImaginaryEnabled', true);
+ // Type-cast because old configs could have 1/0 for this key.
+ get => (bool) $this->get('isImaginaryEnabled', true);
set { $this->set('isImaginaryEnabled', $value); }
}
public bool $isFulltextsearchEnabled {
- get => $this->get('isFulltextsearchEnabled', false);
+ // Type-cast because old configs could have 1/0 for this key.
+ get => (bool) $this->get('isFulltextsearchEnabled', false);
// Elasticsearch does not work on kernels without seccomp anymore. See https://github.com/nextcloud/all-in-one/discussions/5768
set { $this->set('isFulltextsearchEnabled', ($this->isSeccompDisabled() && $value)); }
}
From 27fd1e82ab74ffa7acf74eefae7b26f1ec7d8724 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Fri, 23 Jan 2026 17:10:21 +0100
Subject: [PATCH 090/164] Turn install_latest_major property into a string so
we can save a version string or number
I chose a string instead of an integer so we have more freedom what to
actually save (maybe we want to include minor version digits at one point).
Signed-off-by: Pablo Zmdl
---
php/src/Controller/DockerController.php | 8 +++++++-
php/src/Data/ConfigurationManager.php | 7 ++++---
2 files changed, 11 insertions(+), 4 deletions(-)
diff --git a/php/src/Controller/DockerController.php b/php/src/Controller/DockerController.php
index 7078b71f..47c6c259 100644
--- a/php/src/Controller/DockerController.php
+++ b/php/src/Controller/DockerController.php
@@ -177,8 +177,14 @@ readonly class DockerController {
$port = 443;
}
+ if (isset($request->getParsedBody()['install_latest_major'])) {
+ $install_latest_major = '32';
+ } else {
+ $install_latest_major = '';
+ }
+
$this->configurationManager->startTransaction();
- $this->configurationManager->install_latest_major = isset($request->getParsedBody()['install_latest_major']);
+ $this->configurationManager->install_latest_major = $install_latest_major;
// set AIO_URL
$this->configurationManager->AIO_URL = $host . ':' . (string)$port . $path;
// set wasStartButtonClicked
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index b7916b16..7ca0f8bc 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -68,8 +68,9 @@ class ConfigurationManager
set { $this->set('wasStartButtonClicked', $value); }
}
- public bool $install_latest_major {
- get => $this->get('install_latest_major', false);
+ public string $install_latest_major {
+ // Type-cast because old configs could have integers for this key.
+ get => (string) $this->get('install_latest_major', '');
set { $this->set('install_latest_major', $value); }
}
@@ -1080,7 +1081,7 @@ class ConfigurationManager
'NEXTCLOUD_STARTUP_APPS' => $this->GetNextcloudStartupApps(),
'NEXTCLOUD_ADDITIONAL_APKS' => $this->GetNextcloudAdditionalApks(),
'NEXTCLOUD_ADDITIONAL_PHP_EXTENSIONS' => $this->GetNextcloudAdditionalPhpExtensions(),
- 'INSTALL_LATEST_MAJOR' => $this->install_latest_major ? 'yes' : '',
+ 'INSTALL_LATEST_MAJOR' => $this->install_latest_major,
'REMOVE_DISABLED_APPS' => $this->shouldDisabledAppsGetRemoved() ? 'yes' : '',
// Allow to get local ip-address of database container which allows to talk to it even in host mode (the container that requires this needs to be started first then)
'AIO_DATABASE_HOST' => gethostbyname('nextcloud-aio-database'),
From dd5d51cb2a1ef50944e161f2c9e5b4f02808d926 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Fri, 23 Jan 2026 17:12:45 +0100
Subject: [PATCH 091/164] Camelize property AIO_TOKEN => aioToken
Signed-off-by: Pablo Zmdl
---
php/src/Auth/AuthManager.php | 2 +-
php/src/Controller/DockerController.php | 2 +-
php/src/Data/ConfigurationManager.php | 4 ++--
3 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/php/src/Auth/AuthManager.php b/php/src/Auth/AuthManager.php
index 1d558aed..f6ab0d10 100644
--- a/php/src/Auth/AuthManager.php
+++ b/php/src/Auth/AuthManager.php
@@ -19,7 +19,7 @@ readonly class AuthManager {
}
public function CheckToken(string $token) : bool {
- return hash_equals($this->configurationManager->AIO_TOKEN, $token);
+ return hash_equals($this->configurationManager->aioToken, $token);
}
public function SetAuthState(bool $isLoggedIn) : void {
diff --git a/php/src/Controller/DockerController.php b/php/src/Controller/DockerController.php
index 47c6c259..862665c3 100644
--- a/php/src/Controller/DockerController.php
+++ b/php/src/Controller/DockerController.php
@@ -208,7 +208,7 @@ readonly class DockerController {
}
public function startTopContainer(bool $pullImage) : void {
- $this->configurationManager->AIO_TOKEN = bin2hex(random_bytes(24));
+ $this->configurationManager->aioToken = bin2hex(random_bytes(24));
// Stop domaincheck since apache would not be able to start otherwise
$this->StopDomaincheckContainer();
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index 7ca0f8bc..340e59d9 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -13,7 +13,7 @@ class ConfigurationManager
private bool $noWrite = false;
- public string $AIO_TOKEN {
+ public string $aioToken {
get => $this->get('AIO_TOKEN', '');
set { $this->set('AIO_TOKEN', $value); }
}
@@ -1045,7 +1045,7 @@ class ConfigurationManager
return match ($placeholder) {
'NC_DOMAIN' => $this->domain,
'NC_BASE_DN' => $this->GetBaseDN(),
- 'AIO_TOKEN' => $this->AIO_TOKEN,
+ 'AIO_TOKEN' => $this->aioToken,
'BORGBACKUP_REMOTE_REPO' => $this->borg_remote_repo,
'BORGBACKUP_MODE' => $this->backupMode,
'AIO_URL' => $this->AIO_URL,
From 62a21dd34a1bf8f9c346d92c585c8653b37c9a4d Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Fri, 23 Jan 2026 17:16:02 +0100
Subject: [PATCH 092/164] Camelize property instance_restore_attempt =>
instanceRestoreAttempt
Signed-off-by: Pablo Zmdl
---
php/public/index.php | 2 +-
php/src/Controller/DockerController.php | 2 +-
php/src/Data/ConfigurationManager.php | 4 ++--
3 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/php/public/index.php b/php/public/index.php
index d4f4799f..7037946a 100644
--- a/php/public/index.php
+++ b/php/public/index.php
@@ -103,7 +103,7 @@ $app->get('/containers', function (Request $request, Response $response, array $
'has_backup_run_once' => $configurationManager->hasBackupRunOnce(),
'is_backup_container_running' => $dockerActionManager->isBackupContainerRunning(),
'backup_exit_code' => $dockerActionManager->GetBackupcontainerExitCode(),
- 'is_instance_restore_attempt' => $configurationManager->instance_restore_attempt,
+ 'is_instance_restore_attempt' => $configurationManager->instanceRestoreAttempt,
'borg_backup_mode' => $configurationManager->backupMode,
'was_start_button_clicked' => $configurationManager->wasStartButtonClicked,
'has_update_available' => $dockerActionManager->isAnyUpdateAvailable(),
diff --git a/php/src/Controller/DockerController.php b/php/src/Controller/DockerController.php
index 862665c3..c420bba3 100644
--- a/php/src/Controller/DockerController.php
+++ b/php/src/Controller/DockerController.php
@@ -154,7 +154,7 @@ readonly class DockerController {
public function StartBackupContainerTest(Request $request, Response $response, array $args) : Response {
$this->configurationManager->startTransaction();
$this->configurationManager->backupMode = 'test';
- $this->configurationManager->instance_restore_attempt = false;
+ $this->configurationManager->instanceRestoreAttempt = false;
$this->configurationManager->commitTransaction();
$id = self::TOP_CONTAINER;
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index 340e59d9..94e8ae71 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -51,7 +51,7 @@ class ConfigurationManager
set { $this->set('backup-mode', $value); }
}
- public bool $instance_restore_attempt {
+ public bool $instanceRestoreAttempt {
// Type-cast because old configs could have 1/'' for this key.
get => (bool) $this->get('instance_restore_attempt', false);
set { $this->set('instance_restore_attempt', $value); }
@@ -536,7 +536,7 @@ class ConfigurationManager
$this->borg_backup_host_location = $location;
$this->borg_remote_repo = $repo;
$this->borg_restore_password = $password;
- $this->instance_restore_attempt = true;
+ $this->instanceRestoreAttempt = true;
$this->commitTransaction();
}
From 68f811b25f690af648d5c178238791d76b561719 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Fri, 23 Jan 2026 17:17:54 +0100
Subject: [PATCH 093/164] Camelize property AIO_URL => aioUrl
Signed-off-by: Pablo Zmdl
---
php/src/Controller/DockerController.php | 2 +-
php/src/Data/ConfigurationManager.php | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/php/src/Controller/DockerController.php b/php/src/Controller/DockerController.php
index c420bba3..2bff0295 100644
--- a/php/src/Controller/DockerController.php
+++ b/php/src/Controller/DockerController.php
@@ -186,7 +186,7 @@ readonly class DockerController {
$this->configurationManager->startTransaction();
$this->configurationManager->install_latest_major = $install_latest_major;
// set AIO_URL
- $this->configurationManager->AIO_URL = $host . ':' . (string)$port . $path;
+ $this->configurationManager->aioUrl = $host . ':' . (string)$port . $path;
// set wasStartButtonClicked
$this->configurationManager->wasStartButtonClicked = true;
$this->configurationManager->commitTransaction();
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index 94e8ae71..eaf944af 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -57,7 +57,7 @@ class ConfigurationManager
set { $this->set('instance_restore_attempt', $value); }
}
- public string $AIO_URL {
+ public string $aioUrl {
get => $this->get('AIO_URL', '');
set { $this->set('AIO_URL', $value); }
}
@@ -1048,7 +1048,7 @@ class ConfigurationManager
'AIO_TOKEN' => $this->aioToken,
'BORGBACKUP_REMOTE_REPO' => $this->borg_remote_repo,
'BORGBACKUP_MODE' => $this->backupMode,
- 'AIO_URL' => $this->AIO_URL,
+ 'AIO_URL' => $this->aioUrl,
'SELECTED_RESTORE_TIME' => $this->selectedRestoreTime,
'RESTORE_EXCLUDE_PREVIEWS' => $this->restoreExcludePreviews ? '1' : '',
'APACHE_PORT' => $this->apache_port,
From 2425a0777234a341337af57c347094eebef7712e Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Fri, 23 Jan 2026 17:19:10 +0100
Subject: [PATCH 094/164] Camelize property install_latest_major =>
installLatestMajor
Signed-off-by: Pablo Zmdl
---
php/src/Controller/DockerController.php | 6 +++---
php/src/Data/ConfigurationManager.php | 4 ++--
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/php/src/Controller/DockerController.php b/php/src/Controller/DockerController.php
index 2bff0295..81b920d0 100644
--- a/php/src/Controller/DockerController.php
+++ b/php/src/Controller/DockerController.php
@@ -178,13 +178,13 @@ readonly class DockerController {
}
if (isset($request->getParsedBody()['install_latest_major'])) {
- $install_latest_major = '32';
+ $installLatestMajor = '32';
} else {
- $install_latest_major = '';
+ $installLatestMajor = '';
}
$this->configurationManager->startTransaction();
- $this->configurationManager->install_latest_major = $install_latest_major;
+ $this->configurationManager->installLatestMajor = $installLatestMajor;
// set AIO_URL
$this->configurationManager->aioUrl = $host . ':' . (string)$port . $path;
// set wasStartButtonClicked
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index eaf944af..5ccf4b88 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -68,7 +68,7 @@ class ConfigurationManager
set { $this->set('wasStartButtonClicked', $value); }
}
- public string $install_latest_major {
+ public string $installLatestMajor {
// Type-cast because old configs could have integers for this key.
get => (string) $this->get('install_latest_major', '');
set { $this->set('install_latest_major', $value); }
@@ -1081,7 +1081,7 @@ class ConfigurationManager
'NEXTCLOUD_STARTUP_APPS' => $this->GetNextcloudStartupApps(),
'NEXTCLOUD_ADDITIONAL_APKS' => $this->GetNextcloudAdditionalApks(),
'NEXTCLOUD_ADDITIONAL_PHP_EXTENSIONS' => $this->GetNextcloudAdditionalPhpExtensions(),
- 'INSTALL_LATEST_MAJOR' => $this->install_latest_major,
+ 'INSTALL_LATEST_MAJOR' => $this->installLatestMajor,
'REMOVE_DISABLED_APPS' => $this->shouldDisabledAppsGetRemoved() ? 'yes' : '',
// Allow to get local ip-address of database container which allows to talk to it even in host mode (the container that requires this needs to be started first then)
'AIO_DATABASE_HOST' => gethostbyname('nextcloud-aio-database'),
From 62856e78bbaee7584a9ad9e6a255e6ec33aed06a Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Fri, 23 Jan 2026 17:21:07 +0100
Subject: [PATCH 095/164] Camelize property borg_backup_host_location =>
borgBackupHostLocation
Signed-off-by: Pablo Zmdl
---
php/public/index.php | 2 +-
php/src/ContainerDefinitionFetcher.php | 2 +-
php/src/Data/ConfigurationManager.php | 10 +++++-----
3 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/php/public/index.php b/php/public/index.php
index 7037946a..7e3a3842 100644
--- a/php/public/index.php
+++ b/php/public/index.php
@@ -93,7 +93,7 @@ $app->get('/containers', function (Request $request, Response $response, array $
return $view->render($response, 'containers.twig', [
'domain' => $configurationManager->domain,
'apache_port' => $configurationManager->apache_port,
- 'borg_backup_host_location' => $configurationManager->borg_backup_host_location,
+ 'borg_backup_host_location' => $configurationManager->borgBackupHostLocation,
'borg_remote_repo' => $configurationManager->borg_remote_repo,
'borg_public_key' => $configurationManager->GetBorgPublicKey(),
'nextcloud_password' => $configurationManager->GetAndGenerateSecret('NEXTCLOUD_PASSWORD'),
diff --git a/php/src/ContainerDefinitionFetcher.php b/php/src/ContainerDefinitionFetcher.php
index 22309da8..84cd4d89 100644
--- a/php/src/ContainerDefinitionFetcher.php
+++ b/php/src/ContainerDefinitionFetcher.php
@@ -113,7 +113,7 @@ readonly class ContainerDefinitionFetcher {
if (isset($entry['volumes'])) {
foreach ($entry['volumes'] as $value) {
if($value['source'] === '%BORGBACKUP_HOST_LOCATION%') {
- $value['source'] = $this->configurationManager->borg_backup_host_location;
+ $value['source'] = $this->configurationManager->borgBackupHostLocation;
if($value['source'] === '') {
continue;
}
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index 5ccf4b88..e7e830cc 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -122,7 +122,7 @@ class ConfigurationManager
set { $this->SetDomain($value); }
}
- public string $borg_backup_host_location {
+ public string $borgBackupHostLocation {
get => $this->get('borg_backup_host_location', '');
set { $this->set('borg_backup_host_location', $value); }
}
@@ -461,7 +461,7 @@ class ConfigurationManager
public function SetBorgLocationVars(string $location, string $repo) : void {
$this->ValidateBorgLocationVars($location, $repo);
$this->startTransaction();
- $this->borg_backup_host_location = $location;
+ $this->borgBackupHostLocation = $location;
$this->borg_remote_repo = $repo;
$this->commitTransaction();
}
@@ -510,7 +510,7 @@ class ConfigurationManager
public function DeleteBorgBackupLocationItems() : void {
// Delete the variables
$this->startTransaction();
- $this->borg_backup_host_location = '';
+ $this->borgBackupHostLocation = '';
$this->borg_remote_repo = '';
$this->commitTransaction();
@@ -533,7 +533,7 @@ class ConfigurationManager
}
$this->startTransaction();
- $this->borg_backup_host_location = $location;
+ $this->borgBackupHostLocation = $location;
$this->borg_remote_repo = $repo;
$this->borg_restore_password = $password;
$this->instanceRestoreAttempt = true;
@@ -1075,7 +1075,7 @@ class ConfigurationManager
'FULLTEXTSEARCH_JAVA_OPTIONS' => $this->GetFulltextsearchJavaOptions(),
'NEXTCLOUD_TRUSTED_CACERTS_DIR' => $this->GetTrustedCacertsDir(),
'ADDITIONAL_DIRECTORIES_BACKUP' => $this->GetAdditionalBackupDirectoriesString() !== '' ? 'yes' : '',
- 'BORGBACKUP_HOST_LOCATION' => $this->borg_backup_host_location,
+ 'BORGBACKUP_HOST_LOCATION' => $this->borgBackupHostLocation,
'APACHE_MAX_SIZE' => (string)($this->GetApacheMaxSize()),
'COLLABORA_SECCOMP_POLICY' => $this->GetCollaboraSeccompPolicy(),
'NEXTCLOUD_STARTUP_APPS' => $this->GetNextcloudStartupApps(),
From 284411c3695bf10c81d24bc8c16d36263578ce0c Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Fri, 23 Jan 2026 17:22:14 +0100
Subject: [PATCH 096/164] Camelize property borg_remote_repo => borgRemoteRepo
Signed-off-by: Pablo Zmdl
---
php/public/index.php | 2 +-
php/src/Data/ConfigurationManager.php | 10 +++++-----
2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/php/public/index.php b/php/public/index.php
index 7e3a3842..eafa994b 100644
--- a/php/public/index.php
+++ b/php/public/index.php
@@ -94,7 +94,7 @@ $app->get('/containers', function (Request $request, Response $response, array $
'domain' => $configurationManager->domain,
'apache_port' => $configurationManager->apache_port,
'borg_backup_host_location' => $configurationManager->borgBackupHostLocation,
- 'borg_remote_repo' => $configurationManager->borg_remote_repo,
+ 'borg_remote_repo' => $configurationManager->borgRemoteRepo,
'borg_public_key' => $configurationManager->GetBorgPublicKey(),
'nextcloud_password' => $configurationManager->GetAndGenerateSecret('NEXTCLOUD_PASSWORD'),
'containers' => (new \AIO\ContainerDefinitionFetcher($container->get(\AIO\Data\ConfigurationManager::class), $container))->FetchDefinition(),
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index e7e830cc..08924d14 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -127,7 +127,7 @@ class ConfigurationManager
set { $this->set('borg_backup_host_location', $value); }
}
- public string $borg_remote_repo {
+ public string $borgRemoteRepo {
get => $this->get('borg_remote_repo', '');
set { $this->set('borg_remote_repo', $value); }
}
@@ -462,7 +462,7 @@ class ConfigurationManager
$this->ValidateBorgLocationVars($location, $repo);
$this->startTransaction();
$this->borgBackupHostLocation = $location;
- $this->borg_remote_repo = $repo;
+ $this->borgRemoteRepo = $repo;
$this->commitTransaction();
}
@@ -511,7 +511,7 @@ class ConfigurationManager
// Delete the variables
$this->startTransaction();
$this->borgBackupHostLocation = '';
- $this->borg_remote_repo = '';
+ $this->borgRemoteRepo = '';
$this->commitTransaction();
// Also delete the borg config file to be able to start over
@@ -534,7 +534,7 @@ class ConfigurationManager
$this->startTransaction();
$this->borgBackupHostLocation = $location;
- $this->borg_remote_repo = $repo;
+ $this->borgRemoteRepo = $repo;
$this->borg_restore_password = $password;
$this->instanceRestoreAttempt = true;
$this->commitTransaction();
@@ -1046,7 +1046,7 @@ class ConfigurationManager
'NC_DOMAIN' => $this->domain,
'NC_BASE_DN' => $this->GetBaseDN(),
'AIO_TOKEN' => $this->aioToken,
- 'BORGBACKUP_REMOTE_REPO' => $this->borg_remote_repo,
+ 'BORGBACKUP_REMOTE_REPO' => $this->borgRemoteRepo,
'BORGBACKUP_MODE' => $this->backupMode,
'AIO_URL' => $this->aioUrl,
'SELECTED_RESTORE_TIME' => $this->selectedRestoreTime,
From 5cac2dcf12531b9631f06ba321a203059f5bd44c Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Fri, 23 Jan 2026 17:23:21 +0100
Subject: [PATCH 097/164] Camelize property borg_restore_password =>
borgRestorePassword
Signed-off-by: Pablo Zmdl
---
php/public/index.php | 2 +-
php/src/Data/ConfigurationManager.php | 8 ++++----
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/php/public/index.php b/php/public/index.php
index eafa994b..5e8ddbb8 100644
--- a/php/public/index.php
+++ b/php/public/index.php
@@ -114,7 +114,7 @@ $app->get('/containers', function (Request $request, Response $response, array $
'is_onlyoffice_enabled' => $configurationManager->isOnlyofficeEnabled,
'is_collabora_enabled' => $configurationManager->isCollaboraEnabled,
'is_talk_enabled' => $configurationManager->isTalkEnabled,
- 'borg_restore_password' => $configurationManager->borg_restore_password,
+ 'borg_restore_password' => $configurationManager->borgRestorePassword,
'daily_backup_time' => $configurationManager->GetDailyBackupTime(),
'is_daily_backup_running' => $configurationManager->isDailyBackupRunning(),
'timezone' => $configurationManager->timezone,
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index 08924d14..a2dd399d 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -132,7 +132,7 @@ class ConfigurationManager
set { $this->set('borg_remote_repo', $value); }
}
- public string $borg_restore_password {
+ public string $borgRestorePassword {
get => $this->get('borg_restore_password', '');
set { $this->set('borg_restore_password', $value); }
}
@@ -442,7 +442,7 @@ class ConfigurationManager
// Don't set the domain via the attribute, or we create a loop.
$this->set('domain', $domain);
// Reset the borg restore password when setting the domain
- $this->borg_restore_password = '';
+ $this->borgRestorePassword = '';
$this->startTransaction();
$this->commitTransaction();
}
@@ -535,7 +535,7 @@ class ConfigurationManager
$this->startTransaction();
$this->borgBackupHostLocation = $location;
$this->borgRemoteRepo = $repo;
- $this->borg_restore_password = $password;
+ $this->borgRestorePassword = $password;
$this->instanceRestoreAttempt = true;
$this->commitTransaction();
}
@@ -1056,7 +1056,7 @@ class ConfigurationManager
'TALK_PORT' => $this->talk_port,
'TURN_DOMAIN' => $this->turn_domain,
'NEXTCLOUD_MOUNT' => $this->nextcloud_mount,
- 'BACKUP_RESTORE_PASSWORD' => $this->borg_restore_password,
+ 'BACKUP_RESTORE_PASSWORD' => $this->borgRestorePassword,
'CLAMAV_ENABLED' => $this->isClamavEnabled ? 'yes' : '',
'TALK_RECORDING_ENABLED' => $this->isTalkRecordingEnabled ? 'yes' : '',
'ONLYOFFICE_ENABLED' => $this->isOnlyofficeEnabled ? 'yes' : '',
From f17db4fac17b4051e24650b9fd1007ddaac3e6c5 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Fri, 23 Jan 2026 17:25:14 +0100
Subject: [PATCH 098/164] Camelize property apache_ip_binding =>
apacheIpBinding
Signed-off-by: Pablo Zmdl
---
php/src/Data/ConfigurationManager.php | 4 ++--
php/src/Docker/DockerActionManager.php | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index a2dd399d..e80073c3 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -137,7 +137,7 @@ class ConfigurationManager
set { $this->set('borg_restore_password', $value); }
}
- public string $apache_ip_binding {
+ public string $apacheIpBinding {
get => $this->GetEnvironmentalVariableOrConfig('APACHE_IP_BINDING', 'apache_ip_binding', '');
set { $this->set('apache_ip_binding', $value); }
}
@@ -1052,7 +1052,7 @@ class ConfigurationManager
'SELECTED_RESTORE_TIME' => $this->selectedRestoreTime,
'RESTORE_EXCLUDE_PREVIEWS' => $this->restoreExcludePreviews ? '1' : '',
'APACHE_PORT' => $this->apache_port,
- 'APACHE_IP_BINDING' => $this->apache_ip_binding,
+ 'APACHE_IP_BINDING' => $this->apacheIpBinding,
'TALK_PORT' => $this->talk_port,
'TURN_DOMAIN' => $this->turn_domain,
'NEXTCLOUD_MOUNT' => $this->nextcloud_mount,
diff --git a/php/src/Docker/DockerActionManager.php b/php/src/Docker/DockerActionManager.php
index 832480c2..5ae45044 100644
--- a/php/src/Docker/DockerActionManager.php
+++ b/php/src/Docker/DockerActionManager.php
@@ -289,7 +289,7 @@ readonly class DockerActionManager {
}
$ipBinding = $value->ipBinding;
if ($ipBinding === '%APACHE_IP_BINDING%') {
- $ipBinding = $this->configurationManager->apache_ip_binding;
+ $ipBinding = $this->configurationManager->apacheIpBinding;
// Do not expose if AIO is in internal network mode
if ($ipBinding === '@INTERNAL') {
continue;
From 41c92b814fde85bc509a7c51849b3c79dbbd87b6 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Fri, 23 Jan 2026 17:33:24 +0100
Subject: [PATCH 099/164] Camelize key names from aio_variables from container
specs
Signed-off-by: Pablo Zmdl
---
php/src/Data/ConfigurationManager.php | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index e80073c3..3eba45f5 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -989,6 +989,11 @@ class ConfigurationManager
return true;
}
}
+
+ private function camelize(string $input, string $delimiter = '_') : string {
+ return lcfirst(implode("", array_map('ucfirst', explode($delimiter, strtolower($input)))));
+
+ }
public function setAioVariables(array $input) : void {
if ($input === []) {
@@ -1004,6 +1009,7 @@ class ConfigurationManager
// Pad the result with nulls so psalm is happy (and we don't risk to run into warnings in case
// the check for an equal sign from above gets changed).
[$key, $value] = explode('=', $keyWithValue, 2) + [null, null];
+ $key = $this->camelize($key);
if ($value === null) {
error_log("Invalid input: '$keyWithValue' has no value after the equal sign");
} else if (!property_exists($confManager, $key)) {
From efe8317446c5020c131e2b9a402439b1ccfab688 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Fri, 23 Jan 2026 17:34:33 +0100
Subject: [PATCH 100/164] Camelize property nextcloud_max_time =>
nextcloudMaxTime
Signed-off-by: Pablo Zmdl
---
php/public/index.php | 2 +-
php/src/Data/ConfigurationManager.php | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/php/public/index.php b/php/public/index.php
index 5e8ddbb8..a9758b24 100644
--- a/php/public/index.php
+++ b/php/public/index.php
@@ -130,7 +130,7 @@ $app->get('/containers', function (Request $request, Response $response, array $
'nextcloud_datadir' => $configurationManager->nextcloud_datadir_mount,
'nextcloud_mount' => $configurationManager->nextcloud_mount,
'nextcloud_upload_limit' => $configurationManager->nextcloud_upload_limit,
- 'nextcloud_max_time' => $configurationManager->nextcloud_max_time,
+ 'nextcloud_max_time' => $configurationManager->nextcloudMaxTime,
'nextcloud_memory_limit' => $configurationManager->nextcloud_memory_limit,
'is_dri_device_enabled' => $configurationManager->isDriDeviceEnabled(),
'is_nvidia_gpu_enabled' => $configurationManager->isNvidiaGpuEnabled(),
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index 3eba45f5..ff30751c 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -652,7 +652,7 @@ class ConfigurationManager
return $uploadLimit * 1024 * 1024 * 1024;
}
- public string $nextcloud_max_time {
+ public string $nextcloudMaxTime {
get => $this->GetEnvironmentalVariableOrConfig('NEXTCLOUD_MAX_TIME', 'nextcloud_max_time', '3600');
set { $this->set('nextcloud_max_time', $value); }
}
@@ -1076,7 +1076,7 @@ class ConfigurationManager
'DOCKER_SOCKET_PROXY_ENABLED' => $this->isDockerSocketProxyEnabled ? 'yes' : '',
'NEXTCLOUD_UPLOAD_LIMIT' => $this->nextcloud_upload_limit,
'NEXTCLOUD_MEMORY_LIMIT' => $this->nextcloud_memory_limit,
- 'NEXTCLOUD_MAX_TIME' => $this->nextcloud_max_time,
+ 'NEXTCLOUD_MAX_TIME' => $this->nextcloudMaxTime,
'BORG_RETENTION_POLICY' => $this->GetBorgRetentionPolicy(),
'FULLTEXTSEARCH_JAVA_OPTIONS' => $this->GetFulltextsearchJavaOptions(),
'NEXTCLOUD_TRUSTED_CACERTS_DIR' => $this->GetTrustedCacertsDir(),
From 5373471ed8f5671f59010f3ed6f9b16ed79dba67 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Fri, 23 Jan 2026 17:35:52 +0100
Subject: [PATCH 101/164] Camelize property collabora_dictionaries =>
collaboraDictionaries
Signed-off-by: Pablo Zmdl
---
php/public/index.php | 2 +-
php/src/Controller/ConfigurationController.php | 2 +-
php/src/Data/ConfigurationManager.php | 4 ++--
3 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/php/public/index.php b/php/public/index.php
index a9758b24..3aded9d0 100644
--- a/php/public/index.php
+++ b/php/public/index.php
@@ -120,7 +120,7 @@ $app->get('/containers', function (Request $request, Response $response, array $
'timezone' => $configurationManager->timezone,
'skip_domain_validation' => $configurationManager->shouldDomainValidationBeSkipped($skip_domain_validation),
'talk_port' => $configurationManager->talk_port,
- 'collabora_dictionaries' => $configurationManager->collabora_dictionaries,
+ 'collabora_dictionaries' => $configurationManager->collaboraDictionaries,
'collabora_additional_options' => $configurationManager->collabora_additional_options,
'automatic_updates' => $configurationManager->areAutomaticUpdatesEnabled(),
'is_backup_section_enabled' => $configurationManager->isBackupSectionEnabled(),
diff --git a/php/src/Controller/ConfigurationController.php b/php/src/Controller/ConfigurationController.php
index a1132981..27c83e11 100644
--- a/php/src/Controller/ConfigurationController.php
+++ b/php/src/Controller/ConfigurationController.php
@@ -117,7 +117,7 @@ readonly class ConfigurationController {
if (isset($request->getParsedBody()['collabora_dictionaries'])) {
$collaboraDictionaries = $request->getParsedBody()['collabora_dictionaries'] ?? '';
- $this->configurationManager->collabora_dictionaries = $collaboraDictionaries;
+ $this->configurationManager->collaboraDictionaries = $collaboraDictionaries;
}
if (isset($request->getParsedBody()['delete_collabora_additional_options'])) {
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index ff30751c..71238c4c 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -157,7 +157,7 @@ class ConfigurationManager
/**
* @throws InvalidSettingConfigurationException
*/
- public string $collabora_dictionaries {
+ public string $collaboraDictionaries {
get => $this->get('collabora_dictionaries', '');
set {
// This throws an exception if the validation fails.
@@ -1070,7 +1070,7 @@ class ConfigurationManager
'TALK_ENABLED' => $this->isTalkEnabled ? 'yes' : '',
'UPDATE_NEXTCLOUD_APPS' => ($this->isDailyBackupRunning() && $this->areAutomaticUpdatesEnabled()) ? 'yes' : '',
'TIMEZONE' => $this->timezone === '' ? 'Etc/UTC' : $this->timezone,
- 'COLLABORA_DICTIONARIES' => $this->collabora_dictionaries === '' ? 'de_DE en_GB en_US es_ES fr_FR it nl pt_BR pt_PT ru' : $this->collabora_dictionaries,
+ 'COLLABORA_DICTIONARIES' => $this->collaboraDictionaries === '' ? 'de_DE en_GB en_US es_ES fr_FR it nl pt_BR pt_PT ru' : $this->collaboraDictionaries,
'IMAGINARY_ENABLED' => $this->isImaginaryEnabled ? 'yes' : '',
'FULLTEXTSEARCH_ENABLED' => $this->isFulltextsearchEnabled ? 'yes' : '',
'DOCKER_SOCKET_PROXY_ENABLED' => $this->isDockerSocketProxyEnabled ? 'yes' : '',
From b49900150180786735ad66b0e35793f7e672cd5b Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Fri, 23 Jan 2026 17:36:45 +0100
Subject: [PATCH 102/164] Camelize property collabora_additional_options =>
collaboraAdditionalOptions
Signed-off-by: Pablo Zmdl
---
php/public/index.php | 2 +-
php/src/Controller/ConfigurationController.php | 2 +-
php/src/Data/ConfigurationManager.php | 4 ++--
php/src/Docker/DockerActionManager.php | 4 ++--
4 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/php/public/index.php b/php/public/index.php
index 3aded9d0..cf17e612 100644
--- a/php/public/index.php
+++ b/php/public/index.php
@@ -121,7 +121,7 @@ $app->get('/containers', function (Request $request, Response $response, array $
'skip_domain_validation' => $configurationManager->shouldDomainValidationBeSkipped($skip_domain_validation),
'talk_port' => $configurationManager->talk_port,
'collabora_dictionaries' => $configurationManager->collaboraDictionaries,
- 'collabora_additional_options' => $configurationManager->collabora_additional_options,
+ 'collabora_additional_options' => $configurationManager->collaboraAdditionalOptions,
'automatic_updates' => $configurationManager->areAutomaticUpdatesEnabled(),
'is_backup_section_enabled' => $configurationManager->isBackupSectionEnabled(),
'is_imaginary_enabled' => $configurationManager->isImaginaryEnabled,
diff --git a/php/src/Controller/ConfigurationController.php b/php/src/Controller/ConfigurationController.php
index 27c83e11..c396a508 100644
--- a/php/src/Controller/ConfigurationController.php
+++ b/php/src/Controller/ConfigurationController.php
@@ -126,7 +126,7 @@ readonly class ConfigurationController {
if (isset($request->getParsedBody()['collabora_additional_options'])) {
$additionalCollaboraOptions = $request->getParsedBody()['collabora_additional_options'] ?? '';
- $this->configurationManager->collabora_additional_options = $additionalCollaboraOptions;
+ $this->configurationManager->collaboraAdditionalOptions = $additionalCollaboraOptions;
}
if (isset($request->getParsedBody()['delete_borg_backup_location_vars'])) {
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index 71238c4c..1dcc147d 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -169,7 +169,7 @@ class ConfigurationManager
/**
* @throws InvalidSettingConfigurationException
*/
- public string $collabora_additional_options {
+ public string $collaboraAdditionalOptions {
get => $this->get('collabora_additional_options', '');
set {
// This throws an exception if the validation fails.
@@ -882,7 +882,7 @@ class ConfigurationManager
}
public function isCollaboraSubscriptionEnabled() : bool {
- return str_contains($this->collabora_additional_options, '--o:support_key=');
+ return str_contains($this->collaboraAdditionalOptions, '--o:support_key=');
}
/**
diff --git a/php/src/Docker/DockerActionManager.php b/php/src/Docker/DockerActionManager.php
index 5ae45044..9e52fb5b 100644
--- a/php/src/Docker/DockerActionManager.php
+++ b/php/src/Docker/DockerActionManager.php
@@ -419,8 +419,8 @@ readonly class DockerActionManager {
}
// Additional Collabora options
- if ($this->configurationManager->collabora_additional_options !== '') {
- $requestBody['Cmd'] = [$this->configurationManager->collabora_additional_options];
+ if ($this->configurationManager->collaboraAdditionalOptions !== '') {
+ $requestBody['Cmd'] = [$this->configurationManager->collaboraAdditionalOptions];
}
}
From c4aa148bff296e87edf7ff810d3973dfc4690375 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Fri, 23 Jan 2026 17:37:36 +0100
Subject: [PATCH 103/164] Camelize property aio_community_containers =>
aioCommunityContainers
Signed-off-by: Pablo Zmdl
---
php/public/index.php | 2 +-
php/src/ContainerDefinitionFetcher.php | 2 +-
php/src/Controller/ConfigurationController.php | 2 +-
php/src/Data/ConfigurationManager.php | 4 ++--
4 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/php/public/index.php b/php/public/index.php
index cf17e612..fedd7c2e 100644
--- a/php/public/index.php
+++ b/php/public/index.php
@@ -138,7 +138,7 @@ $app->get('/containers', function (Request $request, Response $response, array $
'is_docker_socket_proxy_enabled' => $configurationManager->isDockerSocketProxyEnabled,
'is_whiteboard_enabled' => $configurationManager->isWhiteboardEnabled,
'community_containers' => $configurationManager->listAvailableCommunityContainers(),
- 'community_containers_enabled' => $configurationManager->aio_community_containers,
+ 'community_containers_enabled' => $configurationManager->aioCommunityContainers,
'bypass_container_update' => $bypass_container_update,
]);
})->setName('profile');
diff --git a/php/src/ContainerDefinitionFetcher.php b/php/src/ContainerDefinitionFetcher.php
index 84cd4d89..2884aa32 100644
--- a/php/src/ContainerDefinitionFetcher.php
+++ b/php/src/ContainerDefinitionFetcher.php
@@ -41,7 +41,7 @@ readonly class ContainerDefinitionFetcher {
$data = json_decode((string)file_get_contents(DataConst::GetContainersDefinitionPath()), true, 512, JSON_THROW_ON_ERROR);
$additionalContainerNames = [];
- foreach ($this->configurationManager->aio_community_containers as $communityContainer) {
+ foreach ($this->configurationManager->aioCommunityContainers as $communityContainer) {
if ($communityContainer !== '') {
$path = DataConst::GetCommunityContainersDirectory() . '/' . $communityContainer . '/' . $communityContainer . '.json';
$additionalData = json_decode((string)file_get_contents($path), true, 512, JSON_THROW_ON_ERROR);
diff --git a/php/src/Controller/ConfigurationController.php b/php/src/Controller/ConfigurationController.php
index c396a508..8bf193e0 100644
--- a/php/src/Controller/ConfigurationController.php
+++ b/php/src/Controller/ConfigurationController.php
@@ -108,7 +108,7 @@ readonly class ConfigurationController {
$enabledCC[] = $item;
}
}
- $this->configurationManager->aio_community_containers = $enabledCC;
+ $this->configurationManager->aioCommunityContainers = $enabledCC;
}
if (isset($request->getParsedBody()['delete_collabora_dictionaries'])) {
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index 1dcc147d..9dc6589f 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -178,7 +178,7 @@ class ConfigurationManager
}
}
- public array $aio_community_containers {
+ public array $aioCommunityContainers {
get => explode(' ', $this->get('aio_community_containers', ''));
set { $this->set('aio_community_containers', implode(' ', $value)); }
}
@@ -1092,7 +1092,7 @@ class ConfigurationManager
// Allow to get local ip-address of database container which allows to talk to it even in host mode (the container that requires this needs to be started first then)
'AIO_DATABASE_HOST' => gethostbyname('nextcloud-aio-database'),
// Allow to get local ip-address of caddy container and add it to trusted proxies automatically
- 'CADDY_IP_ADDRESS' => in_array('caddy', $this->aio_community_containers, true) ? gethostbyname('nextcloud-aio-caddy') : '',
+ 'CADDY_IP_ADDRESS' => in_array('caddy', $this->aioCommunityContainers, true) ? gethostbyname('nextcloud-aio-caddy') : '',
'WHITEBOARD_ENABLED' => $this->isWhiteboardEnabled ? 'yes' : '',
default => $this->GetRegisteredSecret($placeholder),
};
From 00ce78d703c8f7824eb76ba510f0a4f6c83da2c7 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Fri, 23 Jan 2026 17:38:20 +0100
Subject: [PATCH 104/164] Camelize property turn_domain => turnDomain
Signed-off-by: Pablo Zmdl
---
php/src/Data/ConfigurationManager.php | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index 9dc6589f..bfdcd689 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -183,7 +183,7 @@ class ConfigurationManager
set { $this->set('aio_community_containers', implode(' ', $value)); }
}
- public string $turn_domain {
+ public string $turnDomain {
get => $this->get('turn_domain', '');
set { $this->set('turn_domain', $value); }
}
@@ -1060,7 +1060,7 @@ class ConfigurationManager
'APACHE_PORT' => $this->apache_port,
'APACHE_IP_BINDING' => $this->apacheIpBinding,
'TALK_PORT' => $this->talk_port,
- 'TURN_DOMAIN' => $this->turn_domain,
+ 'TURN_DOMAIN' => $this->turnDomain,
'NEXTCLOUD_MOUNT' => $this->nextcloud_mount,
'BACKUP_RESTORE_PASSWORD' => $this->borgRestorePassword,
'CLAMAV_ENABLED' => $this->isClamavEnabled ? 'yes' : '',
From 567f072ee061a91cef464d52c39d85a63e5455d4 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Fri, 23 Jan 2026 17:39:17 +0100
Subject: [PATCH 105/164] Camelize property apache_port => apachePort
Signed-off-by: Pablo Zmdl
---
php/public/index.php | 2 +-
php/src/Data/ConfigurationManager.php | 6 +++---
php/src/Docker/DockerActionManager.php | 6 +++---
3 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/php/public/index.php b/php/public/index.php
index fedd7c2e..b7d07f6a 100644
--- a/php/public/index.php
+++ b/php/public/index.php
@@ -92,7 +92,7 @@ $app->get('/containers', function (Request $request, Response $response, array $
return $view->render($response, 'containers.twig', [
'domain' => $configurationManager->domain,
- 'apache_port' => $configurationManager->apache_port,
+ 'apache_port' => $configurationManager->apachePort,
'borg_backup_host_location' => $configurationManager->borgBackupHostLocation,
'borg_remote_repo' => $configurationManager->borgRemoteRepo,
'borg_public_key' => $configurationManager->GetBorgPublicKey(),
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index bfdcd689..984943db 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -381,7 +381,7 @@ class ConfigurationManager
}
// Get the apache port
- $port = $this->apache_port;
+ $port = $this->apachePort;
if (!filter_var($dnsRecordIP, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
if ($port === '443') {
@@ -568,7 +568,7 @@ class ConfigurationManager
$this->set('password', $newPassword);
}
- public string $apache_port {
+ public string $apachePort {
get => $this->GetEnvironmentalVariableOrConfig('APACHE_PORT', 'apache_port', '443');
set { $this->set('apache_port', $value); }
}
@@ -1057,7 +1057,7 @@ class ConfigurationManager
'AIO_URL' => $this->aioUrl,
'SELECTED_RESTORE_TIME' => $this->selectedRestoreTime,
'RESTORE_EXCLUDE_PREVIEWS' => $this->restoreExcludePreviews ? '1' : '',
- 'APACHE_PORT' => $this->apache_port,
+ 'APACHE_PORT' => $this->apachePort,
'APACHE_IP_BINDING' => $this->apacheIpBinding,
'TALK_PORT' => $this->talk_port,
'TURN_DOMAIN' => $this->turnDomain,
diff --git a/php/src/Docker/DockerActionManager.php b/php/src/Docker/DockerActionManager.php
index 9e52fb5b..d4eac6b7 100644
--- a/php/src/Docker/DockerActionManager.php
+++ b/php/src/Docker/DockerActionManager.php
@@ -115,7 +115,7 @@ readonly class DockerActionManager {
$containerName = $container->identifier;
$internalPort = $container->internalPorts;
if ($internalPort === '%APACHE_PORT%') {
- $internalPort = $this->configurationManager->apache_port;
+ $internalPort = $this->configurationManager->apachePort;
} elseif ($internalPort === '%TALK_PORT%') {
$internalPort = $this->configurationManager->talk_port;
}
@@ -253,7 +253,7 @@ readonly class DockerActionManager {
$port = $value->port;
$protocol = $value->protocol;
if ($port === '%APACHE_PORT%') {
- $port = $this->configurationManager->apache_port;
+ $port = $this->configurationManager->apachePort;
// Do not expose udp if AIO is in reverse proxy mode
if ($port !== '443' && $protocol === 'udp') {
continue;
@@ -275,7 +275,7 @@ readonly class DockerActionManager {
$port = $value->port;
$protocol = $value->protocol;
if ($port === '%APACHE_PORT%') {
- $port = $this->configurationManager->apache_port;
+ $port = $this->configurationManager->apachePort;
// Do not expose udp if AIO is in reverse proxy mode
if ($port !== '443' && $protocol === 'udp') {
continue;
From f7c5115c7015083f273eb3930e13518fb12b50f1 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Fri, 23 Jan 2026 17:40:23 +0100
Subject: [PATCH 106/164] Camelize property talk_port => talkPort
Signed-off-by: Pablo Zmdl
---
php/public/index.php | 2 +-
php/src/Data/ConfigurationManager.php | 4 ++--
php/src/Docker/DockerActionManager.php | 6 +++---
3 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/php/public/index.php b/php/public/index.php
index b7d07f6a..16e2918e 100644
--- a/php/public/index.php
+++ b/php/public/index.php
@@ -119,7 +119,7 @@ $app->get('/containers', function (Request $request, Response $response, array $
'is_daily_backup_running' => $configurationManager->isDailyBackupRunning(),
'timezone' => $configurationManager->timezone,
'skip_domain_validation' => $configurationManager->shouldDomainValidationBeSkipped($skip_domain_validation),
- 'talk_port' => $configurationManager->talk_port,
+ 'talk_port' => $configurationManager->talkPort,
'collabora_dictionaries' => $configurationManager->collaboraDictionaries,
'collabora_additional_options' => $configurationManager->collaboraAdditionalOptions,
'automatic_updates' => $configurationManager->areAutomaticUpdatesEnabled(),
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index 984943db..d0c0020f 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -573,7 +573,7 @@ class ConfigurationManager
set { $this->set('apache_port', $value); }
}
- public string $talk_port {
+ public string $talkPort {
get => $this->GetEnvironmentalVariableOrConfig('TALK_PORT', 'talk_port', '3478');
set { $this->set('talk_port', $value); }
}
@@ -1059,7 +1059,7 @@ class ConfigurationManager
'RESTORE_EXCLUDE_PREVIEWS' => $this->restoreExcludePreviews ? '1' : '',
'APACHE_PORT' => $this->apachePort,
'APACHE_IP_BINDING' => $this->apacheIpBinding,
- 'TALK_PORT' => $this->talk_port,
+ 'TALK_PORT' => $this->talkPort,
'TURN_DOMAIN' => $this->turnDomain,
'NEXTCLOUD_MOUNT' => $this->nextcloud_mount,
'BACKUP_RESTORE_PASSWORD' => $this->borgRestorePassword,
diff --git a/php/src/Docker/DockerActionManager.php b/php/src/Docker/DockerActionManager.php
index d4eac6b7..e66989ca 100644
--- a/php/src/Docker/DockerActionManager.php
+++ b/php/src/Docker/DockerActionManager.php
@@ -117,7 +117,7 @@ readonly class DockerActionManager {
if ($internalPort === '%APACHE_PORT%') {
$internalPort = $this->configurationManager->apachePort;
} elseif ($internalPort === '%TALK_PORT%') {
- $internalPort = $this->configurationManager->talk_port;
+ $internalPort = $this->configurationManager->talkPort;
}
if ($internalPort !== "" && $internalPort !== 'host') {
@@ -259,7 +259,7 @@ readonly class DockerActionManager {
continue;
}
} else if ($port === '%TALK_PORT%') {
- $port = $this->configurationManager->talk_port;
+ $port = $this->configurationManager->talkPort;
}
$portWithProtocol = $port . '/' . $protocol;
$exposedPorts[$portWithProtocol] = null;
@@ -281,7 +281,7 @@ readonly class DockerActionManager {
continue;
}
} else if ($port === '%TALK_PORT%') {
- $port = $this->configurationManager->talk_port;
+ $port = $this->configurationManager->talkPort;
// Skip publishing talk tcp port if it is set to 443
if ($port === '443' && $protocol === 'tcp') {
continue;
From f35a0b43679feceae4fee98876a7cf17c5eb2881 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Fri, 23 Jan 2026 17:41:26 +0100
Subject: [PATCH 107/164] Camelize property nextcloud_mount => nextcloudMount
Signed-off-by: Pablo Zmdl
---
php/public/index.php | 2 +-
php/src/ContainerDefinitionFetcher.php | 4 ++--
php/src/Data/ConfigurationManager.php | 4 ++--
php/src/Docker/DockerActionManager.php | 2 +-
4 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/php/public/index.php b/php/public/index.php
index 16e2918e..6319f632 100644
--- a/php/public/index.php
+++ b/php/public/index.php
@@ -128,7 +128,7 @@ $app->get('/containers', function (Request $request, Response $response, array $
'is_fulltextsearch_enabled' => $configurationManager->isFulltextsearchEnabled,
'additional_backup_directories' => $configurationManager->GetAdditionalBackupDirectoriesString(),
'nextcloud_datadir' => $configurationManager->nextcloud_datadir_mount,
- 'nextcloud_mount' => $configurationManager->nextcloud_mount,
+ 'nextcloud_mount' => $configurationManager->nextcloudMount,
'nextcloud_upload_limit' => $configurationManager->nextcloud_upload_limit,
'nextcloud_max_time' => $configurationManager->nextcloudMaxTime,
'nextcloud_memory_limit' => $configurationManager->nextcloud_memory_limit,
diff --git a/php/src/ContainerDefinitionFetcher.php b/php/src/ContainerDefinitionFetcher.php
index 2884aa32..7ef6827f 100644
--- a/php/src/ContainerDefinitionFetcher.php
+++ b/php/src/ContainerDefinitionFetcher.php
@@ -119,7 +119,7 @@ readonly class ContainerDefinitionFetcher {
}
}
if($value['source'] === '%NEXTCLOUD_MOUNT%') {
- $value['source'] = $this->configurationManager->nextcloud_mount;
+ $value['source'] = $this->configurationManager->nextcloudMount;
if($value['source'] === '') {
continue;
}
@@ -140,7 +140,7 @@ readonly class ContainerDefinitionFetcher {
}
}
if ($value['destination'] === '%NEXTCLOUD_MOUNT%') {
- $value['destination'] = $this->configurationManager->nextcloud_mount;
+ $value['destination'] = $this->configurationManager->nextcloudMount;
if($value['destination'] === '') {
continue;
}
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index d0c0020f..d5ce251d 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -626,7 +626,7 @@ class ConfigurationManager
return trim((string)file_get_contents(DataConst::GetBackupPublicKey()));
}
- public string $nextcloud_mount {
+ public string $nextcloudMount {
get => $this->GetEnvironmentalVariableOrConfig('NEXTCLOUD_MOUNT', 'nextcloud_mount', '');
set { $this->set('nextcloud_mount', $value); }
}
@@ -1061,7 +1061,7 @@ class ConfigurationManager
'APACHE_IP_BINDING' => $this->apacheIpBinding,
'TALK_PORT' => $this->talkPort,
'TURN_DOMAIN' => $this->turnDomain,
- 'NEXTCLOUD_MOUNT' => $this->nextcloud_mount,
+ 'NEXTCLOUD_MOUNT' => $this->nextcloudMount,
'BACKUP_RESTORE_PASSWORD' => $this->borgRestorePassword,
'CLAMAV_ENABLED' => $this->isClamavEnabled ? 'yes' : '',
'TALK_RECORDING_ENABLED' => $this->isTalkRecordingEnabled ? 'yes' : '',
diff --git a/php/src/Docker/DockerActionManager.php b/php/src/Docker/DockerActionManager.php
index e66989ca..12dd70ae 100644
--- a/php/src/Docker/DockerActionManager.php
+++ b/php/src/Docker/DockerActionManager.php
@@ -205,7 +205,7 @@ readonly class DockerActionManager {
foreach ($container->volumes->GetVolumes() as $volume) {
// // NEXTCLOUD_MOUNT gets added via bind-mount later on
// if ($container->identifier === 'nextcloud-aio-nextcloud') {
- // if ($volume->name === $this->configurationManager->nextcloud_mount) {
+ // if ($volume->name === $this->configurationManager->nextcloudMount) {
// continue;
// }
// }
From f5cf7903adfb4eec6e1906a86eb2aa7bdaad61d5 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Fri, 23 Jan 2026 17:42:15 +0100
Subject: [PATCH 108/164] Camelize property nextcloud_datadir_mount =>
nextcloudDatadirMount
Signed-off-by: Pablo Zmdl
---
php/public/index.php | 2 +-
php/src/ContainerDefinitionFetcher.php | 2 +-
php/src/Data/ConfigurationManager.php | 6 +++---
3 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/php/public/index.php b/php/public/index.php
index 6319f632..0db30a1b 100644
--- a/php/public/index.php
+++ b/php/public/index.php
@@ -127,7 +127,7 @@ $app->get('/containers', function (Request $request, Response $response, array $
'is_imaginary_enabled' => $configurationManager->isImaginaryEnabled,
'is_fulltextsearch_enabled' => $configurationManager->isFulltextsearchEnabled,
'additional_backup_directories' => $configurationManager->GetAdditionalBackupDirectoriesString(),
- 'nextcloud_datadir' => $configurationManager->nextcloud_datadir_mount,
+ 'nextcloud_datadir' => $configurationManager->nextcloudDatadirMount,
'nextcloud_mount' => $configurationManager->nextcloudMount,
'nextcloud_upload_limit' => $configurationManager->nextcloud_upload_limit,
'nextcloud_max_time' => $configurationManager->nextcloudMaxTime,
diff --git a/php/src/ContainerDefinitionFetcher.php b/php/src/ContainerDefinitionFetcher.php
index 7ef6827f..3bbc37e2 100644
--- a/php/src/ContainerDefinitionFetcher.php
+++ b/php/src/ContainerDefinitionFetcher.php
@@ -124,7 +124,7 @@ readonly class ContainerDefinitionFetcher {
continue;
}
} elseif ($value['source'] === '%NEXTCLOUD_DATADIR%') {
- $value['source'] = $this->configurationManager->nextcloud_datadir_mount;
+ $value['source'] = $this->configurationManager->nextcloudDatadirMount;
if ($value['source'] === '') {
continue;
}
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index d5ce251d..d1701a39 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -487,8 +487,8 @@ class ConfigurationManager
// Prevent backup to be contained in Nextcloud Datadir as this will delete the backup archive upon restore
// See https://github.com/nextcloud/all-in-one/issues/6607
- if (str_starts_with($location . '/', rtrim($this->nextcloud_datadir_mount, '/') . '/')) {
- throw new InvalidSettingConfigurationException("The path must not be a children of or equal to NEXTCLOUD_DATADIR, which is currently set to " . $this->nextcloud_datadir_mount);
+ if (str_starts_with($location . '/', rtrim($this->nextcloudDatadirMount, '/') . '/')) {
+ throw new InvalidSettingConfigurationException("The path must not be a children of or equal to NEXTCLOUD_DATADIR, which is currently set to " . $this->nextcloudDatadirMount);
}
} else {
@@ -632,7 +632,7 @@ class ConfigurationManager
}
- public string $nextcloud_datadir_mount {
+ public string $nextcloudDatadirMount {
get => $this->GetEnvironmentalVariableOrConfig('NEXTCLOUD_DATADIR', 'nextcloud_datadir', 'nextcloud_aio_nextcloud_data');
set { $this->set('nextcloud_datadir_mount', $value); }
}
From bbf41cfdd37b29d54b76dff4d67efe1e3df54b74 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Fri, 23 Jan 2026 17:42:50 +0100
Subject: [PATCH 109/164] Camelize property nextcloud_upload_limit =>
nextcloudUploadLimit
Signed-off-by: Pablo Zmdl
---
php/public/index.php | 2 +-
php/src/Data/ConfigurationManager.php | 6 +++---
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/php/public/index.php b/php/public/index.php
index 0db30a1b..209f1d6d 100644
--- a/php/public/index.php
+++ b/php/public/index.php
@@ -129,7 +129,7 @@ $app->get('/containers', function (Request $request, Response $response, array $
'additional_backup_directories' => $configurationManager->GetAdditionalBackupDirectoriesString(),
'nextcloud_datadir' => $configurationManager->nextcloudDatadirMount,
'nextcloud_mount' => $configurationManager->nextcloudMount,
- 'nextcloud_upload_limit' => $configurationManager->nextcloud_upload_limit,
+ 'nextcloud_upload_limit' => $configurationManager->nextcloudUploadLimit,
'nextcloud_max_time' => $configurationManager->nextcloudMaxTime,
'nextcloud_memory_limit' => $configurationManager->nextcloud_memory_limit,
'is_dri_device_enabled' => $configurationManager->isDriDeviceEnabled(),
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index d1701a39..ce547bf8 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -637,7 +637,7 @@ class ConfigurationManager
set { $this->set('nextcloud_datadir_mount', $value); }
}
- public string $nextcloud_upload_limit {
+ public string $nextcloudUploadLimit {
get => $this->GetEnvironmentalVariableOrConfig('NEXTCLOUD_UPLOAD_LIMIT', 'nextcloud_upload_limit', '16G');
set { $this->set('nextcloud_upload_limit', $value); }
}
@@ -648,7 +648,7 @@ class ConfigurationManager
}
public function GetApacheMaxSize() : int {
- $uploadLimit = (int)rtrim($this->nextcloud_upload_limit, 'G');
+ $uploadLimit = (int)rtrim($this->nextcloudUploadLimit, 'G');
return $uploadLimit * 1024 * 1024 * 1024;
}
@@ -1074,7 +1074,7 @@ class ConfigurationManager
'IMAGINARY_ENABLED' => $this->isImaginaryEnabled ? 'yes' : '',
'FULLTEXTSEARCH_ENABLED' => $this->isFulltextsearchEnabled ? 'yes' : '',
'DOCKER_SOCKET_PROXY_ENABLED' => $this->isDockerSocketProxyEnabled ? 'yes' : '',
- 'NEXTCLOUD_UPLOAD_LIMIT' => $this->nextcloud_upload_limit,
+ 'NEXTCLOUD_UPLOAD_LIMIT' => $this->nextcloudUploadLimit,
'NEXTCLOUD_MEMORY_LIMIT' => $this->nextcloud_memory_limit,
'NEXTCLOUD_MAX_TIME' => $this->nextcloudMaxTime,
'BORG_RETENTION_POLICY' => $this->GetBorgRetentionPolicy(),
From 8b8f60f76bf5595c7ff606510d7f05213cf8a47d Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Fri, 23 Jan 2026 17:43:22 +0100
Subject: [PATCH 110/164] Camelize property nextcloud_memory_limit =>
nextcloudMemoryLimit
Signed-off-by: Pablo Zmdl
---
php/public/index.php | 2 +-
php/src/Data/ConfigurationManager.php | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/php/public/index.php b/php/public/index.php
index 209f1d6d..47c6bb7b 100644
--- a/php/public/index.php
+++ b/php/public/index.php
@@ -131,7 +131,7 @@ $app->get('/containers', function (Request $request, Response $response, array $
'nextcloud_mount' => $configurationManager->nextcloudMount,
'nextcloud_upload_limit' => $configurationManager->nextcloudUploadLimit,
'nextcloud_max_time' => $configurationManager->nextcloudMaxTime,
- 'nextcloud_memory_limit' => $configurationManager->nextcloud_memory_limit,
+ 'nextcloud_memory_limit' => $configurationManager->nextcloudMemoryLimit,
'is_dri_device_enabled' => $configurationManager->isDriDeviceEnabled(),
'is_nvidia_gpu_enabled' => $configurationManager->isNvidiaGpuEnabled(),
'is_talk_recording_enabled' => $configurationManager->isTalkRecordingEnabled,
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index ce547bf8..1530708a 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -642,7 +642,7 @@ class ConfigurationManager
set { $this->set('nextcloud_upload_limit', $value); }
}
- public string $nextcloud_memory_limit {
+ public string $nextcloudMemoryLimit {
get => $this->GetEnvironmentalVariableOrConfig('NEXTCLOUD_MEMORY_LIMIT', 'nextcloud_memory_limit', '512M');
set { $this->set('nextcloud_memory_limit', $value); }
}
@@ -1075,7 +1075,7 @@ class ConfigurationManager
'FULLTEXTSEARCH_ENABLED' => $this->isFulltextsearchEnabled ? 'yes' : '',
'DOCKER_SOCKET_PROXY_ENABLED' => $this->isDockerSocketProxyEnabled ? 'yes' : '',
'NEXTCLOUD_UPLOAD_LIMIT' => $this->nextcloudUploadLimit,
- 'NEXTCLOUD_MEMORY_LIMIT' => $this->nextcloud_memory_limit,
+ 'NEXTCLOUD_MEMORY_LIMIT' => $this->nextcloudMemoryLimit,
'NEXTCLOUD_MAX_TIME' => $this->nextcloudMaxTime,
'BORG_RETENTION_POLICY' => $this->GetBorgRetentionPolicy(),
'FULLTEXTSEARCH_JAVA_OPTIONS' => $this->GetFulltextsearchJavaOptions(),
From 0ed83c52588f9ebaffcce44a17365fb81b1ae9ff Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Fri, 23 Jan 2026 17:45:19 +0100
Subject: [PATCH 111/164] Move get-configurable-aio-variables.sh into php/
folder
Signed-off-by: Pablo Zmdl
---
.../get-configurable-aio-variables.sh | 0
1 file changed, 0 insertions(+), 0 deletions(-)
rename get-configurable-aio-variables.sh => php/get-configurable-aio-variables.sh (100%)
diff --git a/get-configurable-aio-variables.sh b/php/get-configurable-aio-variables.sh
similarity index 100%
rename from get-configurable-aio-variables.sh
rename to php/get-configurable-aio-variables.sh
From 365e1e34e4bc27fd2f8b4fd959e4cfb453cb4f08 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 26 Jan 2026 10:06:53 +0100
Subject: [PATCH 112/164] Make 'borgRetentionPolicy' an attribute
Signed-off-by: Pablo Zmdl
---
php/src/Data/ConfigurationManager.php | 10 ++++------
1 file changed, 4 insertions(+), 6 deletions(-)
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index 1530708a..ce3d321d 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -657,11 +657,9 @@ class ConfigurationManager
set { $this->set('nextcloud_max_time', $value); }
}
- public function GetBorgRetentionPolicy() : string {
- $envVariableName = 'BORG_RETENTION_POLICY';
- $configName = 'borg_retention_policy';
- $defaultValue = '--keep-within=7d --keep-weekly=4 --keep-monthly=6';
- return $this->GetEnvironmentalVariableOrConfig($envVariableName, $configName, $defaultValue);
+ public string $borgRetentionPolicy {
+ get => $this->GetEnvironmentalVariableOrConfig('BORG_RETENTION_POLICY', 'borg_retention_policy', '--keep-within=7d --keep-weekly=4 --keep-monthly=6');
+ set { $this->set('borg_retention_policy', $value); }
}
public function GetFulltextsearchJavaOptions() : string {
@@ -1077,7 +1075,7 @@ class ConfigurationManager
'NEXTCLOUD_UPLOAD_LIMIT' => $this->nextcloudUploadLimit,
'NEXTCLOUD_MEMORY_LIMIT' => $this->nextcloudMemoryLimit,
'NEXTCLOUD_MAX_TIME' => $this->nextcloudMaxTime,
- 'BORG_RETENTION_POLICY' => $this->GetBorgRetentionPolicy(),
+ 'BORG_RETENTION_POLICY' => $this->borgRetentionPolicy,
'FULLTEXTSEARCH_JAVA_OPTIONS' => $this->GetFulltextsearchJavaOptions(),
'NEXTCLOUD_TRUSTED_CACERTS_DIR' => $this->GetTrustedCacertsDir(),
'ADDITIONAL_DIRECTORIES_BACKUP' => $this->GetAdditionalBackupDirectoriesString() !== '' ? 'yes' : '',
From bfa2b64674843ea14a6542a0078fbe8576776e25 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 26 Jan 2026 10:07:53 +0100
Subject: [PATCH 113/164] Make 'fulltextsearchJavaOptions' an attribute
Signed-off-by: Pablo Zmdl
---
php/src/Data/ConfigurationManager.php | 10 ++++------
1 file changed, 4 insertions(+), 6 deletions(-)
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index ce3d321d..41097c8d 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -662,11 +662,9 @@ class ConfigurationManager
set { $this->set('borg_retention_policy', $value); }
}
- public function GetFulltextsearchJavaOptions() : string {
- $envVariableName = 'FULLTEXTSEARCH_JAVA_OPTIONS';
- $configName = 'fulltextsearch_java_options';
- $defaultValue = '-Xms512M -Xmx512M';
- return $this->GetEnvironmentalVariableOrConfig($envVariableName, $configName, $defaultValue);
+ public string $fulltextsearchJavaOptions {
+ get => $this->GetEnvironmentalVariableOrConfig('FULLTEXTSEARCH_JAVA_OPTIONS', 'fulltextsearch_java_options', '-Xms512M -Xmx512M');
+ set { $this->set('fulltextsearch_java_options', $value); }
}
public function GetDockerSocketPath() : string {
@@ -1076,7 +1074,7 @@ class ConfigurationManager
'NEXTCLOUD_MEMORY_LIMIT' => $this->nextcloudMemoryLimit,
'NEXTCLOUD_MAX_TIME' => $this->nextcloudMaxTime,
'BORG_RETENTION_POLICY' => $this->borgRetentionPolicy,
- 'FULLTEXTSEARCH_JAVA_OPTIONS' => $this->GetFulltextsearchJavaOptions(),
+ 'FULLTEXTSEARCH_JAVA_OPTIONS' => $this->fulltextsearchJavaOptions,
'NEXTCLOUD_TRUSTED_CACERTS_DIR' => $this->GetTrustedCacertsDir(),
'ADDITIONAL_DIRECTORIES_BACKUP' => $this->GetAdditionalBackupDirectoriesString() !== '' ? 'yes' : '',
'BORGBACKUP_HOST_LOCATION' => $this->borgBackupHostLocation,
From 63245430efa417d88ea7c13ffea433ea9bb069fe Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 26 Jan 2026 10:08:44 +0100
Subject: [PATCH 114/164] Make 'dockerSocketPath' an attribute
Signed-off-by: Pablo Zmdl
---
php/src/ContainerDefinitionFetcher.php | 2 +-
php/src/Data/ConfigurationManager.php | 8 +++-----
2 files changed, 4 insertions(+), 6 deletions(-)
diff --git a/php/src/ContainerDefinitionFetcher.php b/php/src/ContainerDefinitionFetcher.php
index 3bbc37e2..ead82363 100644
--- a/php/src/ContainerDefinitionFetcher.php
+++ b/php/src/ContainerDefinitionFetcher.php
@@ -129,7 +129,7 @@ readonly class ContainerDefinitionFetcher {
continue;
}
} elseif ($value['source'] === '%WATCHTOWER_DOCKER_SOCKET_PATH%') {
- $value['source'] = $this->configurationManager->GetDockerSocketPath();
+ $value['source'] = $this->configurationManager->dockerSocketPath;
if($value['source'] === '') {
continue;
}
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index 41097c8d..090762ae 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -667,11 +667,9 @@ class ConfigurationManager
set { $this->set('fulltextsearch_java_options', $value); }
}
- public function GetDockerSocketPath() : string {
- $envVariableName = 'WATCHTOWER_DOCKER_SOCKET_PATH';
- $configName = 'docker_socket_path';
- $defaultValue = '/var/run/docker.sock';
- return $this->GetEnvironmentalVariableOrConfig($envVariableName, $configName, $defaultValue);
+ public string $dockerSocketPath {
+ get => $this->GetEnvironmentalVariableOrConfig('WATCHTOWER_DOCKER_SOCKET_PATH', 'docker_socket_path', '/var/run/docker.sock');
+ set { $this->set('docker_socket_path', $value); }
}
public function GetTrustedCacertsDir() : string {
From 4ad8fcf2581f7d39b2dda9912cd4f89e511fd328 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 26 Jan 2026 10:09:32 +0100
Subject: [PATCH 115/164] Make 'trustedCacertsDir' an attribute
Signed-off-by: Pablo Zmdl
---
php/src/ContainerDefinitionFetcher.php | 2 +-
php/src/Data/ConfigurationManager.php | 10 ++++------
2 files changed, 5 insertions(+), 7 deletions(-)
diff --git a/php/src/ContainerDefinitionFetcher.php b/php/src/ContainerDefinitionFetcher.php
index ead82363..831a7bc5 100644
--- a/php/src/ContainerDefinitionFetcher.php
+++ b/php/src/ContainerDefinitionFetcher.php
@@ -134,7 +134,7 @@ readonly class ContainerDefinitionFetcher {
continue;
}
} elseif ($value['source'] === '%NEXTCLOUD_TRUSTED_CACERTS_DIR%') {
- $value['source'] = $this->configurationManager->GetTrustedCacertsDir();
+ $value['source'] = $this->configurationManager->trustedCacertsDir;
if($value['source'] === '') {
continue;
}
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index 090762ae..63862c91 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -672,11 +672,9 @@ class ConfigurationManager
set { $this->set('docker_socket_path', $value); }
}
- public function GetTrustedCacertsDir() : string {
- $envVariableName = 'NEXTCLOUD_TRUSTED_CACERTS_DIR';
- $configName = 'trusted_cacerts_dir';
- $defaultValue = '';
- return $this->GetEnvironmentalVariableOrConfig($envVariableName, $configName, $defaultValue);
+ public string $trustedCacertsDir {
+ get => $this->GetEnvironmentalVariableOrConfig('NEXTCLOUD_TRUSTED_CACERTS_DIR', 'trusted_cacerts_dir', '');
+ set { $this->set('trusted_cacerts_dir', $value); }
}
public function GetNextcloudAdditionalApks() : string {
@@ -1073,7 +1071,7 @@ class ConfigurationManager
'NEXTCLOUD_MAX_TIME' => $this->nextcloudMaxTime,
'BORG_RETENTION_POLICY' => $this->borgRetentionPolicy,
'FULLTEXTSEARCH_JAVA_OPTIONS' => $this->fulltextsearchJavaOptions,
- 'NEXTCLOUD_TRUSTED_CACERTS_DIR' => $this->GetTrustedCacertsDir(),
+ 'NEXTCLOUD_TRUSTED_CACERTS_DIR' => $this->trustedCacertsDir,
'ADDITIONAL_DIRECTORIES_BACKUP' => $this->GetAdditionalBackupDirectoriesString() !== '' ? 'yes' : '',
'BORGBACKUP_HOST_LOCATION' => $this->borgBackupHostLocation,
'APACHE_MAX_SIZE' => (string)($this->GetApacheMaxSize()),
From d50dc2db1de2a7fe741db56db2f8dc9f6ae7c62b Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 26 Jan 2026 10:10:08 +0100
Subject: [PATCH 116/164] Make 'nextcloudAdditionalApks' an attribute
Signed-off-by: Pablo Zmdl
---
php/src/Data/ConfigurationManager.php | 10 ++++------
1 file changed, 4 insertions(+), 6 deletions(-)
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index 63862c91..6e62be77 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -677,11 +677,9 @@ class ConfigurationManager
set { $this->set('trusted_cacerts_dir', $value); }
}
- public function GetNextcloudAdditionalApks() : string {
- $envVariableName = 'NEXTCLOUD_ADDITIONAL_APKS';
- $configName = 'nextcloud_additional_apks';
- $defaultValue = 'imagemagick';
- return trim($this->GetEnvironmentalVariableOrConfig($envVariableName, $configName, $defaultValue));
+ public string $nextcloudAdditionalApks {
+ get => trim($this->GetEnvironmentalVariableOrConfig('NEXTCLOUD_ADDITIONAL_APKS', 'nextcloud_additional_apks', 'imagemagick'));
+ set { $this->set('nextcloud_addtional_apks', $value); }
}
public function GetNextcloudAdditionalPhpExtensions() : string {
@@ -1077,7 +1075,7 @@ class ConfigurationManager
'APACHE_MAX_SIZE' => (string)($this->GetApacheMaxSize()),
'COLLABORA_SECCOMP_POLICY' => $this->GetCollaboraSeccompPolicy(),
'NEXTCLOUD_STARTUP_APPS' => $this->GetNextcloudStartupApps(),
- 'NEXTCLOUD_ADDITIONAL_APKS' => $this->GetNextcloudAdditionalApks(),
+ 'NEXTCLOUD_ADDITIONAL_APKS' => $this->nextcloudAdditionalApks,
'NEXTCLOUD_ADDITIONAL_PHP_EXTENSIONS' => $this->GetNextcloudAdditionalPhpExtensions(),
'INSTALL_LATEST_MAJOR' => $this->installLatestMajor,
'REMOVE_DISABLED_APPS' => $this->shouldDisabledAppsGetRemoved() ? 'yes' : '',
From c3477a7eb206aff3653a036395c4591068e85e96 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 26 Jan 2026 10:10:35 +0100
Subject: [PATCH 117/164] Make 'nextcloudAdditionalPhpExtensions' an attribute
Signed-off-by: Pablo Zmdl
---
php/src/Data/ConfigurationManager.php | 10 ++++------
1 file changed, 4 insertions(+), 6 deletions(-)
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index 6e62be77..c3f32f02 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -682,11 +682,9 @@ class ConfigurationManager
set { $this->set('nextcloud_addtional_apks', $value); }
}
- public function GetNextcloudAdditionalPhpExtensions() : string {
- $envVariableName = 'NEXTCLOUD_ADDITIONAL_PHP_EXTENSIONS';
- $configName = 'nextcloud_additional_php_extensions';
- $defaultValue = 'imagick';
- return trim($this->GetEnvironmentalVariableOrConfig($envVariableName, $configName, $defaultValue));
+ public string $nextcloudAdditionalPhpExtensions {
+ get => trim($this->GetEnvironmentalVariableOrConfig('NEXTCLOUD_ADDITIONAL_PHP_EXTENSIONS', 'nextcloud_additional_php_extensions', 'imagick'));
+ set { $this->set('nextcloud_additional_php_extensions', $value); }
}
public function GetCollaboraSeccompPolicy() : string {
@@ -1076,7 +1074,7 @@ class ConfigurationManager
'COLLABORA_SECCOMP_POLICY' => $this->GetCollaboraSeccompPolicy(),
'NEXTCLOUD_STARTUP_APPS' => $this->GetNextcloudStartupApps(),
'NEXTCLOUD_ADDITIONAL_APKS' => $this->nextcloudAdditionalApks,
- 'NEXTCLOUD_ADDITIONAL_PHP_EXTENSIONS' => $this->GetNextcloudAdditionalPhpExtensions(),
+ 'NEXTCLOUD_ADDITIONAL_PHP_EXTENSIONS' => $this->nextcloudAdditionalPhpExtensions,
'INSTALL_LATEST_MAJOR' => $this->installLatestMajor,
'REMOVE_DISABLED_APPS' => $this->shouldDisabledAppsGetRemoved() ? 'yes' : '',
// Allow to get local ip-address of database container which allows to talk to it even in host mode (the container that requires this needs to be started first then)
From 22a26268e07308af0419739a56e0ad1f7d5517f3 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 26 Jan 2026 10:27:55 +0100
Subject: [PATCH 118/164] Helper to booleanize environment-or-config-values
Signed-off-by: Pablo Zmdl
---
php/src/Data/ConfigurationManager.php | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index c3f32f02..c35f7ff9 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -1085,4 +1085,8 @@ class ConfigurationManager
default => $this->GetRegisteredSecret($placeholder),
};
}
+
+ private function booleanize(mixed $value) : bool {
+ return in_array($value, [true, 'true'], true);
+ }
}
From dc5dc0215c1d304dc45e621f124fe3e2960d5389 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 26 Jan 2026 10:12:01 +0100
Subject: [PATCH 119/164] Make 'collaboraSeccompDisabled' an attribute
Signed-off-by: Pablo Zmdl
---
php/src/Data/ConfigurationManager.php | 16 +++++-----------
php/src/Docker/DockerActionManager.php | 2 +-
2 files changed, 6 insertions(+), 12 deletions(-)
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index c35f7ff9..8e316b19 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -114,7 +114,7 @@ class ConfigurationManager
// Type-cast because old configs could have 1/0 for this key.
get => (bool) $this->get('isFulltextsearchEnabled', false);
// Elasticsearch does not work on kernels without seccomp anymore. See https://github.com/nextcloud/all-in-one/discussions/5768
- set { $this->set('isFulltextsearchEnabled', ($this->isSeccompDisabled() && $value)); }
+ set { $this->set('isFulltextsearchEnabled', ($this->collaboraSeccompDisabled && $value)); }
}
public string $domain {
@@ -689,21 +689,15 @@ class ConfigurationManager
public function GetCollaboraSeccompPolicy() : string {
$defaultString = '--o:security.seccomp=';
- if (!$this->isSeccompDisabled()) {
+ if (!$this->collaboraSeccompDisabled) {
return $defaultString . 'true';
}
return $defaultString . 'false';
}
- private function GetCollaboraSeccompDisabledState() : string {
- $envVariableName = 'COLLABORA_SECCOMP_DISABLED';
- $configName = 'collabora_seccomp_disabled';
- $defaultValue = 'false';
- return $this->GetEnvironmentalVariableOrConfig($envVariableName, $configName, $defaultValue);
- }
-
- public function isSeccompDisabled() : bool {
- return $this->GetCollaboraSeccompDisabledState() === 'true';
+ public bool $collaboraSeccompDisabled {
+ get => booleanize($this->GetEnvironmentalVariableOrConfig('COLLABORA_SECCOMP_DISABLED', 'collabora_seccomp_disabled', ''));
+ set { $this->set('collabora_seccomp_disabled', $value); }
}
/**
diff --git a/php/src/Docker/DockerActionManager.php b/php/src/Docker/DockerActionManager.php
index 12dd70ae..47522e23 100644
--- a/php/src/Docker/DockerActionManager.php
+++ b/php/src/Docker/DockerActionManager.php
@@ -412,7 +412,7 @@ readonly class DockerActionManager {
// Special things for the collabora container which should not be exposed in the containers.json
} elseif ($container->identifier === 'nextcloud-aio-collabora') {
- if (!$this->configurationManager->isSeccompDisabled()) {
+ if (!$this->configurationManager->collaboraSeccompDisabled) {
// Load reference seccomp profile for collabora
$seccompProfile = (string)file_get_contents(DataConst::GetCollaboraSeccompProfilePath());
$requestBody['HostConfig']['SecurityOpt'] = ["label:disable", "seccomp=$seccompProfile"];
From 08438aff4259eee999c4f3e1c380190f024ec28d Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 26 Jan 2026 10:12:41 +0100
Subject: [PATCH 120/164] Make 'apacheAdditionalNetwork' an attribute
Signed-off-by: Pablo Zmdl
---
php/src/Data/ConfigurationManager.php | 8 +++-----
php/src/Docker/DockerActionManager.php | 2 +-
2 files changed, 4 insertions(+), 6 deletions(-)
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index 8e316b19..d5a5e4f0 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -874,11 +874,9 @@ class ConfigurationManager
$this->set('collabora_additional_options', '');
}
- public function GetApacheAdditionalNetwork() : string {
- $envVariableName = 'APACHE_ADDITIONAL_NETWORK';
- $configName = 'apache_additional_network';
- $defaultValue = '';
- return $this->GetEnvironmentalVariableOrConfig($envVariableName, $configName, $defaultValue);
+ public string $apacheAdditionalNetwork {
+ get => $this->GetEnvironmentalVariableOrConfig('APACHE_ADDITIONAL_NETWORK', 'apache_additional_network', '');
+ set { $this->set('apache_additional_network', $value); }
}
private function GetDisableBackupSection() : string {
diff --git a/php/src/Docker/DockerActionManager.php b/php/src/Docker/DockerActionManager.php
index 47522e23..fd6334c6 100644
--- a/php/src/Docker/DockerActionManager.php
+++ b/php/src/Docker/DockerActionManager.php
@@ -837,7 +837,7 @@ readonly class DockerActionManager {
$this->ConnectContainerIdToNetwork($container->identifier, $container->internalPorts, alias: $alias);
if ($container->identifier === 'nextcloud-aio-apache' || $container->identifier === 'nextcloud-aio-domaincheck') {
- $apacheAdditionalNetwork = $this->configurationManager->GetApacheAdditionalNetwork();
+ $apacheAdditionalNetwork = $this->configurationManager->apacheAdditionalNetwork;
if ($apacheAdditionalNetwork !== '') {
$this->ConnectContainerIdToNetwork($container->identifier, $container->internalPorts, $apacheAdditionalNetwork, false, $alias);
}
From 0cb79a387fe128b158f6d7e784b3f47ff5c083be Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 26 Jan 2026 10:19:57 +0100
Subject: [PATCH 121/164] Make 'disableBackupSection' an attribute
Signed-off-by: Pablo Zmdl
---
php/public/index.php | 2 +-
php/src/Data/ConfigurationManager.php | 16 +++-------------
2 files changed, 4 insertions(+), 14 deletions(-)
diff --git a/php/public/index.php b/php/public/index.php
index 47c6bb7b..07837125 100644
--- a/php/public/index.php
+++ b/php/public/index.php
@@ -123,7 +123,7 @@ $app->get('/containers', function (Request $request, Response $response, array $
'collabora_dictionaries' => $configurationManager->collaboraDictionaries,
'collabora_additional_options' => $configurationManager->collaboraAdditionalOptions,
'automatic_updates' => $configurationManager->areAutomaticUpdatesEnabled(),
- 'is_backup_section_enabled' => $configurationManager->isBackupSectionEnabled(),
+ 'is_backup_section_enabled' => !$configurationManager->disableBackupSection,
'is_imaginary_enabled' => $configurationManager->isImaginaryEnabled,
'is_fulltextsearch_enabled' => $configurationManager->isFulltextsearchEnabled,
'additional_backup_directories' => $configurationManager->GetAdditionalBackupDirectoriesString(),
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index d5a5e4f0..d1825552 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -879,19 +879,9 @@ class ConfigurationManager
set { $this->set('apache_additional_network', $value); }
}
- private function GetDisableBackupSection() : string {
- $envVariableName = 'AIO_DISABLE_BACKUP_SECTION';
- $configName = 'disable_backup_section';
- $defaultValue = '';
- return $this->GetEnvironmentalVariableOrConfig($envVariableName, $configName, $defaultValue);
- }
-
- public function isBackupSectionEnabled() : bool {
- if ($this->GetDisableBackupSection() === 'true') {
- return false;
- } else {
- return true;
- }
+ public bool $disableBackupSection {
+ get => booleanize($this->GetEnvironmentalVariableOrConfig('AIO_DISABLE_BACKUP_SECTION', 'disable_backup_section', ''));
+ set { $this->set('disable_backup_section', $value); }
}
public function listAvailableCommunityContainers() : array {
From 5fc4951ba0d4ecfb56bf6f0cfe3c983cef89ad2c Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 26 Jan 2026 10:26:39 +0100
Subject: [PATCH 122/164] Make 'nextcloudEnableDriDevice' an attribute
Signed-off-by: Pablo Zmdl
---
php/public/index.php | 2 +-
php/src/Data/ConfigurationManager.php | 16 +++-------------
php/src/Docker/DockerActionManager.php | 2 +-
3 files changed, 5 insertions(+), 15 deletions(-)
diff --git a/php/public/index.php b/php/public/index.php
index 07837125..519ec71a 100644
--- a/php/public/index.php
+++ b/php/public/index.php
@@ -132,7 +132,7 @@ $app->get('/containers', function (Request $request, Response $response, array $
'nextcloud_upload_limit' => $configurationManager->nextcloudUploadLimit,
'nextcloud_max_time' => $configurationManager->nextcloudMaxTime,
'nextcloud_memory_limit' => $configurationManager->nextcloudMemoryLimit,
- 'is_dri_device_enabled' => $configurationManager->isDriDeviceEnabled(),
+ 'is_dri_device_enabled' => $configurationManager->nextcloudEnableDriDevice,
'is_nvidia_gpu_enabled' => $configurationManager->isNvidiaGpuEnabled(),
'is_talk_recording_enabled' => $configurationManager->isTalkRecordingEnabled,
'is_docker_socket_proxy_enabled' => $configurationManager->isDockerSocketProxyEnabled,
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index d1825552..afbe9fbc 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -919,19 +919,9 @@ class ConfigurationManager
return $cc;
}
- private function GetEnabledDriDevice() : string {
- $envVariableName = 'NEXTCLOUD_ENABLE_DRI_DEVICE';
- $configName = 'nextcloud_enable_dri_device';
- $defaultValue = '';
- return $this->GetEnvironmentalVariableOrConfig($envVariableName, $configName, $defaultValue);
- }
-
- public function isDriDeviceEnabled() : bool {
- if ($this->GetEnabledDriDevice() === 'true') {
- return true;
- } else {
- return false;
- }
+ public bool $nextcloudEnableDriDevice{
+ get => booleanize($this->GetEnvironmentalVariableOrConfig('NEXTCLOUD_ENABLE_DRI_DEVICE', 'nextcloud_enable_dri_device', ''));
+ set { $this->set('nextcloud_enable_dri_device', $value); }
}
private function GetEnabledNvidiaGpu() : string {
diff --git a/php/src/Docker/DockerActionManager.php b/php/src/Docker/DockerActionManager.php
index fd6334c6..31ad2371 100644
--- a/php/src/Docker/DockerActionManager.php
+++ b/php/src/Docker/DockerActionManager.php
@@ -307,7 +307,7 @@ readonly class DockerActionManager {
$devices = [];
foreach ($container->devices as $device) {
- if ($device === '/dev/dri' && !$this->configurationManager->isDriDeviceEnabled()) {
+ if ($device === '/dev/dri' && !$this->configurationManager->nextcloudEnableDriDevice) {
continue;
}
$devices[] = ["PathOnHost" => $device, "PathInContainer" => $device, "CgroupPermissions" => "rwm"];
From 5bdcfd67eb54aa14401a75bb54d92466c73896fe Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 26 Jan 2026 10:27:31 +0100
Subject: [PATCH 123/164] Make 'enableNvidiaGpu' an attribute
Signed-off-by: Pablo Zmdl
---
php/public/index.php | 2 +-
php/src/Data/ConfigurationManager.php | 14 ++++----------
php/src/Docker/DockerActionManager.php | 2 +-
3 files changed, 6 insertions(+), 12 deletions(-)
diff --git a/php/public/index.php b/php/public/index.php
index 519ec71a..1ec42949 100644
--- a/php/public/index.php
+++ b/php/public/index.php
@@ -133,7 +133,7 @@ $app->get('/containers', function (Request $request, Response $response, array $
'nextcloud_max_time' => $configurationManager->nextcloudMaxTime,
'nextcloud_memory_limit' => $configurationManager->nextcloudMemoryLimit,
'is_dri_device_enabled' => $configurationManager->nextcloudEnableDriDevice,
- 'is_nvidia_gpu_enabled' => $configurationManager->isNvidiaGpuEnabled(),
+ 'is_nvidia_gpu_enabled' => $configurationManager->enableNvidiaGpu,
'is_talk_recording_enabled' => $configurationManager->isTalkRecordingEnabled,
'is_docker_socket_proxy_enabled' => $configurationManager->isDockerSocketProxyEnabled,
'is_whiteboard_enabled' => $configurationManager->isWhiteboardEnabled,
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index afbe9fbc..e03e2bfb 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -923,16 +923,10 @@ class ConfigurationManager
get => booleanize($this->GetEnvironmentalVariableOrConfig('NEXTCLOUD_ENABLE_DRI_DEVICE', 'nextcloud_enable_dri_device', ''));
set { $this->set('nextcloud_enable_dri_device', $value); }
}
-
- private function GetEnabledNvidiaGpu() : string {
- $envVariableName = 'NEXTCLOUD_ENABLE_NVIDIA_GPU';
- $configName = 'enable_nvidia_gpu';
- $defaultValue = '';
- return $this->GetEnvironmentalVariableOrConfig($envVariableName, $configName, $defaultValue);
- }
-
- public function isNvidiaGpuEnabled() : bool {
- return $this->GetEnabledNvidiaGpu() === 'true';
+
+ public bool $enableNvidiaGpu {
+ get => booleanize($this->GetEnvironmentalVariableOrConfig('NEXTCLOUD_ENABLE_NVIDIA_GPU', 'enable_nvidia_gpu', ''));
+ set { $this->set('enable_nvidia_gpu', $value); }
}
private function GetKeepDisabledApps() : string {
diff --git a/php/src/Docker/DockerActionManager.php b/php/src/Docker/DockerActionManager.php
index 31ad2371..509f4c28 100644
--- a/php/src/Docker/DockerActionManager.php
+++ b/php/src/Docker/DockerActionManager.php
@@ -317,7 +317,7 @@ readonly class DockerActionManager {
$requestBody['HostConfig']['Devices'] = $devices;
}
- if ($container->enableNvidiaGpu && $this->configurationManager->isNvidiaGpuEnabled()) {
+ if ($container->enableNvidiaGpu && $this->configurationManager->enableNvidiaGpu) {
$requestBody['HostConfig']['Runtime'] = 'nvidia';
$requestBody['HostConfig']['DeviceRequests'] = [
[
From 3cfe307a5cb7651cb0b54bb7db5f4fac28c64b7c Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 26 Jan 2026 10:39:40 +0100
Subject: [PATCH 124/164] Make `nextcloudKeepDisabledApps` an attribute
Signed-off-by: Pablo Zmdl
---
php/src/Data/ConfigurationManager.php | 18 ++++--------------
1 file changed, 4 insertions(+), 14 deletions(-)
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index e03e2bfb..57071d91 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -929,21 +929,11 @@ class ConfigurationManager
set { $this->set('enable_nvidia_gpu', $value); }
}
- private function GetKeepDisabledApps() : string {
- $envVariableName = 'NEXTCLOUD_KEEP_DISABLED_APPS';
- $configName = 'nextcloud_keep_disabled_apps';
- $defaultValue = '';
- return $this->GetEnvironmentalVariableOrConfig($envVariableName, $configName, $defaultValue);
+ public bool $nextcloudKeepDisabledApps {
+ get => booleanize($this->GetEnvironmentalVariableOrConfig('NEXTCLOUD_KEEP_DISABLED_APPS', 'nextcloud_keep_disabled_apps', ''));
+ set { $this->set('nextcloud_keep_disabled_apps', $value); }
}
- public function shouldDisabledAppsGetRemoved() : bool {
- if ($this->GetKeepDisabledApps() === 'true') {
- return false;
- } else {
- return true;
- }
- }
-
private function camelize(string $input, string $delimiter = '_') : string {
return lcfirst(implode("", array_map('ucfirst', explode($delimiter, strtolower($input)))));
@@ -1042,7 +1032,7 @@ class ConfigurationManager
'NEXTCLOUD_ADDITIONAL_APKS' => $this->nextcloudAdditionalApks,
'NEXTCLOUD_ADDITIONAL_PHP_EXTENSIONS' => $this->nextcloudAdditionalPhpExtensions,
'INSTALL_LATEST_MAJOR' => $this->installLatestMajor,
- 'REMOVE_DISABLED_APPS' => $this->shouldDisabledAppsGetRemoved() ? 'yes' : '',
+ 'REMOVE_DISABLED_APPS' => $this->nextcloudKeepDisabledApps ? '' : 'yes',
// Allow to get local ip-address of database container which allows to talk to it even in host mode (the container that requires this needs to be started first then)
'AIO_DATABASE_HOST' => gethostbyname('nextcloud-aio-database'),
// Allow to get local ip-address of caddy container and add it to trusted proxies automatically
From 078f3caf8aa180ff74ad906652d11757823576f2 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 26 Jan 2026 10:48:33 +0100
Subject: [PATCH 125/164] Move all properties to the top of the file
Signed-off-by: Pablo Zmdl
---
php/src/Data/ConfigurationManager.php | 201 +++++++++++++-------------
1 file changed, 100 insertions(+), 101 deletions(-)
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index 57071d91..19b0a7bb 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -188,6 +188,106 @@ class ConfigurationManager
set { $this->set('turn_domain', $value); }
}
+ public string $apachePort {
+ get => $this->GetEnvironmentalVariableOrConfig('APACHE_PORT', 'apache_port', '443');
+ set { $this->set('apache_port', $value); }
+ }
+
+ public string $talkPort {
+ get => $this->GetEnvironmentalVariableOrConfig('TALK_PORT', 'talk_port', '3478');
+ set { $this->set('talk_port', $value); }
+ }
+
+ public string $nextcloudMount {
+ get => $this->GetEnvironmentalVariableOrConfig('NEXTCLOUD_MOUNT', 'nextcloud_mount', '');
+ set { $this->set('nextcloud_mount', $value); }
+ }
+
+ public string $nextcloudDatadirMount {
+ get => $this->GetEnvironmentalVariableOrConfig('NEXTCLOUD_DATADIR', 'nextcloud_datadir', 'nextcloud_aio_nextcloud_data');
+ set { $this->set('nextcloud_datadir_mount', $value); }
+ }
+
+ public string $nextcloudUploadLimit {
+ get => $this->GetEnvironmentalVariableOrConfig('NEXTCLOUD_UPLOAD_LIMIT', 'nextcloud_upload_limit', '16G');
+ set { $this->set('nextcloud_upload_limit', $value); }
+ }
+
+ public string $nextcloudMemoryLimit {
+ get => $this->GetEnvironmentalVariableOrConfig('NEXTCLOUD_MEMORY_LIMIT', 'nextcloud_memory_limit', '512M');
+ set { $this->set('nextcloud_memory_limit', $value); }
+ }
+
+ public function GetApacheMaxSize() : int {
+ $uploadLimit = (int)rtrim($this->nextcloudUploadLimit, 'G');
+ return $uploadLimit * 1024 * 1024 * 1024;
+ }
+
+ public string $nextcloudMaxTime {
+ get => $this->GetEnvironmentalVariableOrConfig('NEXTCLOUD_MAX_TIME', 'nextcloud_max_time', '3600');
+ set { $this->set('nextcloud_max_time', $value); }
+ }
+
+ public string $borgRetentionPolicy {
+ get => $this->GetEnvironmentalVariableOrConfig('BORG_RETENTION_POLICY', 'borg_retention_policy', '--keep-within=7d --keep-weekly=4 --keep-monthly=6');
+ set { $this->set('borg_retention_policy', $value); }
+ }
+
+ public string $fulltextsearchJavaOptions {
+ get => $this->GetEnvironmentalVariableOrConfig('FULLTEXTSEARCH_JAVA_OPTIONS', 'fulltextsearch_java_options', '-Xms512M -Xmx512M');
+ set { $this->set('fulltextsearch_java_options', $value); }
+ }
+
+ public string $dockerSocketPath {
+ get => $this->GetEnvironmentalVariableOrConfig('WATCHTOWER_DOCKER_SOCKET_PATH', 'docker_socket_path', '/var/run/docker.sock');
+ set { $this->set('docker_socket_path', $value); }
+ }
+
+ public string $trustedCacertsDir {
+ get => $this->GetEnvironmentalVariableOrConfig('NEXTCLOUD_TRUSTED_CACERTS_DIR', 'trusted_cacerts_dir', '');
+ set { $this->set('trusted_cacerts_dir', $value); }
+ }
+
+ public string $nextcloudAdditionalApks {
+ get => trim($this->GetEnvironmentalVariableOrConfig('NEXTCLOUD_ADDITIONAL_APKS', 'nextcloud_additional_apks', 'imagemagick'));
+ set { $this->set('nextcloud_addtional_apks', $value); }
+ }
+
+ public string $nextcloudAdditionalPhpExtensions {
+ get => trim($this->GetEnvironmentalVariableOrConfig('NEXTCLOUD_ADDITIONAL_PHP_EXTENSIONS', 'nextcloud_additional_php_extensions', 'imagick'));
+ set { $this->set('nextcloud_additional_php_extensions', $value); }
+ }
+
+ public bool $collaboraSeccompDisabled {
+ get => booleanize($this->GetEnvironmentalVariableOrConfig('COLLABORA_SECCOMP_DISABLED', 'collabora_seccomp_disabled', ''));
+ set { $this->set('collabora_seccomp_disabled', $value); }
+ }
+
+ public string $apacheAdditionalNetwork {
+ get => $this->GetEnvironmentalVariableOrConfig('APACHE_ADDITIONAL_NETWORK', 'apache_additional_network', '');
+ set { $this->set('apache_additional_network', $value); }
+ }
+
+ public bool $disableBackupSection {
+ get => booleanize($this->GetEnvironmentalVariableOrConfig('AIO_DISABLE_BACKUP_SECTION', 'disable_backup_section', ''));
+ set { $this->set('disable_backup_section', $value); }
+ }
+
+ public bool $nextcloudEnableDriDevice{
+ get => booleanize($this->GetEnvironmentalVariableOrConfig('NEXTCLOUD_ENABLE_DRI_DEVICE', 'nextcloud_enable_dri_device', ''));
+ set { $this->set('nextcloud_enable_dri_device', $value); }
+ }
+
+ public bool $enableNvidiaGpu {
+ get => booleanize($this->GetEnvironmentalVariableOrConfig('NEXTCLOUD_ENABLE_NVIDIA_GPU', 'enable_nvidia_gpu', ''));
+ set { $this->set('enable_nvidia_gpu', $value); }
+ }
+
+ public bool $nextcloudKeepDisabledApps {
+ get => booleanize($this->GetEnvironmentalVariableOrConfig('NEXTCLOUD_KEEP_DISABLED_APPS', 'nextcloud_keep_disabled_apps', ''));
+ set { $this->set('nextcloud_keep_disabled_apps', $value); }
+ }
+
private function GetConfig() : array
{
if ($this->config === [] && file_exists(DataConst::GetConfigFile()))
@@ -568,16 +668,6 @@ class ConfigurationManager
$this->set('password', $newPassword);
}
- public string $apachePort {
- get => $this->GetEnvironmentalVariableOrConfig('APACHE_PORT', 'apache_port', '443');
- set { $this->set('apache_port', $value); }
- }
-
- public string $talkPort {
- get => $this->GetEnvironmentalVariableOrConfig('TALK_PORT', 'talk_port', '3478');
- set { $this->set('talk_port', $value); }
- }
-
/**
* @throws InvalidSettingConfigurationException
*/
@@ -626,67 +716,6 @@ class ConfigurationManager
return trim((string)file_get_contents(DataConst::GetBackupPublicKey()));
}
- public string $nextcloudMount {
- get => $this->GetEnvironmentalVariableOrConfig('NEXTCLOUD_MOUNT', 'nextcloud_mount', '');
- set { $this->set('nextcloud_mount', $value); }
- }
-
-
- public string $nextcloudDatadirMount {
- get => $this->GetEnvironmentalVariableOrConfig('NEXTCLOUD_DATADIR', 'nextcloud_datadir', 'nextcloud_aio_nextcloud_data');
- set { $this->set('nextcloud_datadir_mount', $value); }
- }
-
- public string $nextcloudUploadLimit {
- get => $this->GetEnvironmentalVariableOrConfig('NEXTCLOUD_UPLOAD_LIMIT', 'nextcloud_upload_limit', '16G');
- set { $this->set('nextcloud_upload_limit', $value); }
- }
-
- public string $nextcloudMemoryLimit {
- get => $this->GetEnvironmentalVariableOrConfig('NEXTCLOUD_MEMORY_LIMIT', 'nextcloud_memory_limit', '512M');
- set { $this->set('nextcloud_memory_limit', $value); }
- }
-
- public function GetApacheMaxSize() : int {
- $uploadLimit = (int)rtrim($this->nextcloudUploadLimit, 'G');
- return $uploadLimit * 1024 * 1024 * 1024;
- }
-
- public string $nextcloudMaxTime {
- get => $this->GetEnvironmentalVariableOrConfig('NEXTCLOUD_MAX_TIME', 'nextcloud_max_time', '3600');
- set { $this->set('nextcloud_max_time', $value); }
- }
-
- public string $borgRetentionPolicy {
- get => $this->GetEnvironmentalVariableOrConfig('BORG_RETENTION_POLICY', 'borg_retention_policy', '--keep-within=7d --keep-weekly=4 --keep-monthly=6');
- set { $this->set('borg_retention_policy', $value); }
- }
-
- public string $fulltextsearchJavaOptions {
- get => $this->GetEnvironmentalVariableOrConfig('FULLTEXTSEARCH_JAVA_OPTIONS', 'fulltextsearch_java_options', '-Xms512M -Xmx512M');
- set { $this->set('fulltextsearch_java_options', $value); }
- }
-
- public string $dockerSocketPath {
- get => $this->GetEnvironmentalVariableOrConfig('WATCHTOWER_DOCKER_SOCKET_PATH', 'docker_socket_path', '/var/run/docker.sock');
- set { $this->set('docker_socket_path', $value); }
- }
-
- public string $trustedCacertsDir {
- get => $this->GetEnvironmentalVariableOrConfig('NEXTCLOUD_TRUSTED_CACERTS_DIR', 'trusted_cacerts_dir', '');
- set { $this->set('trusted_cacerts_dir', $value); }
- }
-
- public string $nextcloudAdditionalApks {
- get => trim($this->GetEnvironmentalVariableOrConfig('NEXTCLOUD_ADDITIONAL_APKS', 'nextcloud_additional_apks', 'imagemagick'));
- set { $this->set('nextcloud_addtional_apks', $value); }
- }
-
- public string $nextcloudAdditionalPhpExtensions {
- get => trim($this->GetEnvironmentalVariableOrConfig('NEXTCLOUD_ADDITIONAL_PHP_EXTENSIONS', 'nextcloud_additional_php_extensions', 'imagick'));
- set { $this->set('nextcloud_additional_php_extensions', $value); }
- }
-
public function GetCollaboraSeccompPolicy() : string {
$defaultString = '--o:security.seccomp=';
if (!$this->collaboraSeccompDisabled) {
@@ -695,11 +724,6 @@ class ConfigurationManager
return $defaultString . 'false';
}
- public bool $collaboraSeccompDisabled {
- get => booleanize($this->GetEnvironmentalVariableOrConfig('COLLABORA_SECCOMP_DISABLED', 'collabora_seccomp_disabled', ''));
- set { $this->set('collabora_seccomp_disabled', $value); }
- }
-
/**
* @throws InvalidSettingConfigurationException
*/
@@ -874,16 +898,6 @@ class ConfigurationManager
$this->set('collabora_additional_options', '');
}
- public string $apacheAdditionalNetwork {
- get => $this->GetEnvironmentalVariableOrConfig('APACHE_ADDITIONAL_NETWORK', 'apache_additional_network', '');
- set { $this->set('apache_additional_network', $value); }
- }
-
- public bool $disableBackupSection {
- get => booleanize($this->GetEnvironmentalVariableOrConfig('AIO_DISABLE_BACKUP_SECTION', 'disable_backup_section', ''));
- set { $this->set('disable_backup_section', $value); }
- }
-
public function listAvailableCommunityContainers() : array {
$cc = [];
$dir = scandir(DataConst::GetCommunityContainersDirectory());
@@ -919,21 +933,6 @@ class ConfigurationManager
return $cc;
}
- public bool $nextcloudEnableDriDevice{
- get => booleanize($this->GetEnvironmentalVariableOrConfig('NEXTCLOUD_ENABLE_DRI_DEVICE', 'nextcloud_enable_dri_device', ''));
- set { $this->set('nextcloud_enable_dri_device', $value); }
- }
-
- public bool $enableNvidiaGpu {
- get => booleanize($this->GetEnvironmentalVariableOrConfig('NEXTCLOUD_ENABLE_NVIDIA_GPU', 'enable_nvidia_gpu', ''));
- set { $this->set('enable_nvidia_gpu', $value); }
- }
-
- public bool $nextcloudKeepDisabledApps {
- get => booleanize($this->GetEnvironmentalVariableOrConfig('NEXTCLOUD_KEEP_DISABLED_APPS', 'nextcloud_keep_disabled_apps', ''));
- set { $this->set('nextcloud_keep_disabled_apps', $value); }
- }
-
private function camelize(string $input, string $delimiter = '_') : string {
return lcfirst(implode("", array_map('ucfirst', explode($delimiter, strtolower($input)))));
From ec66b359e0d3aaa1324abc172df9645c07a89ba4 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Tue, 27 Jan 2026 10:52:20 +0100
Subject: [PATCH 126/164] Check arguments to camelize() for usefulness
Signed-off-by: Pablo Zmdl
---
php/src/Data/ConfigurationManager.php | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index 19b0a7bb..06122839 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -934,6 +934,12 @@ class ConfigurationManager
}
private function camelize(string $input, string $delimiter = '_') : string {
+ if ($input === '') {
+ throw new InvalidSettingConfigurationException('input cannot be empty!');
+ }
+ if ($delimiter === '') {
+ $delimiter = '_';
+ }
return lcfirst(implode("", array_map('ucfirst', explode($delimiter, strtolower($input)))));
}
From 659b1ca383c575d27fba77f1b0d9d1f4624a6281 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Tue, 27 Jan 2026 10:58:25 +0100
Subject: [PATCH 127/164] Fix calling booleanize
Signed-off-by: Pablo Zmdl
---
php/src/Data/ConfigurationManager.php | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index 06122839..e592286c 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -259,7 +259,7 @@ class ConfigurationManager
}
public bool $collaboraSeccompDisabled {
- get => booleanize($this->GetEnvironmentalVariableOrConfig('COLLABORA_SECCOMP_DISABLED', 'collabora_seccomp_disabled', ''));
+ get => $this->booleanize($this->GetEnvironmentalVariableOrConfig('COLLABORA_SECCOMP_DISABLED', 'collabora_seccomp_disabled', ''));
set { $this->set('collabora_seccomp_disabled', $value); }
}
@@ -269,22 +269,22 @@ class ConfigurationManager
}
public bool $disableBackupSection {
- get => booleanize($this->GetEnvironmentalVariableOrConfig('AIO_DISABLE_BACKUP_SECTION', 'disable_backup_section', ''));
+ get => $this->booleanize($this->GetEnvironmentalVariableOrConfig('AIO_DISABLE_BACKUP_SECTION', 'disable_backup_section', ''));
set { $this->set('disable_backup_section', $value); }
}
public bool $nextcloudEnableDriDevice{
- get => booleanize($this->GetEnvironmentalVariableOrConfig('NEXTCLOUD_ENABLE_DRI_DEVICE', 'nextcloud_enable_dri_device', ''));
+ get => $this->booleanize($this->GetEnvironmentalVariableOrConfig('NEXTCLOUD_ENABLE_DRI_DEVICE', 'nextcloud_enable_dri_device', ''));
set { $this->set('nextcloud_enable_dri_device', $value); }
}
public bool $enableNvidiaGpu {
- get => booleanize($this->GetEnvironmentalVariableOrConfig('NEXTCLOUD_ENABLE_NVIDIA_GPU', 'enable_nvidia_gpu', ''));
+ get => $this->booleanize($this->GetEnvironmentalVariableOrConfig('NEXTCLOUD_ENABLE_NVIDIA_GPU', 'enable_nvidia_gpu', ''));
set { $this->set('enable_nvidia_gpu', $value); }
}
public bool $nextcloudKeepDisabledApps {
- get => booleanize($this->GetEnvironmentalVariableOrConfig('NEXTCLOUD_KEEP_DISABLED_APPS', 'nextcloud_keep_disabled_apps', ''));
+ get => $this->booleanize($this->GetEnvironmentalVariableOrConfig('NEXTCLOUD_KEEP_DISABLED_APPS', 'nextcloud_keep_disabled_apps', ''));
set { $this->set('nextcloud_keep_disabled_apps', $value); }
}
From d9d4e3680f94ec14bb32ee534e019868ca7e8db7 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Tue, 27 Jan 2026 11:55:24 +0100
Subject: [PATCH 128/164] Fix residue from change to use
start/commitTransaction()
Signed-off-by: Pablo Zmdl
---
php/src/Data/ConfigurationManager.php | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index e592286c..c8f09890 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -954,17 +954,17 @@ class ConfigurationManager
error_log("Invalid input: '$variable' is not a string or does not contain an equal sign ('=')");
continue;
}
- $keyWithValue = $confManager->replaceEnvPlaceholders($variable);
+ $keyWithValue = $this->replaceEnvPlaceholders($variable);
// Pad the result with nulls so psalm is happy (and we don't risk to run into warnings in case
// the check for an equal sign from above gets changed).
[$key, $value] = explode('=', $keyWithValue, 2) + [null, null];
$key = $this->camelize($key);
if ($value === null) {
error_log("Invalid input: '$keyWithValue' has no value after the equal sign");
- } else if (!property_exists($confManager, $key)) {
+ } else if (!property_exists($this, $key)) {
error_log("Error: '$key' is not a valid configuration key (in '$keyWithValue')");
} else {
- $confManager->$key = $value;
+ $this->$key = $value;
}
}
$this->commitTransaction();
From 5b6e0f30a6de38e1ec281443d8b0ce1121fcc0ed Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Tue, 27 Jan 2026 12:04:55 +0100
Subject: [PATCH 129/164] Fix assignment of INSTALL_LATEST_MAJOR from env
replacement
Signed-off-by: Pablo Zmdl
---
php/src/Data/ConfigurationManager.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index c8f09890..25263b50 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -1036,7 +1036,7 @@ class ConfigurationManager
'NEXTCLOUD_STARTUP_APPS' => $this->GetNextcloudStartupApps(),
'NEXTCLOUD_ADDITIONAL_APKS' => $this->nextcloudAdditionalApks,
'NEXTCLOUD_ADDITIONAL_PHP_EXTENSIONS' => $this->nextcloudAdditionalPhpExtensions,
- 'INSTALL_LATEST_MAJOR' => $this->installLatestMajor,
+ 'INSTALL_LATEST_MAJOR' => $this->installLatestMajor ? 'yes' : '',
'REMOVE_DISABLED_APPS' => $this->nextcloudKeepDisabledApps ? '' : 'yes',
// Allow to get local ip-address of database container which allows to talk to it even in host mode (the container that requires this needs to be started first then)
'AIO_DATABASE_HOST' => gethostbyname('nextcloud-aio-database'),
From 5ba678c0820e748bad54a6748ad65f693b5a40bd Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Wed, 28 Jan 2026 12:08:07 +0100
Subject: [PATCH 130/164] Non-functional addition to camelizing nextcloud_mount
to nextcloudMount
Signed-off-by: Pablo Zmdl
---
php/src/Docker/DockerActionManager.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/php/src/Docker/DockerActionManager.php b/php/src/Docker/DockerActionManager.php
index 509f4c28..db48dc2c 100644
--- a/php/src/Docker/DockerActionManager.php
+++ b/php/src/Docker/DockerActionManager.php
@@ -400,7 +400,7 @@ readonly class DockerActionManager {
// // Special things for the nextcloud container which should not be exposed in the containers.json
// } elseif ($container->identifier === 'nextcloud-aio-nextcloud') {
// foreach ($container->volumes->GetVolumes() as $volume) {
- // if ($volume->name !== $this->configurationManager->nextcloud_mount) {
+ // if ($volume->name !== $this->configurationManager->nextcloudMount) {
// continue;
// }
// $mounts[] = ["Type" => "bind", "Source" => $volume->name, "Target" => $volume->mountPoint, "ReadOnly" => !$volume->isWritable, "BindOptions" => [ "Propagation" => "rshared"]];
From 0ee76078ad32f2d7dd46c38c839965c083b6527b Mon Sep 17 00:00:00 2001
From: szaimen <42591237+szaimen@users.noreply.github.com>
Date: Wed, 28 Jan 2026 12:03:53 +0000
Subject: [PATCH 131/164] php dependency updates
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
---
php/composer.lock | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/php/composer.lock b/php/composer.lock
index ee344d52..77403624 100644
--- a/php/composer.lock
+++ b/php/composer.lock
@@ -4058,16 +4058,16 @@
},
{
"name": "symfony/finder",
- "version": "v6.4.32",
+ "version": "v6.4.33",
"source": {
"type": "git",
"url": "https://github.com/symfony/finder.git",
- "reference": "3ec24885c1d9ababbb9c8f63bb42fea3c8c9b6de"
+ "reference": "24965ca011dac87431729640feef8bcf7b5523e0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/finder/zipball/3ec24885c1d9ababbb9c8f63bb42fea3c8c9b6de",
- "reference": "3ec24885c1d9ababbb9c8f63bb42fea3c8c9b6de",
+ "url": "https://api.github.com/repos/symfony/finder/zipball/24965ca011dac87431729640feef8bcf7b5523e0",
+ "reference": "24965ca011dac87431729640feef8bcf7b5523e0",
"shasum": ""
},
"require": {
@@ -4102,7 +4102,7 @@
"description": "Finds files and directories via an intuitive fluent interface",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/finder/tree/v6.4.32"
+ "source": "https://github.com/symfony/finder/tree/v6.4.33"
},
"funding": [
{
@@ -4122,7 +4122,7 @@
"type": "tidelift"
}
],
- "time": "2026-01-10T14:09:00+00:00"
+ "time": "2026-01-26T13:03:48+00:00"
},
{
"name": "symfony/polyfill-intl-grapheme",
From 27020e608de07b035ff53eb508a41e680b06db2c Mon Sep 17 00:00:00 2001
From: "Simon L."
Date: Wed, 28 Jan 2026 13:28:07 +0100
Subject: [PATCH 132/164] fix get-configurable-aio-variables.sh script
Signed-off-by: Simon L.
Signed-off-by: Simon L.
---
php/get-configurable-aio-variables.sh | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/php/get-configurable-aio-variables.sh b/php/get-configurable-aio-variables.sh
index 44536bd3..3093e1e0 100755
--- a/php/get-configurable-aio-variables.sh
+++ b/php/get-configurable-aio-variables.sh
@@ -1,3 +1,3 @@
#!/usr/bin/env bash
-awk '/^ public [^f][^u][^n]/ { sub(/\$/, "", $3); print $3 }' php/src/Data/ConfigurationManager.php | sort
+awk '/^ public [^f][^u][^n]/ { sub(/\$/, "", $3); print $3 }' src/Data/ConfigurationManager.php | sort
From 9871a3eb9a75910d32e5aa4c806a5e3ed1264f05 Mon Sep 17 00:00:00 2001
From: "Simon L."
Date: Fri, 16 Jan 2026 15:22:18 +0100
Subject: [PATCH 133/164] insert the AIO version into Nextcloud's system config
Signed-off-by: Simon L.
---
php/containers.json | 1 +
php/src/Data/ConfigurationManager.php | 9 +++++++++
php/src/Data/DataConst.php | 4 ++++
3 files changed, 14 insertions(+)
diff --git a/php/containers.json b/php/containers.json
index 8c507f91..8e9218ac 100644
--- a/php/containers.json
+++ b/php/containers.json
@@ -219,6 +219,7 @@
"SIGNALING_SECRET=%SIGNALING_SECRET%",
"ONLYOFFICE_SECRET=%ONLYOFFICE_SECRET%",
"AIO_URL=%AIO_URL%",
+ "NC_AIO_VERSION=v%AIO_VERSION%",
"NEXTCLOUD_MOUNT=%NEXTCLOUD_MOUNT%",
"CLAMAV_ENABLED=%CLAMAV_ENABLED%",
"CLAMAV_HOST=nextcloud-aio-clamav",
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index 25263b50..124e78c6 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -420,6 +420,14 @@ class ConfigurationManager
return $backupTimes;
}
+ public function getAioVersion() : string {
+ $path = DataConst::GetAioVersionFile();
+ if ($path !== '' && file_exists($path)) {
+ return trim((string)file_get_contents($path));
+ }
+ return '';
+ }
+
private function isx64Platform() : bool {
if (php_uname('m') === 'x86_64') {
return true;
@@ -1043,6 +1051,7 @@ class ConfigurationManager
// Allow to get local ip-address of caddy container and add it to trusted proxies automatically
'CADDY_IP_ADDRESS' => in_array('caddy', $this->aioCommunityContainers, true) ? gethostbyname('nextcloud-aio-caddy') : '',
'WHITEBOARD_ENABLED' => $this->isWhiteboardEnabled ? 'yes' : '',
+ 'AIO_VERSION' => $this->getAioVersion(),
default => $this->GetRegisteredSecret($placeholder),
};
}
diff --git a/php/src/Data/DataConst.php b/php/src/Data/DataConst.php
index 9111a98a..9272e3d4 100644
--- a/php/src/Data/DataConst.php
+++ b/php/src/Data/DataConst.php
@@ -66,4 +66,8 @@ class DataConst {
public static function GetContainersDefinitionPath() : string {
return (string)realpath(__DIR__ . '/../../containers.json');
}
+
+ public static function GetAioVersionFile() : string {
+ return (string)realpath(__DIR__ . '/../../templates/includes/aio-version.twig');
+ }
}
From bf43a6dae6e1a760f79ca33f800991e355c6c061 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Wed, 28 Jan 2026 16:51:36 +0100
Subject: [PATCH 134/164] Lower case method names in ConfigurationManager
Signed-off-by: Pablo Zmdl
---
php/public/index.php | 14 +-
php/src/ContainerDefinitionFetcher.php | 2 +-
.../Controller/ConfigurationController.php | 18 +--
php/src/Data/ConfigurationManager.php | 134 +++++++++---------
php/src/Docker/DockerActionManager.php | 4 +-
5 files changed, 86 insertions(+), 86 deletions(-)
diff --git a/php/public/index.php b/php/public/index.php
index 1ec42949..cc06bb90 100644
--- a/php/public/index.php
+++ b/php/public/index.php
@@ -95,10 +95,10 @@ $app->get('/containers', function (Request $request, Response $response, array $
'apache_port' => $configurationManager->apachePort,
'borg_backup_host_location' => $configurationManager->borgBackupHostLocation,
'borg_remote_repo' => $configurationManager->borgRemoteRepo,
- 'borg_public_key' => $configurationManager->GetBorgPublicKey(),
- 'nextcloud_password' => $configurationManager->GetAndGenerateSecret('NEXTCLOUD_PASSWORD'),
+ 'borg_public_key' => $configurationManager->getBorgPublicKey(),
+ 'nextcloud_password' => $configurationManager->getAndGenerateSecret('NEXTCLOUD_PASSWORD'),
'containers' => (new \AIO\ContainerDefinitionFetcher($container->get(\AIO\Data\ConfigurationManager::class), $container))->FetchDefinition(),
- 'borgbackup_password' => $configurationManager->GetAndGenerateSecret('BORGBACKUP_PASSWORD'),
+ 'borgbackup_password' => $configurationManager->getAndGenerateSecret('BORGBACKUP_PASSWORD'),
'is_mastercontainer_update_available' => ( $bypass_mastercontainer_update ? false : $dockerActionManager->IsMastercontainerUpdateAvailable() ),
'has_backup_run_once' => $configurationManager->hasBackupRunOnce(),
'is_backup_container_running' => $dockerActionManager->isBackupContainerRunning(),
@@ -107,15 +107,15 @@ $app->get('/containers', function (Request $request, Response $response, array $
'borg_backup_mode' => $configurationManager->backupMode,
'was_start_button_clicked' => $configurationManager->wasStartButtonClicked,
'has_update_available' => $dockerActionManager->isAnyUpdateAvailable(),
- 'last_backup_time' => $configurationManager->GetLastBackupTime(),
- 'backup_times' => $configurationManager->GetBackupTimes(),
+ 'last_backup_time' => $configurationManager->getLastBackupTime(),
+ 'backup_times' => $configurationManager->getBackupTimes(),
'current_channel' => $dockerActionManager->GetCurrentChannel(),
'is_clamav_enabled' => $configurationManager->isClamavEnabled,
'is_onlyoffice_enabled' => $configurationManager->isOnlyofficeEnabled,
'is_collabora_enabled' => $configurationManager->isCollaboraEnabled,
'is_talk_enabled' => $configurationManager->isTalkEnabled,
'borg_restore_password' => $configurationManager->borgRestorePassword,
- 'daily_backup_time' => $configurationManager->GetDailyBackupTime(),
+ 'daily_backup_time' => $configurationManager->getDailyBackupTime(),
'is_daily_backup_running' => $configurationManager->isDailyBackupRunning(),
'timezone' => $configurationManager->timezone,
'skip_domain_validation' => $configurationManager->shouldDomainValidationBeSkipped($skip_domain_validation),
@@ -126,7 +126,7 @@ $app->get('/containers', function (Request $request, Response $response, array $
'is_backup_section_enabled' => !$configurationManager->disableBackupSection,
'is_imaginary_enabled' => $configurationManager->isImaginaryEnabled,
'is_fulltextsearch_enabled' => $configurationManager->isFulltextsearchEnabled,
- 'additional_backup_directories' => $configurationManager->GetAdditionalBackupDirectoriesString(),
+ 'additional_backup_directories' => $configurationManager->getAdditionalBackupDirectoriesString(),
'nextcloud_datadir' => $configurationManager->nextcloudDatadirMount,
'nextcloud_mount' => $configurationManager->nextcloudMount,
'nextcloud_upload_limit' => $configurationManager->nextcloudUploadLimit,
diff --git a/php/src/ContainerDefinitionFetcher.php b/php/src/ContainerDefinitionFetcher.php
index 831a7bc5..d2519ed7 100644
--- a/php/src/ContainerDefinitionFetcher.php
+++ b/php/src/ContainerDefinitionFetcher.php
@@ -246,7 +246,7 @@ readonly class ContainerDefinitionFetcher {
// All secrets are registered with the configuration when they
// are discovered so they can be later generated at time-of-use.
foreach ($entry['secrets'] as $secret) {
- $this->configurationManager->RegisterSecret($secret);
+ $this->configurationManager->registerSecret($secret);
}
}
diff --git a/php/src/Controller/ConfigurationController.php b/php/src/Controller/ConfigurationController.php
index 8bf193e0..bb55e10f 100644
--- a/php/src/Controller/ConfigurationController.php
+++ b/php/src/Controller/ConfigurationController.php
@@ -20,26 +20,26 @@ readonly class ConfigurationController {
if (isset($request->getParsedBody()['domain'])) {
$domain = $request->getParsedBody()['domain'] ?? '';
$skipDomainValidation = isset($request->getParsedBody()['skip_domain_validation']);
- $this->configurationManager->SetDomain($domain, $skipDomainValidation);
+ $this->configurationManager->setDomain($domain, $skipDomainValidation);
}
if (isset($request->getParsedBody()['current-master-password']) || isset($request->getParsedBody()['new-master-password'])) {
$currentMasterPassword = $request->getParsedBody()['current-master-password'] ?? '';
$newMasterPassword = $request->getParsedBody()['new-master-password'] ?? '';
- $this->configurationManager->ChangeMasterPassword($currentMasterPassword, $newMasterPassword);
+ $this->configurationManager->changeMasterPassword($currentMasterPassword, $newMasterPassword);
}
if (isset($request->getParsedBody()['borg_backup_host_location']) || isset($request->getParsedBody()['borg_remote_repo'])) {
$location = $request->getParsedBody()['borg_backup_host_location'] ?? '';
$borgRemoteRepo = $request->getParsedBody()['borg_remote_repo'] ?? '';
- $this->configurationManager->SetBorgLocationVars($location, $borgRemoteRepo);
+ $this->configurationManager->setBorgLocationVars($location, $borgRemoteRepo);
}
if (isset($request->getParsedBody()['borg_restore_host_location']) || isset($request->getParsedBody()['borg_restore_remote_repo']) || isset($request->getParsedBody()['borg_restore_password'])) {
$restoreLocation = $request->getParsedBody()['borg_restore_host_location'] ?? '';
$borgRemoteRepo = $request->getParsedBody()['borg_restore_remote_repo'] ?? '';
$borgPassword = $request->getParsedBody()['borg_restore_password'] ?? '';
- $this->configurationManager->SetBorgRestoreLocationVarsAndPassword($restoreLocation, $borgRemoteRepo, $borgPassword);
+ $this->configurationManager->setBorgRestoreLocationVarsAndPassword($restoreLocation, $borgRemoteRepo, $borgPassword);
}
if (isset($request->getParsedBody()['daily_backup_time'])) {
@@ -54,16 +54,16 @@ readonly class ConfigurationController {
$successNotification = false;
}
$dailyBackupTime = $request->getParsedBody()['daily_backup_time'] ?? '';
- $this->configurationManager->SetDailyBackupTime($dailyBackupTime, $enableAutomaticUpdates, $successNotification);
+ $this->configurationManager->setDailyBackupTime($dailyBackupTime, $enableAutomaticUpdates, $successNotification);
}
if (isset($request->getParsedBody()['delete_daily_backup_time'])) {
- $this->configurationManager->DeleteDailyBackupTime();
+ $this->configurationManager->deleteDailyBackupTime();
}
if (isset($request->getParsedBody()['additional_backup_directories'])) {
$additionalBackupDirectories = $request->getParsedBody()['additional_backup_directories'] ?? '';
- $this->configurationManager->SetAdditionalBackupDirectories($additionalBackupDirectories);
+ $this->configurationManager->setAdditionalBackupDirectories($additionalBackupDirectories);
}
if (isset($request->getParsedBody()['delete_timezone'])) {
@@ -112,7 +112,7 @@ readonly class ConfigurationController {
}
if (isset($request->getParsedBody()['delete_collabora_dictionaries'])) {
- $this->configurationManager->DeleteCollaboraDictionaries();
+ $this->configurationManager->deleteCollaboraDictionaries();
}
if (isset($request->getParsedBody()['collabora_dictionaries'])) {
@@ -130,7 +130,7 @@ readonly class ConfigurationController {
}
if (isset($request->getParsedBody()['delete_borg_backup_location_vars'])) {
- $this->configurationManager->DeleteBorgBackupLocationItems();
+ $this->configurationManager->deleteBorgBackupLocationItems();
}
return $response->withStatus(201)->withHeader('Location', '.');
diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php
index 124e78c6..e65d5504 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -119,7 +119,7 @@ class ConfigurationManager
public string $domain {
get => $this->get('domain', '');
- set { $this->SetDomain($value); }
+ set { $this->setDomain($value); }
}
public string $borgBackupHostLocation {
@@ -138,7 +138,7 @@ class ConfigurationManager
}
public string $apacheIpBinding {
- get => $this->GetEnvironmentalVariableOrConfig('APACHE_IP_BINDING', 'apache_ip_binding', '');
+ get => $this->getEnvironmentalVariableOrConfig('APACHE_IP_BINDING', 'apache_ip_binding', '');
set { $this->set('apache_ip_binding', $value); }
}
@@ -189,106 +189,106 @@ class ConfigurationManager
}
public string $apachePort {
- get => $this->GetEnvironmentalVariableOrConfig('APACHE_PORT', 'apache_port', '443');
+ get => $this->getEnvironmentalVariableOrConfig('APACHE_PORT', 'apache_port', '443');
set { $this->set('apache_port', $value); }
}
public string $talkPort {
- get => $this->GetEnvironmentalVariableOrConfig('TALK_PORT', 'talk_port', '3478');
+ get => $this->getEnvironmentalVariableOrConfig('TALK_PORT', 'talk_port', '3478');
set { $this->set('talk_port', $value); }
}
public string $nextcloudMount {
- get => $this->GetEnvironmentalVariableOrConfig('NEXTCLOUD_MOUNT', 'nextcloud_mount', '');
+ get => $this->getEnvironmentalVariableOrConfig('NEXTCLOUD_MOUNT', 'nextcloud_mount', '');
set { $this->set('nextcloud_mount', $value); }
}
public string $nextcloudDatadirMount {
- get => $this->GetEnvironmentalVariableOrConfig('NEXTCLOUD_DATADIR', 'nextcloud_datadir', 'nextcloud_aio_nextcloud_data');
+ get => $this->getEnvironmentalVariableOrConfig('NEXTCLOUD_DATADIR', 'nextcloud_datadir', 'nextcloud_aio_nextcloud_data');
set { $this->set('nextcloud_datadir_mount', $value); }
}
public string $nextcloudUploadLimit {
- get => $this->GetEnvironmentalVariableOrConfig('NEXTCLOUD_UPLOAD_LIMIT', 'nextcloud_upload_limit', '16G');
+ get => $this->getEnvironmentalVariableOrConfig('NEXTCLOUD_UPLOAD_LIMIT', 'nextcloud_upload_limit', '16G');
set { $this->set('nextcloud_upload_limit', $value); }
}
public string $nextcloudMemoryLimit {
- get => $this->GetEnvironmentalVariableOrConfig('NEXTCLOUD_MEMORY_LIMIT', 'nextcloud_memory_limit', '512M');
+ get => $this->getEnvironmentalVariableOrConfig('NEXTCLOUD_MEMORY_LIMIT', 'nextcloud_memory_limit', '512M');
set { $this->set('nextcloud_memory_limit', $value); }
}
- public function GetApacheMaxSize() : int {
+ public function getApacheMaxSize() : int {
$uploadLimit = (int)rtrim($this->nextcloudUploadLimit, 'G');
return $uploadLimit * 1024 * 1024 * 1024;
}
public string $nextcloudMaxTime {
- get => $this->GetEnvironmentalVariableOrConfig('NEXTCLOUD_MAX_TIME', 'nextcloud_max_time', '3600');
+ get => $this->getEnvironmentalVariableOrConfig('NEXTCLOUD_MAX_TIME', 'nextcloud_max_time', '3600');
set { $this->set('nextcloud_max_time', $value); }
}
public string $borgRetentionPolicy {
- get => $this->GetEnvironmentalVariableOrConfig('BORG_RETENTION_POLICY', 'borg_retention_policy', '--keep-within=7d --keep-weekly=4 --keep-monthly=6');
+ get => $this->getEnvironmentalVariableOrConfig('BORG_RETENTION_POLICY', 'borg_retention_policy', '--keep-within=7d --keep-weekly=4 --keep-monthly=6');
set { $this->set('borg_retention_policy', $value); }
}
public string $fulltextsearchJavaOptions {
- get => $this->GetEnvironmentalVariableOrConfig('FULLTEXTSEARCH_JAVA_OPTIONS', 'fulltextsearch_java_options', '-Xms512M -Xmx512M');
+ get => $this->getEnvironmentalVariableOrConfig('FULLTEXTSEARCH_JAVA_OPTIONS', 'fulltextsearch_java_options', '-Xms512M -Xmx512M');
set { $this->set('fulltextsearch_java_options', $value); }
}
public string $dockerSocketPath {
- get => $this->GetEnvironmentalVariableOrConfig('WATCHTOWER_DOCKER_SOCKET_PATH', 'docker_socket_path', '/var/run/docker.sock');
+ get => $this->getEnvironmentalVariableOrConfig('WATCHTOWER_DOCKER_SOCKET_PATH', 'docker_socket_path', '/var/run/docker.sock');
set { $this->set('docker_socket_path', $value); }
}
public string $trustedCacertsDir {
- get => $this->GetEnvironmentalVariableOrConfig('NEXTCLOUD_TRUSTED_CACERTS_DIR', 'trusted_cacerts_dir', '');
+ get => $this->getEnvironmentalVariableOrConfig('NEXTCLOUD_TRUSTED_CACERTS_DIR', 'trusted_cacerts_dir', '');
set { $this->set('trusted_cacerts_dir', $value); }
}
public string $nextcloudAdditionalApks {
- get => trim($this->GetEnvironmentalVariableOrConfig('NEXTCLOUD_ADDITIONAL_APKS', 'nextcloud_additional_apks', 'imagemagick'));
+ get => trim($this->getEnvironmentalVariableOrConfig('NEXTCLOUD_ADDITIONAL_APKS', 'nextcloud_additional_apks', 'imagemagick'));
set { $this->set('nextcloud_addtional_apks', $value); }
}
public string $nextcloudAdditionalPhpExtensions {
- get => trim($this->GetEnvironmentalVariableOrConfig('NEXTCLOUD_ADDITIONAL_PHP_EXTENSIONS', 'nextcloud_additional_php_extensions', 'imagick'));
+ get => trim($this->getEnvironmentalVariableOrConfig('NEXTCLOUD_ADDITIONAL_PHP_EXTENSIONS', 'nextcloud_additional_php_extensions', 'imagick'));
set { $this->set('nextcloud_additional_php_extensions', $value); }
}
public bool $collaboraSeccompDisabled {
- get => $this->booleanize($this->GetEnvironmentalVariableOrConfig('COLLABORA_SECCOMP_DISABLED', 'collabora_seccomp_disabled', ''));
+ get => $this->booleanize($this->getEnvironmentalVariableOrConfig('COLLABORA_SECCOMP_DISABLED', 'collabora_seccomp_disabled', ''));
set { $this->set('collabora_seccomp_disabled', $value); }
}
public string $apacheAdditionalNetwork {
- get => $this->GetEnvironmentalVariableOrConfig('APACHE_ADDITIONAL_NETWORK', 'apache_additional_network', '');
+ get => $this->getEnvironmentalVariableOrConfig('APACHE_ADDITIONAL_NETWORK', 'apache_additional_network', '');
set { $this->set('apache_additional_network', $value); }
}
public bool $disableBackupSection {
- get => $this->booleanize($this->GetEnvironmentalVariableOrConfig('AIO_DISABLE_BACKUP_SECTION', 'disable_backup_section', ''));
+ get => $this->booleanize($this->getEnvironmentalVariableOrConfig('AIO_DISABLE_BACKUP_SECTION', 'disable_backup_section', ''));
set { $this->set('disable_backup_section', $value); }
}
public bool $nextcloudEnableDriDevice{
- get => $this->booleanize($this->GetEnvironmentalVariableOrConfig('NEXTCLOUD_ENABLE_DRI_DEVICE', 'nextcloud_enable_dri_device', ''));
+ get => $this->booleanize($this->getEnvironmentalVariableOrConfig('NEXTCLOUD_ENABLE_DRI_DEVICE', 'nextcloud_enable_dri_device', ''));
set { $this->set('nextcloud_enable_dri_device', $value); }
}
public bool $enableNvidiaGpu {
- get => $this->booleanize($this->GetEnvironmentalVariableOrConfig('NEXTCLOUD_ENABLE_NVIDIA_GPU', 'enable_nvidia_gpu', ''));
+ get => $this->booleanize($this->getEnvironmentalVariableOrConfig('NEXTCLOUD_ENABLE_NVIDIA_GPU', 'enable_nvidia_gpu', ''));
set { $this->set('enable_nvidia_gpu', $value); }
}
public bool $nextcloudKeepDisabledApps {
- get => $this->booleanize($this->GetEnvironmentalVariableOrConfig('NEXTCLOUD_KEEP_DISABLED_APPS', 'nextcloud_keep_disabled_apps', ''));
+ get => $this->booleanize($this->getEnvironmentalVariableOrConfig('NEXTCLOUD_KEEP_DISABLED_APPS', 'nextcloud_keep_disabled_apps', ''));
set { $this->set('nextcloud_keep_disabled_apps', $value); }
}
- private function GetConfig() : array
+ private function getConfig() : array
{
if ($this->config === [] && file_exists(DataConst::GetConfigFile()))
{
@@ -300,15 +300,15 @@ class ConfigurationManager
}
private function get(string $key, mixed $fallbackValue = null) : mixed {
- return $this->GetConfig()[$key] ?? $fallbackValue;
+ return $this->getConfig()[$key] ?? $fallbackValue;
}
private function set(string $key, mixed $value) : void {
- $this->GetConfig();
+ $this->getConfig();
$this->config[$key] = $value;
// Only write if this isn't called in between startTransaction() and commitTransaction().
if ($this->noWrite !== true) {
- $this->WriteConfig();
+ $this->writeConfig();
}
}
@@ -317,7 +317,7 @@ class ConfigurationManager
* followed by a call to commitTransaction(), which then writes all changes to disk.
*/
public function startTransaction() : void {
- $this->GetConfig();
+ $this->getConfig();
$this->noWrite = true;
}
@@ -326,13 +326,13 @@ class ConfigurationManager
*/
public function commitTransaction() : void {
try {
- $this->WriteConfig();
+ $this->writeConfig();
} finally {
$this->noWrite = false;
}
}
- public function GetAndGenerateSecret(string $secretId) : string {
+ public function getAndGenerateSecret(string $secretId) : string {
if ($secretId === '') {
return '';
}
@@ -344,24 +344,24 @@ class ConfigurationManager
}
if ($secretId === 'BORGBACKUP_PASSWORD' && !file_exists(DataConst::GetBackupSecretFile())) {
- $this->DoubleSafeBackupSecret($secrets[$secretId]);
+ $this->doubleSafeBackupSecret($secrets[$secretId]);
}
return $secrets[$secretId];
}
- public function GetRegisteredSecret(string $secretId) : string {
+ public function getRegisteredSecret(string $secretId) : string {
if ($this->secrets[$secretId]) {
- return $this->GetAndGenerateSecret($secretId);
+ return $this->getAndGenerateSecret($secretId);
}
throw new \Exception("The secret " . $secretId . " was not registered. Please check if it is defined in secrets of containers.json.");
}
- public function RegisterSecret(string $secretId) : void {
+ public function registerSecret(string $secretId) : void {
$this->secrets[$secretId] = true;
}
- private function DoubleSafeBackupSecret(string $borgBackupPassword) : void {
+ private function doubleSafeBackupSecret(string $borgBackupPassword) : void {
file_put_contents(DataConst::GetBackupSecretFile(), $borgBackupPassword);
}
@@ -373,7 +373,7 @@ class ConfigurationManager
}
}
- public function GetLastBackupTime() : string {
+ public function getLastBackupTime() : string {
if (!file_exists(DataConst::GetBackupArchivesList())) {
return '';
}
@@ -398,7 +398,7 @@ class ConfigurationManager
return $lastBackupTime;
}
- public function GetBackupTimes() : array {
+ public function getBackupTimes() : array {
if (!file_exists(DataConst::GetBackupArchivesList())) {
return [];
}
@@ -441,7 +441,7 @@ class ConfigurationManager
*
* We can't turn this into a private validation method because of the second argument.
*/
- public function SetDomain(string $domain, bool $skipDomainValidation) : void {
+ public function setDomain(string $domain, bool $skipDomainValidation) : void {
// Validate that at least one dot is contained
if (!str_contains($domain, '.')) {
throw new InvalidSettingConfigurationException("Domain must contain at least one dot!");
@@ -508,7 +508,7 @@ class ConfigurationManager
}
// Get Instance ID
- $instanceID = $this->GetAndGenerateSecret('INSTANCE_ID');
+ $instanceID = $this->getAndGenerateSecret('INSTANCE_ID');
// set protocol
if ($port !== '443') {
@@ -555,7 +555,7 @@ class ConfigurationManager
$this->commitTransaction();
}
- public function GetBaseDN() : string {
+ public function getBaseDN() : string {
$domain = $this->domain;
if ($domain === "") {
return "";
@@ -566,15 +566,15 @@ class ConfigurationManager
/**
* @throws InvalidSettingConfigurationException
*/
- public function SetBorgLocationVars(string $location, string $repo) : void {
- $this->ValidateBorgLocationVars($location, $repo);
+ public function setBorgLocationVars(string $location, string $repo) : void {
+ $this->validateBorgLocationVars($location, $repo);
$this->startTransaction();
$this->borgBackupHostLocation = $location;
$this->borgRemoteRepo = $repo;
$this->commitTransaction();
}
- private function ValidateBorgLocationVars(string $location, string $repo) : void {
+ private function validateBorgLocationVars(string $location, string $repo) : void {
if ($location === '' && $repo === '') {
throw new InvalidSettingConfigurationException("Please enter a path or a remote repo url!");
} elseif ($location !== '' && $repo !== '') {
@@ -600,11 +600,11 @@ class ConfigurationManager
}
} else {
- $this->ValidateBorgRemoteRepo($repo);
+ $this->validateBorgRemoteRepo($repo);
}
}
- private function ValidateBorgRemoteRepo(string $repo) : void {
+ private function validateBorgRemoteRepo(string $repo) : void {
$commonMsg = "For valid urls, see the remote examples at https://borgbackup.readthedocs.io/en/stable/usage/general.html#repository-urls";
if ($repo === "") {
// Ok, remote repo is optional
@@ -615,7 +615,7 @@ class ConfigurationManager
}
}
- public function DeleteBorgBackupLocationItems() : void {
+ public function deleteBorgBackupLocationItems() : void {
// Delete the variables
$this->startTransaction();
$this->borgBackupHostLocation = '';
@@ -633,8 +633,8 @@ class ConfigurationManager
/**
* @throws InvalidSettingConfigurationException
*/
- public function SetBorgRestoreLocationVarsAndPassword(string $location, string $repo, string $password) : void {
- $this->ValidateBorgLocationVars($location, $repo);
+ public function setBorgRestoreLocationVarsAndPassword(string $location, string $repo, string $password) : void {
+ $this->validateBorgLocationVars($location, $repo);
if ($password === '') {
throw new InvalidSettingConfigurationException("Please enter the password!");
@@ -651,7 +651,7 @@ class ConfigurationManager
/**
* @throws InvalidSettingConfigurationException
*/
- public function ChangeMasterPassword(string $currentPassword, string $newPassword) : void {
+ public function changeMasterPassword(string $currentPassword, string $newPassword) : void {
if ($currentPassword === '') {
throw new InvalidSettingConfigurationException("Please enter your current password.");
}
@@ -679,7 +679,7 @@ class ConfigurationManager
/**
* @throws InvalidSettingConfigurationException
*/
- private function WriteConfig() : void {
+ private function writeConfig() : void {
if(!is_dir(DataConst::GetDataDirectory())) {
throw new InvalidSettingConfigurationException(DataConst::GetDataDirectory() . " does not exist! Something was set up falsely!");
}
@@ -697,7 +697,7 @@ class ConfigurationManager
$this->config = [];
}
- private function GetEnvironmentalVariableOrConfig(string $envVariableName, string $configName, string $defaultValue) : string {
+ private function getEnvironmentalVariableOrConfig(string $envVariableName, string $configName, string $defaultValue) : string {
$envVariableOutput = getenv($envVariableName);
$configValue = $this->get($configName, '');
if ($envVariableOutput === false) {
@@ -716,7 +716,7 @@ class ConfigurationManager
return $envVariableOutput;
}
- public function GetBorgPublicKey() : string {
+ public function getBorgPublicKey() : string {
if (!file_exists(DataConst::GetBackupPublicKey())) {
return "";
}
@@ -724,7 +724,7 @@ class ConfigurationManager
return trim((string)file_get_contents(DataConst::GetBackupPublicKey()));
}
- public function GetCollaboraSeccompPolicy() : string {
+ public function getCollaboraSeccompPolicy() : string {
$defaultString = '--o:security.seccomp=';
if (!$this->collaboraSeccompDisabled) {
return $defaultString . 'true';
@@ -735,7 +735,7 @@ class ConfigurationManager
/**
* @throws InvalidSettingConfigurationException
*/
- public function SetDailyBackupTime(string $time, bool $enableAutomaticUpdates, bool $successNotification) : void {
+ public function setDailyBackupTime(string $time, bool $enableAutomaticUpdates, bool $successNotification) : void {
if ($time === "") {
throw new InvalidSettingConfigurationException("The daily backup time must not be empty!");
}
@@ -757,7 +757,7 @@ class ConfigurationManager
file_put_contents(DataConst::GetDailyBackupTimeFile(), $time);
}
- public function GetDailyBackupTime() : string {
+ public function getDailyBackupTime() : string {
if (!file_exists(DataConst::GetDailyBackupTimeFile())) {
return '';
}
@@ -779,7 +779,7 @@ class ConfigurationManager
}
}
- public function DeleteDailyBackupTime() : void {
+ public function deleteDailyBackupTime() : void {
if (file_exists(DataConst::GetDailyBackupTimeFile())) {
unlink(DataConst::GetDailyBackupTimeFile());
}
@@ -788,7 +788,7 @@ class ConfigurationManager
/**
* @throws InvalidSettingConfigurationException
*/
- public function SetAdditionalBackupDirectories(string $additionalBackupDirectories) : void {
+ public function setAdditionalBackupDirectories(string $additionalBackupDirectories) : void {
$additionalBackupDirectoriesArray = explode("\n", $additionalBackupDirectories);
$validDirectories = '';
foreach($additionalBackupDirectoriesArray as $entry) {
@@ -809,15 +809,15 @@ class ConfigurationManager
}
}
- public function GetAdditionalBackupDirectoriesString() : string {
+ public function getAdditionalBackupDirectoriesString() : string {
if (!file_exists(DataConst::GetAdditionalBackupDirectoriesFile())) {
return '';
}
return (string)file_get_contents(DataConst::GetAdditionalBackupDirectoriesFile());
}
- public function GetAdditionalBackupDirectoriesArray() : array {
- $additionalBackupDirectories = $this->GetAdditionalBackupDirectoriesString();
+ public function getAdditionalBackupDirectoriesArray() : array {
+ $additionalBackupDirectories = $this->getAdditionalBackupDirectoriesString();
$additionalBackupDirectoriesArray = explode("\n", $additionalBackupDirectories);
$additionalBackupDirectoriesArray = array_unique($additionalBackupDirectoriesArray, SORT_REGULAR);
return $additionalBackupDirectoriesArray;
@@ -854,7 +854,7 @@ class ConfigurationManager
return false;
}
- public function GetNextcloudStartupApps() : string {
+ public function getNextcloudStartupApps() : string {
$apps = getenv('NEXTCLOUD_STARTUP_APPS');
if (is_string($apps)) {
return trim($apps);
@@ -878,7 +878,7 @@ class ConfigurationManager
/**
* Provide an extra method since the corresponding attribute setter prevents setting an empty value.
*/
- public function DeleteCollaboraDictionaries() : void {
+ public function deleteCollaboraDictionaries() : void {
$this->set('collabora_dictionaries', '');
}
@@ -1007,7 +1007,7 @@ class ConfigurationManager
private function getPlaceholderValue(string $placeholder) : string {
return match ($placeholder) {
'NC_DOMAIN' => $this->domain,
- 'NC_BASE_DN' => $this->GetBaseDN(),
+ 'NC_BASE_DN' => $this->getBaseDN(),
'AIO_TOKEN' => $this->aioToken,
'BORGBACKUP_REMOTE_REPO' => $this->borgRemoteRepo,
'BORGBACKUP_MODE' => $this->backupMode,
@@ -1037,11 +1037,11 @@ class ConfigurationManager
'BORG_RETENTION_POLICY' => $this->borgRetentionPolicy,
'FULLTEXTSEARCH_JAVA_OPTIONS' => $this->fulltextsearchJavaOptions,
'NEXTCLOUD_TRUSTED_CACERTS_DIR' => $this->trustedCacertsDir,
- 'ADDITIONAL_DIRECTORIES_BACKUP' => $this->GetAdditionalBackupDirectoriesString() !== '' ? 'yes' : '',
+ 'ADDITIONAL_DIRECTORIES_BACKUP' => $this->getAdditionalBackupDirectoriesString() !== '' ? 'yes' : '',
'BORGBACKUP_HOST_LOCATION' => $this->borgBackupHostLocation,
- 'APACHE_MAX_SIZE' => (string)($this->GetApacheMaxSize()),
- 'COLLABORA_SECCOMP_POLICY' => $this->GetCollaboraSeccompPolicy(),
- 'NEXTCLOUD_STARTUP_APPS' => $this->GetNextcloudStartupApps(),
+ 'APACHE_MAX_SIZE' => (string)($this->getApacheMaxSize()),
+ 'COLLABORA_SECCOMP_POLICY' => $this->getCollaboraSeccompPolicy(),
+ 'NEXTCLOUD_STARTUP_APPS' => $this->getNextcloudStartupApps(),
'NEXTCLOUD_ADDITIONAL_APKS' => $this->nextcloudAdditionalApks,
'NEXTCLOUD_ADDITIONAL_PHP_EXTENSIONS' => $this->nextcloudAdditionalPhpExtensions,
'INSTALL_LATEST_MAJOR' => $this->installLatestMajor ? 'yes' : '',
@@ -1052,7 +1052,7 @@ class ConfigurationManager
'CADDY_IP_ADDRESS' => in_array('caddy', $this->aioCommunityContainers, true) ? gethostbyname('nextcloud-aio-caddy') : '',
'WHITEBOARD_ENABLED' => $this->isWhiteboardEnabled ? 'yes' : '',
'AIO_VERSION' => $this->getAioVersion(),
- default => $this->GetRegisteredSecret($placeholder),
+ default => $this->getRegisteredSecret($placeholder),
};
}
diff --git a/php/src/Docker/DockerActionManager.php b/php/src/Docker/DockerActionManager.php
index db48dc2c..6fea395f 100644
--- a/php/src/Docker/DockerActionManager.php
+++ b/php/src/Docker/DockerActionManager.php
@@ -383,7 +383,7 @@ readonly class DockerActionManager {
// Make volumes read only in case of borgbackup container. The viewer makes them writeable
$isReadOnly = $container->identifier === 'nextcloud-aio-borgbackup';
- foreach ($this->configurationManager->GetAdditionalBackupDirectoriesArray() as $additionalBackupDirectories) {
+ foreach ($this->configurationManager->getAdditionalBackupDirectoriesArray() as $additionalBackupDirectories) {
if ($additionalBackupDirectories !== '') {
if (!str_starts_with($additionalBackupDirectories, '/')) {
$mounts[] = ["Type" => "volume", "Source" => $additionalBackupDirectories, "Target" => "/docker_volumes/" . $additionalBackupDirectories, "ReadOnly" => $isReadOnly];
@@ -940,7 +940,7 @@ readonly class DockerActionManager {
}
public function GetAndGenerateSecretWrapper(string $secretId): string {
- return $this->configurationManager->GetAndGenerateSecret($secretId);
+ return $this->configurationManager->getAndGenerateSecret($secretId);
}
public function isNextcloudImageOutdated(): bool {
From caac0443b3c2639761336d2e9cb639b3a6600d25 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 29 Jan 2026 04:07:36 +0000
Subject: [PATCH 135/164] build(deps): bump alpine from 3.23.2 to 3.23.3 in
/Containers/alpine
Bumps alpine from 3.23.2 to 3.23.3.
---
updated-dependencies:
- dependency-name: alpine
dependency-version: 3.23.3
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot]
---
Containers/alpine/Dockerfile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Containers/alpine/Dockerfile b/Containers/alpine/Dockerfile
index 718c5510..1098b4c4 100644
--- a/Containers/alpine/Dockerfile
+++ b/Containers/alpine/Dockerfile
@@ -1,5 +1,5 @@
# syntax=docker/dockerfile:latest
-FROM alpine:3.23.2
+FROM alpine:3.23.3
RUN set -ex; \
apk upgrade --no-cache -a
From 120c9ba9274649e141eea4c5e39c04b8bd2cd804 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 29 Jan 2026 04:07:42 +0000
Subject: [PATCH 136/164] build(deps): bump alpine from 3.23.2 to 3.23.3 in
/Containers/borgbackup
Bumps alpine from 3.23.2 to 3.23.3.
---
updated-dependencies:
- dependency-name: alpine
dependency-version: 3.23.3
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot]
---
Containers/borgbackup/Dockerfile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Containers/borgbackup/Dockerfile b/Containers/borgbackup/Dockerfile
index 97d6198b..6e3180cb 100644
--- a/Containers/borgbackup/Dockerfile
+++ b/Containers/borgbackup/Dockerfile
@@ -1,5 +1,5 @@
# syntax=docker/dockerfile:latest
-FROM alpine:3.23.2
+FROM alpine:3.23.3
RUN set -ex; \
\
From da70dafa3d96799bbcef956d5bfda5a88e02298e Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 29 Jan 2026 04:07:45 +0000
Subject: [PATCH 137/164] build(deps): bump alpine from 3.23.2 to 3.23.3 in
/Containers/clamav
Bumps alpine from 3.23.2 to 3.23.3.
---
updated-dependencies:
- dependency-name: alpine
dependency-version: 3.23.3
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot]
---
Containers/clamav/Dockerfile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Containers/clamav/Dockerfile b/Containers/clamav/Dockerfile
index e81fb06e..6910ae1c 100644
--- a/Containers/clamav/Dockerfile
+++ b/Containers/clamav/Dockerfile
@@ -1,5 +1,5 @@
# syntax=docker/dockerfile:latest
-FROM alpine:3.23.2
+FROM alpine:3.23.3
RUN set -ex; \
apk upgrade --no-cache -a; \
From b3a4eda249f570ef1c7318615f46b11c5f05ab10 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 29 Jan 2026 04:07:46 +0000
Subject: [PATCH 138/164] build(deps): bump collabora/code in
/Containers/collabora
Bumps collabora/code from 25.04.8.1.1 to 25.04.8.2.1.
---
updated-dependencies:
- dependency-name: collabora/code
dependency-version: 25.04.8.2.1
dependency-type: direct:production
...
Signed-off-by: dependabot[bot]
---
Containers/collabora/Dockerfile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Containers/collabora/Dockerfile b/Containers/collabora/Dockerfile
index 976360cb..d1693da0 100644
--- a/Containers/collabora/Dockerfile
+++ b/Containers/collabora/Dockerfile
@@ -1,6 +1,6 @@
# syntax=docker/dockerfile:latest
# From a file located probably somewhere here: https://github.com/CollaboraOnline/online/blob/master/docker/from-packages/Dockerfile
-FROM collabora/code:25.04.8.1.1
+FROM collabora/code:25.04.8.2.1
USER root
ARG DEBIAN_FRONTEND=noninteractive
From abdcc9f551c30ae01366c6757a9a0d5550607a03 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 29 Jan 2026 04:07:52 +0000
Subject: [PATCH 139/164] build(deps): bump alpine in /Containers/domaincheck
Bumps alpine from 3.23.2 to 3.23.3.
---
updated-dependencies:
- dependency-name: alpine
dependency-version: 3.23.3
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot]
---
Containers/domaincheck/Dockerfile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Containers/domaincheck/Dockerfile b/Containers/domaincheck/Dockerfile
index 8122f315..374aba4a 100644
--- a/Containers/domaincheck/Dockerfile
+++ b/Containers/domaincheck/Dockerfile
@@ -1,5 +1,5 @@
# syntax=docker/dockerfile:latest
-FROM alpine:3.23.2
+FROM alpine:3.23.3
RUN set -ex; \
apk upgrade --no-cache -a; \
apk add --no-cache bash lighttpd netcat-openbsd; \
From 8e48e92ebcfbdd0a88f1fda6d8680cb694c99dda Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 29 Jan 2026 04:07:58 +0000
Subject: [PATCH 140/164] build(deps): bump alpine from 3.23.2 to 3.23.3 in
/Containers/imaginary
Bumps alpine from 3.23.2 to 3.23.3.
---
updated-dependencies:
- dependency-name: alpine
dependency-version: 3.23.3
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot]
---
Containers/imaginary/Dockerfile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Containers/imaginary/Dockerfile b/Containers/imaginary/Dockerfile
index 650c4c67..b108ac18 100644
--- a/Containers/imaginary/Dockerfile
+++ b/Containers/imaginary/Dockerfile
@@ -14,7 +14,7 @@ RUN set -ex; \
build-base; \
go install github.com/h2non/imaginary@"$IMAGINARY_HASH";
-FROM alpine:3.23.2
+FROM alpine:3.23.3
RUN set -ex; \
apk upgrade --no-cache -a; \
apk add --no-cache \
From d6f1bdd8d39b3d00d2a0bad2a29d7aed67daf0fd Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 29 Jan 2026 04:08:35 +0000
Subject: [PATCH 141/164] build(deps): bump alpine in /Containers/notify-push
Bumps alpine from 3.23.2 to 3.23.3.
---
updated-dependencies:
- dependency-name: alpine
dependency-version: 3.23.3
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot]
---
Containers/notify-push/Dockerfile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Containers/notify-push/Dockerfile b/Containers/notify-push/Dockerfile
index 425115c4..838c847c 100644
--- a/Containers/notify-push/Dockerfile
+++ b/Containers/notify-push/Dockerfile
@@ -1,5 +1,5 @@
# syntax=docker/dockerfile:latest
-FROM alpine:3.23.2
+FROM alpine:3.23.3
COPY --chmod=775 start.sh /start.sh
COPY --chmod=775 healthcheck.sh /healthcheck.sh
From 3ba704b233f89ba00099e2d5db11b31a5a737c5c Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 29 Jan 2026 04:08:41 +0000
Subject: [PATCH 142/164] build(deps): bump alpine from 3.23.2 to 3.23.3 in
/Containers/talk
Bumps alpine from 3.23.2 to 3.23.3.
---
updated-dependencies:
- dependency-name: alpine
dependency-version: 3.23.3
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot]
---
Containers/talk/Dockerfile | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Containers/talk/Dockerfile b/Containers/talk/Dockerfile
index fc8cc54a..e8d3d72f 100644
--- a/Containers/talk/Dockerfile
+++ b/Containers/talk/Dockerfile
@@ -2,7 +2,7 @@
FROM nats:2.12.4-scratch AS nats
FROM eturnal/eturnal:1.12.2-alpine AS eturnal
FROM strukturag/nextcloud-spreed-signaling:2.0.4 AS signaling
-FROM alpine:3.23.2 AS janus
+FROM alpine:3.23.3 AS janus
ARG JANUS_VERSION=v1.3.3
WORKDIR /src
@@ -35,7 +35,7 @@ RUN set -ex; \
make configs; \
rename -v ".jcfg.sample" ".jcfg" /usr/local/etc/janus/*.jcfg.sample
-FROM alpine:3.23.2
+FROM alpine:3.23.3
ENV ETURNAL_ETC_DIR="/conf"
ENV SKIP_CERT_VERIFY=false
COPY --from=janus --chmod=777 --chown=1000:1000 /usr/local /usr/local
From a72b79f63bad3f1c3613692b728d2ba74128e46b Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 29 Jan 2026 04:08:55 +0000
Subject: [PATCH 143/164] build(deps): bump alpine from 3.23.2 to 3.23.3 in
/Containers/watchtower
Bumps alpine from 3.23.2 to 3.23.3.
---
updated-dependencies:
- dependency-name: alpine
dependency-version: 3.23.3
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot]
---
Containers/watchtower/Dockerfile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Containers/watchtower/Dockerfile b/Containers/watchtower/Dockerfile
index 83bccc07..fc9ea093 100644
--- a/Containers/watchtower/Dockerfile
+++ b/Containers/watchtower/Dockerfile
@@ -9,7 +9,7 @@ RUN set -ex; \
build-base; \
go install github.com/nicholas-fedor/watchtower@$WATCHTOWER_COMMIT_HASH # v1.14.0
-FROM alpine:3.23.2
+FROM alpine:3.23.3
RUN set -ex; \
apk upgrade --no-cache -a; \
From 7de7ee1244bd19107da284ce0427bc0415d1b58a Mon Sep 17 00:00:00 2001
From: "Simon L."
Date: Thu, 29 Jan 2026 09:47:21 +0100
Subject: [PATCH 144/164] apply suggestion
Signed-off-by: Simon L.
---
.github/pull_request_template.md | 19 +------------------
1 file changed, 1 insertion(+), 18 deletions(-)
diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
index 7958ceab..0350cecc 100644
--- a/.github/pull_request_template.md
+++ b/.github/pull_request_template.md
@@ -5,21 +5,4 @@
-->
* Resolves: #
-
-## Summary
-
-
-## TODO
-
-- [ ] ...
-
-## Checklist
-
-- Code is [properly formatted](https://docs.nextcloud.com/server/latest/developer_manual/digging_deeper/continuous_integration.html#linting)
-- [Sign-off message](https://github.com/src-d/guide/blob/master/developer-community/fix-DCO.md) is added to all commits
-- [ ] Tests ([unit](https://docs.nextcloud.com/server/latest/developer_manual/app_development/tutorial.html#unit-tests), [integration](https://docs.nextcloud.com/server/latest/developer_manual/app_development/tutorial.html#integration-tests), api and/or acceptance) are included
-- [ ] Screenshots before/after for front-end changes
-- [ ] Documentation ([manuals](https://github.com/nextcloud/documentation/) or wiki) has been updated or is not required
-- [ ] [Backports requested](https://github.com/nextcloud/backportbot/#usage) where applicable (ex: critical bugfixes)
-- [ ] [Labels added](https://github.com/nextcloud/server/labels) where applicable (ex: bug/enhancement, `3. to review`, feature component)
-- [ ] [Milestone added](https://github.com/nextcloud/server/milestones) for target branch/version (ex: 32.x for `stable32`)
+* [Sign-off message](https://github.com/src-d/guide/blob/master/developer-community/fix-DCO.md) is added to all commits
From b47e89468157cba66f2c1d3f78a344bf38abc199 Mon Sep 17 00:00:00 2001
From: "Simon L."
Date: Thu, 29 Jan 2026 09:54:34 +0100
Subject: [PATCH 145/164] increase timeout for backup restore
Signed-off-by: Simon L.
---
php/tests/tests/restore-instance.spec.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/php/tests/tests/restore-instance.spec.js b/php/tests/tests/restore-instance.spec.js
index e93cf340..696a4376 100644
--- a/php/tests/tests/restore-instance.spec.js
+++ b/php/tests/tests/restore-instance.spec.js
@@ -74,7 +74,7 @@ test('Restore instance', async ({ page: setupPage }) => {
dialog.accept()
});
await containersPage.getByRole('button', { name: 'Start and update containers' }).click();
- await expect(containersPage.getByRole('link', { name: 'Open your Nextcloud ↗' })).toBeVisible({ timeout: 5 * 60 * 1000 });
+ await expect(containersPage.getByRole('link', { name: 'Open your Nextcloud ↗' })).toBeVisible({ timeout: 8 * 60 * 1000 });
await expect(containersPage.getByRole('main')).toContainText(initialNextcloudPassword);
// Verify that containers are all stopped
From ff3fb24fa772f02825351af5adda03364c77195b Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Thu, 29 Jan 2026 12:10:04 +0000
Subject: [PATCH 146/164] build(deps): bump peter-evans/create-pull-request in
/.github/workflows
Bumps [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) from 7.0.11 to 8.1.0.
- [Release notes](https://github.com/peter-evans/create-pull-request/releases)
- [Commits](https://github.com/peter-evans/create-pull-request/compare/22a9089034f40e5a961c8808d113e2c98fb63676...c0f553fe549906ede9cf27b5156039d195d2ece0)
---
updated-dependencies:
- dependency-name: peter-evans/create-pull-request
dependency-version: 8.1.0
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot]
---
.github/workflows/collabora.yml | 2 +-
.github/workflows/dependency-updates.yml | 2 +-
.github/workflows/imaginary-update.yml | 2 +-
.github/workflows/nextcloud-update.yml | 2 +-
.github/workflows/psalm-update-baseline.yml | 2 +-
.github/workflows/talk.yml | 2 +-
.github/workflows/update-helm.yml | 2 +-
.github/workflows/update-yaml.yml | 2 +-
.github/workflows/watchtower-update.yml | 2 +-
9 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/.github/workflows/collabora.yml b/.github/workflows/collabora.yml
index 81ea8ff1..a61067f3 100644
--- a/.github/workflows/collabora.yml
+++ b/.github/workflows/collabora.yml
@@ -18,7 +18,7 @@ jobs:
mv cool-seccomp-profile.json php/
- name: Create Pull Request
- uses: peter-evans/create-pull-request@22a9089034f40e5a961c8808d113e2c98fb63676 # v7
+ uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 # v7
with:
commit-message: collabora-seccomp-update automated change
signoff: true
diff --git a/.github/workflows/dependency-updates.yml b/.github/workflows/dependency-updates.yml
index 7bdc5d1a..3805a0d0 100644
--- a/.github/workflows/dependency-updates.yml
+++ b/.github/workflows/dependency-updates.yml
@@ -44,7 +44,7 @@ jobs:
)"
sed -i "s|pecl install APCu.*\;|pecl install APCu-$apcu_version\;|" ./Containers/mastercontainer/Dockerfile
- name: Create Pull Request
- uses: peter-evans/create-pull-request@22a9089034f40e5a961c8808d113e2c98fb63676 # v7
+ uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 # v7
with:
commit-message: php dependency updates
signoff: true
diff --git a/.github/workflows/imaginary-update.yml b/.github/workflows/imaginary-update.yml
index 171fb132..05050a20 100644
--- a/.github/workflows/imaginary-update.yml
+++ b/.github/workflows/imaginary-update.yml
@@ -22,7 +22,7 @@ jobs:
sed -i "s|^ENV IMAGINARY_HASH.*$|ENV IMAGINARY_HASH=$imaginary_version|" ./Containers/imaginary/Dockerfile
- name: Create Pull Request
- uses: peter-evans/create-pull-request@22a9089034f40e5a961c8808d113e2c98fb63676 # v7
+ uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 # v7
with:
commit-message: imaginary-update automated change
signoff: true
diff --git a/.github/workflows/nextcloud-update.yml b/.github/workflows/nextcloud-update.yml
index 5b420c20..b2475290 100644
--- a/.github/workflows/nextcloud-update.yml
+++ b/.github/workflows/nextcloud-update.yml
@@ -79,7 +79,7 @@ jobs:
fi
- name: Create Pull Request
- uses: peter-evans/create-pull-request@22a9089034f40e5a961c8808d113e2c98fb63676 # v7
+ uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 # v7
with:
commit-message: nextcloud-update automated change
signoff: true
diff --git a/.github/workflows/psalm-update-baseline.yml b/.github/workflows/psalm-update-baseline.yml
index 0c2f8aee..bcbb12c3 100644
--- a/.github/workflows/psalm-update-baseline.yml
+++ b/.github/workflows/psalm-update-baseline.yml
@@ -30,7 +30,7 @@ jobs:
continue-on-error: true
- name: Create Pull Request
- uses: peter-evans/create-pull-request@22a9089034f40e5a961c8808d113e2c98fb63676 # v7
+ uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 # v7
with:
token: ${{ secrets.COMMAND_BOT_PAT }}
commit-message: Update psalm baseline
diff --git a/.github/workflows/talk.yml b/.github/workflows/talk.yml
index 28f9fef7..b19e1cb5 100644
--- a/.github/workflows/talk.yml
+++ b/.github/workflows/talk.yml
@@ -45,7 +45,7 @@ jobs:
sed -i "s|^ARG JANUS_VERSION=.*$|ARG JANUS_VERSION=$janus_version|" ./Containers/talk/Dockerfile
- name: Create Pull Request
- uses: peter-evans/create-pull-request@22a9089034f40e5a961c8808d113e2c98fb63676 # v7
+ uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 # v7
with:
commit-message: talk-update automated change
signoff: true
diff --git a/.github/workflows/update-helm.yml b/.github/workflows/update-helm.yml
index 2dcd2e73..92cbb978 100644
--- a/.github/workflows/update-helm.yml
+++ b/.github/workflows/update-helm.yml
@@ -23,7 +23,7 @@ jobs:
sudo bash nextcloud-aio-helm-chart/update-helm.sh "$DOCKER_TAG"
fi
- name: Create Pull Request
- uses: peter-evans/create-pull-request@22a9089034f40e5a961c8808d113e2c98fb63676 # v7
+ uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 # v7
with:
commit-message: Helm Chart updates
signoff: true
diff --git a/.github/workflows/update-yaml.yml b/.github/workflows/update-yaml.yml
index a60ea1c6..6e150261 100644
--- a/.github/workflows/update-yaml.yml
+++ b/.github/workflows/update-yaml.yml
@@ -16,7 +16,7 @@ jobs:
run: |
sudo bash manual-install/update-yaml.sh
- name: Create Pull Request
- uses: peter-evans/create-pull-request@22a9089034f40e5a961c8808d113e2c98fb63676 # v7
+ uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 # v7
with:
commit-message: Yaml updates
signoff: true
diff --git a/.github/workflows/watchtower-update.yml b/.github/workflows/watchtower-update.yml
index c04657be..ecd82a69 100644
--- a/.github/workflows/watchtower-update.yml
+++ b/.github/workflows/watchtower-update.yml
@@ -26,7 +26,7 @@ jobs:
sed -i "s|\$WATCHTOWER_COMMIT_HASH.*$|\$WATCHTOWER_COMMIT_HASH # $watchtower_version|" ./Containers/watchtower/Dockerfile
- name: Create Pull Request
- uses: peter-evans/create-pull-request@22a9089034f40e5a961c8808d113e2c98fb63676 # v7
+ uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 # v7
with:
commit-message: watchtower-update automated change
signoff: true
From c64ecba63c3ce3e5b07b1ffb566b5a9a5811ac6b Mon Sep 17 00:00:00 2001
From: "Simon L."
Date: Wed, 28 Jan 2026 18:46:01 +0100
Subject: [PATCH 147/164] Update GPG key import method in entrypoint.sh
Signed-off-by: Simon L.
---
Containers/nextcloud/entrypoint.sh | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/Containers/nextcloud/entrypoint.sh b/Containers/nextcloud/entrypoint.sh
index 5f47a0f4..d4b4f253 100644
--- a/Containers/nextcloud/entrypoint.sh
+++ b/Containers/nextcloud/entrypoint.sh
@@ -182,8 +182,11 @@ if ! [ -f "$NEXTCLOUD_DATA_DIR/skip.update" ]; then
curl -fsSL -o nextcloud.tar.bz2.asc "https://download.nextcloud.com/server/releases/latest-${NEXT_MAJOR}.tar.bz2.asc"
GNUPGHOME="$(mktemp -d)"
export GNUPGHOME
- # gpg key from https://nextcloud.com/nextcloud.asc
- gpg --batch --keyserver keyserver.ubuntu.com --recv-keys 28806A878AE423A28372792ED75899B9A724937A
+ if ! gpg --batch --keyserver keyserver.ubuntu.com --recv-keys 28806A878AE423A28372792ED75899B9A724937A; then
+ if ! gpg --batch --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 28806A878AE423A28372792ED75899B9A724937A; then
+ curl -sSL https://nextcloud.com/nextcloud.asc | gpg --import
+ fi
+ fi
gpg --batch --verify nextcloud.tar.bz2.asc nextcloud.tar.bz2
mkdir -p /usr/src/tmp
tar -xjf nextcloud.tar.bz2 -C /usr/src/tmp/
From a5efaafef20f1b60116021489db566807a7deb71 Mon Sep 17 00:00:00 2001
From: "Simon L."
Date: Thu, 29 Jan 2026 13:54:31 +0100
Subject: [PATCH 148/164] update-yaml.sh: remove the `NC_AIO_VERSION`
Signed-off-by: Simon L.
---
manual-install/update-yaml.sh | 1 +
1 file changed, 1 insertion(+)
diff --git a/manual-install/update-yaml.sh b/manual-install/update-yaml.sh
index af746aee..928275da 100644
--- a/manual-install/update-yaml.sh
+++ b/manual-install/update-yaml.sh
@@ -47,6 +47,7 @@ sed -i '/AIO_URL/d' containers.yml
sed -i '/DOCKER_SOCKET_PROXY_ENABLED/d' containers.yml
sed -i '/ADDITIONAL_TRUSTED_PROXY/d' containers.yml
sed -i '/TURN_DOMAIN/d' containers.yml
+sed -i '/NC_AIO_VERSION/d' containers.yml
TCP="$(grep -oP '[%A-Z0-9_]+/tcp' containers.yml | sort -u)"
mapfile -t TCP <<< "$TCP"
From ffd8dac1b4e95c05e7c0c27d66653576d0ffeb6e Mon Sep 17 00:00:00 2001
From: MrAn0nym <63542658+MrAn0nym@users.noreply.github.com>
Date: Thu, 29 Jan 2026 14:29:15 +0100
Subject: [PATCH 149/164] Fix: Additional Collabora options not working
correctly (#7481)
Signed-off-by: MrAn0nym <63542658+MrAn0nym@users.noreply.github.com>
Signed-off-by: Simon L.
Co-authored-by: Simon L.
Co-authored-by: Pablo Zmdl <57864086+pabzm@users.noreply.github.com>
---
php/src/Docker/DockerActionManager.php | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/php/src/Docker/DockerActionManager.php b/php/src/Docker/DockerActionManager.php
index 6fea395f..a8891c3c 100644
--- a/php/src/Docker/DockerActionManager.php
+++ b/php/src/Docker/DockerActionManager.php
@@ -420,7 +420,13 @@ readonly class DockerActionManager {
// Additional Collabora options
if ($this->configurationManager->collaboraAdditionalOptions !== '') {
- $requestBody['Cmd'] = [$this->configurationManager->collaboraAdditionalOptions];
+ // Split the list of Collabora options, which are stored as a string but must be assigned as an array.
+ // To avoid problems with whitespace or dashes in option arguments we use a regular expression
+ // that splits the string at every position where a whitespace is followed by '--o:'.
+ // The leading whitespace is removed in the split but the following characters are not.
+ // Example: "--o:example_config1='some thing' --o:example_config2=something-else" -> ["--o:example_config1='some thing'", "--o:example_config2=something-else"]
+ $regEx = '/\s+(?=--o:)/';
+ $requestBody['Cmd'] = preg_split($regEx, rtrim($this->configurationManager->collaboraAdditionalOptions));
}
}
From ec6850be6371249654f5834bfe85182d0450b2f7 Mon Sep 17 00:00:00 2001
From: "Simon L."