mirror of
https://github.com/discourse/discourse.git
synced 2025-03-24 19:09:24 +08:00
FEATURE: Improve handling of backup storage errors
This commit is contained in:
parent
33269c4172
commit
6a8007e5fb
@ -1,4 +1,5 @@
|
|||||||
import { ajax } from "discourse/lib/ajax";
|
import { ajax } from "discourse/lib/ajax";
|
||||||
|
import { extractError } from "discourse/lib/ajax-error";
|
||||||
|
|
||||||
const Backup = Discourse.Model.extend({
|
const Backup = Discourse.Model.extend({
|
||||||
destroy() {
|
destroy() {
|
||||||
@ -15,9 +16,16 @@ const Backup = Discourse.Model.extend({
|
|||||||
|
|
||||||
Backup.reopenClass({
|
Backup.reopenClass({
|
||||||
find() {
|
find() {
|
||||||
return ajax("/admin/backups.json").then(backups =>
|
return ajax("/admin/backups.json")
|
||||||
backups.map(backup => Backup.create(backup))
|
.then(backups => backups.map(backup => Backup.create(backup)))
|
||||||
);
|
.catch(error => {
|
||||||
|
bootbox.alert(
|
||||||
|
I18n.t("admin.backups.backup_storage_error", {
|
||||||
|
error_message: extractError(error)
|
||||||
|
})
|
||||||
|
);
|
||||||
|
return [];
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
start(withUploads) {
|
start(withUploads) {
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
import { ajax } from "discourse/lib/ajax";
|
import { ajax } from "discourse/lib/ajax";
|
||||||
|
import { popupAjaxError } from "discourse/lib/ajax-error";
|
||||||
import computed from "ember-addons/ember-computed-decorators";
|
import computed from "ember-addons/ember-computed-decorators";
|
||||||
import UploadMixin from "discourse/mixins/upload";
|
import UploadMixin from "discourse/mixins/upload";
|
||||||
|
|
||||||
@ -39,14 +40,12 @@ export default Ember.Component.extend(UploadMixin, {
|
|||||||
$upload.on("fileuploadadd", (e, data) => {
|
$upload.on("fileuploadadd", (e, data) => {
|
||||||
ajax("/admin/backups/upload_url", {
|
ajax("/admin/backups/upload_url", {
|
||||||
data: { filename: data.files[0].name }
|
data: { filename: data.files[0].name }
|
||||||
}).then(result => {
|
})
|
||||||
if (!result.success) {
|
.then(result => {
|
||||||
bootbox.alert(result.message);
|
|
||||||
} else {
|
|
||||||
data.url = result.url;
|
data.url = result.url;
|
||||||
data.submit();
|
data.submit();
|
||||||
}
|
})
|
||||||
});
|
.catch(popupAjaxError);
|
||||||
});
|
});
|
||||||
}.on("didInsertElement")
|
}.on("didInsertElement")
|
||||||
});
|
});
|
||||||
|
@ -37,7 +37,7 @@ class Admin::BackupsController < Admin::AdminController
|
|||||||
}
|
}
|
||||||
BackupRestore.backup!(current_user.id, opts)
|
BackupRestore.backup!(current_user.id, opts)
|
||||||
rescue BackupRestore::OperationRunningError
|
rescue BackupRestore::OperationRunningError
|
||||||
render json: failed_json.merge(message: I18n.t("backup.operation_already_running"))
|
render_error("backup.operation_already_running")
|
||||||
else
|
else
|
||||||
StaffActionLogger.new(current_user).log_backup_create
|
StaffActionLogger.new(current_user).log_backup_create
|
||||||
render json: success_json
|
render json: success_json
|
||||||
@ -46,7 +46,7 @@ class Admin::BackupsController < Admin::AdminController
|
|||||||
def cancel
|
def cancel
|
||||||
BackupRestore.cancel!
|
BackupRestore.cancel!
|
||||||
rescue BackupRestore::OperationRunningError
|
rescue BackupRestore::OperationRunningError
|
||||||
render json: failed_json.merge(message: I18n.t("backup.operation_already_running"))
|
render_error("backup.operation_already_running")
|
||||||
else
|
else
|
||||||
render json: success_json
|
render json: success_json
|
||||||
end
|
end
|
||||||
@ -117,7 +117,7 @@ class Admin::BackupsController < Admin::AdminController
|
|||||||
SiteSetting.set_and_log(:disable_emails, 'yes', current_user)
|
SiteSetting.set_and_log(:disable_emails, 'yes', current_user)
|
||||||
BackupRestore.restore!(current_user.id, opts)
|
BackupRestore.restore!(current_user.id, opts)
|
||||||
rescue BackupRestore::OperationRunningError
|
rescue BackupRestore::OperationRunningError
|
||||||
render json: failed_json.merge(message: I18n.t("backup.operation_already_running"))
|
render_error("backup.operation_already_running")
|
||||||
else
|
else
|
||||||
render json: success_json
|
render json: success_json
|
||||||
end
|
end
|
||||||
@ -125,7 +125,7 @@ class Admin::BackupsController < Admin::AdminController
|
|||||||
def rollback
|
def rollback
|
||||||
BackupRestore.rollback!
|
BackupRestore.rollback!
|
||||||
rescue BackupRestore::OperationRunningError
|
rescue BackupRestore::OperationRunningError
|
||||||
render json: failed_json.merge(message: I18n.t("backup.operation_already_running"))
|
render_error("backup.operation_already_running")
|
||||||
else
|
else
|
||||||
render json: success_json
|
render json: success_json
|
||||||
end
|
end
|
||||||
@ -192,15 +192,17 @@ class Admin::BackupsController < Admin::AdminController
|
|||||||
params.require(:filename)
|
params.require(:filename)
|
||||||
filename = params.fetch(:filename)
|
filename = params.fetch(:filename)
|
||||||
|
|
||||||
return render_error("backup.backup_file_should_be_tar_gz") unless valid_extension?(filename)
|
return render_json_error(I18n.t("backup.backup_file_should_be_tar_gz")) unless valid_extension?(filename)
|
||||||
return render_error("backup.invalid_filename") unless valid_filename?(filename)
|
return render_json_error(I18n.t("backup.invalid_filename")) unless valid_filename?(filename)
|
||||||
|
|
||||||
store = BackupRestore::BackupStore.create
|
store = BackupRestore::BackupStore.create
|
||||||
|
|
||||||
begin
|
begin
|
||||||
upload_url = store.generate_upload_url(filename)
|
upload_url = store.generate_upload_url(filename)
|
||||||
rescue BackupRestore::BackupStore::BackupFileExists
|
rescue BackupRestore::BackupStore::BackupFileExists
|
||||||
return render_error("backup.file_exists")
|
return render_json_error(I18n("backup.file_exists"))
|
||||||
|
rescue BackupRestore::BackupStore::StorageError => e
|
||||||
|
return render_json_error(e)
|
||||||
end
|
end
|
||||||
|
|
||||||
render json: success_json.merge(url: upload_url)
|
render json: success_json.merge(url: upload_url)
|
||||||
|
@ -3276,6 +3276,7 @@ en:
|
|||||||
location:
|
location:
|
||||||
local: "Local Storage"
|
local: "Local Storage"
|
||||||
s3: "S3"
|
s3: "S3"
|
||||||
|
backup_storage_error: "Failed to access backup storage: %{error_message}"
|
||||||
|
|
||||||
export_csv:
|
export_csv:
|
||||||
success: "Export initiated, you will be notified via message when the process is complete."
|
success: "Export initiated, you will be notified via message when the process is complete."
|
||||||
|
@ -49,6 +49,9 @@ module BackupRestore
|
|||||||
|
|
||||||
ensure_cors!
|
ensure_cors!
|
||||||
presigned_url(obj, :put, UPLOAD_URL_EXPIRES_AFTER_SECONDS)
|
presigned_url(obj, :put, UPLOAD_URL_EXPIRES_AFTER_SECONDS)
|
||||||
|
rescue Aws::Errors::ServiceError => e
|
||||||
|
Rails.logger.warn("Failed to generate upload URL for S3: #{e.message.presence || e.class.name}")
|
||||||
|
raise StorageError
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
Loading…
x
Reference in New Issue
Block a user