Skip to content

Commit 516472b

Browse files
committed
feat: 提供备份数据http接口,以支持通过外部定时脚本发起定时备份功能; #172
1 parent 438b1a3 commit 516472b

File tree

7 files changed

+44
-3
lines changed

7 files changed

+44
-3
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,7 @@ k8s支持使用 [helm](https://github.com/nacos-group/r-nacos/tree/master/deploy
184184
|RNACOS_ENABLE_OPEN_API_AUTH|是否对openapi开启鉴权;(注:nacos切换到r-nacos过程中不要开启鉴权)|false|true|0.5.8|
185185
|RNACOS_API_LOGIN_TIMEOUT|open api鉴权有效时长,单位为秒;(注:从不鉴权到开启鉴权,需要间隔对应时长以保证客户端token能更新生效)|一小时,3600秒|3600|0.5.8|
186186
|RNACOS_CLUSTER_TOKEN|集群间的通信请求校验token,空表示不开启校验,设置后只有相同token的节点间才可通讯|空字符串|1234567890abcdefg|0.5.8|
187+
|RNACOS_BACKUP_TOKEN|数据备份接口请求校验token,空或长度小于32位表示不开启备份接口|空字符串|1234567890abcdefg1234567890abcdefg|0.6.6|
187188
|RNACOS_INIT_ADMIN_USERNAME|初始化管理员用户名,只在主节点第一次启动时生效|admin|rnacos|0.5.11|
188189
|RNACOS_INIT_ADMIN_PASSWORD|初始化管理员密码,只在主节点第一次启动时生效|admin|rnacos123456|0.5.11|
189190
|RNACOS_ENABLE_METRICS|是否开启监控指标功能|true|true|0.5.13|

doc/conf/.env.example

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,9 @@ RNACOS_ENABLE_NO_AUTH_CONSOLE=false
5656
#集群间的通信请求校验token,空表示不开启校验,设置后只有相同token的节点间才可通讯;默认为字符串
5757
#RNACOS_CLUSTER_TOKEN=bbd8b0b391254e00ae1a7c8ac6ed5f82
5858

59+
#数据备份接口请求校验token,空或长度小于32位表示不开启备份接口
60+
#RNACOS_BACKUP_TOKEN=
61+
5962
# 初始化管理员用户名,只在主节点第一次启动时生效,默认值:admin
6063
RNACOS_INIT_ADMIN_USERNAME=admin
6164

src/common/mod.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ pub struct AppSysConfig {
7878
pub openapi_login_one_minute_limit: u32,
7979
pub openapi_enable_auth: bool,
8080
pub cluster_token: Arc<String>,
81+
pub backup_token: Arc<String>,
8182
pub init_admin_username: String,
8283
pub init_admin_password: String,
8384
pub metrics_enable: bool,
@@ -165,6 +166,12 @@ impl AppSysConfig {
165166
let cluster_token = std::env::var("RNACOS_CLUSTER_TOKEN")
166167
.map(Arc::new)
167168
.unwrap_or(constant::EMPTY_ARC_STRING.clone());
169+
let mut backup_token = std::env::var("RNACOS_BACKUP_TOKEN")
170+
.map(Arc::new)
171+
.unwrap_or(constant::EMPTY_ARC_STRING.clone());
172+
if backup_token.len() < 32 {
173+
backup_token = constant::EMPTY_ARC_STRING.clone();
174+
}
168175
let init_admin_username =
169176
StringUtils::map_not_empty(std::env::var("RNACOS_INIT_ADMIN_USERNAME").ok())
170177
.unwrap_or("admin".to_owned());
@@ -236,6 +243,7 @@ impl AppSysConfig {
236243
gmt_fixed_offset_hours,
237244
openapi_enable_auth,
238245
cluster_token,
246+
backup_token,
239247
init_admin_username,
240248
init_admin_password,
241249
metrics_enable,

src/console/transfer_api.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,7 @@ use std::sync::Arc;
1313
use tokio::fs::OpenOptions;
1414
use tokio::io::{AsyncReadExt, AsyncSeekExt};
1515

16-
pub async fn download_transfer_file(
17-
app_share_data: web::Data<Arc<AppShareData>>,
18-
) -> impl Responder {
16+
pub async fn download_transfer_file(app_share_data: web::Data<Arc<AppShareData>>) -> HttpResponse {
1917
if let Ok(Ok(TransferManagerResponse::BackupFile(temp_file))) = app_share_data
2018
.transfer_writer_manager
2119
.send(TransferManagerAsyncRequest::Backup(

src/openapi/backup.rs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
use crate::common::appdata::AppShareData;
2+
use crate::console::transfer_api::download_transfer_file;
3+
use actix_web::{web, HttpResponse, Responder};
4+
use serde::{Deserialize, Serialize};
5+
use std::sync::Arc;
6+
7+
#[derive(Debug, Deserialize, Serialize)]
8+
pub struct BackupParam {
9+
pub token: Arc<String>,
10+
}
11+
12+
pub async fn backup(
13+
app_share_data: web::Data<Arc<AppShareData>>,
14+
web::Query(params): web::Query<BackupParam>,
15+
) -> impl Responder {
16+
if app_share_data.sys_config.backup_token.is_empty() {
17+
HttpResponse::InternalServerError().body("backup api is not open")
18+
} else if params.token.as_str() != app_share_data.sys_config.backup_token.as_str() {
19+
HttpResponse::InternalServerError().body("backup token is not matched")
20+
} else {
21+
download_transfer_file(app_share_data).await
22+
}
23+
}
24+
25+
pub fn backup_config(config: &mut web::ServiceConfig) {
26+
config.service(web::resource("/rnacos/backup").route(web::get().to(backup)));
27+
}

src/openapi/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use crate::common::AppSysConfig;
44
use crate::openapi::constant::NACOS_PREFIX;
55

66
pub(crate) mod auth;
7+
pub(crate) mod backup;
78
pub(crate) mod config;
89
mod constant;
910
pub(crate) mod health;

src/web_config.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use rnacos_web_dist_wrap::get_embedded_file;
66
use crate::common::AppSysConfig;
77
use crate::console::api::{console_api_config_v1, console_api_config_v2};
88
use crate::openapi::auth::{login_config, mock_token};
9+
use crate::openapi::backup::backup_config;
910
use crate::openapi::health::health_config;
1011
use crate::openapi::metrics::metrics_config;
1112
use crate::openapi::{openapi_config, v1::console as nacos_console};
@@ -85,6 +86,7 @@ async fn disable_no_auth_console_index() -> impl Responder {
8586
pub fn app_config(conf_data: AppSysConfig) -> impl FnOnce(&mut ServiceConfig) {
8687
move |config: &mut ServiceConfig| {
8788
if !conf_data.enable_no_auth_console || conf_data.openapi_enable_auth {
89+
backup_config(config);
8890
config
8991
.service(web::resource("/").route(web::get().to(disable_no_auth_console_index)))
9092
.service(
@@ -107,6 +109,7 @@ pub fn app_config(conf_data: AppSysConfig) -> impl FnOnce(&mut ServiceConfig) {
107109
nacos_console_api_config(config);
108110
config.configure(openapi_config(conf_data));
109111
} else {
112+
backup_config(config);
110113
login_config(config);
111114
metrics_config(config);
112115
health_config(config);

0 commit comments

Comments
 (0)