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}`;