diff --git a/src/js/client.js b/src/js/client.js index 7c2438679..b6772dc99 100644 --- a/src/js/client.js +++ b/src/js/client.js @@ -88,6 +88,137 @@ const APP_TYPES = { var SECRET_PLACEHOLDER = String.fromCharCode(0x25CF).repeat(8); +// List is from http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region +const REGIONS_S3 = [ + { name: 'Asia Pacific (Mumbai)', value: 'ap-south-1' }, + { name: 'Asia Pacific (Osaka-Local)', value: 'ap-northeast-3' }, + { name: 'Asia Pacific (Seoul)', value: 'ap-northeast-2' }, + { name: 'Asia Pacific (Singapore)', value: 'ap-southeast-1' }, + { name: 'Asia Pacific (Sydney)', value: 'ap-southeast-2' }, + { name: 'Asia Pacific (Tokyo)', value: 'ap-northeast-1' }, + { name: 'Canada (Central)', value: 'ca-central-1' }, + { name: 'China (Beijing)', value: 'cn-north-1' }, + { name: 'China (Ningxia)', value: 'cn-northwest-1' }, + { name: 'EU (Frankfurt)', value: 'eu-central-1' }, + { name: 'EU (Ireland)', value: 'eu-west-1' }, + { name: 'EU (London)', value: 'eu-west-2' }, + { name: 'EU (Paris)', value: 'eu-west-3' }, + { name: 'EU (Stockholm)', value: 'eu-north-1' }, + { name: 'South America (São Paulo)', value: 'sa-east-1' }, + { name: 'US East (N. Virginia)', value: 'us-east-1' }, + { name: 'US East (Ohio)', value: 'us-east-2' }, + { name: 'US West (N. California)', value: 'us-west-1' }, + { name: 'US West (Oregon)', value: 'us-west-2' }, +]; + +const REGIONS_WASABI = [ + { name: 'Amsterdam (EU Central 1)', value: 'https://s3.eu-central-1.wasabisys.com' }, + { name: 'Frankfurt (EU Central 2)', value: 'https://s3.eu-central-2.wasabisys.com' }, + { name: 'London (EU West 1)', value: 'https://s3.eu-west-1.wasabisys.com' }, + { name: 'Oregon (US West 1)', value: 'https://s3.us-west-1.wasabisys.com' }, + { name: 'Osaka (AP Northeast 2)', value: 'https://s3.ap-northeast-2.wasabisys.com' }, + { name: 'Paris (EU West 2)', value: 'https://s3.eu-west-2.wasabisys.com' }, + { name: 'Plano (US Central 1)', value: 'https://s3.us-central-1.wasabisys.com' }, + { name: 'Singapore (AP Southeast 1)', value: 'https://s3.ap-southeast-1.wasabisys.com' }, + { name: 'Sydney (AP Southeast 2)', value: 'https://s3.ap-southeast-2.wasabisys.com' }, + { name: 'Tokyo (AP Northeast 1)', value: 'https://s3.ap-northeast-1.wasabisys.com' }, + { name: 'Toronto (CA Central 1)', value: 'https://s3.ca-central-1.wasabisys.com' }, + { name: 'Virginia (US East 1)', value: 'https://s3.us-east-1.wasabisys.com' }, + { name: 'Virginia (US East 2)', value: 'https://s3.us-east-2.wasabisys.com' } +]; + +const REGIONS_DIGITALOCEAN = [ + { name: 'AMS3', value: 'https://ams3.digitaloceanspaces.com' }, + { name: 'FRA1', value: 'https://fra1.digitaloceanspaces.com' }, + { name: 'NYC3', value: 'https://nyc3.digitaloceanspaces.com' }, + { name: 'SFO2', value: 'https://sfo2.digitaloceanspaces.com' }, + { name: 'SFO3', value: 'https://sfo3.digitaloceanspaces.com' }, + { name: 'SGP1', value: 'https://sgp1.digitaloceanspaces.com' } +]; + +const REGIONS_EXOSCALE = [ + { name: 'AT-VIE-1', value: 'https://sos-at-vie-1.exo.io' }, + { name: 'CH-DK-2', value: 'https://sos-ch-dk-2.exo.io' }, + { name: 'CH-GVA-2', value: 'https://sos-ch-gva-2.exo.io' }, + { name: 'DE-FRA-1', value: 'https://sos-de-fra-1.exo.io' }, +]; + +// https://www.scaleway.com/docs/object-storage-feature/ +const REGIONS_SCALEWAY = [ + { name: 'FR-PAR', value: 'https://s3.fr-par.scw.cloud', region: 'fr-par' }, // default + { name: 'NL-AMS', value: 'https://s3.nl-ams.scw.cloud', region: 'nl-ams' } +]; + +const REGIONS_LINODE = [ + { name: 'Newark', value: 'us-east-1.linodeobjects.com', region: 'us-east-1' }, // default + { name: 'Frankfurt', value: 'eu-central-1.linodeobjects.com', region: 'us-east-1' }, + { name: 'Singapore', value: 'ap-south-1.linodeobjects.com', region: 'us-east-1' } +]; + +// note: ovh also has a storage endpoint but that only supports path style access +const REGIONS_OVH = [ + { name: 'Beauharnois (BHS)', value: 'https://s3.bhs.cloud.ovh.net', region: 'bhs' }, // default + { name: 'Frankfurt (DE)', value: 'https://s3.de.cloud.ovh.net', region: 'de' }, + { name: 'Gravelines (GRA)', value: 'https://s3.gra.cloud.ovh.net', region: 'gra' }, + { name: 'Strasbourg (SBG)', value: 'https://s3.sbg.cloud.ovh.net', region: 'sbg' }, + { name: 'London (UK)', value: 'https://s3.uk.cloud.ovh.net', region: 'uk' }, + { name: 'Sydney (SYD)', value: 'https://s3.syd.cloud.ovh.net', region: 'syd' }, + { name: 'Warsaw (WAW)', value: 'https://s3.waw.cloud.ovh.net', region: 'waw' }, +]; + +// https://devops.ionos.com/api/s3/ +const REGIONS_IONOS = [ + { name: 'DE', value: 'https://s3-de-central.profitbricks.com', region: 's3-de-central' }, // default +]; + +// this is not used anywhere because upcloud needs endpoint URL. we detect region from the URL +const REGIONS_UPCLOUD = [ + { name: 'AU-SYD1 (Australia)', value: 'https://au-syd1.upcloudobjects.com', region: 'au-syd1' }, // default + { name: 'DE-FRA1 (Germany)', value: 'https://de-fra1.upcloudobjects.com', region: 'de-fra1' }, + { name: 'ES-MAD1 (Spain)', value: 'https://es-mad1.upcloudobjects.com', region: 'es-mad1' }, + { name: 'FI-HEL2 (Finland)', value: 'https://fi-hel2.upcloudobjects.com', region: 'fi-hel2' }, + { name: 'NL-AMS1 (Netherlands)', value: 'https://nl-ams1.upcloudobjects.com', region: 'nl-ams1' }, + { name: 'PL-WAW1 (Poland)', value: 'https://pl-waw1.upcloudobjects.com', region: 'pl-waw1' }, + { name: 'SG-SIN1 (Singapore)', value: 'https://sg-sin1.upcloudobjects.com', region: 'sg-sin1' }, + { name: 'UK-LON1 (United Kingdom)', value: 'https://uk-lon1.upcloudobjects.com', region: 'uk-lon1' }, + { name: 'US-CHI1 (USA)', value: 'https://us-chi1.upcloudobjects.com', region: 'us-chi1' }, + { name: 'US-NYC1 (USA)', value: 'https://us-nyc1.upcloudobjects.com', region: 'us-nyc1' }, + { name: 'US-SJO1 (USA)', value: 'https://us-sjo1.upcloudobjects.com', region: 'us-sjo1' }, +]; + +const REGIONS_VULTR = [ + { name: 'New Jersey', value: 'https://ewr1.vultrobjects.com', region: 'us-east-1' }, // default +]; + +const STORAGE_PROVIDER = [ + { name: 'Amazon S3', value: 's3' }, + { 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' }, + { name: 'Minio', value: 'minio' }, + { name: 'NFS Mount', value: 'nfs' }, + { name: 'OVH Object Storage', value: 'ovh-objectstorage' }, + { name: 'S3 API Compatible (v4)', value: 's3-v4-compat' }, + { name: 'Scaleway Object Storage', value: 'scaleway-objectstorage' }, + { name: 'SSHFS Mount', value: 'sshfs' }, + { name: 'UpCloud Object Storage', value: 'upcloud-objectstorage' }, + { name: 'Vultr Object Storage', value: 'vultr-objectstorage' }, + { name: 'Wasabi', value: 'wasabi' }, + { name: 'XFS Disk', value: 'xfs' }, +]; + +const BACKUP_FORMATS = [ + { name: 'Tarball (zipped)', value: 'tgz' }, + { name: 'rsync', value: 'rsync' } +]; + // ---------------------------------------------- // Helper to ensure loading a fallback app icon on first load failure // ---------------------------------------------- diff --git a/src/js/restore.js b/src/js/restore.js index a9279a48d..b4a3a8400 100644 --- a/src/js/restore.js +++ b/src/js/restore.js @@ -1,6 +1,7 @@ 'use strict'; -/* global $, angular, tld, SECRET_PLACEHOLDER */ +/* global $, angular, tld, SECRET_PLACEHOLDER, STORAGE_PROVIDER, BACKUP_FORMATS */ +/* global REGIONS_S3, REGIONS_WASABI, REGIONS_DIGITALOCEAN, REGIONS_EXOSCALE, REGIONS_SCALEWAY, REGIONS_LINODE, REGIONS_OVH, REGIONS_IONOS, REGIONS_UPCLOUD, REGIONS_VULTR */ // create main application module var app = angular.module('Application', ['pascalprecht.translate', 'ngCookies', 'angular-md5', 'ui-notification', 'ui.bootstrap']); @@ -74,121 +75,20 @@ app.controller('RestoreController', ['$scope', 'Client', function ($scope, Clien } }; - // List is from http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region - $scope.s3Regions = [ - { name: 'Asia Pacific (Mumbai)', value: 'ap-south-1' }, - { name: 'Asia Pacific (Osaka-Local)', value: 'ap-northeast-3' }, - { name: 'Asia Pacific (Seoul)', value: 'ap-northeast-2' }, - { name: 'Asia Pacific (Singapore)', value: 'ap-southeast-1' }, - { name: 'Asia Pacific (Sydney)', value: 'ap-southeast-2' }, - { name: 'Asia Pacific (Tokyo)', value: 'ap-northeast-1' }, - { name: 'Canada (Central)', value: 'ca-central-1' }, - { name: 'China (Beijing)', value: 'cn-north-1' }, - { name: 'China (Ningxia)', value: 'cn-northwest-1' }, - { name: 'EU (Frankfurt)', value: 'eu-central-1' }, - { name: 'EU (Ireland)', value: 'eu-west-1' }, - { name: 'EU (London)', value: 'eu-west-2' }, - { name: 'EU (Paris)', value: 'eu-west-3' }, - { name: 'EU (Stockholm)', value: 'eu-north-1' }, - { name: 'South America (São Paulo)', value: 'sa-east-1' }, - { name: 'US East (N. Virginia)', value: 'us-east-1' }, - { name: 'US East (Ohio)', value: 'us-east-2' }, - { name: 'US West (N. California)', value: 'us-west-1' }, - { name: 'US West (Oregon)', value: 'us-west-2' }, - ]; + $scope.s3Regions = REGIONS_S3; + $scope.wasabiRegions = REGIONS_WASABI; + $scope.doSpacesRegions = REGIONS_DIGITALOCEAN; + $scope.exoscaleSosRegions = REGIONS_EXOSCALE; + $scope.scalewayRegions = REGIONS_SCALEWAY; + $scope.linodeRegions = REGIONS_LINODE; + $scope.ovhRegions = REGIONS_OVH; + $scope.ionosRegions = REGIONS_IONOS; + $scope.upcloudRegions = REGIONS_UPCLOUD; + $scope.vultrRegions = REGIONS_VULTR; - $scope.doSpacesRegions = [ - { name: 'AMS3', value: 'https://ams3.digitaloceanspaces.com' }, - { name: 'FRA1', value: 'https://fra1.digitaloceanspaces.com' }, - { name: 'NYC3', value: 'https://nyc3.digitaloceanspaces.com' }, - { name: 'SFO2', value: 'https://sfo2.digitaloceanspaces.com' }, - { name: 'SFO3', value: 'https://sfo3.digitaloceanspaces.com' }, - { name: 'SGP1', value: 'https://sgp1.digitaloceanspaces.com' } - ]; + $scope.storageProvider = STORAGE_PROVIDER; - $scope.exoscaleSosRegions = [ - { name: 'AT-VIE-1', value: 'https://sos-at-vie-1.exo.io' }, - { name: 'CH-DK-2', value: 'https://sos-ch-dk-2.exo.io' }, - { name: 'CH-GVA-2', value: 'https://sos-ch-gva-2.exo.io' }, - { name: 'DE-FRA-1', value: 'https://sos-de-fra-1.exo.io' }, - ]; - - // https://www.scaleway.com/docs/object-storage-feature/ - $scope.scalewayRegions = [ - { name: 'FR-PAR', value: 'https://s3.fr-par.scw.cloud', region: 'fr-par' }, // default - { name: 'NL-AMS', value: 'https://s3.nl-ams.scw.cloud', region: 'nl-ams' } - ]; - - $scope.linodeRegions = [ - { name: 'Newark', value: 'us-east-1.linodeobjects.com', region: 'us-east-1' }, // default - { name: 'Frankfurt', value: 'eu-central-1.linodeobjects.com', region: 'us-east-1' }, - { name: 'Singapore', value: 'ap-south-1.linodeobjects.com', region: 'us-east-1' }, - ]; - - // note: ovh also has a storage endpoint but that only supports path style access - $scope.ovhRegions = [ - { name: 'Beauharnois (BHS)', value: 'https://s3.bhs.cloud.ovh.net', region: 'bhs' }, // default - { name: 'Frankfurt (DE)', value: 'https://s3.de.cloud.ovh.net', region: 'de' }, - { name: 'Gravelines (GRA)', value: 'https://s3.gra.cloud.ovh.net', region: 'gra' }, - { name: 'Strasbourg (SBG)', value: 'https://s3.sbg.cloud.ovh.net', region: 'sbg' }, - { name: 'London (UK)', value: 'https://s3.uk.cloud.ovh.net', region: 'uk' }, - { name: 'Sydney (SYD)', value: 'https://s3.syd.cloud.ovh.net', region: 'syd' }, - { name: 'Warsaw (WAW)', value: 'https://s3.waw.cloud.ovh.net', region: 'waw' }, - ]; - - // https://devops.ionos.com/api/s3/ - $scope.ionosRegions = [ - { name: 'DE', value: 'https://s3-de-central.profitbricks.com', region: 's3-de-central' }, // default - ]; - - $scope.vultrRegions = [ - { name: 'New Jersey', value: 'https://ewr1.vultrobjects.com', region: 'us-east-1' }, // default - ]; - - $scope.wasabiRegions = [ - { name: 'Amsterdam (EU Central 1)', value: 'https://s3.eu-central-1.wasabisys.com' }, - { name: 'Frankfurt (EU Central 2)', value: 'https://s3.eu-central-2.wasabisys.com' }, - { name: 'London (EU West 1)', value: 'https://s3.eu-west-1.wasabisys.com' }, - { name: 'Oregon (US West 1)', value: 'https://s3.us-west-1.wasabisys.com' }, - { name: 'Osaka (AP Northeast 2)', value: 'https://s3.ap-northeast-2.wasabisys.com' }, - { name: 'Paris (EU West 2)', value: 'https://s3.eu-west-2.wasabisys.com' }, - { name: 'Plano (US Central 1)', value: 'https://s3.us-central-1.wasabisys.com' }, - { name: 'Singapore (AP Southeast 1)', value: 'https://s3.ap-southeast-1.wasabisys.com' }, - { name: 'Sydney (AP Southeast 2)', value: 'https://s3.ap-southeast-2.wasabisys.com' }, - { name: 'Tokyo (AP Northeast 1)', value: 'https://s3.ap-northeast-1.wasabisys.com' }, - { name: 'Toronto (CA Central 1)', value: 'https://s3.ca-central-1.wasabisys.com' }, - { name: 'Virginia (US East 1)', value: 'https://s3.us-east-1.wasabisys.com' }, - { name: 'Virginia (US East 2)', value: 'https://s3.us-east-2.wasabisys.com' } - ]; - - $scope.storageProvider = [ - { name: 'Amazon S3', value: 's3' }, - { 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' }, - { name: 'Minio', value: 'minio' }, - { name: 'NFS Mount', value: 'nfs' }, - { name: 'OVH Object Storage', value: 'ovh-objectstorage' }, - { name: 'S3 API Compatible (v4)', value: 's3-v4-compat' }, - { name: 'Scaleway Object Storage', value: 'scaleway-objectstorage' }, - { name: 'SSHFS Mount', value: 'sshfs' }, - { name: 'UpCloud Object Storage', value: 'upcloud-objectstorage' }, - { name: 'Vultr Object Storage', value: 'vultr-objectstorage' }, - { name: 'Wasabi', value: 'wasabi' }, - { name: 'XFS Disk', value: 'xfs' }, - ]; - - $scope.formats = [ - { name: 'Tarball (zipped)', value: 'tgz' }, - { name: 'rsync', value: 'rsync' } - ]; + $scope.formats = BACKUP_FORMATS; $scope.s3like = function (provider) { return provider === 's3' || provider === 'minio' || provider === 's3-v4-compat' || provider === 'exoscale-sos' diff --git a/src/js/utils.js b/src/js/utils.js index 3571a7600..304bd1375 100644 --- a/src/js/utils.js +++ b/src/js/utils.js @@ -37,4 +37,5 @@ angular.module('Application').directive('passwordReveal', function () { element.parentNode.insertBefore(eye, element.nextSibling); } }; -}); \ No newline at end of file +}); + diff --git a/src/views/app.js b/src/views/app.js index 35a01462f..c1ea2be09 100644 --- a/src/views/app.js +++ b/src/views/app.js @@ -9,125 +9,24 @@ /* global Chart */ /* global Clipboard */ /* global SECRET_PLACEHOLDER */ -/* global APP_TYPES */ +/* global APP_TYPES, STORAGE_PROVIDER, BACKUP_FORMATS */ +/* global REGIONS_S3, REGIONS_WASABI, REGIONS_DIGITALOCEAN, REGIONS_EXOSCALE, REGIONS_SCALEWAY, REGIONS_LINODE, REGIONS_OVH, REGIONS_IONOS, REGIONS_UPCLOUD, REGIONS_VULTR */ angular.module('Application').controller('AppController', ['$scope', '$location', '$translate', '$timeout', '$interval', '$route', '$routeParams', 'Client', function ($scope, $location, $translate, $timeout, $interval, $route, $routeParams, Client) { - // List is from http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region - $scope.s3Regions = [ - { name: 'Asia Pacific (Mumbai)', value: 'ap-south-1' }, - { name: 'Asia Pacific (Osaka-Local)', value: 'ap-northeast-3' }, - { name: 'Asia Pacific (Seoul)', value: 'ap-northeast-2' }, - { name: 'Asia Pacific (Singapore)', value: 'ap-southeast-1' }, - { name: 'Asia Pacific (Sydney)', value: 'ap-southeast-2' }, - { name: 'Asia Pacific (Tokyo)', value: 'ap-northeast-1' }, - { name: 'Canada (Central)', value: 'ca-central-1' }, - { name: 'China (Beijing)', value: 'cn-north-1' }, - { name: 'China (Ningxia)', value: 'cn-northwest-1' }, - { name: 'EU (Frankfurt)', value: 'eu-central-1' }, - { name: 'EU (Ireland)', value: 'eu-west-1' }, - { name: 'EU (London)', value: 'eu-west-2' }, - { name: 'EU (Paris)', value: 'eu-west-3' }, - { name: 'EU (Stockholm)', value: 'eu-north-1' }, - { name: 'South America (São Paulo)', value: 'sa-east-1' }, - { name: 'US East (N. Virginia)', value: 'us-east-1' }, - { name: 'US East (Ohio)', value: 'us-east-2' }, - { name: 'US West (N. California)', value: 'us-west-1' }, - { name: 'US West (Oregon)', value: 'us-west-2' }, - ]; + $scope.s3Regions = REGIONS_S3; + $scope.wasabiRegions = REGIONS_WASABI; + $scope.doSpacesRegions = REGIONS_DIGITALOCEAN; + $scope.exoscaleSosRegions = REGIONS_EXOSCALE; + $scope.scalewayRegions = REGIONS_SCALEWAY; + $scope.linodeRegions = REGIONS_LINODE; + $scope.ovhRegions = REGIONS_OVH; + $scope.ionosRegions = REGIONS_IONOS; + $scope.upcloudRegions = REGIONS_UPCLOUD; + $scope.vultrRegions = REGIONS_VULTR; - $scope.wasabiRegions = [ - { name: 'Amsterdam (EU Central 1)', value: 'https://s3.eu-central-1.wasabisys.com' }, - { name: 'Frankfurt (EU Central 2)', value: 'https://s3.eu-central-2.wasabisys.com' }, - { name: 'London (EU West 1)', value: 'https://s3.eu-west-1.wasabisys.com' }, - { name: 'Oregon (US West 1)', value: 'https://s3.us-west-1.wasabisys.com' }, - { name: 'Osaka (AP Northeast 2)', value: 'https://s3.ap-northeast-2.wasabisys.com' }, - { name: 'Paris (EU West 2)', value: 'https://s3.eu-west-2.wasabisys.com' }, - { name: 'Plano (US Central 1)', value: 'https://s3.us-central-1.wasabisys.com' }, - { name: 'Singapore (AP Southeast 1)', value: 'https://s3.ap-southeast-1.wasabisys.com' }, - { name: 'Sydney (AP Southeast 2)', value: 'https://s3.ap-southeast-2.wasabisys.com' }, - { name: 'Tokyo (AP Northeast 1)', value: 'https://s3.ap-northeast-1.wasabisys.com' }, - { name: 'Toronto (CA Central 1)', value: 'https://s3.ca-central-1.wasabisys.com' }, - { name: 'Virginia (US East 1)', value: 'https://s3.us-east-1.wasabisys.com' }, - { name: 'Virginia (US East 2)', value: 'https://s3.us-east-2.wasabisys.com' } - ]; + $scope.storageProvider = STORAGE_PROVIDER; - $scope.doSpacesRegions = [ - { name: 'AMS3', value: 'https://ams3.digitaloceanspaces.com' }, - { name: 'FRA1', value: 'https://fra1.digitaloceanspaces.com' }, - { name: 'NYC3', value: 'https://nyc3.digitaloceanspaces.com' }, - { name: 'SFO2', value: 'https://sfo2.digitaloceanspaces.com' }, - { name: 'SFO3', value: 'https://sfo3.digitaloceanspaces.com' }, - { name: 'SGP1', value: 'https://sgp1.digitaloceanspaces.com' } - ]; - - $scope.exoscaleSosRegions = [ - { name: 'AT-VIE-1', value: 'https://sos-at-vie-1.exo.io' }, - { name: 'CH-DK-2', value: 'https://sos-ch-dk-2.exo.io' }, - { name: 'CH-GVA-2', value: 'https://sos-ch-gva-2.exo.io' }, - { name: 'DE-FRA-1', value: 'https://sos-de-fra-1.exo.io' }, - ]; - - // https://www.scaleway.com/docs/object-storage-feature/ - $scope.scalewayRegions = [ - { name: 'FR-PAR', value: 'https://s3.fr-par.scw.cloud', region: 'fr-par' }, // default - { name: 'NL-AMS', value: 'https://s3.nl-ams.scw.cloud', region: 'nl-ams' } - ]; - - $scope.linodeRegions = [ - { name: 'Newark', value: 'us-east-1.linodeobjects.com', region: 'us-east-1' }, // default - { name: 'Frankfurt', value: 'eu-central-1.linodeobjects.com', region: 'us-east-1' }, - { name: 'Singapore', value: 'ap-south-1.linodeobjects.com', region: 'us-east-1' }, - ]; - - // note: ovh also has a storage endpoint but that only supports path style access - $scope.ovhRegions = [ - { name: 'Beauharnois (BHS)', value: 'https://s3.bhs.cloud.ovh.net', region: 'bhs' }, // default - { name: 'Frankfurt (DE)', value: 'https://s3.de.cloud.ovh.net', region: 'de' }, - { name: 'Gravelines (GRA)', value: 'https://s3.gra.cloud.ovh.net', region: 'gra' }, - { name: 'Strasbourg (SBG)', value: 'https://s3.sbg.cloud.ovh.net', region: 'sbg' }, - { name: 'London (UK)', value: 'https://s3.uk.cloud.ovh.net', region: 'uk' }, - { name: 'Sydney (SYD)', value: 'https://s3.syd.cloud.ovh.net', region: 'syd' }, - { name: 'Warsaw (WAW)', value: 'https://s3.waw.cloud.ovh.net', region: 'waw' }, - ]; - - // https://devops.ionos.com/api/s3/ - $scope.ionosRegions = [ - { name: 'DE', value: 'https://s3-de-central.profitbricks.com', region: 's3-de-central' }, // default - ]; - - $scope.vultrRegions = [ - { name: 'New Jersey', value: 'https://ewr1.vultrobjects.com', region: 'us-east-1' }, // default - ]; - - $scope.storageProvider = [ - { name: 'Amazon S3', value: 's3' }, - { name: 'Backblaze B2 (S3 API)', value: 'backblaze-b2' }, - { name: 'CIFS Mount', value: 'cifs' }, - { name: 'DigitalOcean Spaces', value: 'digitalocean-spaces' }, - { name: 'Exoscale SOS', value: 'exoscale-sos' }, - // { name: 'EXT4', value: 'ext4' }, - { name: 'Filesystem', value: 'filesystem' }, - // { name: 'Filesystem (Mountpoint)', value: 'mountpoint' }, - { name: 'Google Cloud Storage', value: 'gcs' }, - { name: 'IONOS (Profitbricks)', value: 'ionos-objectstorage' }, - { name: 'Linode Object Storage', value: 'linode-objectstorage' }, - { name: 'Minio', value: 'minio' }, - { name: 'NFS Mount', value: 'nfs' }, - { name: 'OVH Object Storage', value: 'ovh-objectstorage' }, - { name: 'S3 API Compatible (v4)', value: 's3-v4-compat' }, - { name: 'Scaleway Object Storage', value: 'scaleway-objectstorage' }, - { name: 'SSHFS Mount', value: 'sshfs' }, - { name: 'UpCloud Object Storage', value: 'upcloud-objectstorage' }, - { name: 'Vultr Object Storage', value: 'vultr-objectstorage' }, - // { name: 'No-op (Only for testing)', value: 'noop' }, - { name: 'Wasabi', value: 'wasabi' } - // { name: 'XFS', value: 'xfs' } - ]; - - $scope.formats = [ - { name: 'Tarball (zipped)', value: 'tgz' }, - { name: 'rsync', value: 'rsync' } - ]; + $scope.formats = BACKUP_FORMATS; // Avoid full reload on path change // https://stackoverflow.com/a/22614334 diff --git a/src/views/backups.js b/src/views/backups.js index a8d0c9d8f..7b2a9c1c0 100644 --- a/src/views/backups.js +++ b/src/views/backups.js @@ -1,6 +1,7 @@ 'use strict'; -/* global $, angular, TASK_TYPES, SECRET_PLACEHOLDER */ +/* global $, angular, TASK_TYPES, SECRET_PLACEHOLDER, STORAGE_PROVIDER, BACKUP_FORMATS */ +/* global REGIONS_S3, REGIONS_WASABI, REGIONS_DIGITALOCEAN, REGIONS_EXOSCALE, REGIONS_SCALEWAY, REGIONS_LINODE, REGIONS_OVH, REGIONS_IONOS, REGIONS_UPCLOUD, REGIONS_VULTR */ angular.module('Application').controller('BackupsController', ['$scope', '$location', '$rootScope', '$timeout', 'Client', function ($scope, $location, $rootScope, $timeout, Client) { Client.onReady(function () { if (!Client.getUserInfo().isAtLeastAdmin) $location.path('/'); }); @@ -17,132 +18,20 @@ angular.module('Application').controller('BackupsController', ['$scope', '$locat $scope.backupConfig = {}; $scope.backups = []; - // List is from http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region - $scope.s3Regions = [ - { name: 'Asia Pacific (Mumbai)', value: 'ap-south-1' }, - { name: 'Asia Pacific (Osaka-Local)', value: 'ap-northeast-3' }, - { name: 'Asia Pacific (Seoul)', value: 'ap-northeast-2' }, - { name: 'Asia Pacific (Singapore)', value: 'ap-southeast-1' }, - { name: 'Asia Pacific (Sydney)', value: 'ap-southeast-2' }, - { name: 'Asia Pacific (Tokyo)', value: 'ap-northeast-1' }, - { name: 'Canada (Central)', value: 'ca-central-1' }, - { name: 'China (Beijing)', value: 'cn-north-1' }, - { name: 'China (Ningxia)', value: 'cn-northwest-1' }, - { name: 'EU (Frankfurt)', value: 'eu-central-1' }, - { name: 'EU (Ireland)', value: 'eu-west-1' }, - { name: 'EU (London)', value: 'eu-west-2' }, - { name: 'EU (Paris)', value: 'eu-west-3' }, - { name: 'EU (Stockholm)', value: 'eu-north-1' }, - { name: 'South America (São Paulo)', value: 'sa-east-1' }, - { name: 'US East (N. Virginia)', value: 'us-east-1' }, - { name: 'US East (Ohio)', value: 'us-east-2' }, - { name: 'US West (N. California)', value: 'us-west-1' }, - { name: 'US West (Oregon)', value: 'us-west-2' }, - ]; + $scope.s3Regions = REGIONS_S3; + $scope.wasabiRegions = REGIONS_WASABI; + $scope.doSpacesRegions = REGIONS_DIGITALOCEAN; + $scope.exoscaleSosRegions = REGIONS_EXOSCALE; + $scope.scalewayRegions = REGIONS_SCALEWAY; + $scope.linodeRegions = REGIONS_LINODE; + $scope.ovhRegions = REGIONS_OVH; + $scope.ionosRegions = REGIONS_IONOS; + $scope.upcloudRegions = REGIONS_UPCLOUD; + $scope.vultrRegions = REGIONS_VULTR; - $scope.wasabiRegions = [ - { name: 'Amsterdam (EU Central 1)', value: 'https://s3.eu-central-1.wasabisys.com' }, - { name: 'Frankfurt (EU Central 2)', value: 'https://s3.eu-central-2.wasabisys.com' }, - { name: 'London (EU West 1)', value: 'https://s3.eu-west-1.wasabisys.com' }, - { name: 'Oregon (US West 1)', value: 'https://s3.us-west-1.wasabisys.com' }, - { name: 'Osaka (AP Northeast 2)', value: 'https://s3.ap-northeast-2.wasabisys.com' }, - { name: 'Paris (EU West 2)', value: 'https://s3.eu-west-2.wasabisys.com' }, - { name: 'Plano (US Central 1)', value: 'https://s3.us-central-1.wasabisys.com' }, - { name: 'Singapore (AP Southeast 1)', value: 'https://s3.ap-southeast-1.wasabisys.com' }, - { name: 'Sydney (AP Southeast 2)', value: 'https://s3.ap-southeast-2.wasabisys.com' }, - { name: 'Tokyo (AP Northeast 1)', value: 'https://s3.ap-northeast-1.wasabisys.com' }, - { name: 'Toronto (CA Central 1)', value: 'https://s3.ca-central-1.wasabisys.com' }, - { name: 'Virginia (US East 1)', value: 'https://s3.us-east-1.wasabisys.com' }, - { name: 'Virginia (US East 2)', value: 'https://s3.us-east-2.wasabisys.com' } - ]; - - $scope.doSpacesRegions = [ - { name: 'AMS3', value: 'https://ams3.digitaloceanspaces.com' }, - { name: 'FRA1', value: 'https://fra1.digitaloceanspaces.com' }, - { name: 'NYC3', value: 'https://nyc3.digitaloceanspaces.com' }, - { name: 'SFO2', value: 'https://sfo2.digitaloceanspaces.com' }, - { name: 'SFO3', value: 'https://sfo3.digitaloceanspaces.com' }, - { name: 'SGP1', value: 'https://sgp1.digitaloceanspaces.com' } - ]; - - $scope.exoscaleSosRegions = [ - { name: 'AT-VIE-1', value: 'https://sos-at-vie-1.exo.io' }, - { name: 'CH-DK-2', value: 'https://sos-ch-dk-2.exo.io' }, - { name: 'CH-GVA-2', value: 'https://sos-ch-gva-2.exo.io' }, - { name: 'DE-FRA-1', value: 'https://sos-de-fra-1.exo.io' }, - ]; - - // https://www.scaleway.com/docs/object-storage-feature/ - $scope.scalewayRegions = [ - { name: 'FR-PAR', value: 'https://s3.fr-par.scw.cloud', region: 'fr-par' }, // default - { name: 'NL-AMS', value: 'https://s3.nl-ams.scw.cloud', region: 'nl-ams' } - ]; - - $scope.linodeRegions = [ - { name: 'Newark', value: 'us-east-1.linodeobjects.com', region: 'us-east-1' }, // default - { name: 'Frankfurt', value: 'eu-central-1.linodeobjects.com', region: 'us-east-1' }, - { name: 'Singapore', value: 'ap-south-1.linodeobjects.com', region: 'us-east-1' } - ]; - - // note: ovh also has a storage endpoint but that only supports path style access - $scope.ovhRegions = [ - { name: 'Beauharnois (BHS)', value: 'https://s3.bhs.cloud.ovh.net', region: 'bhs' }, // default - { name: 'Frankfurt (DE)', value: 'https://s3.de.cloud.ovh.net', region: 'de' }, - { name: 'Gravelines (GRA)', value: 'https://s3.gra.cloud.ovh.net', region: 'gra' }, - { name: 'Strasbourg (SBG)', value: 'https://s3.sbg.cloud.ovh.net', region: 'sbg' }, - { name: 'London (UK)', value: 'https://s3.uk.cloud.ovh.net', region: 'uk' }, - { name: 'Sydney (SYD)', value: 'https://s3.syd.cloud.ovh.net', region: 'syd' }, - { name: 'Warsaw (WAW)', value: 'https://s3.waw.cloud.ovh.net', region: 'waw' }, - ]; - - // https://devops.ionos.com/api/s3/ - $scope.ionosRegions = [ - { name: 'DE', value: 'https://s3-de-central.profitbricks.com', region: 's3-de-central' }, // default - ]; - - // this is not used anywhere because upcloud needs endpoint URL. we detect region from the URL - $scope.upcloudRegions = [ - { name: 'AU-SYD1 (Australia)', value: 'https://au-syd1.upcloudobjects.com', region: 'au-syd1' }, // default - { name: 'DE-FRA1 (Germany)', value: 'https://de-fra1.upcloudobjects.com', region: 'de-fra1' }, - { name: 'ES-MAD1 (Spain)', value: 'https://es-mad1.upcloudobjects.com', region: 'es-mad1' }, - { name: 'FI-HEL2 (Finland)', value: 'https://fi-hel2.upcloudobjects.com', region: 'fi-hel2' }, - { name: 'NL-AMS1 (Netherlands)', value: 'https://nl-ams1.upcloudobjects.com', region: 'nl-ams1' }, - { name: 'PL-WAW1 (Poland)', value: 'https://pl-waw1.upcloudobjects.com', region: 'pl-waw1' }, - { name: 'SG-SIN1 (Singapore)', value: 'https://sg-sin1.upcloudobjects.com', region: 'sg-sin1' }, - { name: 'UK-LON1 (United Kingdom)', value: 'https://uk-lon1.upcloudobjects.com', region: 'uk-lon1' }, - { name: 'US-CHI1 (USA)', value: 'https://us-chi1.upcloudobjects.com', region: 'us-chi1' }, - { name: 'US-NYC1 (USA)', value: 'https://us-nyc1.upcloudobjects.com', region: 'us-nyc1' }, - { name: 'US-SJO1 (USA)', value: 'https://us-sjo1.upcloudobjects.com', region: 'us-sjo1' }, - ]; - - $scope.vultrRegions = [ - { name: 'New Jersey', value: 'https://ewr1.vultrobjects.com', region: 'us-east-1' }, // default - ]; - - $scope.storageProvider = [ - { name: 'Amazon S3', value: 's3' }, - { 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' }, - { name: 'Minio', value: 'minio' }, - { name: 'NFS Mount', value: 'nfs' }, - { name: 'OVH Object Storage', value: 'ovh-objectstorage' }, - { name: 'S3 API Compatible (v4)', value: 's3-v4-compat' }, - { name: 'Scaleway Object Storage', value: 'scaleway-objectstorage' }, - { name: 'SSHFS Mount', value: 'sshfs' }, - { name: 'UpCloud Object Storage', value: 'upcloud-objectstorage' }, - { name: 'Vultr Object Storage', value: 'vultr-objectstorage' }, - { name: 'Wasabi', value: 'wasabi' }, - { name: 'XFS', value: 'xfs' }, + $scope.storageProvider = STORAGE_PROVIDER.concat([ { name: 'No-op (Only for testing)', value: 'noop' } - ]; + ]); $scope.retentionPolicies = [ { name: '2 days', value: { keepWithinSecs: 2 * 24 * 60 * 60 }}, @@ -169,10 +58,7 @@ angular.module('Application').controller('BackupsController', ['$scope', '$locat // generates 24h time sets (instead of american 12h) to avoid having to translate everything to locales eg. 12:00 $scope.cronHours = Array.from({ length: 24 }).map(function (v, i) { return { name: (i < 10 ? '0' : '') + i + ':00', value: i }; }); - $scope.formats = [ - { name: 'Tarball (zipped)', value: 'tgz' }, - { name: 'rsync', value: 'rsync' } - ]; + $scope.formats = BACKUP_FORMATS; $scope.prettyProviderName = function (provider) { switch (provider) {