diff --git a/dashboard/src/constants.js b/dashboard/src/constants.js index 270d79ce5..bce51855a 100644 --- a/dashboard/src/constants.js +++ b/dashboard/src/constants.js @@ -286,31 +286,31 @@ const REGIONS_CONTABO = [ ]; const STORAGE_PROVIDERS = [ - { name: 'Amazon S3', value: 's3' }, + { name: 'Amazon S3', value: 's3', regions: REGIONS_S3 }, { name: 'Backblaze B2 (S3 API)', value: 'backblaze-b2' }, { name: 'CIFS Mount', value: 'cifs' }, { name: 'Cloudflare R2', value: 'cloudflare-r2' }, - { name: 'Contabo Object Storage', value: 'contabo-objectstorage' }, - { name: 'DigitalOcean Spaces', value: 'digitalocean-spaces' }, + { name: 'Contabo Object Storage', value: 'contabo-objectstorage', regions: REGIONS_CONTABO }, + { name: 'DigitalOcean Spaces', value: 'digitalocean-spaces', regions: REGIONS_DIGITALOCEAN }, { name: 'External/Local Disk (EXT4 or XFS)', value: 'disk' }, { name: 'EXT4 Disk', value: 'ext4' }, - { name: 'Exoscale SOS', value: 'exoscale-sos' }, + { name: 'Exoscale SOS', value: 'exoscale-sos', regions: REGIONS_EXOSCALE }, { name: 'Filesystem', value: 'filesystem' }, { name: 'Filesystem (Mountpoint)', value: 'mountpoint' }, // legacy { name: 'Google Cloud Storage', value: 'gcs' }, - { name: 'Hetzner Object Storage', value: 'hetzner-objectstorage' }, + { name: 'Hetzner Object Storage', value: 'hetzner-objectstorage', regions: REGIONS_HETZNER }, { name: 'IDrive e2', value: 'idrive-e2' }, - { name: 'IONOS (Profitbricks)', value: 'ionos-objectstorage' }, - { name: 'Linode Object Storage', value: 'linode-objectstorage' }, + { name: 'IONOS (Profitbricks)', value: 'ionos-objectstorage', regions: REGIONS_IONOS }, + { name: 'Linode Object Storage', value: 'linode-objectstorage', regions: REGIONS_LINODE }, { name: 'Minio', value: 'minio' }, { name: 'NFS Mount', value: 'nfs' }, - { name: 'OVH Object Storage', value: 'ovh-objectstorage' }, + { name: 'OVH Object Storage', value: 'ovh-objectstorage', regions: REGIONS_OVH }, { name: 'S3 API Compatible (v4)', value: 's3-v4-compat' }, - { name: 'Scaleway Object Storage', value: 'scaleway-objectstorage' }, + { name: 'Scaleway Object Storage', value: 'scaleway-objectstorage', regions: REGIONS_SCALEWAY }, { name: 'SSHFS Mount', value: 'sshfs' }, { name: 'UpCloud Object Storage', value: 'upcloud-objectstorage' }, - { name: 'Vultr Object Storage', value: 'vultr-objectstorage' }, - { name: 'Wasabi', value: 'wasabi' }, + { name: 'Vultr Object Storage', value: 'vultr-objectstorage', regions: REGIONS_VULTR }, + { name: 'Wasabi', value: 'wasabi', regions: REGIONS_WASABI }, { name: 'XFS Disk', value: 'xfs' }, ]; diff --git a/dashboard/src/utils.js b/dashboard/src/utils.js index dcbf05c88..5fbeaea8d 100644 --- a/dashboard/src/utils.js +++ b/dashboard/src/utils.js @@ -1,6 +1,6 @@ import { prettyBinarySize } from '@cloudron/pankow/utils'; -import { ISTATES } from './constants.js'; +import { ISTATES, STORAGE_PROVIDERS } from './constants.js'; // https://stackoverflow.com/questions/3665115/how-to-create-a-file-in-memory-for-user-to-download-but-not-through-server#18197341 function download(filename, text) { @@ -29,6 +29,15 @@ function s3like(provider) { || provider === 'contabo-objectstorage'; } +function regionName(provider, endpoint) { + const storageProvider = STORAGE_PROVIDERS.find(sp => sp.value === provider); + const regions = storageProvider.regions; + if (!regions) return endpoint; + const region = regions.find(r => r.value === endpoint); + if (!region) return endpoint; + return region.name; +} + function eventlogDetails(eventLog, app = null, appIdContext = '') { const ACTION_ACTIVATE = 'cloudron.activate'; const ACTION_PROVISION = 'cloudron.provision'; @@ -610,6 +619,7 @@ export { download, mountlike, s3like, + regionName, eventlogDetails, eventlogSource, taskNameFromInstallationState, @@ -623,6 +633,7 @@ export default { download, mountlike, s3like, + regionName, eventlogDetails, eventlogSource, taskNameFromInstallationState, diff --git a/dashboard/src/views/BackupSitesView.vue b/dashboard/src/views/BackupSitesView.vue index 6fbe8e57f..94024fced 100644 --- a/dashboard/src/views/BackupSitesView.vue +++ b/dashboard/src/views/BackupSitesView.vue @@ -16,7 +16,7 @@ import { TASK_TYPES } from '../constants.js'; import BackupSitesModel from '../models/BackupSitesModel.js'; import ProfileModel from '../models/ProfileModel.js'; import TasksModel from '../models/TasksModel.js'; -import { mountlike, s3like } from '../utils.js'; +import { regionName, mountlike } from '../utils.js'; const profileModel = ProfileModel.create(); const tasksModel = TasksModel.create(); @@ -231,14 +231,19 @@ onMounted(async () => {
{{ site.name }}
- {{ site.provider }}/{{ site.format }} @ + {{ site.provider }}/{{ site.format }} + + ({{ site.config.noHardlinks ? 'no hardlinks' : 'hardlinks' }}) + +
+
{{ site.config.backupDir }}{{ (site.config.prefix ? `/${site.config.prefix}` : '') }} {{ site.config.mountOptions.diskPath || site.config.mountPoint }}{{ (site.config.prefix ? `/${site.config.prefix}` : '') }} {{ site.config.mountOptions.host }}:{{ site.config.mountOptions.remoteDir }}{{ (site.config.prefix ? `/${site.config.prefix}` : '') }} {{ site.config.region + ' ' + site.config.bucket + (site.config.prefix ? `/${site.config.prefix}` : '') }} {{ site.config.endpoint + ' ' + site.config.bucket + (site.config.prefix ? `/${site.config.prefix}` : '') }} {{ site.config.endpoint + ' ' + site.config.bucket + (site.config.prefix ? `/${site.config.prefix}` : '') }} - {{ site.config.bucket + (site.config.prefix ? `/${site.config.prefix}` : '') }} + {{ regionName(site.provider, site.config.endpoint) + ' ' + site.config.bucket + (site.config.prefix ? `/${site.config.prefix}` : '') }}