2020-05-22 13:48:26 +02:00
<!-- Modal details -->
< div class = "modal fade" id = "backupDetailsModal" tabindex = "-1" role = "dialog" >
< div class = "modal-dialog" >
< div class = "modal-content" >
< div class = "modal-header" >
2020-11-03 16:58:11 +01:00
< h4 class = "modal-title" > {{ 'backups.backupDetails.title' | tr }}< / h4 >
2020-05-22 13:48:26 +02:00
< / div >
< div class = "modal-body" >
< div class = "row" >
2020-11-03 16:58:11 +01:00
< div class = "col-xs-3 text-muted" > {{ 'backups.backupDetails.id' | tr }}:< / div >
2020-05-22 13:48:26 +02:00
< div class = "col-xs-9 text-right" > {{ backupDetails.backup.id }}< / div >
< / div >
2022-04-05 14:41:41 +02:00
< div class = "row" >
2022-04-08 15:09:04 +02:00
< div class = "col-xs-3 text-muted" > {{ 'backups.backupEdit.label' | tr }}:< / div >
2022-04-05 14:41:41 +02:00
< div class = "col-xs-9 text-right" > {{ backupDetails.backup.label }}< / div >
< / div >
2020-05-22 13:48:26 +02:00
< div class = "row" >
2020-11-03 16:58:11 +01:00
< div class = "col-xs-3 text-muted" > {{ 'backups.backupDetails.date' | tr }}:< / div >
2020-05-22 13:48:26 +02:00
< div class = "col-xs-9 text-right" > {{ backupDetails.backup.creationTime | prettyLongDate }}< / div >
< / div >
< div class = "row" >
2020-11-03 16:58:11 +01:00
< div class = "col-xs-3 text-muted" > {{ 'backups.backupDetails.version' | tr }}:< / div >
2020-05-22 13:48:26 +02:00
< div class = "col-xs-9 text-right" > v{{ backupDetails.backup.packageVersion }}< / div >
< / div >
< div class = "row" >
2020-11-03 16:58:11 +01:00
< div class = "col-xs-3 text-muted" > {{ 'backups.backupDetails.format' | tr }}:< / div >
2020-05-22 13:48:26 +02:00
< div class = "col-xs-9 text-right" > {{ backupDetails.backup.format }}< / div >
< / div >
< br / >
2020-11-12 23:13:52 +01:00
< p class = "text-muted" > {{ 'backups.backupDetails.list' | tr:{ appCount: backupDetails.backup.contents.length } }}:< / p >
2020-05-27 09:34:04 -07:00
< span ng-repeat = "app in backupDetails.backup.contents | orderBy:['label','fqdn']" >
2020-11-03 16:58:11 +01:00
< a ng-href = "/#/app/{{app.id}}/backups" > {{ app.label || app.fqdn }}< / a > < span ng-hide = "$last" > ,< / span >
2020-05-27 09:20:39 -07:00
< / span >
2020-05-22 13:48:26 +02:00
< / div >
< div class = "modal-footer" >
2020-11-03 16:58:11 +01:00
< button type = "button" class = "btn btn-primary" data-dismiss = "modal" > {{ 'main.dialog.close' | tr }}< / button >
2020-05-22 13:48:26 +02:00
< / div >
< / div >
< / div >
< / div >
2022-04-05 14:41:41 +02:00
<!-- Modal edit individual backup (label and retention sec) -->
< div class = "modal fade" id = "editBackupModal" tabindex = "-1" role = "dialog" >
< div class = "modal-dialog" >
< div class = "modal-content" >
< div class = "modal-header" >
2022-04-08 15:09:04 +02:00
< h4 class = "modal-title" > {{ 'backups.backupEdit.title' | tr }}< / h4 >
2022-04-05 14:41:41 +02:00
< / div >
< div class = "modal-body" >
< form name = "editBackupForm" role = "form" novalidate ng-submit = "editBackup.submit()" autocomplete = "off" >
< p class = "has-error text-center" ng-show = "editBackup.error" > {{ editBackup.error }}< / p >
< div class = "form-group" >
2022-04-08 15:09:04 +02:00
< label class = "control-label" for = "inputBackupLabel" > {{ 'backups.backupEdit.label' | tr }}< / label >
2022-04-05 14:41:41 +02:00
< input type = "text" class = "form-control" ng-model = "editBackup.label" id = "inputBackupLabel" name = "label" ng-disabled = "editBackup.busy" placeholder = "" autofocus >
< / div >
< div class = "form-group" >
2022-04-07 15:31:41 +02:00
< div class = "checkbox" >
< label >
2022-04-08 15:09:04 +02:00
< input type = "checkbox" ng-model = "editBackup.persist" > {{ 'backups.backupEdit.preserved.description' | tr }}< / input >
2022-04-08 11:22:05 -07:00
< sup > < a popover-placement = "top-right" popover-trigger = "outsideClick" uib-popover = "{{ 'backups.backupEdit.preserved.tooltip' | tr: { appsLength: editBackup.backup.contents.length} }}" > < i class = "fa fa-question-circle" > < / i > < / a > < / sup >
2022-04-07 15:31:41 +02:00
< / label >
< / div >
2022-04-05 14:41:41 +02:00
< / div >
< / form >
< / div >
< div class = "modal-footer" >
< button type = "button" class = "btn btn-default" data-dismiss = "modal" > {{ 'main.dialog.cancel' | tr }}< / button >
< button type = "submit" class = "btn btn-outline btn-success pull-right" ng-click = "editBackup.submit()" ng-disabled = "editBackupForm.$invalid || editBackup.busy" > < i class = "fa fa-circle-notch fa-spin" ng-show = "editBackup.busy" > < / i > < span > {{ 'main.dialog.save' | tr }}< / span > < / button >
< / div >
< / div >
< / div >
< / div >
2018-06-07 14:22:48 +02:00
<!-- Modal backup failed -->
< div class = "modal fade" id = "createBackupFailedModal" tabindex = "-1" role = "dialog" >
< div class = "modal-dialog" >
< div class = "modal-content" >
< div class = "modal-header" >
2020-11-03 16:58:11 +01:00
< h4 class = "modal-title" > {{ 'backups.backupFailed.title' | tr }}< / h4 >
2018-06-07 14:22:48 +02:00
< / div >
< div class = "modal-body" >
{{ createBackup.errorMessage }}
< / div >
< div class = "modal-footer" >
2020-11-03 16:58:11 +01:00
< button type = "button" class = "btn btn-primary" data-dismiss = "modal" > {{ 'main.dialog.close' | tr }}< / button >
2018-06-07 14:22:48 +02:00
< / div >
< / div >
< / div >
< / div >
2020-07-15 15:10:37 -07:00
<!-- Cleanup backups info -->
< div class = "modal fade" id = "cleanupBackupsModal" tabindex = "-1" role = "dialog" >
< div class = "modal-dialog" >
< div class = "modal-content" >
< div class = "modal-header" >
2020-11-03 16:58:11 +01:00
< h4 class = "modal-title" > {{ 'backups.cleanupBackups.title' | tr }}< / h4 >
2020-07-15 15:10:37 -07:00
< / div >
2020-11-03 16:58:11 +01:00
< div class = "modal-body" > {{ 'backups.cleanupBackups.description' | tr }}< / div >
2020-07-15 15:10:37 -07:00
< div class = "modal-footer" >
2020-11-03 16:58:11 +01:00
< button type = "button" class = "btn btn-default" data-dismiss = "modal" > {{ 'main.dialog.cancel' | tr }}< / button >
< button type = "submit" class = "btn btn-outline btn-success pull-right" ng-click = "createBackup.startCleanup()" > {{ 'backups.cleanupBackups.cleanupNow' | tr }}< / button >
2020-07-15 15:10:37 -07:00
< / div >
< / div >
< / div >
< / div >
2020-05-19 16:13:20 +02:00
<!-- modal backup config -->
< div class = "modal fade" id = "configureScheduleAndRetentionModal" tabindex = "-1" role = "dialog" >
< div class = "modal-dialog" >
< div class = "modal-content" >
< div class = "modal-header" >
2020-11-03 16:58:11 +01:00
< h4 class = "modal-title" > {{ 'backups.configureBackupSchedule.title' | tr }}< / h4 >
2020-05-19 16:13:20 +02:00
< / div >
< div class = "modal-body" >
< form name = "configureScheduleAndRetentionForm" role = "form" novalidate ng-submit = "configureScheduleAndRetention.submit()" autocomplete = "off" >
2020-11-03 16:58:11 +01:00
< p class = "has-error text-center" ng-show = "configureScheduleAndRetention.error" > {{ configureScheduleAndRetention.error.generic }}< / p >
2020-07-28 21:48:24 -07:00
2020-11-03 16:58:11 +01:00
< div class = "form-group" >
< label class = "control-label" for = "backupSchedule" > {{ 'backups.configureBackupSchedule.schedule' | tr }}< / label >
< p ng-bind-html = "'backups.configureBackupSchedule.scheduleDescription' | tr" > < / p >
2020-07-28 21:48:24 -07:00
2020-11-03 16:58:11 +01:00
< div class = "row" style = "margin-left: 20px;" >
< div class = "col-md-5" >
{{ 'backups.configureBackupSchedule.days' | tr }}: < multiselect id = "backupSchedule" class = "input-sm stretch" ng-model = "configureScheduleAndRetention.days" options = "a.name for a in cronDays" data-multiple = "true" > < / multiselect >
2020-07-28 21:48:24 -07:00
< / div >
2020-05-19 16:13:20 +02:00
2020-11-03 16:58:11 +01:00
< div class = "col-md-5" >
{{ 'backups.configureBackupSchedule.hours' | tr }}: < multiselect class = "input-sm stretch" ng-model = "configureScheduleAndRetention.hours" options = "a.name for a in cronHours" data-multiple = "true" > < / multiselect >
< / div >
2020-05-19 16:13:20 +02:00
< / div >
2020-11-03 16:58:11 +01:00
< / div >
2020-05-19 16:13:20 +02:00
2020-11-03 16:58:11 +01:00
< div class = "form-group" >
< label class = "control-label" for = "backupRetention" > {{ 'backups.configureBackupSchedule.retentionPolicy' | tr }}< / label >
< select class = "form-control" id = "backupRetention" ng-model = "configureScheduleAndRetention.retentionPolicy" ng-options = "a.value as a.name for a in retentionPolicies" > < / select >
< / div >
2020-05-19 16:13:20 +02:00
< / form >
< / div >
< div class = "modal-footer " >
2020-11-03 16:58:11 +01:00
< button type = "button" class = "btn btn-default" data-dismiss = "modal" > {{ 'main.dialog.cancel' | tr }}< / button >
< button type = "submit" class = "btn btn-outline btn-success pull-right" ng-click = "configureScheduleAndRetention.submit()" ng-disabled = "configureScheduleAndRetention.$invalid || configureScheduleAndRetention.busy" > < i class = "fa fa-circle-notch fa-spin" ng-show = "configureScheduleAndRetention.busy" > < / i > < span > {{ 'main.dialog.save' | tr }}< / span > < / button >
2020-05-19 16:13:20 +02:00
< / div >
< / div >
< / div >
< / div >
2018-06-07 14:22:48 +02:00
<!-- modal backup config -->
< div class = "modal fade" id = "configureBackupModal" tabindex = "-1" role = "dialog" >
< div class = "modal-dialog" >
< div class = "modal-content" >
< div class = "modal-header" >
2020-11-03 16:58:11 +01:00
< h4 class = "modal-title" > {{ 'backups.configureBackupStorage.title' | tr }}< / h4 >
2018-06-07 14:22:48 +02:00
< / div >
< div class = "modal-body" >
< form name = "configureBackupForm" role = "form" novalidate ng-submit = "configureBackup.submit()" autocomplete = "off" >
2020-11-03 16:58:11 +01:00
< p class = "has-error text-center" ng-show = "configureBackup.error" > {{ configureBackup.error.generic }}< / p >
< div class = "form-group" >
< label class = "control-label" for = "storageProviderProvider" > {{ 'backups.configureBackupStorage.provider' | tr }} < sup > < a ng-href = "https://docs.cloudron.io/backups/#storage-providers" class = "help" target = "_blank" > < i class = "fa fa-question-circle" > < / i > < / a > < / sup > < / label >
< p class = "small text-info" ng-show = "backupConfig.provider !== configureBackup.provider" > Backups in the old storage location have to be removed manually.< / p >
< select class = "form-control" id = "storageProviderProvider" ng-model = "configureBackup.provider" ng-options = "a.value as a.name for a in storageProvider" ng-change = configureBackup.clearProviderFields() > < / select >
< / div >
<!-- Noop -->
< div class = "form-group" ng-show = "configureBackup.provider === 'noop'" >
< p class = "has-error" > {{ 'backups.configureBackupStorage.noopNote' | tr }}< / p >
< / div >
2021-06-21 22:08:19 -07:00
<!-- mountpoint -->
< div class = "form-group" ng-class = "{ 'has-error': configureBackup.error.mountPoint || (configureBackupForm.mountPoint.$dirty && !configureBackup.mountPoint) }" ng-show = "configureBackup.provider === 'mountpoint'" >
2020-11-03 16:58:11 +01:00
< label class = "control-label" for = "inputConfigureMountPoint" > {{ 'backups.configureBackupStorage.mountPoint' | tr }}< / label >
2021-06-21 22:08:19 -07:00
< input type = "text" class = "form-control" ng-model = "configureBackup.mountPoint" id = "inputConfigureMountPoint" name = "mountPoint" ng-disabled = "configureBackup.busy" placeholder = "/mnt/backups" ng-required = "configureBackup.provider === 'mountpoint'" >
2021-05-17 15:24:19 -07:00
< p ng-show = "configureBackup.provider === 'mointpoint'" ng-bind-html = "'backups.configureBackupStorage.mountPointDescription' | tr:{ providerDocsLink: 'https://docs.cloudron.io/backups/#'+configureBackup.provider }" > < / p >
< / div >
2021-06-21 22:39:43 -07:00
<!-- CIFS/NFS/SSHFS -->
< div class = "form-group" ng-show = "configureBackup.provider === 'cifs' || configureBackup.provider === 'nfs' || configureBackup.provider === 'sshfs'" >
2021-05-17 15:24:19 -07:00
< label class = "control-label" for = "configureBackupHost" > {{ 'backups.configureBackupStorage.server' | tr }} ({{ configureBackup.provider }})< / label >
2021-09-14 11:37:36 +02:00
< input type = "text" class = "form-control" ng-model = "configureBackup.mountOptions.host" id = "configureBackupHost" name = "host" ng-disabled = "configureBackup.busy" placeholder = "Server IP or hostname" ng-required = "configureBackup.provider === 'cifs' || configureBackup.provider === 'nfs' || configureBackup.provider === 'sshfs'" >
2021-05-17 15:24:19 -07:00
< / div >
2022-01-10 14:28:25 +01:00
<!-- CIFS -->
< div class = "checkbox" ng-show = "configureBackup.provider === 'cifs'" >
< label >
2022-01-10 16:09:42 +01:00
< input type = "checkbox" ng-model = "configureBackup.mountOptions.seal" > {{ 'backups.configureBackupStorage.cifsSealSupport' | tr }}< / input >
2022-01-10 14:28:25 +01:00
< / label >
< / div >
2021-09-14 11:37:36 +02:00
<!-- CIFS/NFS/SSHFS -->
2021-06-21 22:39:43 -07:00
< div class = "form-group" ng-show = "configureBackup.provider === 'cifs' || configureBackup.provider === 'nfs' || configureBackup.provider === 'sshfs'" >
2021-05-17 15:24:19 -07:00
< label class = "control-label" for = "configureBackupRemoteDir" > {{ 'backups.configureBackupStorage.remoteDirectory' | tr }} ({{ configureBackup.provider }})< / label >
2021-07-09 16:32:04 -07:00
< input type = "text" class = "form-control" ng-model = "configureBackup.mountOptions.remoteDir" id = "configureBackupRemoteDir" name = "remoteDir" ng-disabled = "configureBackup.busy" placeholder = "/share" ng-required = "configureBackup.provider === 'cifs' || configureBackup.provider === 'nfs' || configureBackup.provider === 'sshfs'" >
2021-05-17 15:24:19 -07:00
< / div >
2021-09-14 11:37:36 +02:00
<!-- CIFS -->
2021-05-17 15:24:19 -07:00
< div class = "form-group" ng-show = "configureBackup.provider === 'cifs'" >
< label class = "control-label" for = "configureBackupUsername" > {{ 'backups.configureBackupStorage.username' | tr }} ({{ configureBackup.provider }})< / label >
2022-03-30 09:14:08 -07:00
< input type = "text" class = "form-control" ng-model = "configureBackup.mountOptions.username" id = "configureBackupUsername" name = "cifsUsername" ng-disabled = "configureBackup.busy" >
2021-05-17 15:24:19 -07:00
< / div >
2021-09-14 11:37:36 +02:00
<!-- CIFS -->
2021-05-17 15:24:19 -07:00
< div class = "form-group" ng-show = "configureBackup.provider === 'cifs'" >
< label class = "control-label" for = "configureBackupPassword" > {{ 'backups.configureBackupStorage.password' | tr }} ({{ configureBackup.provider }})< / label >
2022-03-30 09:14:08 -07:00
< input type = "password" class = "form-control" ng-model = "configureBackup.mountOptions.password" id = "configureBackupPassword" name = "cifsPassword" ng-disabled = "configureBackup.busy" password-reveal >
2021-05-17 15:24:19 -07:00
< / div >
2021-09-14 11:37:36 +02:00
<!-- EXT4 -->
2022-06-08 10:38:54 -07:00
< div class = "form-group" ng-class = "{ 'has-error': configureBackup.error.diskPath || !configureBackup.mountOptions.diskPath }" ng-show = "configureBackup.provider === 'ext4' || configureBackup.provider === 'xfs'" >
2021-05-17 15:24:19 -07:00
< label class = "control-label" for = "inputConfigureDiskPath" > {{ 'backups.configureBackupStorage.diskPath' | tr }}< / label >
2022-06-08 10:38:54 -07:00
< input type = "text" class = "form-control" ng-model = "configureBackup.mountOptions.diskPath" id = "inputConfigureDiskPath" name = "diskPath" ng-disabled = "configureBackup.busy" placeholder = "/dev/disk/by-uuid/uuid" ng-required = "configureBackup.provider === 'ext4' || configureBackup.provider === 'xfs'" >
2020-11-03 16:58:11 +01:00
< / div >
2021-05-27 15:31:37 -07:00
<!-- SSHFS -->
< div class = "form-group" ng-show = "configureBackup.provider === 'sshfs'" >
< label class = "control-label" for = "configureBackupPort" > {{ 'backups.configureBackupStorage.port' | tr }}< / label >
2021-07-09 16:32:04 -07:00
< input type = "number" class = "form-control" ng-model = "configureBackup.mountOptions.port" id = "configureBackupPort" name = "port" ng-disabled = "configureBackup.busy" ng-required = "configureBackup.provider === 'sshfs'" >
2021-05-27 15:31:37 -07:00
< / div >
<!-- SSHFS -->
< div class = "form-group" ng-show = "configureBackup.provider === 'sshfs'" >
< label class = "control-label" for = "configureBackupUser" > {{ 'backups.configureBackupStorage.user' | tr }}< / label >
2021-07-09 16:32:04 -07:00
< input type = "text" class = "form-control" ng-model = "configureBackup.mountOptions.user" id = "configureBackupUser" name = "user" ng-disabled = "configureBackup.busy" ng-required = "configureBackup.provider === 'sshfs'" >
2021-05-27 15:31:37 -07:00
< / div >
<!-- SSHFS -->
< div class = "form-group" ng-show = "configureBackup.provider === 'sshfs'" >
< label class = "control-label" for = "configureBackupPrivateKey" > {{ 'backups.configureBackupStorage.privateKey' | tr }}< / label >
2021-07-09 16:32:04 -07:00
< textarea class = "form-control" ng-model = "configureBackup.mountOptions.privateKey" id = "configureBackupPrivateKey" name = "privateKey" ng-disabled = "configureBackup.busy" ng-required = "configureBackup.provider === 'sshfs'" > < / textarea >
2021-05-27 15:31:37 -07:00
< / div >
2020-11-03 16:58:11 +01:00
<!-- Filesystem -->
2021-07-09 16:32:04 -07:00
< div class = "form-group" ng-class = "{ 'has-error': configureBackup.error.backupFolder }" ng-show = "configureBackup.provider === 'filesystem'" >
2020-11-03 16:58:11 +01:00
< label class = "control-label" for = "inputConfigureBackupFolder" > {{ 'backups.configureBackupStorage.localDirectory' | tr }}< / label >
< input type = "text" class = "form-control" ng-model = "configureBackup.backupFolder" id = "inputConfigureBackupFolder" name = "backupFolder" ng-disabled = "configureBackup.busy" placeholder = "Directory for backups" ng-required = "configureBackup.provider === 'filesystem'" >
< / div >
2021-05-17 15:24:19 -07:00
<!-- Filesystem/SSHFS/CIFS/NFS/EXT4/mountpoint -->
2020-11-03 16:58:11 +01:00
< div class = "checkbox" ng-show = "configureBackup.provider === 'filesystem' || mountlike(configureBackup.provider)" >
< label >
< input type = "checkbox" ng-model = "configureBackup.useHardlinks" > {{ 'backups.configureBackupStorage.hardlinksLabel' | tr }}< / input >
< / label >
< / div >
2022-02-16 11:48:57 -08:00
<!-- mountpoint -->
< div class = "checkbox" ng-show = "configureBackup.provider === 'mountpoint'" >
< label >
< input type = "checkbox" ng-model = "configureBackup.chown" > {{ 'backups.configureBackupStorage.chown' | tr }}< / input >
< / label >
< / div >
2021-09-27 10:01:09 -07:00
<!-- S3/Minio/SOS/GCS/UpCloud -->
< div class = "form-group" ng-class = "{ 'has-error': configureBackup.error.endpoint }" ng-show = "configureBackup.provider === 'minio' || configureBackup.provider === 'upcloud-objectstorage' || configureBackup.provider === 'backblaze-b2' || configureBackup.provider === 's3-v4-compat'" >
2020-11-03 16:58:11 +01:00
< label class = "control-label" for = "inputConfigureBackupEndpoint" > {{ 'backups.configureBackupStorage.s3Endpoint' | tr }}< / label >
2021-09-27 10:01:09 -07:00
< input type = "text" class = "form-control" ng-model = "configureBackup.endpoint" id = "inputConfigureBackupEndpoint" name = "endpoint" ng-disabled = "configureBackup.busy" placeholder = "URL" ng-required = "configureBackup.provider === 'minio' || configureBackup.provider === 'upcloud-objectstorage' || configureBackup.provider === 'backblaze-b2' || configureBackup.provider === 's3-v4-compat'" >
2020-11-03 16:58:11 +01:00
< / div >
< div class = "checkbox" ng-show = "configureBackup.provider === 'minio' || configureBackup.provider === 's3-v4-compat'" >
< label >
< input type = "checkbox" ng-model = "configureBackup.acceptSelfSignedCerts" > {{ 'backups.configureBackupStorage.acceptSelfSignedCerts' | tr }}< / input >
< / label >
< / div >
< div class = "form-group" ng-class = "{ 'has-error': configureBackup.error.bucket }" ng-show = "s3like(configureBackup.provider) || configureBackup.provider === 'gcs'" >
< label class = "control-label" for = "inputConfigureBackupBucket" > {{ 'backups.configureBackupStorage.bucketName' | tr }}< / label >
< input type = "text" class = "form-control" ng-model = "configureBackup.bucket" id = "inputConfigureBackupBucket" name = "bucket" ng-disabled = "configureBackup.busy" ng-required = "s3like(configureBackup.provider)" >
< / div >
<!-- S3/Minio/SOS/GCS/SSHFS/CIFS/NFS/B2 -->
< div class = "form-group" ng-class = "{ 'has-error': configureBackup.error.prefix }" ng-show = "configureBackup.provider !== 'filesystem' && configureBackup.provider !== 'noop'" >
< label class = "control-label" for = "inputConfigureBackupPrefix" > {{ 'backups.configureBackupStorage.prefix' | tr }}< / label >
< input type = "text" class = "form-control" ng-model = "configureBackup.prefix" id = "inputConfigureBackupPrefix" name = "prefix" ng-disabled = "configureBackup.busy" placeholder = "Prefix for backup file names" >
< / div >
<!-- S3/Minio/SOS/GCS -->
< div class = "form-group" ng-class = "{ 'has-error': configureBackup.error.region }" ng-show = "configureBackup.provider === 's3'" >
< label class = "control-label" for = "inputConfigureBackupS3Region" > {{ 'backups.configureBackupStorage.region' | tr }}< / label >
< select class = "form-control" name = "region" id = "inputConfigureBackupS3Region" ng-model = "configureBackup.region" ng-options = "a.value as a.name for a in s3Regions" ng-disabled = "configureBackup.busy" ng-required = "configureBackup.provider === 's3'" > < / select >
< / div >
< div class = "form-group" ng-class = "{ 'has-error': configureBackup.error.region }" ng-show = "configureBackup.provider === 's3-v4-compat'" >
< label class = "control-label" for = "inputConfigureBackupS3V4CompatRegion" > {{ 'backups.configureBackupStorage.region' | tr }}< / label >
< input class = "form-control" type = "text" name = "region" id = "inputConfigureBackupS3V4CompatRegion" ng-model = "configureBackup.region" ng-disabled = "configureBackup.busy" placeholder = "Leave empty to use us-east-1 as default" > < / input >
< / div >
< div class = "form-group" ng-class = "{ 'has-error': configureBackup.error.region }" ng-show = "configureBackup.provider === 'digitalocean-spaces'" >
< label class = "control-label" for = "inputConfigureBackupDORegion" > {{ 'backups.configureBackupStorage.region' | tr }}< / label >
< select class = "form-control" name = "region" id = "inputConfigureBackupDORegion" ng-model = "configureBackup.endpoint" ng-options = "a.value as a.name for a in doSpacesRegions" ng-disabled = "configureBackup.busy" ng-required = "configureBackup.provider === 'digitalocean-spaces'" > < / select >
< / div >
< div class = "form-group" ng-class = "{ 'has-error': configureBackup.error.region }" ng-show = "configureBackup.provider === 'exoscale-sos'" >
< label class = "control-label" for = "inputConfigureBackupExoscaleRegion" > {{ 'backups.configureBackupStorage.region' | tr }}< / label >
< select class = "form-control" name = "region" id = "inputConfigureBackupExoscaleRegion" ng-model = "configureBackup.endpoint" ng-options = "a.value as a.name for a in exoscaleSosRegions" ng-disabled = "configureBackup.busy" ng-required = "configureBackup.provider === 'exoscale-sos'" > < / select >
< / div >
< div class = "form-group" ng-class = "{ 'has-error': configureBackup.error.region }" ng-show = "configureBackup.provider === 'wasabi'" >
< label class = "control-label" for = "inputConfigureBackupWasabiRegion" > {{ 'backups.configureBackupStorage.region' | tr }}< / label >
< select class = "form-control" name = "region" id = "inputConfigureBackupWasabiRegion" ng-model = "configureBackup.endpoint" ng-options = "a.value as a.name for a in wasabiRegions" ng-disabled = "configureBackup.busy" ng-required = "configureBackup.provider === 'wasabi'" > < / select >
< / div >
< div class = "form-group" ng-class = "{ 'has-error': configureBackup.error.region }" ng-show = "configureBackup.provider === 'scaleway-objectstorage'" >
< label class = "control-label" for = "inputConfigureBackupScalewayRegion" > {{ 'backups.configureBackupStorage.region' | tr }}< / label >
< select class = "form-control" name = "region" id = "inputConfigureBackupScalewayRegion" ng-model = "configureBackup.endpoint" ng-options = "a.value as a.name for a in scalewayRegions" ng-disabled = "configureBackup.busy" ng-required = "configureBackup.provider === 'scaleway-objectstorage'" > < / select >
< / div >
< div class = "form-group" ng-class = "{ 'has-error': configureBackup.error.region }" ng-show = "configureBackup.provider === 'linode-objectstorage'" >
< label class = "control-label" for = "inputConfigureBackupLinodeRegion" > {{ 'backups.configureBackupStorage.region' | tr }}< / label >
< select class = "form-control" name = "region" id = "inputConfigureBackupLinodeRegion" ng-model = "configureBackup.endpoint" ng-options = "a.value as a.name for a in linodeRegions" ng-disabled = "configureBackup.busy" ng-required = "configureBackup.provider === 'linode-objectstorage'" > < / select >
< / div >
< div class = "form-group" ng-class = "{ 'has-error': configureBackup.error.region }" ng-show = "configureBackup.provider === 'ovh-objectstorage'" >
< label class = "control-label" for = "inputConfigureBackupOvhRegion" > {{ 'backups.configureBackupStorage.region' | tr }}< / label >
< select class = "form-control" name = "region" id = "inputConfigureBackupOvhRegion" ng-model = "configureBackup.endpoint" ng-options = "a.value as a.name for a in ovhRegions" ng-disabled = "configureBackup.busy" ng-required = "configureBackup.provider === 'ovh-objectstorage'" > < / select >
< / div >
2021-02-04 10:14:42 -08:00
< div class = "form-group" ng-class = "{ 'has-error': configureBackup.error.region }" ng-show = "configureBackup.provider === 'ionos-objectstorage'" >
< label class = "control-label" for = "inputConfigureBackupIonosRegion" > {{ 'backups.configureBackupStorage.region' | tr }}< / label >
< select class = "form-control" name = "region" id = "inputConfigureBackupIonosRegion" ng-model = "configureBackup.endpoint" ng-options = "a.value as a.name for a in ionosRegions" ng-disabled = "configureBackup.busy" ng-required = "configureBackup.provider === 'ionos-objectstorage'" > < / select >
< / div >
2021-06-16 22:35:46 -07:00
< div class = "form-group" ng-class = "{ 'has-error': configureBackup.error.region }" ng-show = "configureBackup.provider === 'vultr-objectstorage'" >
< label class = "control-label" for = "inputConfigureBackupVultrRegion" > {{ 'backups.configureBackupStorage.region' | tr }}< / label >
< select class = "form-control" name = "region" id = "inputConfigureBackupVultrRegion" ng-model = "configureBackup.endpoint" ng-options = "a.value as a.name for a in vultrRegions" ng-disabled = "configureBackup.busy" ng-required = "configureBackup.provider === 'vultr-objectstorage'" > < / select >
< / div >
2020-11-03 16:58:11 +01:00
< div class = "form-group" ng-class = "{ 'has-error': configureBackup.error.accessKeyId }" ng-show = "s3like(configureBackup.provider)" >
< label class = "control-label" for = "inputConfigureBackupAccessKeyId" > {{ 'backups.configureBackupStorage.s3AccessKeyId' | tr }}< / label >
< input type = "text" class = "form-control" ng-model = "configureBackup.accessKeyId" id = "inputConfigureBackupAccessKeyId" name = "accessKeyId" ng-disabled = "configureBackup.busy" ng-required = "s3like(configureBackup.provider)" >
< / div >
< div class = "form-group" ng-class = "{ 'has-error': configureBackup.error.secretAccessKey }" ng-show = "s3like(configureBackup.provider)" >
< label class = "control-label" for = "inputConfigureBackupSecretAccessKey" > {{ 'backups.configureBackupStorage.s3SecretAccessKey' | tr }}< / label >
< input type = "text" class = "form-control" ng-model = "configureBackup.secretAccessKey" id = "inputConfigureBackupSecretAccessKey" name = "secretAccessKey" ng-disabled = "configureBackup.busy" ng-required = "s3like(configureBackup.provider)" >
< / div >
< div class = "form-group" ng-class = "{ 'has-error': configureBackup.error.gcsKeyInput }" ng-show = "configureBackup.provider === 'gcs'" >
< label class = "control-label" for = "gcsKeyInput" > {{ 'backups.configureBackupStorage.gcsServiceKey' | tr }}< / label >
< div class = "input-group" >
< input type = "file" id = "gcsKeyFileInput" style = "display:none" / >
< input type = "text" class = "form-control" placeholder = "Service Account Key" ng-model = "configureBackup.gcsKey.keyFileName" id = "gcsKeyInput" name = "cert" onclick = "getElementById('gcsKeyFileInput').click();" style = "cursor: pointer;" ng-disabled = "configureBackup.busy" ng-required = "configureBackup.provider === 'gcs'" >
< span class = "input-group-addon" >
< i class = "fa fa-upload" onclick = "getElementById('gcsKeyFileInput').click();" > < / i >
< / span >
2020-02-26 09:08:34 -08:00
< / div >
2020-11-03 16:58:11 +01:00
< / div >
2020-04-29 12:54:19 -07:00
2020-11-03 16:58:11 +01:00
< div class = "form-group" ng-show = "configureBackup.provider !== 'noop'" >
< label class = "control-label" for = "storageFormat" > {{ 'backups.configureBackupStorage.format' | tr }} < sup > < a ng-href = "https://docs.cloudron.io/backups/#backup-formats" class = "help" target = "_blank" > < i class = "fa fa-question-circle" > < / i > < / a > < / sup > < / label >
< p class = "small text-info" ng-show = "backupConfig.format !== configureBackup.format" > {{ 'backups.configureBackupStorage.formatChangeNote' | tr }}< / p >
< p class = "small text-info" ng-show = "configureBackup.format === 'rsync' && (s3like(configureBackup.provider) || configureBackup.provider === 'gcs')" > {{ 'backups.configureBackupStorage.s3LikeNote' | tr }} < sup > < a ng-href = "https://docs.cloudron.io/backups/#amazon-s3" class = "help" target = "_blank" > < i class = "fa fa-question-circle" > < / i > < / a > < / sup > < / p >
< select class = "form-control" id = "storageFormat" ng-model = "configureBackup.format" ng-options = "a.value as a.name for a in formats" > < / select >
< / div >
2020-02-26 09:08:34 -08:00
2020-11-03 16:58:11 +01:00
< div class = "form-group" ng-class = "{ 'has-error': configureBackup.error.password }" ng-show = "configureBackup.provider !== 'noop'" >
< label class = "control-label" for = "inputConfigureBackupPassword" > {{ 'backups.configureBackupStorage.encryptionPassword' | tr }} < sup > < a ng-href = "https://docs.cloudron.io/backups/#encryption" class = "help" target = "_blank" > < i class = "fa fa-question-circle" > < / i > < / a > < / sup > < / label >
< p class = "small" > {{ 'backups.configureBackupStorage.encryptionDescription' | tr }}< / p >
2022-03-30 09:14:08 -07:00
< input type = "text" class = "form-control" name = "encryptionPassword" ng-model = "configureBackup.password" id = "inputConfigureBackupPassword" ng-disabled = "configureBackup.busy" placeholder = "{{ 'backups.configureBackupStorage.encryptionPasswordPlaceholder' | tr }}" >
2022-03-16 22:01:22 -07:00
< / div >
2020-11-14 11:01:46 +01:00
2022-03-30 09:14:08 -07:00
< div class = "form-group" ng-show = "configureBackup.password && configureBackup.password !== SECRET_PLACEHOLDER" ng-class = "{ 'has-error': (configureBackupForm.encryptionPassword.$dirty && configureBackup.password !== configureBackup.passwordRepeat) }" >
2022-03-16 22:01:22 -07:00
< label class = "control-label" for = "inputConfigureBackupPasswordRepeat" > {{ 'backups.configureBackupStorage.encryptionPasswordRepeat' | tr }}< / label >
< input id = "inputConfigureBackupPasswordRepeat" type = "text" class = "form-control" name = "passwordRepeat" ng-model = "configureBackup.passwordRepeat" ng-disabled = "configureBackup.busy" >
2020-11-03 16:58:11 +01:00
< / div >
2018-06-07 14:22:48 +02:00
2022-06-27 09:02:44 -07:00
< div class = "checkbox" ng-show = "configureBackup.password !== '' && configureBackup.format === 'rsync'" >
< label >
< input type = "checkbox" ng-model = "configureBackup.encryptedFilenames" > {{ 'backups.configureBackupStorage.encryptedFilenames' | tr }}< / input >
< sup > < a ng-href = "https://docs.cloudron.io/backups/#filenames" class = "help" target = "_blank" > < i class = "fa fa-question-circle" > < / i > < / a > < / sup >
< / label >
< / div >
2020-11-03 16:58:11 +01:00
< a href = "" ng-click = "configureBackup.advancedVisible = true" ng-hide = "configureBackup.advancedVisible" > {{ 'backups.configureBackupStorage.advancedSettings' | tr }}< / a >
< div uib-collapse = "!configureBackup.advancedVisible" >
2018-06-07 14:22:48 +02:00
2020-11-03 16:58:11 +01:00
< div class = "form-group" >
2021-10-26 09:24:15 -07:00
< label class = "control-label" > {{ 'backups.configureBackupStorage.memoryLimit' | tr }}: < b > {{ configureBackup.memoryLimit | prettyByteSize:'800 MB' }}< / b > < / label >
2020-11-03 16:58:11 +01:00
< p class = "small" > {{ 'backups.configureBackupStorage.memoryLimitDescription' | tr }}< / p >
< div style = "padding: 0 10px;" >
< slider id = "sliderConfigureBackupMemoryLimit" ng-model = "configureBackup.memoryLimit" step = "134217728" tooltip = "hide" ticks = "configureBackup.memoryTicks" ticks-snap-bounds = "67108864" > < / slider >
2018-06-07 14:22:48 +02:00
< / div >
< / div >
2021-02-01 14:16:35 -08:00
< div class = "form-group" ng-show = "s3like(configureBackup.provider)" >
< label class = "control-label" > {{ 'backups.configureBackupStorage.uploadPartSize' | tr }}: < b > {{ configureBackup.uploadPartSize | prettyByteSize:'Default (50 MB)' }}< / b > < / label >
2020-11-03 16:58:11 +01:00
< p class = "small" > {{ 'backups.configureBackupStorage.uploadPartSizeDescription' | tr }}< / p >
< div style = "padding: 0 10px;" >
< slider id = "sliderConfigureBackupUploadPartSize" ng-model = "configureBackup.uploadPartSize" step = "1048576" tooltip = "hide" ticks = "configureBackup.uploadPartSizeTicks" ticks-snap-bounds = "2097152" > < / slider >
2020-08-19 14:39:41 -07:00
< / div >
2020-11-03 16:58:11 +01:00
< / div >
2020-08-19 14:39:41 -07:00
2022-03-15 17:56:50 -07:00
< div class = "form-group" ng-show = "configureBackup.format === 'rsync' && configureBackup.provider !== 'noop'" >
2020-11-03 16:58:11 +01:00
< label class = "control-label" > {{ 'backups.configureBackupStorage.uploadConcurrency' | tr }}: < b > {{ configureBackup.syncConcurrency }}< / b > < / label >
< p class = "small" > {{ 'backups.configureBackupStorage.uploadConcurrencyDescription' | tr }}< / p >
< div style = "padding: 0 10px;" >
< slider id = "sliderConfigureBackupSyncConcurrency" ng-model = "configureBackup.syncConcurrency" tooltip = "hide" min = "10" max = "200" step = "10" > < / slider >
2020-08-10 23:01:09 -07:00
< / div >
2020-11-03 16:58:11 +01:00
< / div >
2020-08-10 23:01:09 -07:00
2020-11-03 16:58:11 +01:00
< div class = "form-group" ng-show = "configureBackup.format === 'rsync' && (s3like(configureBackup.provider) || configureBackup.provider === 'gcs')" >
< label class = "control-label" > {{ 'backups.configureBackupStorage.downloadConcurrency' | tr }}: < b > {{ configureBackup.downloadConcurrency }}< / b > < / label >
< p class = "small" > {{ 'backups.configureBackupStorage.downloadConcurrencyDescription' | tr }}< / p >
< div style = "padding: 0 10px;" >
< slider id = "sliderConfigureBackupCopyConcurrency" ng-model = "configureBackup.downloadConcurrency" tooltip = "hide" min = "10" max = "200" step = "10" > < / slider >
2020-08-10 23:01:09 -07:00
< / div >
2020-11-03 16:58:11 +01:00
< / div >
2020-08-10 23:01:09 -07:00
2020-11-03 16:58:11 +01:00
< div class = "form-group" ng-show = "configureBackup.format === 'rsync' && (s3like(configureBackup.provider) || configureBackup.provider === 'gcs')" >
< label class = "control-label" > {{ 'backups.configureBackupStorage.copyConcurrency' | tr }}: < b > {{ configureBackup.copyConcurrency }}< / b > < / label >
< p class = "small" > {{ 'backups.configureBackupStorage.copyConcurrencyDescription' | tr }}
< span ng-show = "configureBackup.provider === 'digitalocean-spaces'" > {{ 'backups.configureBackupStorage.copyConcurrencyDigitalOceanNote' | tr }}< / span >
< / p >
< div style = "padding: 0 10px;" >
< slider id = "sliderConfigureBackupCopyConcurrency" ng-model = "configureBackup.copyConcurrency" tooltip = "hide" min = "10" max = "500" step = "10" > < / slider >
2020-08-10 23:01:09 -07:00
< / div >
2020-11-03 16:58:11 +01:00
< / div >
2020-08-10 23:01:09 -07:00
2020-11-03 16:58:11 +01:00
< / div > <!-- advanced -->
2018-06-07 14:22:48 +02:00
2020-11-14 11:01:46 +01:00
< input class = "ng-hide" type = "submit" ng-disabled = "configureBackupForm.$invalid || (configureBackup.password !== SECRET_PLACEHOLDER && configureBackup.password !== configureBackup.passwordRepeat)" / >
2018-06-07 14:22:48 +02:00
< / form >
< / div >
< div class = "modal-footer " >
2020-11-03 16:58:11 +01:00
< button type = "button" class = "btn btn-default" data-dismiss = "modal" > {{ 'main.dialog.cancel' | tr }}< / button >
2020-11-14 11:01:46 +01:00
< button type = "submit" class = "btn btn-outline btn-success pull-right" ng-click = "configureBackup.submit()" ng-disabled = "configureBackupForm.$invalid || configureBackup.busy || (configureBackup.password !== SECRET_PLACEHOLDER && configureBackup.password !== configureBackup.passwordRepeat)" > < i class = "fa fa-circle-notch fa-spin" ng-show = "configureBackup.busy" > < / i > < span > {{ 'main.dialog.save' | tr }}< / span > < / button >
2018-06-07 14:22:48 +02:00
< / div >
< / div >
< / div >
< / div >
< div class = "content" >
< div class = "text-left" >
2020-10-28 16:17:14 +01:00
< h1 > {{ 'backups.title' | tr }}< / h1 >
2018-06-07 14:22:48 +02:00
< / div >
2020-05-14 22:42:41 -07:00
< div class = "text-left" >
2020-11-03 12:58:33 +01:00
< h3 > {{ 'backups.location.title' | tr }}< / h3 >
2020-05-14 22:42:41 -07:00
< / div >
2018-06-07 14:22:48 +02:00
< div class = "card" style = "margin-bottom: 15px;" >
2020-11-03 12:58:33 +01:00
< p > {{ 'backups.location.description' | tr }}
2020-04-03 10:36:51 -07:00
< span ng-show = "manualBackupApps.length" >
2020-11-03 12:58:33 +01:00
{{ 'backups.location.disabledList' | tr }}
2020-04-03 10:36:51 -07:00
< span ng-repeat = "app in manualBackupApps" >
< a ng-href = "/#/app/{{app.id}}/backups" > {{app.label || app.fqdn}}< / a > < span ng-hide = "$last" > ,< / span >
< / span >
< / span >
< / p >
2020-03-18 17:15:41 -07:00
2021-06-23 22:12:05 -07:00
< p ng-show = "backupConfig.provider === 'noop'" class = "text-danger" ng-bind-html = "'backups.check.noop' | tr | markdown2html" > < / p >
< p ng-show = "backupConfig.provider === 'filesystem'" class = "text-danger" ng-bind-html = "'backups.check.sameDisk' | tr | markdown2html" > < / p >
2020-07-28 18:08:57 +02:00
2018-06-07 14:22:48 +02:00
< div class = "row" >
< div class = "col-xs-6" >
2020-11-03 12:58:33 +01:00
< span class = "text-muted" > {{ 'backups.location.provider' | tr }}< / span >
2018-06-07 14:22:48 +02:00
< / div >
< div class = "col-xs-6 text-right" >
< span > {{ prettyProviderName(backupConfig.provider) }}< / span >
< / div >
< / div >
2020-02-04 12:49:36 -08:00
< div class = "row" >
2018-06-07 14:22:48 +02:00
< div class = "col-xs-6" >
2020-11-03 12:58:33 +01:00
< span class = "text-muted" > {{ 'backups.location.location' | tr }}< / span >
2018-06-07 14:22:48 +02:00
< / div >
2020-11-25 16:36:55 +01:00
< div class = "col-xs-6 text-right no-wrap" >
2018-06-07 14:22:48 +02:00
< span ng-show = "backupConfig.provider === 'filesystem'" > {{ backupConfig.backupFolder }}< / span >
2021-05-17 15:24:19 -07:00
< span ng-show = "mountlike(backupConfig.provider)" >
< i class = "fa fa-circle" ng-style = "{ color: backupConfig.mountStatus.state === 'active' ? '#27CE65' : '#d9534f' }" ng-show = "backupConfig.mountStatus" uib-tooltip = "{{ backupConfig.mountStatus.message }}" > < / i >
2022-06-08 10:38:54 -07:00
< span ng-show = "backupConfig.provider === 'filesystem' || backupConfig.provider === 'ext4' || backupConfig.provider === 'xfs' || backupConfig.provider === 'mountpoint'" > {{ backupConfig.mountOptions.diskPath || backupConfig.mountPoint }}{{ (backupConfig.prefix ? '/' : '') + backupConfig.prefix }}< / span >
2021-06-22 13:03:38 -07:00
< span ng-show = "backupConfig.provider === 'cifs' || backupConfig.provider === 'nfs' || backupConfig.provider === 'sshfs'" > {{ backupConfig.mountOptions.host }}:{{ backupConfig.mountOptions.remoteDir }}{{ (backupConfig.prefix ? '/' : '') + backupConfig.prefix }}< / span >
2021-05-17 15:24:19 -07:00
< / span >
2019-12-19 11:05:40 -08:00
< span ng-show = "backupConfig.provider !== 's3' && backupConfig.provider !== 'minio' && (s3like(backupConfig.provider) || backupConfig.provider === 'gcs')" > {{ backupConfig.bucket + (backupConfig.prefix ? '/' : '') + backupConfig.prefix }}< / span >
2019-11-18 11:04:06 -08:00
< span ng-show = "backupConfig.provider === 's3'" > {{ backupConfig.region + ' ' + backupConfig.bucket + (backupConfig.prefix ? '/' : '') + backupConfig.prefix }}< / span >
2019-12-19 11:05:40 -08:00
< span ng-show = "backupConfig.provider === 'minio'" > {{ backupConfig.endpoint + ' ' + backupConfig.bucket + (backupConfig.prefix ? '/' : '') + backupConfig.prefix }}< / span >
2018-06-07 14:22:48 +02:00
< / div >
< / div >
2020-05-15 16:05:30 -07:00
< div class = "row" ng-show = "backupConfig.endpoint && backupConfig.provider !== 'minio'" >
< div class = "col-xs-6" >
2020-11-03 12:58:33 +01:00
< span class = "text-muted" > {{ 'backups.location.endpoint' | tr }}< / span >
2020-05-15 16:05:30 -07:00
< / div >
< div class = "col-xs-6 text-right" >
< span > {{ backupConfig.endpoint || backupConfig.region }}< / span >
< / div >
< / div >
2020-02-04 12:49:36 -08:00
< div class = "row" >
2018-06-07 14:22:48 +02:00
< div class = "col-xs-6" >
2020-11-03 12:58:33 +01:00
< span class = "text-muted" > {{ 'backups.location.format' | tr }}< / span >
2018-06-07 14:22:48 +02:00
< / div >
< div class = "col-xs-6 text-right" >
2020-05-12 23:42:56 -07:00
< span > {{ backupConfig.format }} < i class = "fas fa-lock" ng-show = "backupConfig.password" > < / i > < / span >
2018-06-07 14:22:48 +02:00
< / div >
< / div >
< br / >
< div class = "row" >
2021-10-11 17:45:55 +02:00
< div class = "col-md-12" >
2021-12-02 12:21:59 -08:00
< button class = "btn btn-outline btn-primary pull-right" ng-show = "user.isAtLeastOwner" ng-click = "configureBackup.show()" > {{ 'backups.location.configure' | tr }}< / button >
< button class = "btn btn-outline btn-default pull-right" ng-show = "user.isAtLeastOwner && mountlike(backupConfig.provider)" ng-disabled = "remount.busy" ng-click = "remount.submit()" > < i class = "fa fa-circle-notch fa-spin" ng-show = "remount.busy" > < / i > {{ 'backups.location.remount' | tr }}< / button >
2018-06-07 14:22:48 +02:00
< / div >
< / div >
2020-05-14 22:42:41 -07:00
< / div >
2020-05-19 16:13:20 +02:00
< div class = "text-left" >
2020-11-03 12:58:33 +01:00
< h3 > {{ 'backups.schedule.title' | tr }}< / h3 >
2020-05-19 16:13:20 +02:00
< / div >
< div class = "card" style = "margin-bottom: 15px;" >
2020-11-03 12:58:33 +01:00
< p > {{ 'backups.schedule.description' | tr }}< / p >
2020-05-19 16:13:20 +02:00
< div class = "row" >
< div class = "col-xs-6" >
2020-11-03 12:58:33 +01:00
< span class = "text-muted" > {{ 'backups.schedule.schedule' | tr }}< / span >
2020-05-19 16:13:20 +02:00
< / div >
< div class = "col-xs-6 text-right" >
2020-07-28 21:48:24 -07:00
< span > {{ prettyBackupSchedule(backupConfig.schedulePattern) }}< / span >
2020-05-19 16:13:20 +02:00
< / div >
< / div >
< div class = "row" >
< div class = "col-xs-6" >
2020-11-03 12:58:33 +01:00
< span class = "text-muted" > {{ 'backups.schedule.retentionPolicy' | tr }}< / span >
2020-05-19 16:13:20 +02:00
< / div >
< div class = "col-xs-6 text-right" >
< span > {{ prettyBackupRetentionPolicy(backupConfig.retentionPolicy) }}< / span >
< / div >
< / div >
< br / >
< div class = "row" >
< div class = "col-md-12 text-right" >
2021-12-02 12:21:59 -08:00
< button class = "btn btn-outline btn-primary pull-right" ng-show = "user.isAtLeastOwner" ng-click = "configureScheduleAndRetention.show()" > {{ 'backups.schedule.configure' | tr }}< / button >
2020-05-19 16:13:20 +02:00
< / div >
< / div >
< / div >
2020-05-14 22:42:41 -07:00
< div class = "text-left" >
2020-11-03 12:58:33 +01:00
< h3 > {{ 'backups.listing.title' | tr }}< / h3 >
2020-05-14 22:42:41 -07:00
< / div >
2018-06-07 14:22:48 +02:00
2020-05-14 22:42:41 -07:00
< div class = "card card-large" >
2018-06-07 14:22:48 +02:00
< div class = "row" >
2020-05-14 22:42:41 -07:00
< div class = "col-md-12" >
2020-11-03 12:58:33 +01:00
< p ng-show = "!backups.length" > {{ 'backups.listing.noBackups' | tr }}< / p >
2020-05-14 22:42:41 -07:00
< table class = "table table-hover" style = "margin: 0;" ng-hide = "!backups.length" >
< thead >
< tr >
2022-04-07 15:31:41 +02:00
< th style = "width: 20px" > < / th >
2020-11-03 12:58:33 +01:00
< th > {{ 'backups.listing.version' | tr }}< / th >
< th > {{ 'main.table.date' | tr }}< / th >
< th > {{ 'backups.listing.contents' | tr }}< / th >
2022-04-05 14:41:41 +02:00
< th class = "text-right" > {{ 'main.actions' | tr }}< / th >
2020-05-14 22:42:41 -07:00
< / tr >
< / thead >
< tbody >
< tr ng-repeat = "backup in backups" >
2022-04-08 19:10:29 +02:00
< td > < i class = "fas fa-archive" ng-show = "backup.preserveSecs === -1" uib-tooltip = "{{ 'backups.listing.tooltipPreservedBackup' | tr }}" > < / i > < / td >
2020-05-22 13:48:26 +02:00
< td ng-click = "backupDetails.show(backup)" class = "hand" > v{{ backup.packageVersion }}< / td >
2022-04-07 15:46:28 +02:00
< td ng-click = "backupDetails.show(backup)" class = "hand" > < span uib-tooltip = "{{ backup.creationTime | prettyLongDate }}" > {{ backup.creationTime | prettyDate }} < b ng-show = "backup.label" > ({{ backup.label }})< / b > < / span > < / td >
2020-05-22 13:48:26 +02:00
< td ng-click = "backupDetails.show(backup)" class = "hand" >
2020-11-03 12:58:33 +01:00
< span ng-show = "!backup.contents.length" > {{ 'backups.listing.noApps' | tr }}< / span >
2020-11-25 18:29:15 +01:00
< span ng-show = "backup.contents.length" > {{ 'backups.listing.appCount' | tr:{ appCount: backup.contents.length } }}< / span >
2020-05-16 09:46:57 -07:00
< / td >
2020-05-14 22:42:41 -07:00
< td class = "text-right no-wrap" style = "vertical-align: bottom" >
2022-04-08 15:09:04 +02:00
< button class = "btn btn-xs btn-default" ng-click = "editBackup.show(backup)" uib-tooltip = "{{ 'backups.listing.tooltipEditBackup' | tr }}" > < i class = "fa fa-pencil-alt" > < / i > < / button >
2020-11-03 12:58:33 +01:00
< button class = "btn btn-xs btn-default" ng-click = "downloadConfig(backup)" uib-tooltip = "{{ 'backups.listing.tooltipDownloadBackupConfig' | tr }}" > < i class = "fas fa-file-alt" > < / i > < / button >
2020-05-14 22:42:41 -07:00
< / td >
< / tr >
< / tbody >
< / table >
2018-06-07 14:22:48 +02:00
< / div >
< / div >
2020-04-20 18:21:35 +02:00
< br / >
< div class = "row" ng-show = "createBackup.busy" >
2018-12-09 20:59:32 +01:00
< div class = "col-md-12" style = "margin-bottom: 10px;" >
2020-04-20 18:21:35 +02:00
< div class = "progress progress-striped active animateMe" >
2018-06-07 14:22:48 +02:00
< div class = "progress-bar progress-bar-success" role = "progressbar" style = "width: {{ createBackup.percent }}%" > < / div >
< / div >
2020-04-20 18:21:35 +02:00
< p > {{ createBackup.message }}< / p >
2018-06-07 14:22:48 +02:00
< / div >
< / div >
2020-04-20 18:21:35 +02:00
< div class = "row" ng-show = "!createBackup.busy && !createBackup.active && createBackup.errorMessage" >
< div class = "col-md-12" >
< p class = "has-error" > {{ createBackup.errorMessage }}< / p >
2018-06-07 14:22:48 +02:00
< / div >
2020-04-20 18:21:35 +02:00
< / div >
< div class = "row" >
< div class = "col-md-12 text-right" >
2020-11-03 12:58:33 +01:00
< button class = "btn btn-default" ng-click = "createBackup.cleanupBackups()" ng-show = "!createBackup.busy" style = "margin-right: 5px" > {{ 'backups.listing.cleanupBackups' | tr }}< / button >
< button class = "btn btn-outline btn-primary" ng-click = "createBackup.startBackup()" ng-show = "!createBackup.busy" > {{ 'backups.listing.backupNow' | tr }}< / button >
2020-11-12 23:13:52 +01:00
< button class = "btn btn-outline btn-danger" ng-click = "createBackup.stopTask()" ng-show = "createBackup.busy" > {{ 'backups.listing.stopTask' | tr:{ taskType: createBackup.taskType } }}< / button >
2018-06-07 14:22:48 +02:00
< / div >
< / div >
< / div >
2018-06-15 09:38:47 -07:00
2018-06-16 11:14:45 -07:00
< div class = "text-left" >
2020-11-03 12:58:33 +01:00
< h3 > {{ 'backups.logs.title' | tr }}< / h3 >
2018-06-15 09:38:47 -07:00
< / div >
< div class = "card card-large" style = "margin-bottom: 15px;" >
< div class = "row" >
< div class = "col-md-12" >
2020-11-03 12:58:33 +01:00
< p > {{ 'backups.logs.description' | tr }}< / p >
< a class = "btn btn-primary pull-right" ng-href = "/logs.html?taskId={{createBackup.taskId}}" ng-disabled = "!createBackup.taskId" target = "_blank" > {{ 'backups.logs.showLogs' | tr }}< / a >
2018-06-15 09:38:47 -07:00
< / div >
< / div >
< / div >
2018-06-07 14:22:48 +02:00
< / div >