mirror of
https://github.com/fawney19/Aether.git
synced 2026-10-07 18:07:47 +08:00
feat(admin): expose s3 backup as module
This commit is contained in:
@@ -6,4 +6,5 @@ pub(crate) mod store;
|
||||
pub(crate) mod task;
|
||||
pub(crate) mod worker;
|
||||
|
||||
pub(crate) const S3_BACKUP_ENABLED_KEY: &str = "backup_s3_enabled";
|
||||
pub(crate) const S3_BACKUP_LAST_SLOT_KEY: &str = "backup_s3_last_slot";
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
use crate::backup::config::S3BackupConfig;
|
||||
use crate::bark_push::bark_push_configured;
|
||||
use crate::handlers::admin::request::AdminAppState;
|
||||
use crate::handlers::shared::{module_available_from_env, system_config_bool};
|
||||
@@ -121,6 +122,18 @@ pub(crate) const ADMIN_MODULE_DEFINITIONS: &[AdminModuleDefinition] = &[
|
||||
admin_menu_group: None,
|
||||
admin_menu_order: 59,
|
||||
},
|
||||
AdminModuleDefinition {
|
||||
name: "s3_backup",
|
||||
display_name: "S3 备份",
|
||||
description: "将配置、用户或完整数据定期备份到 S3-compatible 对象存储",
|
||||
category: "integration",
|
||||
env_key: "S3_BACKUP_AVAILABLE",
|
||||
default_available: true,
|
||||
admin_route: Some("/admin/modules/s3-backup"),
|
||||
admin_menu_icon: Some("CloudUpload"),
|
||||
admin_menu_group: None,
|
||||
admin_menu_order: 60,
|
||||
},
|
||||
AdminModuleDefinition {
|
||||
name: "gemini_files",
|
||||
display_name: "文件缓存",
|
||||
@@ -183,6 +196,7 @@ pub(crate) struct AdminModuleRuntimeState {
|
||||
important_notification_configured: bool,
|
||||
server_chan_push_configured: bool,
|
||||
bark_push_configured: bool,
|
||||
s3_backup_configured: bool,
|
||||
}
|
||||
|
||||
pub(crate) fn admin_module_by_name(name: &str) -> Option<&'static AdminModuleDefinition> {
|
||||
@@ -209,6 +223,8 @@ pub(crate) fn admin_module_enabled_config_key(module: &AdminModuleDefinition) ->
|
||||
ENABLE_MODEL_DIRECTIVES_CONFIG_KEY.to_string()
|
||||
} else if module.name == "important_notification" {
|
||||
IMPORTANT_NOTIFICATION_ENABLED_KEY.to_string()
|
||||
} else if module.name == "s3_backup" {
|
||||
crate::backup::S3_BACKUP_ENABLED_KEY.to_string()
|
||||
} else {
|
||||
format!("module.{}.enabled", module.name)
|
||||
}
|
||||
@@ -272,6 +288,7 @@ pub(crate) async fn build_admin_module_runtime_state(
|
||||
let notification_configured = important_notification_configured(state.app()).await?;
|
||||
let server_chan_configured = server_chan_push_configured(state.app()).await?;
|
||||
let bark_configured = bark_push_configured(state.app()).await?;
|
||||
let backup_configured = s3_backup_configured(state.app()).await;
|
||||
|
||||
Ok(AdminModuleRuntimeState {
|
||||
oauth_providers,
|
||||
@@ -280,9 +297,21 @@ pub(crate) async fn build_admin_module_runtime_state(
|
||||
important_notification_configured: notification_configured,
|
||||
server_chan_push_configured: server_chan_configured,
|
||||
bark_push_configured: bark_configured,
|
||||
s3_backup_configured: backup_configured,
|
||||
})
|
||||
}
|
||||
|
||||
async fn s3_backup_configured(app: &crate::AppState) -> bool {
|
||||
let Ok(mut values) = crate::backup::task::load_s3_backup_config_values(app).await else {
|
||||
return false;
|
||||
};
|
||||
values.insert(
|
||||
crate::backup::S3_BACKUP_ENABLED_KEY.to_string(),
|
||||
json!(true),
|
||||
);
|
||||
S3BackupConfig::from_json_map(&values).is_ok()
|
||||
}
|
||||
|
||||
pub(crate) fn build_admin_module_validation_result(
|
||||
module: &AdminModuleDefinition,
|
||||
runtime: &AdminModuleRuntimeState,
|
||||
@@ -295,6 +324,7 @@ pub(crate) fn build_admin_module_validation_result(
|
||||
runtime.important_notification_configured,
|
||||
runtime.server_chan_push_configured,
|
||||
runtime.bark_push_configured,
|
||||
runtime.s3_backup_configured,
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -897,6 +897,15 @@ async fn gateway_handles_admin_modules_status_locally_with_trusted_admin_princip
|
||||
);
|
||||
assert_eq!(payload["bark_push"]["display_name"], "Bark 推送");
|
||||
assert_eq!(payload["bark_push"]["admin_route"], "/admin/modules/bark");
|
||||
assert_eq!(payload["s3_backup"]["display_name"], "S3 备份");
|
||||
assert_eq!(
|
||||
payload["s3_backup"]["admin_route"],
|
||||
"/admin/modules/s3-backup"
|
||||
);
|
||||
assert_eq!(
|
||||
payload["s3_backup"]["admin_menu_group"],
|
||||
serde_json::Value::Null
|
||||
);
|
||||
assert_eq!(*upstream_hits.lock().expect("mutex should lock"), 0);
|
||||
|
||||
gateway_handle.abort();
|
||||
|
||||
Reference in New Issue
Block a user