diff --git a/src/apps.js b/src/apps.js index e4f849045..cb392a6d1 100644 --- a/src/apps.js +++ b/src/apps.js @@ -2063,13 +2063,12 @@ async function importApp(app, data, auditSource) { // TODO: make this smarter to do a read-only test and check if the file exists in the storage backend if (backupConfig) { if (mounts.isManagedProvider(backupConfig.provider)) { - backupConfig.mountPoint = `/mnt/appimport-${app.id}`; error = mounts.validateMountOptions(backupConfig.provider, backupConfig.mountOptions); if (error) throw error; const mountObject = { // keep this in sync with the import code in apptask name: `appimport-${app.id}`, - hostPath: backupConfig.mountPoint, + hostPath: `/mnt/appimport-${app.id}`, mountType: backupConfig.provider, mountOptions: backupConfig.mountOptions }; diff --git a/src/mounts.js b/src/mounts.js index 5975d3129..ee382258f 100644 --- a/src/mounts.js +++ b/src/mounts.js @@ -66,9 +66,11 @@ function isManagedProvider(provider) { } function mountObjectFromBackupConfig(backupConfig) { + assert(isManagedProvider(backupConfig.provider)); + return { name: 'backup', - hostPath: backupConfig.mountPoint, + hostPath: paths.MANAGED_BACKUP_MOUNT_DIR, mountType: backupConfig.provider, mountOptions: backupConfig.mountOptions }; diff --git a/src/paths.js b/src/paths.js index 9c9503c4f..9748eaa42 100644 --- a/src/paths.js +++ b/src/paths.js @@ -22,6 +22,7 @@ exports = module.exports = { SETUP_TOKEN_FILE: '/etc/cloudron/SETUP_TOKEN', VOLUMES_MOUNT_DIR: '/mnt/volumes', + MANAGED_BACKUP_MOUNT_DIR: '/mnt/cloudronbackup', PLATFORM_DATA_DIR: path.join(baseDir(), 'platformdata'), APPS_DATA_DIR: path.join(baseDir(), 'appsdata'), diff --git a/src/provision.js b/src/provision.js index 47050d7cb..bee5aaf85 100644 --- a/src/provision.js +++ b/src/provision.js @@ -212,7 +212,7 @@ async function restore(backupConfig, backupId, version, sysinfoConfig, options, const newMount = { name: 'backup', - hostPath: backupConfig.mountPoint, + hostPath: paths.MANAGED_BACKUP_MOUNT_DIR, mountType: backupConfig.provider, mountOptions: backupConfig.mountOptions }; diff --git a/src/settings.js b/src/settings.js index 4e6cd55f4..43c567337 100644 --- a/src/settings.js +++ b/src/settings.js @@ -401,7 +401,9 @@ async function getBackupConfig() { const backupConfig = JSON.parse(value); // provider, token, password, region, prefix, bucket - if (backupConfig.provider === 'sshfs' || backupConfig.provider === 'cifs' || backupConfig.provider === 'nfs' || backupConfig.provider === 'ext4' || backupConfig.provider === 'mountpoint') { + if (mounts.isManagedProvider(backupConfig.provider)) { + backupConfig.mountStatus = await mounts.getStatus(backupConfig.provider, paths.MANAGED_BACKUP_MOUNT_DIR); // { state, message } + } else if (backupConfig.provider === 'mountpoint') { backupConfig.mountStatus = await mounts.getStatus(backupConfig.provider, backupConfig.mountPoint); // { state, message } } @@ -422,7 +424,6 @@ async function setBackupConfig(backupConfig) { backups.injectPrivateFields(backupConfig, oldConfig); if (mounts.isManagedProvider(backupConfig.provider) && (!mounts.isManagedProvider(oldConfig.provider) || mountOptionsChanged(oldConfig, backupConfig))) { - backupConfig.mountPoint = '/mnt/cloudronbackup'; // hardcode the mountPoint for built-in mounts let error = mounts.validateMountOptions(backupConfig.provider, backupConfig.mountOptions); if (error) throw error; diff --git a/src/storage/filesystem.js b/src/storage/filesystem.js index e98fea4e5..9df7f5c9a 100644 --- a/src/storage/filesystem.js +++ b/src/storage/filesystem.js @@ -51,12 +51,13 @@ function getBackupPath(apiConfig) { switch (apiConfig.provider) { case PROVIDER_SSHFS: - case PROVIDER_MOUNTPOINT: case PROVIDER_NFS: case PROVIDER_CIFS: case PROVIDER_EXT4: + return path.join(paths.MANAGED_BACKUP_MOUNT_DIR, apiConfig.prefix); + case PROVIDER_MOUNTPOINT: return path.join(apiConfig.mountPoint, apiConfig.prefix); - default: + case PROVIDER_FILESYSTEM: return apiConfig.backupFolder; } } @@ -299,9 +300,11 @@ function testConfig(apiConfig, callback) { let error = validateBackupTarget(apiConfig.backupFolder); if (error) return callback(error); } else { // cifs/ext4/nfs/mountpoint/sshfs - if (!apiConfig.mountPoint || typeof apiConfig.mountPoint !== 'string') return callback(new BoxError(BoxError.BAD_FIELD, 'mountPoint must be non-empty string', { field: 'mountPoint' })); - let error = validateBackupTarget(apiConfig.mountPoint); - if (error) return callback(error); + if (apiConfig.provider === PROVIDER_MOUNTPOINT) { + if (!apiConfig.mountPoint || typeof apiConfig.mountPoint !== 'string') return callback(new BoxError(BoxError.BAD_FIELD, 'mountPoint must be non-empty string', { field: 'mountPoint' })); + let error = validateBackupTarget(apiConfig.mountPoint); + if (error) return callback(error); + } if (typeof apiConfig.prefix !== 'string') return callback(new BoxError(BoxError.BAD_FIELD, 'prefix must be a string', { field: 'prefix' })); if (apiConfig.prefix !== '') {