diff --git a/src/views/backups.html b/src/views/backups.html index 4d74d060b..a88e844d2 100644 --- a/src/views/backups.html +++ b/src/views/backups.html @@ -130,11 +130,41 @@

{{ 'backups.configureBackupStorage.noopNote' | tr }}

- +
-

+

+
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ +
@@ -143,13 +173,7 @@ -
- -
- - +
{{ backupConfig.backupFolder }} - {{ backupConfig.mountPoint + (backupConfig.prefix ? '/' : '') + backupConfig.prefix }} + + + {{ backupConfig.mountPoint + (backupConfig.prefix ? '/' : '') + backupConfig.prefix }} + + {{ backupConfig.bucket + (backupConfig.prefix ? '/' : '') + backupConfig.prefix }} {{ backupConfig.region + ' ' + backupConfig.bucket + (backupConfig.prefix ? '/' : '') + backupConfig.prefix }} {{ backupConfig.endpoint + ' ' + backupConfig.bucket + (backupConfig.prefix ? '/' : '') + backupConfig.prefix }} diff --git a/src/views/backups.js b/src/views/backups.js index 26256bedf..de08ee735 100644 --- a/src/views/backups.js +++ b/src/views/backups.js @@ -96,8 +96,10 @@ angular.module('Application').controller('BackupsController', ['$scope', '$locat { name: 'Backblaze B2 (S3 API)', value: 'backblaze-b2' }, { name: 'CIFS Mount', value: 'cifs' }, { name: 'DigitalOcean Spaces', value: 'digitalocean-spaces' }, + { name: 'EXT4 Disk', value: 'ext4' }, { name: 'Exoscale SOS', value: 'exoscale-sos' }, { name: 'Filesystem', value: 'filesystem' }, + { name: 'Filesystem (Mountpoint)', value: 'mountpoint' }, // legacy { name: 'Google Cloud Storage', value: 'gcs' }, { name: 'IONOS (Profitbricks)', value: 'ionos-objectstorage' }, { name: 'Linode Object Storage', value: 'linode-objectstorage' }, @@ -287,7 +289,7 @@ angular.module('Application').controller('BackupsController', ['$scope', '$locat }; $scope.mountlike = function (provider) { - return provider === 'sshfs' || provider === 'cifs' || provider === 'nfs'; + return provider === 'sshfs' || provider === 'cifs' || provider === 'nfs' || provider === 'mountpoint' || provider === 'ext4'; }; // https://stackoverflow.com/questions/3665115/how-to-create-a-file-in-memory-for-user-to-download-but-not-through-server#18197341 @@ -413,7 +415,6 @@ angular.module('Application').controller('BackupsController', ['$scope', '$locat mountPoint: '', acceptSelfSignedCerts: false, useHardlinks: true, - externalDisk: false, format: 'tgz', password: '', passwordRepeat: '', @@ -427,6 +428,14 @@ angular.module('Application').controller('BackupsController', ['$scope', '$locat downloadConcurrency: '', syncConcurrency: '', // sort of similar to upload + mountOptions: { + host: '', + remoteDir: '', + username: '', + password: '', + diskPath: '' + }, + clearProviderFields: function () { $scope.configureBackup.bucket = ''; $scope.configureBackup.prefix = ''; @@ -440,7 +449,6 @@ angular.module('Application').controller('BackupsController', ['$scope', '$locat $scope.configureBackup.mountPoint = ''; $scope.configureBackup.acceptSelfSignedCerts = false; $scope.configureBackup.useHardlinks = true; - $scope.configureBackup.externalDisk = false; $scope.configureBackup.memoryLimit = 400 * 1024 * 1024; // scaleway only supports 1000 parts per object (https://www.scaleway.com/en/docs/s3-multipart-upload/) @@ -448,6 +456,8 @@ angular.module('Application').controller('BackupsController', ['$scope', '$locat $scope.configureBackup.downloadConcurrency = $scope.configureBackup.provider === 's3' ? 30 : 10; $scope.configureBackup.syncConcurrency = $scope.configureBackup.provider === 's3' ? 20 : 10; $scope.configureBackup.copyConcurrency = $scope.configureBackup.provider === 's3' ? 500 : 10; + + $scope.configureBackup.mount = { host: '', remoteDir: '', username: '', password: '', diskPath: '' }; }, show: function () { @@ -478,7 +488,6 @@ angular.module('Application').controller('BackupsController', ['$scope', '$locat $scope.configureBackup.format = $scope.backupConfig.format; $scope.configureBackup.acceptSelfSignedCerts = !!$scope.backupConfig.acceptSelfSignedCerts; $scope.configureBackup.useHardlinks = !$scope.backupConfig.noHardlinks; - $scope.configureBackup.externalDisk = !!$scope.backupConfig.externalDisk; $scope.configureBackup.memoryLimit = $scope.backupConfig.memoryLimit; @@ -498,6 +507,14 @@ angular.module('Application').controller('BackupsController', ['$scope', '$locat $scope.configureBackup.uploadPartSizeTicks.push(j * 1024 * 1024); } + var mountOptions = $scope.backupConfig.mountOptions || {}; + $scope.configureBackup.mount = { + host: mountOptions.host || '', + remoteDir: mountOptions.remoteDir || '', + username: mountOptions.username || '', + password: mountOptions.password || '', + diskPath: mountOptions.diskPath || '' + }; $('#configureBackupModal').modal('show'); }, @@ -573,14 +590,26 @@ angular.module('Application').controller('BackupsController', ['$scope', '$locat $scope.configureBackup.busy = false; return; } - } else if (backupConfig.provider === 'sshfs' || backupConfig.provider === 'cifs' || backupConfig.provider === 'nfs') { + } else if ($scope.mountlike(backupConfig.provider)) { backupConfig.mountPoint = $scope.configureBackup.mountPoint; backupConfig.prefix = $scope.configureBackup.prefix; backupConfig.noHardlinks = !$scope.configureBackup.useHardlinks; - } else if (backupConfig.provider === 'filesystem') { + backupConfig.mountOptions = {}; + + if (backupConfig.provider === 'cifs' || backupConfig.provider === 'sshfs' || backupConfig.provider === 'nfs') { + backupConfig.mountOptions.host = $scope.configureBackup.mountOptions.host; + backupConfig.mountOptions.remoteDir = $scope.configureBackup.mountOptions.remoteDir; + + if (backupConfig.provider === 'cifs') { + backupConfig.mountOptions.username = $scope.configureBackup.mountOptions.username; + backupConfig.mountOptions.password = $scope.configureBackup.mountOptions.password; + } + } else if (backupConfig.provider === 'ext4') { + backupConfig.mountOptions.diskPath = $scope.configureBackup.diskPath; + } + } else if (backupConfig.provider === 'filesystem' || backupConfig.provider === 'mountpoint') { backupConfig.backupFolder = $scope.configureBackup.backupFolder; backupConfig.noHardlinks = !$scope.configureBackup.useHardlinks; - backupConfig.externalDisk = $scope.configureBackup.externalDisk; } backupConfig.uploadPartSize = $scope.configureBackup.uploadPartSize;