diff --git a/dashboard/src/views/services.html b/dashboard/src/views/services.html index 962a74194..5d400e7b4 100644 --- a/dashboard/src/views/services.html +++ b/dashboard/src/views/services.html @@ -30,6 +30,15 @@

+
+
+
+ +
+
+ diff --git a/dashboard/src/views/services.js b/dashboard/src/views/services.js index f2e8f9e92..c8904f0d1 100644 --- a/dashboard/src/views/services.js +++ b/dashboard/src/views/services.js @@ -70,6 +70,7 @@ angular.module('Application').controller('ServicesController', ['$scope', '$loca memoryTicks: [], recoveryMode: false, + useVectorRsExtension: false, show: function (service) { $scope.serviceConfigure.reset(); @@ -77,6 +78,7 @@ angular.module('Application').controller('ServicesController', ['$scope', '$loca $scope.serviceConfigure.service = service; $scope.serviceConfigure.memoryLimit = service.config.memoryLimit; $scope.serviceConfigure.recoveryMode = !!service.config.recoveryMode; + $scope.serviceConfigure.useVectorRsExtension = !!service.config.useVectorRsExtension; $scope.serviceConfigure.memoryTicks = []; @@ -100,6 +102,8 @@ angular.module('Application').controller('ServicesController', ['$scope', '$loca recoveryMode: $scope.serviceConfigure.recoveryMode }; + if ($scope.serviceConfigure.service.name === 'postgresql') data.useVectorRsExtension = $scope.serviceConfigure.useVectorRsExtension; + Client.configureService($scope.serviceConfigure.service.name, data, function (error) { $scope.serviceConfigure.busy = false; if (error) { diff --git a/src/infra_version.js b/src/infra_version.js index 220bcdf52..6c46867e9 100644 --- a/src/infra_version.js +++ b/src/infra_version.js @@ -16,7 +16,7 @@ exports = module.exports = { 'mail': 'registry.docker.com/cloudron/mail:3.11.4@sha256:ab85a0e8b6b50c2828861e08f4df41298c1d5e15b0778eda9116d92f8cf4c292', 'mongodb': 'registry.docker.com/cloudron/mongodb:5.1.2@sha256:897bea3cae08c8c10f9f5adaff853be314ab94aa98d96a8d0caa502babd983aa', 'mysql': 'registry.docker.com/cloudron/mysql:3.4.2@sha256:379749708186a89f4ae09d6b23b58bc6d99a2005bac32e812b4b1dafa47071e4', - 'postgresql': 'registry.docker.com/cloudron/postgresql:5.1.6@sha256:a89231a7835955767893a83b2d993764f59da24e292385b06470c8e42a1ffa0e', + 'postgresql': 'registry.docker.com/cloudron/postgresql:5.1.7@sha256:cd6ce14da84b3d0a6e633b53a73be4700acfda67f853990f56ecc934ca1f2ac9', 'redis': 'registry.docker.com/cloudron/redis:3.5.2@sha256:5c3d9a912d3ad723b195cfcbe9f44956a2aa88f9e29f7da3ef725162f8e2829a', 'sftp': 'registry.docker.com/cloudron/sftp:3.8.5@sha256:6e7cc4218618b27a86c5b862ddd20a22c2c98b7537bd542ebd68cddaf02c0845', 'turn': 'registry.docker.com/cloudron/turn:1.7.2@sha256:9ed8da613c1edc5cb8700657cf6e49f0f285b446222a8f459f80919945352f6d', diff --git a/src/routes/services.js b/src/routes/services.js index 329fb078e..ec8cbd923 100644 --- a/src/routes/services.js +++ b/src/routes/services.js @@ -51,6 +51,11 @@ async function configure(req, res, next) { recoveryMode: req.body.recoveryMode || false }; + if (req.params.service === 'postgresql') { + if ('useVectorRsExtension' in req.body && typeof req.body.useVectorRsExtension !== 'boolean') return next(new HttpError(400, 'useVectorRsExtension must be boolean')); + data.useVectorRsExtension = !!req.body.useVectorRsExtension; + } + const [error] = await safe(services.configureService(req.params.service, data, AuditSource.fromRequest(req))); if (error) return next(BoxError.toHttpError(error)); diff --git a/src/services.js b/src/services.js index 7b60662e2..f65e3dc35 100644 --- a/src/services.js +++ b/src/services.js @@ -426,6 +426,9 @@ async function configureService(id, data, auditSource) { } else if (SERVICES[name]) { const servicesConfig = await getConfig(); needsRebuild = servicesConfig[name]?.recoveryMode != data.recoveryMode; // intentional != since 'recoveryMode' may or may not be there + + if (name === 'postgresql' && data.useVectorRsExtension !== servicesConfig[name].useVectorRsExtension) needsRebuild = true; + servicesConfig[name] = data; await settings.setJson(settings.SERVICES_CONFIG_KEY, servicesConfig); @@ -1353,6 +1356,7 @@ async function startPostgresql(existingInfra) { const serviceConfig = await getServiceConfig('postgresql'); const readOnly = !serviceConfig.recoveryMode ? '--read-only' : ''; const cmd = serviceConfig.recoveryMode ? '/bin/bash -c \'echo "Debug mode. Sleeping" && sleep infinity\'' : ''; + const useVectorRsExtension = !!serviceConfig.useVectorRsExtension; // memory options are applied dynamically. import requires all the memory we can get const runCmd = `docker run --restart=always -d --name="postgresql" \ @@ -1369,6 +1373,7 @@ async function startPostgresql(existingInfra) { --shm-size=128M \ -e CLOUDRON_POSTGRESQL_ROOT_PASSWORD="${rootPassword}" \ -e CLOUDRON_POSTGRESQL_TOKEN="${cloudronToken}" \ + -e CLOUDRON_POSTGRESQL_USE_VECTOR_RS="${ useVectorRsExtension ? 'true': '' }" \ -v "${dataDir}/postgresql:/var/lib/postgresql" \ --label isCloudronManaged=true \ ${readOnly} -v /tmp -v /run "${image}" ${cmd}`;