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 01/95] 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 02/95] 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 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 03/95] 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 04/95] 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 05/95] 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 06/95] 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 07/95] 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 08/95] 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 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 09/95] 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 10/95] 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 11/95] 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 12/95] 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 13/95] 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 14/95] 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 15/95] 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 16/95] 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 17/95] `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 18/95] 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 19/95] 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 20/95] 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 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 21/95] 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 22/95] 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 23/95] 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 4b011369ae490b1508b13b8a95f80a92cd2c8708 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Wed, 7 Jan 2026 17:29:24 +0100
Subject: [PATCH 24/95] 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 9be2c36a6bed83ae225d903c97cf5bba50617b11 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 19 Jan 2026 11:43:43 +0100
Subject: [PATCH 25/95] 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 85654218dd466082a707c9b999aaf965e4a82fa2 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Tue, 20 Jan 2026 18:22:40 +0100
Subject: [PATCH 26/95] 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 681ec13b8d39f5026fbe4e22ece1fbaf20a73f71 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 19 Jan 2026 12:37:36 +0100
Subject: [PATCH 27/95] 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 1eadbe7e7e617f1525cd6b80b606ccf67bf3a889 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 19 Jan 2026 14:55:29 +0100
Subject: [PATCH 28/95] 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 8f02821866c93b5e0240a17ae1a807025d424816 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 19 Jan 2026 13:11:20 +0100
Subject: [PATCH 29/95] 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 68c508f281dd4e2cdeb97f5079777184e6bd793e Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 19 Jan 2026 13:09:52 +0100
Subject: [PATCH 30/95] 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 c608009981adb05374ea92e4f703c51c482d06af Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 19 Jan 2026 13:06:59 +0100
Subject: [PATCH 31/95] 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 0c20e2b2f908d3bb40c2a1265b165eb4b9fcbd08 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 19 Jan 2026 13:05:10 +0100
Subject: [PATCH 32/95] 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 a1bb53a4008de61830fb5522654c9be34cfc13ad Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 19 Jan 2026 13:02:19 +0100
Subject: [PATCH 33/95] 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 419eede1c03a155fc11ac483f2ed7bb3ff940ed7 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 19 Jan 2026 13:00:22 +0100
Subject: [PATCH 34/95] 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 45586f9c..c63c7a05 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 af76dbaeebe9e9cf674d6da75f95d925e860a20d Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 19 Jan 2026 12:58:50 +0100
Subject: [PATCH 35/95] 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 33fb191dfcd3a20667088733bccf1be3b157d7f8 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 19 Jan 2026 12:56:10 +0100
Subject: [PATCH 36/95] 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 c63c7a05..ecd7bc8a 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 e4fe52f6944571db6bf72a8bbf18e191aab789b4 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 19 Jan 2026 12:52:03 +0100
Subject: [PATCH 37/95] 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 1013cb02fded21c1055dd767a63aeaeb649564de Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 19 Jan 2026 12:01:53 +0100
Subject: [PATCH 38/95] 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 ecd7bc8a..1ca02283 100644
--- a/php/src/Controller/ConfigurationController.php
+++ b/php/src/Controller/ConfigurationController.php
@@ -79,11 +79,7 @@ readonly class ConfigurationController {
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!");
}
- 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()['onlyoffice'])) {
$this->configurationManager->SetOnlyofficeEnabledState(1);
} else {
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 2c7f32c4d4c8b40a7ce66d93d85db58e9739a89a Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 19 Jan 2026 12:02:41 +0100
Subject: [PATCH 39/95] Make `isOnlyofficeEnabled` 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 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 1ca02283..7254dbf0 100644
--- a/php/src/Controller/ConfigurationController.php
+++ b/php/src/Controller/ConfigurationController.php
@@ -80,11 +80,7 @@ readonly class ConfigurationController {
throw new InvalidSettingConfigurationException("Collabora and Onlyoffice are not allowed to be enabled at the same time!");
}
$this->configurationManager->isClamavEnabled = isset($request->getParsedBody()['clamav']);
- if (isset($request->getParsedBody()['onlyoffice'])) {
- $this->configurationManager->SetOnlyofficeEnabledState(1);
- } else {
- $this->configurationManager->SetOnlyofficeEnabledState(0);
- }
+ $this->configurationManager->isOnlyofficeEnabled = isset($request->getParsedBody()['onlyoffice']);
if (isset($request->getParsedBody()['collabora'])) {
$this->configurationManager->SetCollaboraEnabledState(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 18e5141c1566bd092f7bf4d7c9778ddb581a1c0d Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 19 Jan 2026 12:03:12 +0100
Subject: [PATCH 40/95] 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, 11 insertions(+), 25 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 7254dbf0..d69d4bc9 100644
--- a/php/src/Controller/ConfigurationController.php
+++ b/php/src/Controller/ConfigurationController.php
@@ -81,11 +81,7 @@ readonly class ConfigurationController {
}
$this->configurationManager->isClamavEnabled = isset($request->getParsedBody()['clamav']);
$this->configurationManager->isOnlyofficeEnabled = isset($request->getParsedBody()['onlyoffice']);
- if (isset($request->getParsedBody()['collabora'])) {
- $this->configurationManager->SetCollaboraEnabledState(1);
- } else {
- $this->configurationManager->SetCollaboraEnabledState(0);
- }
+ $this->configurationManager->isCollaboraEnabled = isset($request->getParsedBody()['collabora']);
if (isset($request->getParsedBody()['talk'])) {
$this->configurationManager->SetTalkEnabledState(1);
} else {
diff --git a/php/src/Controller/DockerController.php b/php/src/Controller/DockerController.php
index 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 d895e0d8e165ae4e27d3c23e73c717c44eeeaf01 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 19 Jan 2026 12:03:38 +0100
Subject: [PATCH 41/95] 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 d69d4bc9..b3e9296b 100644
--- a/php/src/Controller/ConfigurationController.php
+++ b/php/src/Controller/ConfigurationController.php
@@ -82,11 +82,7 @@ readonly class ConfigurationController {
$this->configurationManager->isClamavEnabled = isset($request->getParsedBody()['clamav']);
$this->configurationManager->isOnlyofficeEnabled = isset($request->getParsedBody()['onlyoffice']);
$this->configurationManager->isCollaboraEnabled = isset($request->getParsedBody()['collabora']);
- 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 52c981f49a975325ae46163646347e3093dd1751 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 19 Jan 2026 12:04:04 +0100
Subject: [PATCH 42/95] 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 b3e9296b..7a3cf81d 100644
--- a/php/src/Controller/ConfigurationController.php
+++ b/php/src/Controller/ConfigurationController.php
@@ -83,11 +83,7 @@ readonly class ConfigurationController {
$this->configurationManager->isOnlyofficeEnabled = isset($request->getParsedBody()['onlyoffice']);
$this->configurationManager->isCollaboraEnabled = isset($request->getParsedBody()['collabora']);
$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 a58c41e750b8d731822f3a88b9263a8edc0c0e56 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 19 Jan 2026 12:04:24 +0100
Subject: [PATCH 43/95] 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 7a3cf81d..5ae705c3 100644
--- a/php/src/Controller/ConfigurationController.php
+++ b/php/src/Controller/ConfigurationController.php
@@ -84,11 +84,7 @@ readonly class ConfigurationController {
$this->configurationManager->isCollaboraEnabled = isset($request->getParsedBody()['collabora']);
$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 6767fcfc8a2cb057148276d704cc538b77b3fe35 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 19 Jan 2026 12:04:48 +0100
Subject: [PATCH 44/95] 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 5ae705c3..f707b750 100644
--- a/php/src/Controller/ConfigurationController.php
+++ b/php/src/Controller/ConfigurationController.php
@@ -85,11 +85,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 792593538175c3c9fd78a804f366c4bb819325d5 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 19 Jan 2026 12:06:20 +0100
Subject: [PATCH 45/95] 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 4d246add8acc98be22e5340986e5e4fa01718496 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 19 Jan 2026 12:07:45 +0100
Subject: [PATCH 46/95] 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 6df0333f71ac0b0d6496d84fbb848f2f0de1dff1 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 19 Jan 2026 12:14:39 +0100
Subject: [PATCH 47/95] 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 f030abcafdfe1d2f632f550fc2f4d52bdc72475c Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 19 Jan 2026 12:16:30 +0100
Subject: [PATCH 48/95] 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 9df3a7b231794cbe03043e0e36eaba23a5f9f8e6 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 19 Jan 2026 12:17:25 +0100
Subject: [PATCH 49/95] 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 f707b750..b3a22547 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 e13c6083fea56adfea44e9b2d1d5b1258fe39db7 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 19 Jan 2026 12:18:45 +0100
Subject: [PATCH 50/95] 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 b3a22547..96908a29 100644
--- a/php/src/Controller/ConfigurationController.php
+++ b/php/src/Controller/ConfigurationController.php
@@ -110,7 +110,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 b6e429f1f373a69adf9a95e45fbb0c4df1f0e1e2 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 19 Jan 2026 12:21:23 +0100
Subject: [PATCH 51/95] 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 96908a29..3be60af1 100644
--- a/php/src/Controller/ConfigurationController.php
+++ b/php/src/Controller/ConfigurationController.php
@@ -114,12 +114,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 772fab95775902d4cdebb10f5f658dd78753a80d Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 19 Jan 2026 15:44:22 +0100
Subject: [PATCH 52/95] 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 3be60af1..0330d082 100644
--- a/php/src/Controller/ConfigurationController.php
+++ b/php/src/Controller/ConfigurationController.php
@@ -101,7 +101,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 a3a2a034c015df309e9b1a965e77ea12954496fb Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 19 Jan 2026 12:23:22 +0100
Subject: [PATCH 53/95] 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 ead6ec088fbb90bc4bc0c65e0b5677e3ca985d18 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Tue, 20 Jan 2026 12:45:00 +0100
Subject: [PATCH 54/95] 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 a7c35eda5a56f7ab54122558c9e4c7e256d8b1ea Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Tue, 20 Jan 2026 12:47:45 +0100
Subject: [PATCH 55/95] 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 3c5b3e5698f1689f1d4bbf4909b4e39206de24c5 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Tue, 20 Jan 2026 12:52:24 +0100
Subject: [PATCH 56/95] 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 bb865b7dee001fc78673a5cadec8126fd38e7735 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Tue, 20 Jan 2026 12:54:14 +0100
Subject: [PATCH 57/95] 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 44d5b7cd5e2256dedc660ac10d3dd59f61b73ace Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Tue, 20 Jan 2026 12:53:22 +0100
Subject: [PATCH 58/95] 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 ea5a6d983d6a1e28fc1a2cdf8d07fefb389a2279 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Tue, 20 Jan 2026 12:51:30 +0100
Subject: [PATCH 59/95] 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 6ee312e7a8d7666baadd4f98af839645ce350ed4 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Tue, 20 Jan 2026 12:54:54 +0100
Subject: [PATCH 60/95] 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 6c991873db4a8857bcfc9ad0d8f760d68e1e4800 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Tue, 20 Jan 2026 12:55:58 +0100
Subject: [PATCH 61/95] 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 d88871f52e01305a1b7c819e43ab8fd6779c437c Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 19 Jan 2026 14:28:15 +0100
Subject: [PATCH 62/95] 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 d2c07bbbf7aaa308704a50d5f997eaaca25b5431 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Tue, 20 Jan 2026 18:28:58 +0100
Subject: [PATCH 63/95] 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 6f772755bf93f8b5a616684722a70399ca7d99f3 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 19 Jan 2026 16:31:29 +0100
Subject: [PATCH 64/95] 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 ebbba9744dc4718714d036379bc39240fd33614c Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Tue, 20 Jan 2026 09:27:43 +0100
Subject: [PATCH 65/95] 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 65c253158c210befc95e6aa62d46649c5fd37509 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Mon, 19 Jan 2026 15:18:13 +0100
Subject: [PATCH 66/95] 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 4097d99939ebe19b687cd5c113a685dc4b37856e Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Tue, 20 Jan 2026 19:36:39 +0100
Subject: [PATCH 67/95] 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 be961cedc36fd7f2da8c61e6e33eb69da0347854 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Tue, 20 Jan 2026 19:34:52 +0100
Subject: [PATCH 68/95] 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 7261438180abb1e5e70263e0d6b7179dda8bf2f1 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Wed, 21 Jan 2026 09:54:29 +0100
Subject: [PATCH 69/95] 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 8f123478b06eb01493909ea056515366c6621996 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Wed, 21 Jan 2026 13:11:45 +0100
Subject: [PATCH 70/95] 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 ec9b4b9b38ad4b522746091e3bc1f4b89509df3c Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Fri, 23 Jan 2026 16:40:45 +0100
Subject: [PATCH 71/95] Replace setMultiple() by startTransaction() and
commitTransaction()
Signed-off-by: Pablo Zmdl
---
php/src/Controller/DockerController.php | 33 ++++----
php/src/Data/ConfigurationManager.php | 103 ++++++++++++------------
2 files changed, 70 insertions(+), 66 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..411ff626 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -193,25 +193,27 @@ 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;
- try {
- $this->GetConfig();
- $closure($this);
- $this->WriteConfig();
- } finally {
- $this->noWrite = false;
- }
+ }
+
+ /**
+ * This allows to assign multiple attributes without saving the config to disk in between.
+ */
+ public function commitTransaction() : void {
+ $this->WriteConfig();
+ $this->noWrite = false;
}
public function GetAndGenerateSecret(string $secretId) : string {
@@ -419,13 +421,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 +444,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 +493,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 +516,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 +979,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 fb3f8172ca206268bb055c0c81205de2f74e8751 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Fri, 23 Jan 2026 16:43:41 +0100
Subject: [PATCH 72/95] 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 411ff626..642ef000 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -588,7 +588,6 @@ class ConfigurationManager
$configValue = $this->get($configName, '');
if ($envVariableOutput === false) {
if ($configValue === '') {
- $this->set($configName, $defaultValue);
return $defaultValue;
}
return $configValue;
From 271234c002dc92bb35567a2c00650a4a7bdc535b Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Fri, 23 Jan 2026 16:55:15 +0100
Subject: [PATCH 73/95] 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 642ef000..f3d8e9e1 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 7192e0c4c372b90e6d2486ce58ad72f347564c50 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Fri, 23 Jan 2026 17:10:21 +0100
Subject: [PATCH 74/95] 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 f3d8e9e1..0af3d7f7 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); }
}
@@ -1077,7 +1078,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 609666ff9aaa261948cd1a843575fe44c092aef8 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Fri, 23 Jan 2026 17:12:45 +0100
Subject: [PATCH 75/95] 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 0af3d7f7..510b8f94 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); }
}
@@ -1042,7 +1042,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 ce47826db2352abbde97721ee0dcf8d1c9266b5e Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Fri, 23 Jan 2026 17:16:02 +0100
Subject: [PATCH 76/95] 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 510b8f94..f5b106d0 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); }
@@ -533,7 +533,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 1db9400a994ee434440f53f5bf9d450ee1af9cb1 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Fri, 23 Jan 2026 17:17:54 +0100
Subject: [PATCH 77/95] 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 f5b106d0..dd7bce63 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); }
}
@@ -1045,7 +1045,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 915d2096f7a5b172cd993234d2927c5792773789 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Fri, 23 Jan 2026 17:19:10 +0100
Subject: [PATCH 78/95] 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 dd7bce63..2a233ff8 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); }
@@ -1078,7 +1078,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 fb0c568925a2943a7ef5d8de4bbb88e848db59b0 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Fri, 23 Jan 2026 17:21:07 +0100
Subject: [PATCH 79/95] 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 2a233ff8..6850988a 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); }
}
@@ -458,7 +458,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();
}
@@ -507,7 +507,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();
@@ -530,7 +530,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;
@@ -1072,7 +1072,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 68126f6af2a35478acfb9d0e1f80175cad0b9f64 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Fri, 23 Jan 2026 17:22:14 +0100
Subject: [PATCH 80/95] 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 6850988a..3ad38c6a 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); }
}
@@ -459,7 +459,7 @@ class ConfigurationManager
$this->ValidateBorgLocationVars($location, $repo);
$this->startTransaction();
$this->borgBackupHostLocation = $location;
- $this->borg_remote_repo = $repo;
+ $this->borgRemoteRepo = $repo;
$this->commitTransaction();
}
@@ -508,7 +508,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
@@ -531,7 +531,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();
@@ -1043,7 +1043,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 2a0ef686f0f3b7ee47988e72d5d985d5ad002194 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Fri, 23 Jan 2026 17:23:21 +0100
Subject: [PATCH 81/95] 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 3ad38c6a..04f6e598 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); }
}
@@ -439,7 +439,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();
}
@@ -532,7 +532,7 @@ class ConfigurationManager
$this->startTransaction();
$this->borgBackupHostLocation = $location;
$this->borgRemoteRepo = $repo;
- $this->borg_restore_password = $password;
+ $this->borgRestorePassword = $password;
$this->instanceRestoreAttempt = true;
$this->commitTransaction();
}
@@ -1053,7 +1053,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 d252258e02b05d69458cb876e0ebc0461d66216f Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Fri, 23 Jan 2026 17:25:14 +0100
Subject: [PATCH 82/95] 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 04f6e598..73e20a90 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); }
}
@@ -1049,7 +1049,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 d370448f4e6ab02d1eb3aa4c11ee62480e12106b Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Fri, 23 Jan 2026 17:33:24 +0100
Subject: [PATCH 83/95] 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 73e20a90..724b4e89 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -986,6 +986,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 === []) {
@@ -1001,6 +1006,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 919f8300e6a6da721be1fc937f28d0fe90475717 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Fri, 23 Jan 2026 17:34:33 +0100
Subject: [PATCH 84/95] 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 724b4e89..f860dc35 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -649,7 +649,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); }
}
@@ -1073,7 +1073,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 7899ad4be45ec933ebd75409fe197980a509b8e9 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Fri, 23 Jan 2026 17:35:52 +0100
Subject: [PATCH 85/95] 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 0330d082..273388af 100644
--- a/php/src/Controller/ConfigurationController.php
+++ b/php/src/Controller/ConfigurationController.php
@@ -110,7 +110,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 f860dc35..a9d75199 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.
@@ -1067,7 +1067,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 c04d615f42040442137aef8fc11c48009061a55f Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Fri, 23 Jan 2026 17:36:45 +0100
Subject: [PATCH 86/95] 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 273388af..eccd0763 100644
--- a/php/src/Controller/ConfigurationController.php
+++ b/php/src/Controller/ConfigurationController.php
@@ -119,7 +119,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 a9d75199..2a87500e 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.
@@ -879,7 +879,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 e9b90c49892bc2fb48110e368d65a81f956d6eb9 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Fri, 23 Jan 2026 17:37:36 +0100
Subject: [PATCH 87/95] 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 eccd0763..d73fd656 100644
--- a/php/src/Controller/ConfigurationController.php
+++ b/php/src/Controller/ConfigurationController.php
@@ -101,7 +101,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 2a87500e..b5b018ec 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)); }
}
@@ -1089,7 +1089,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 15794bc19753e3e16a68c76a0236abb0cd8608b5 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Fri, 23 Jan 2026 17:38:20 +0100
Subject: [PATCH 88/95] 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 b5b018ec..9395f358 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); }
}
@@ -1057,7 +1057,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 8a1551df59a7318f94cee882e2b6f7262c32d2d1 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Fri, 23 Jan 2026 17:39:17 +0100
Subject: [PATCH 89/95] 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 9395f358..0c3c267c 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -378,7 +378,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') {
@@ -565,7 +565,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); }
}
@@ -1054,7 +1054,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 c732d736d2acbe73e8858b23ae922eb508c98ca5 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Fri, 23 Jan 2026 17:40:23 +0100
Subject: [PATCH 90/95] 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 0c3c267c..3ad993fd 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -570,7 +570,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); }
}
@@ -1056,7 +1056,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 e89b89cd3195eadd806e5f702ecdf7b079b49951 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Fri, 23 Jan 2026 17:41:26 +0100
Subject: [PATCH 91/95] 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 | 12 +++++++++++-
4 files changed, 16 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 3ad993fd..3ce4312e 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -623,7 +623,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); }
}
@@ -1058,7 +1058,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..82dc3653 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;
// }
// }
@@ -398,9 +398,19 @@ readonly class DockerActionManager {
// 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
+<<<<<<< HEAD
// } elseif ($container->identifier === 'nextcloud-aio-nextcloud') {
// foreach ($container->volumes->GetVolumes() as $volume) {
// if ($volume->name !== $this->configurationManager->nextcloud_mount) {
+||||||| parent of e6528742 (Camelize property nextcloud_mount => nextcloudMount)
+ // } elseif ($container->GetIdentifier() === 'nextcloud-aio-nextcloud') {
+ // foreach ($container->GetVolumes()->GetVolumes() as $volume) {
+ // if ($volume->name !== $this->configurationManager->nextcloud_mount) {
+=======
+ // } elseif ($container->GetIdentifier() === 'nextcloud-aio-nextcloud') {
+ // foreach ($container->GetVolumes()->GetVolumes() as $volume) {
+ // if ($volume->name !== $this->configurationManager->nextcloudMount) {
+>>>>>>> e6528742 (Camelize property nextcloud_mount => nextcloudMount)
// continue;
// }
// $mounts[] = ["Type" => "bind", "Source" => $volume->name, "Target" => $volume->mountPoint, "ReadOnly" => !$volume->isWritable, "BindOptions" => [ "Propagation" => "rshared"]];
From 9281d1f5008fa2956cf3d5e7c5c65c580a5004dc Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Fri, 23 Jan 2026 17:42:15 +0100
Subject: [PATCH 92/95] 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 3ce4312e..533b4d2f 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -484,8 +484,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 {
@@ -629,7 +629,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 20d19a161253c6792e292a67cd5f6bca01d1efe5 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Fri, 23 Jan 2026 17:42:50 +0100
Subject: [PATCH 93/95] 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 533b4d2f..648626e6 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -634,7 +634,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); }
}
@@ -645,7 +645,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;
}
@@ -1071,7 +1071,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 0057de210a053ed4147349debae9760d16233ecd Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Fri, 23 Jan 2026 17:43:22 +0100
Subject: [PATCH 94/95] 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 648626e6..724c903f 100644
--- a/php/src/Data/ConfigurationManager.php
+++ b/php/src/Data/ConfigurationManager.php
@@ -639,7 +639,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); }
}
@@ -1072,7 +1072,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 beff7e6edbb904c958eb0d980789a4399c65a053 Mon Sep 17 00:00:00 2001
From: Pablo Zmdl
Date: Fri, 23 Jan 2026 17:45:19 +0100
Subject: [PATCH 95/95] 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