mirror of
https://github.com/mail-in-a-box/mailinabox.git
synced 2024-12-18 06:37:06 +00:00
2e6c410336
Backup location and maximum age can now be configured in the admin panel. For now only S3 is supported, but adding other duplicity supported backends should be straightforward.
180 lines
5.5 KiB
HTML
180 lines
5.5 KiB
HTML
<style>
|
|
#backup-status th { text-align: center; }
|
|
#backup-status tr.full-backup td { font-weight: bold; }
|
|
</style>
|
|
|
|
<h2>Backup Status</h2>
|
|
|
|
<h3>Copying Backup Files</h3>
|
|
|
|
<p>The box makes an incremental backup each night. By default the backup is stored on the machine itself, but you can also have it stored on Amazon S3</p>
|
|
|
|
<p>You can also use SFTP (FTP over SSH) to copy files from <tt id="backup-location"></tt>. These files are encrypted, so they are safe to store anywhere. Copy the encryption password from <tt id="backup-encpassword-file"></tt> also but keep it in a safe location.</p>
|
|
|
|
<h3>Backup Configuration</h3>
|
|
|
|
<form class="form-horizontal" role="form" onsubmit="set_custom_backup(); return false;">
|
|
<div class="form-group">
|
|
<label for="target" class="col-sm-2 control-label">Backup target</label>
|
|
<div class="col-sm-2">
|
|
<select class="form-control" rows="1" id="target-type" onchange="toggle_form()">
|
|
<option value="file">Store locally</option>
|
|
<option value="s3">Amazon S3</option>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="target" class="col-sm-2 control-label">Maximum time to keep old backups (in days)</label>
|
|
<div class="col-sm-8">
|
|
<input type="number" class="form-control" rows="1" id="max-age"></input>
|
|
</div>
|
|
</div>
|
|
<div class="form-group form-advanced">
|
|
<label for="target" class="col-sm-2 control-label">S3 URL</label>
|
|
<div class="col-sm-8">
|
|
<textarea class="form-control" rows="1" id="target"></textarea>
|
|
</div>
|
|
</div>
|
|
<div class="form-group form-advanced">
|
|
<label for="target-user" class="col-sm-2 control-label">S3 Key</label>
|
|
<div class="col-sm-8">
|
|
<textarea class="form-control" rows="1" id="target-user"></textarea>
|
|
</div>
|
|
</div>
|
|
<div class="form-group form-advanced">
|
|
<label for="target-pass" class="col-sm-2 control-label">S3 Secret</label>
|
|
<div class="col-sm-8">
|
|
<textarea class="form-control" rows="1" id="target-pass"></textarea>
|
|
</div>
|
|
</div>
|
|
<div class="form-group">
|
|
<div class="col-sm-offset-2 col-sm-11">
|
|
<button id="set-s3-backup-button" type="submit" class="btn btn-primary">Save</button>
|
|
</div>
|
|
</div>
|
|
</form>
|
|
|
|
<h3>Current Backups</h3>
|
|
|
|
<p>The backup directory currently contains the backups listed below. The total size on disk of the backups is currently <span id="backup-total-size"></span>.</p>
|
|
|
|
<table id="backup-status" class="table" style="width: auto">
|
|
<thead>
|
|
<th colspan="2">When</th>
|
|
<th>Type</th>
|
|
<th>Size</th>
|
|
<th>Deleted in...</th>
|
|
</thead>
|
|
<tbody>
|
|
</tbody>
|
|
</table>
|
|
<script>
|
|
|
|
function toggle_form() {
|
|
var target_type = $("#target-type").val();
|
|
if (target_type == 'file') {
|
|
$(".form-advanced").hide();
|
|
} else {
|
|
$(".form-advanced").show();
|
|
}
|
|
}
|
|
|
|
function nice_size(bytes) {
|
|
var powers = ['bytes', 'KB', 'MB', 'GB', 'TB'];
|
|
while (true) {
|
|
if (powers.length == 1) break;
|
|
if (bytes < 1000) break;
|
|
bytes /= 1024;
|
|
powers.shift();
|
|
}
|
|
// round to have three significant figures but at most one decimal place
|
|
if (bytes >= 100)
|
|
bytes = Math.round(bytes)
|
|
else
|
|
bytes = Math.round(bytes*10)/10;
|
|
return bytes + " " + powers[0];
|
|
}
|
|
|
|
function show_system_backup() {
|
|
show_custom_backup()
|
|
|
|
$('#backup-status tbody').html("<tr><td colspan='2' class='text-muted'>Loading...</td></tr>")
|
|
api(
|
|
"/system/backup/status",
|
|
"GET",
|
|
{ },
|
|
function(r) {
|
|
$('#backup-location').text(r.directory);
|
|
$('#backup-encpassword-file').text(r.encpwfile);
|
|
|
|
$('#backup-status tbody').html("");
|
|
var total_disk_size = 0;
|
|
|
|
if (r.backups.length == 0) {
|
|
var tr = $('<tr><td colspan="3">No backups have been made yet.</td></tr>');
|
|
$('#backup-status tbody').append(tr);
|
|
}
|
|
|
|
for (var i = 0; i < r.backups.length; i++) {
|
|
var b = r.backups[i];
|
|
var tr = $('<tr/>');
|
|
if (b.full) tr.addClass("full-backup");
|
|
tr.append( $('<td/>').text(b.date_str + " " + r.tz) );
|
|
tr.append( $('<td/>').text(b.date_delta + " ago") );
|
|
tr.append( $('<td/>').text(b.full ? "full" : "increment") );
|
|
tr.append( $('<td style="text-align: right"/>').text( nice_size(b.size)) );
|
|
if (b.deleted_in)
|
|
tr.append( $('<td/>').text(b.deleted_in) );
|
|
else
|
|
tr.append( $('<td class="text-muted">unknown</td>') );
|
|
$('#backup-status tbody').append(tr);
|
|
|
|
total_disk_size += b.size;
|
|
}
|
|
|
|
$('#backup-total-size').text(nice_size(total_disk_size));
|
|
})
|
|
}
|
|
|
|
function show_custom_backup() {
|
|
api(
|
|
"/system/backup/get-custom",
|
|
"GET",
|
|
{ },
|
|
function(r) {
|
|
$("#target").val(r.target);
|
|
$("#target-type").val(r.target_type);
|
|
$("#target-user").val(r.target_user);
|
|
$("#target-pass").val(r.target_pass);
|
|
$("#max-age").val(r.max_age_in_days);
|
|
toggle_form()
|
|
})
|
|
}
|
|
|
|
function set_custom_backup() {
|
|
var target = $("#target").val();
|
|
var target_type = $("#target-type").val();
|
|
var target_user = $("#target-user").val();
|
|
var target_pass = $("#target-pass").val();
|
|
var max_age = $("#max-age").val();
|
|
api(
|
|
"/system/backup/set-custom",
|
|
"POST",
|
|
{
|
|
target: target,
|
|
target_type: target_type,
|
|
target_user: target_user,
|
|
target_pass: target_pass,
|
|
max_age: max_age
|
|
},
|
|
function(r) {
|
|
// Responses are multiple lines of pre-formatted text.
|
|
show_modal_error("Backup configuration", $("<pre/>").text(r));
|
|
},
|
|
function(r) {
|
|
show_modal_error("Backup configuration (error)", r);
|
|
});
|
|
return false;
|
|
}
|
|
</script>
|